PLC:从零到一,用结构化文本(ST)实现经典工业控制逻辑

发布时间:2026/7/14 10:26:14

PLC:从零到一,用结构化文本(ST)实现经典工业控制逻辑 1. 初识结构化文本(ST)语言第一次接触PLC编程时我被梯形图(LD)的图形化界面吸引觉得它直观易懂。但当我遇到一个需要复杂逻辑控制的物料分拣项目时图形化编程突然变得笨拙起来——连线密密麻麻修改起来异常痛苦。这时同事建议我尝试结构化文本(ST)语言从此打开了新世界的大门。ST语言是IEC 61131-3标准定义的五大PLC编程语言之一它的语法风格类似Pascal和C语言特别适合处理复杂逻辑和算法。与梯形图相比ST语言有以下优势代码更紧凑同样的逻辑ST代码通常只有梯形图的1/3长度维护更方便修改逻辑时不需要重新布线直接编辑文本即可功能更强大支持复杂数学运算、字符串处理等高级功能可读性更好良好的命名规范能让代码自解释举个例子要实现一个简单的电机启停控制梯形图需要多个触点、线圈和连线而ST只需要一行代码Motor : StartButton AND NOT StopButton;2. 搭建开发环境工欲善其事必先利其器。我推荐使用以下工具开始ST语言编程之旅2.1 硬件准备PLC设备三菱FX5U、西门子S7-1200等支持ST语言的PLC编程电缆USB转RS232/RS485适配器IO模块根据项目需求准备数字量/模拟量输入输出模块2.2 软件安装以三菱GX Works3为例从官网下载安装包运行安装程序选择完全安装安装USB驱动重要否则无法连接PLC激活软件许可证安装完成后新建项目时记得选择结构化文本(ST)作为编程语言。第一次使用时建议打开语法高亮和自动补全功能这对新手特别友好。3. ST语言基础语法精要3.1 变量声明ST是强类型语言所有变量必须先声明后使用。基本数据类型包括BOOL布尔值(TRUE/FALSE)对应PLC的M寄存器INT16位整数(-32768~32767)DINT32位整数REAL浮点数STRING字符串声明示例VAR StartButton : BOOL; // 启动按钮 StopButton : BOOL; // 停止按钮 Motor : BOOL; // 电机输出 Counter : INT; // 计数器 Temperature : REAL; // 温度值 END_VAR3.2 基本运算符ST支持丰富的运算符算术运算 - * / MOD(取模)比较运算 逻辑运算AND OR NOT XOR特别注意ST中的赋值运算符是:而比较相等是这与许多编程语言不同。3.3 控制结构3.3.1 IF-THEN-ELSEIF 条件1 THEN // 条件1为真时执行 ELSIF 条件2 THEN // 条件2为真时执行 ELSE // 其他情况执行 END_IF;3.3.2 CASE语句CASE 变量 OF 值1: 语句1; 值2: 语句2; ... ELSE: 默认语句; END_CASE;3.3.3 循环结构// FOR循环 FOR i : 1 TO 10 BY 1 DO // 循环体 END_FOR; // WHILE循环 WHILE 条件 DO // 循环体 END_WHILE; // REPEAT循环 REPEAT // 循环体 UNTIL 条件 END_REPEAT;4. 实战物料分拣系统开发让我们通过一个完整的物料分拣项目将ST语言的各项功能串联起来。4.1 项目需求传送带持续运行检测到物品时停止通过颜色传感器识别物品颜色(红/绿/蓝)根据颜色将物品推入对应料槽统计各类物品数量紧急停止按钮可立即停止所有设备4.2 IO分配信号类型地址说明DIX0物品检测传感器DIX1红色识别DIX2绿色识别DIX3紧急停止DOY0传送带电机DOY1红色推杆DOY2绿色推杆DOY3蓝色推杆4.3 程序实现VAR // 输入信号 ObjectDetected : BOOL AT %IX0.0; // 物品检测 RedColor : BOOL AT %IX0.1; // 红色识别 GreenColor : BOOL AT %IX0.2; // 绿色识别 EmergencyStop : BOOL AT %IX0.3; // 急停按钮 // 输出信号 ConveyorMotor : BOOL AT %QX0.0; // 传送带电机 RedPusher : BOOL AT %QX0.1; // 红色推杆 GreenPusher : BOOL AT %QX0.2; // 绿色推杆 BluePusher : BOOL AT %QX0.3; // 蓝色推杆 // 内部变量 RedCount : INT : 0; // 红色物品计数 GreenCount : INT : 0; // 绿色物品计数 BlueCount : INT : 0; // 蓝色物品计数 PusherTimer : TON; // 推杆动作定时器 END_VAR // 主程序 ConveyorMotor : NOT EmergencyStop AND NOT ObjectDetected; IF NOT EmergencyStop AND ObjectDetected THEN CASE TRUE OF RedColor: RedPusher : TRUE; RedCount : RedCount 1; GreenColor: GreenPusher : TRUE; GreenCount : GreenCount 1; ELSE // 既不是红色也不是绿色默认为蓝色 BluePusher : TRUE; BlueCount : BlueCount 1; END_CASE; // 推杆动作0.5秒后复位 PusherTimer(IN : TRUE, PT : T#500MS); IF PusherTimer.Q THEN RedPusher : FALSE; GreenPusher : FALSE; BluePusher : FALSE; PusherTimer(IN : FALSE); END_IF; END_IF;5. 高级功能应用5.1 定时器和计数器ST语言提供了丰富的功能块最常用的就是定时器和计数器。5.1.1 定时器(TON)VAR MotorStartTimer : TON; MotorRunTime : TIME : T#10S; // 10秒 END_VAR // 使用示例 MotorStartTimer(IN : StartButton, PT : MotorRunTime); IF MotorStartTimer.Q THEN Motor : TRUE; END_IF;5.1.2 计数器(CTU)VAR ProductCounter : CTU; MaxCount : INT : 100; END_VAR // 使用示例 ProductCounter(CU : SensorTrigger, R : ResetButton, PV : MaxCount); IF ProductCounter.Q THEN // 达到100个产品 Alarm : TRUE; END_IF;5.2 自定义函数和功能块ST语言支持模块化编程可以将常用功能封装成函数或功能块。5.2.1 函数示例FUNCTION CalculateSpeed : REAL VAR_INPUT PulseCount : INT; TimeInterval : TIME; END_VAR VAR PulsesPerSecond : REAL; END_VAR PulsesPerSecond : INT_TO_REAL(PulseCount) / TIME_TO_REAL(TimeInterval) * 1000.0; CalculateSpeed : PulsesPerSecond / 20.0; // 假设每转20个脉冲 END_FUNCTION5.2.2 功能块示例FUNCTION_BLOCK MotorControl VAR_INPUT Start : BOOL; Stop : BOOL; Overload : BOOL; END_VAR VAR_OUTPUT Run : BOOL; Fault : BOOL; END_VAR VAR OverloadTimer : TON; END_VAR Run : Start AND NOT Stop AND NOT Fault; IF Overload THEN OverloadTimer(IN : TRUE, PT : T#2S); IF OverloadTimer.Q THEN Fault : TRUE; END_IF; ELSE OverloadTimer(IN : FALSE); END_IF; END_FUNCTION_BLOCK6. 调试与优化技巧6.1 在线调试现代PLC编程软件都提供强大的在线调试功能变量监控实时查看变量值变化强制赋值手动设置输入/输出值断点调试暂停程序执行检查状态在GX Works3中按F3键进入在线模式右键变量选择监控即可实时观察其值。6.2 常见错误排查语法错误缺少分号、括号不匹配等编译器通常会提示类型不匹配确保赋值操作两边数据类型一致扫描周期问题注意变量值在同一个周期内的变化顺序定时器不工作检查定时器的IN端是否持续为TRUE6.3 性能优化建议避免在高速循环中使用复杂运算将不常变化的计算移到初始化部分使用功能块代替重复代码合理组织变量将相关变量放在一起7. 工程实践建议在实际项目中我总结了以下经验命名规范使用有意义的变量名如ConveyorMotor比Y0更易理解注释充分解释复杂逻辑的设计意图版本控制使用Git等工具管理代码变更模块化设计将系统分解为独立的功能模块防御性编程考虑所有异常情况如传感器故障处理一个典型的项目目录结构建议/Project /DOC # 文档 /SRC # 源代码 MAIN.st # 主程序 MOTOR.fb # 电机控制功能块 COUNTER.fb # 计数器功能块 /LIB # 库文件 /TEST # 测试程序ST语言的学习曲线可能比梯形图陡峭但一旦掌握你会发现它能大幅提升编程效率和代码质量。从简单的IO控制开始逐步尝试更复杂的逻辑你会越来越体会到ST语言的强大之处。

相关新闻