文章目录

欧姆龙PLC的ST语言编程入门

发布于 2026-03-23 22:48:37 · 浏览 4 次 · 评论 0 条

欧姆龙PLC的ST语言编程入门


什么是ST语言

ST语言全称为结构化文本(Structured Text),是IEC 61131-3标准中定义的五种编程语言之一。相比于梯形图(Ladder Diagram,LD),ST语言更接近高级编程语言的语法,适合处理复杂的数学运算、数据结构和算法逻辑。在欧姆龙PLC系统中,ST语言通过CX-Programmer或CX-One软件进行开发,支持与梯形图、FBD(功能块图)等其他编程语言混合使用。

ST语言的核心优势体现在三个层面:代码复用率高,一条指令可完成梯形图需要多行才能实现的功能;逻辑表达清晰,复杂的条件判断和循环结构易于阅读;维护成本低,文本形式的代码便于复制、搜索和版本管理。


开发环境准备

软件安装

欧姆龙PLC的ST语言开发依赖于CX-One套件。下载 CX-One安装包后,按提示完成安装。安装过程中需要选择是否包含CX-Programmer组件,建议全选以确保完整功能可用。

新建项目

  1. 启动CX-Programmer,点击 “新建” 或使用快捷键 Ctrl + N
  2. 在设备类型选择界面,选择 目标PLC系列(如CP1E、CP1L、CJ2M等)。若不确定具体型号,可选择“CS/CJ系列”作为通用选项。
  3. 设置 网络类型和IP地址。若使用USB编程线连接,直接选择“USB”即可。
  4. 项目创建完成后,在左侧项目树中 右键点击 “程序”,选择“新建程序”,在弹出的对话框中将编程语言改为“ST”。

基本配置

在编写ST代码前,需完成两项基础配置:

任务配置:欧姆龙PLC采用周期任务机制。在左侧项目树中 双击 “任务”文件夹,默认情况下已有一个周期性任务(如Cycle Task 0)。将该任务的执行周期设置为合适数值(通常为10ms或20ms),并将新建的ST程序 关联 到该任务。

内存区域分配:ST语言中使用的变量需要映射到PLC的实际内存区域。在全局符号表中 定义 变量时,需要指定数据类型和存储位置。常用区域包括:

区域前缀 说明 适用场景
D 数据存储器 通用数据存储
W 内部工作位 临时标志位
H 保持区域 断电保持数据
A 辅助区域 系统状态监控
CIO 直接输入输出 外部IO映射

ST语言基础语法

变量声明

ST语言采用强类型机制,所有变量必须先声明后使用。声明语法为:

变量名 : 数据类型;

例如:

var_speed    : INT;        (* 速度变量,整型 *)
var_position : REAL;       (* 位置变量,实型 *)
var_done     : BOOL;       (* 完成标志,布尔型 *)
arr_data     : ARRAY[1..10] OF INT;  (* 数组,整型10个元素 *)

声明位置分为两种:在程序开头声明的为局部变量,仅当前程序有效;在全局符号表中声明的为全局变量,可在多个程序间共享。

基本数据类型

欧omron ST语言支持以下核心数据类型:

数据类型 关键字 取值范围 用途
布尔型 BOOL TRUE / FALSE 开关量、标志位
整型 INT -32768 ~ 32767 计数、整数运算
双整型 DINT -2147483648 ~ 2147483647 大范围整数
实型 REAL ±1.175494×10⁻³⁸ ~ ±3.402823×10³⁸ 浮点运算
字符串 STRING 最长255字符 文本数据
时间 TIME 1ms ~ 49.7天 定时功能

运算符

ST语言的运算符遵循标准优先级规则,主要包括以下几类:

算术运算符+(加)、-(减)、*(乘)、/(除)、MOD(取余)。例如 result := 100 MOD 7; 结果为 7。

比较运算符=(等于)、<>(不等于)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)。

逻辑运算符AND(与)、OR(或)、NOT(非)、XOR(异或)。布尔运算示例:flag := (a > 5) AND (b < 10);

赋值运算符:使用 := 而非 =。注意区分 a := b;(赋值)与 a = b;(比较)。


控制结构

条件判断:IF语句

IF语句用于实现分支逻辑,基本语法为:

IF 条件1 THEN
    (* 执行代码 *)
ELSIF 条件2 THEN
    (* 执行代码 *)
ELSE
    (* 执行代码 *)
END_IF;

实际应用示例:根据温度传感器值控制冷却风扇。

IF temperature >= 80 THEN
    fan_speed := 100;
    alarm := FALSE;
ELSIF temperature >= 60 THEN
    fan_speed := 50;
    alarm := FALSE;
ELSE
    fan_speed := 0;
    alarm := TRUE;
END_IF;

多分支选择:CASE语句

当需要根据一个变量的多个取值执行不同逻辑时,CASE语句比IF更清晰:

CASE step OF
    0:  (* 初始化 *)
        motor_on := FALSE;
        count := 0;
    1:  (* 运行 *)
        motor_on := TRUE;
        count := count + 1;
    2:  (* 停止 *)
        motor_on := FALSE;
    3:  (* 报警 *)
        error_code := 1;
END_CASE;

CASE语句支持范围表示法,如 10..20: 表示值为10到20时执行该分支。

循环结构:FOR循环

FOR循环用于已知循环次数的场景:

FOR i := 1 TO 10 BY 1 DO
    sum := sum + arr[i];
END_FOR;

其中 BY 1 表示步长,可根据需要调整为其他值(如 BY 2 表示隔一个取值)。

循环结构:WHILE循环

WHILE循环在条件满足时持续执行,适用于循环次数不确定的场景:

WHILE count < 100 DO
    result := result * 2;
    count := count + 1;
END_WHILE;

使用WHILE循环时务必确保循环条件最终能够满足,否则会导致程序死循环。


功能块与函数

功能块定义

功能块(Function Block)是ST语言中实现代码复用的核心机制。创建 功能块时,在CX-Programmer中 选择 “功能块”,编写完成后可在主程序中多次调用,每次调用拥有独立的实例数据。

功能块的基本结构包括输入变量、输出变量和内部变量:

FUNCTION_BLOCK FB_MotorControl
VAR_INPUT
    start   : BOOL;
    stop    : BOOL;
    speed   : INT;
END_VAR

VAR_OUTPUT
    running : BOOL;
    fault   : BOOL;
END_VAR

VAR
    timer   : TON;  (* 定时器功能块 *)
END_VAR

(* 功能块逻辑 *)
IF start AND NOT stop THEN
    running := TRUE;
    timer(IN := TRUE, PT := T#5S);
    IF timer.Q THEN
        fault := TRUE;
        running := FALSE;
    END_IF;
ELSIF stop THEN
    running := FALSE;
    fault := FALSE;
END_IF;
END_FUNCTION_BLOCK

功能块调用

在主程序中 调用 功能块时,需要先声明实例:

VAR
    motor1 : FB_MotorControl;
    motor2 : FB_MotorControl;
END_VAR

(* 调用实例 *)
motor1(start := start_btn, stop := stop_btn, speed := 50);
motor2(start := start_btn2, stop := stop_btn2, speed := 75);

通过声明多个实例(如 motor1、motor2),同一功能块可以在不同数据上下文中独立运行。


实用编程示例

示例一:传送带启停控制

以下代码实现一条传送带的顺序控制逻辑,包含启动延迟、过载保护和急停功能:

PROGRAM ConveyorControl
VAR
    start_button   : BOOL;      (* 启动按钮输入 *)
    stop_button    : BOOL;      (* 停止按钮输入 *)
    sensor_input   : BOOL;      (* 物品检测传感器 *)
    overload       : BOOL;      (* 过载保护信号 *)
    conveyor_motor : BOOL;      (* 传送带电机输出 *)
    start_delay    : TON;       (* 启动延时定时器 *)
    stop_delay     : TON;       (* 停止延时定时器 *)
    counter        : INT;       (* 物品计数 *)
    current_step   : INT;       (* 当前步骤 *)
END_VAR

(* 状态机控制 *)
CASE current_step OF
    0:  (* 待机状态 *)
        conveyor_motor := FALSE;
        IF start_button AND NOT overload THEN
            current_step := 1;
        END_IF;

    1:  (* 启动中 *)
        start_delay(IN := TRUE, PT := T#2S);
        IF start_delay.Q THEN
            conveyor_motor := TRUE;
            start_delay(IN := FALSE);
            current_step := 2;
        END_IF;

    2:  (* 运行状态 *)
        IF sensor_input THEN
            counter := counter + 1;
        END_IF;

        IF overload OR stop_button THEN
            current_step := 3;
        END_IF;

    3:  (* 停止中 *)
        stop_delay(IN := TRUE, PT := T#3S);
        IF stop_delay.Q THEN
            conveyor_motor := FALSE;
            stop_delay(IN := FALSE);
            current_step := 0;
        END_IF;
END_CASE;
END_PROGRAM

示例二:PID温度控制

ST语言非常适合实现PID控制算法。以下是一个简化的PID控制实现:

PROGRAM PID_Temperature
VAR
    setpoint    : REAL := 60.0;   (* 目标温度设定值 *)
    pv          : REAL;           (* 过程值,实际温度 *)
    kp          : REAL := 1.2;    (* 比例系数 *)
    ki          : REAL := 0.05;   (* 积分系数 *)
    kd          : REAL := 0.1;    (* 微分系数 *)

    error       : REAL;           (* 误差 *)
    error_prev  : REAL := 0;      (* 上次误差 *)
    integral    : REAL := 0;      (* 积分累计 *)
    derivative  : REAL;           (* 微分项 *)
    output      : REAL;           (* PID输出 *)

    heat_ctrl   : BOOL;           (* 加热控制输出 *)
END_VAR

(* 计算误差 *)
error := setpoint - pv;

(* 积分项限幅,防止积分饱和 *)
integral := integral + error;
IF integral > 1000 THEN integral := 1000; END_IF;
IF integral < -1000 THEN integral := -1000; END_IF;

(* 微分项计算 *)
derivative := error - error_prev;
error_prev := error;

(* PID运算 *)
output := kp * error + ki * integral + kd * derivative;

(* 输出限幅 *)
IF output > 100 THEN output := 100; END_IF;
IF output < 0 THEN output := 0; END_IF;

(* 控制输出 *)
heat_ctrl := output > 10;
END_PROGRAM

调试与常见问题

在线监控

CX-Programmer支持在线监控ST程序执行。点击 “在线”菜单中的“监视”,PLC进入监视模式后,变量当前值会实时显示在代码右侧。对于关键变量,右键点击 选择“强制”或“设置”,可在调试阶段手动赋值。

常见错误类型

语法错误:ST语言对语法要求严格,常见错误包括漏写分号、变量未声明、括号不匹配等。CX-Programmer会在代码下方用红色波浪线标记错误位置。

数据类型不匹配:例如将REAL型变量赋值给INT型变量会导致编译错误,需使用转换函数如 INT()REAL() 进行显式转换。

除零错误:表达式中存在除以零的操作会导致运行时故障。应在除法运算前 判断 除数是否为零:

IF divisor <> 0 THEN
    result := dividend / divisor;
END_IF;

性能优化

对于扫描周期敏感的应用程序,注意以下几点:

  • 减少不必要的浮点运算:浮点运算耗时远高于整数运算,非必要时使用定点数或整数替代。
  • 避免过深的嵌套:多层IF或CASE嵌套会增加执行时间,可考虑拆分为多个功能块。
  • 合理使用定时器:定时器功能块占用一定资源,非必要时使用简单的计数器替代。

总结

ST语言是欧姆龙PLC编程中处理复杂逻辑的利器。通过掌握变量声明、控制结构、功能块调用和调试方法,能够编写出结构清晰、易于维护的程序。建议从简单示例入手,逐步尝试更复杂的算法实现,最终熟练运用ST语言解决实际工业控制问题。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文