ST(Structured Text)是IEC 61131-3标准定义的高级文本编程语言,广泛用于PLC逻辑开发。在调试阶段,实时监控中间变量与安全强制赋值是定位逻辑错误、验证控制策略的核心能力。本文仅聚焦于主流支持ST的工程环境(如TIA Portal V18+、Codesys 3.5+、GX Works3),所有操作均基于编辑器原生功能,不依赖外部HMI或SCADA系统。
一、前提准备:确保调试环境就绪
-
确认PLC处于在线模式且可读写:
点击 工程树中PLC设备节点,检查 状态栏是否显示Online – Read/Write。若为Online – Read Only,需先停止PLC运行,右键 PLC设备 →Download to device→ 勾选Always enable write access→ 下载硬件组态与程序。 -
启用ST编辑器的调试支持:
在TIA Portal中,进入Options→Settings→PLC programming→ST editor→ 勾选Enable online monitoring in ST editor;
在Codesys中,进入Tools→Options→Online→Monitoring→ 勾选Monitor ST variables during online change。 -
编译前插入调试标记(非必须但强烈推荐):
在关键计算行前后添加注释标记,便于快速定位:// === DEBUG_POINT_START: MOTOR_CONTROL_LOGIC === speed_ref := (setpoint * gain) + offset; torque_limit_ok := speed_ref < max_torque; // === DEBUG_POINT_END: MOTOR_CONTROL_LOGIC ===
二、监控中间变量:三类精准定位法
ST中变量分为全局变量(GVL)、局部变量(VAR/VAR_TEMP)、函数块实例变量(FB_INSTANCE.var)。监控必须区分作用域。
方法1:行内变量高亮监控(最快捷)
适用于单行表达式中的临时计算结果。
- 将光标停在待监控的变量名上(如
speed_ref或torque_limit_ok); - 按
F9键 设置断点(仅TIA Portal)或 右键变量名 →Add to watch(Codesys/GX Works3); - 启动在线调试:点击
Online→Start test mode(TIA)或Online→Login→Start Online Change(Codesys); - 观察编辑器左侧灰色区域:已监控变量旁自动显示实时值,格式为
变量名 = 当前值(例如speed_ref = 1250.0); - 值更新规则:仅当该行被执行时刷新——若变量在
IF分支内且条件为假,则值保持灰显(表示未执行)。
⚠️ 注意:
VAR_TEMP变量无法被监控,因其生命周期仅限单次扫描周期,且不驻留内存。需改用VAR或VAR_IN_OUT声明临时调试变量。
方法2:变量表监控(最稳定)
适用于跨多行、需长期跟踪的变量,支持数值比较与变化趋势。
-
打开变量监控表:
- TIA Portal:
Online→Watch table→New watch table; - Codesys:
Online→Watch window→Add variable;
- TIA Portal:
-
手动输入变量路径(严格区分大小写与下划线):
| 变量类型 | 输入示例 | 说明 |
|----------------|--------------------------------|-------------------------------|
| 全局变量 |GVL.speed_ref| GVL为全局变量列表名称 |
| 函数块实例变量 |MAIN.fb_motor.speed_actual| MAIN为主程序组织块,fb_motor为其实例名 |
| 数组元素 |GVL.temp_array[3]| 支持索引访问 |
| 结构体成员 |GVL.motor_cfg.max_speed| 支持多层点号访问 | -
配置显示格式(提升可读性):
- 右键变量行 →
Display format→ 选择Decimal/Hex/Binary/Bool; - 对浮点数,右键 →
Properties→Number of decimals→ 设为1或2; - 对布尔量,勾选
Show as checkbox,直接显示勾选框。
- 右键变量行 →
-
启用值变化高亮:
- 勾选表格顶部
Highlight changes; - 变量值改变时,整行背景短暂变黄(TIA)或闪烁(Codesys)。
- 勾选表格顶部
方法3:结构化监控(针对复杂数据类型)
当监控对象为数组、结构体或UDT(用户自定义类型)时,需展开查看内部成员。
- 在变量表中添加结构体变量(如
GVL.motor_cfg); - 点击变量名左侧的
▶展开箭头; - 逐层展开至目标成员(如
GVL.motor_cfg.pwm_freq); - 对数组使用范围监控(避免逐个添加):
输入GVL.temp_array[0..4]可一次性监控前5个元素,显示为连续行。
✅ 技巧:在TIA Portal中,拖拽变量声明行(如
speed_ref : REAL;)到Watch Table窗口,自动填充完整路径。
三、强制赋值:安全干预与边界测试
强制(Force)是在不修改代码前提下,人为设定变量值,用于模拟传感器故障、验证保护逻辑、跳过初始化等待等。所有强制操作必须在PLC运行时进行,且强制状态在PLC重启后自动清除(除非启用永久强制)。
步骤1:启用强制功能
- TIA Portal:
Online→Forcing→Enable forcing(首次启用需确认警告); - Codesys:
Online→Force→Enable force mode; - GX Works3:
Online→Force→Force ON。
步骤2:选择强制方式
| 方式 | 操作步骤 | 适用场景 |
|---|---|---|
| 单变量强制 | 在Watch Table中,右键变量 → Force value → 输入值 → OK |
快速验证单一信号(如 start_btn := TRUE) |
| 批量强制 | 按住 Ctrl 键 多选Watch Table中变量 → Right-click → Force value |
同时设置多个关联变量(如整套电机参数) |
| 地址强制 | 输入绝对地址(仅限支持地址访问的平台):<br>%MB100(保持寄存器)<br>%MX10.0(位) |
底层通信调试或老旧PLC兼容 |
步骤3:验证强制生效
- 观察变量值右侧图标:
- TIA Portal:出现蓝色
F标志 + 强制值背景为浅蓝; - Codesys:值旁显示
FORCED文字;
- TIA Portal:出现蓝色
- 检查PLC输出响应:
- 若强制
motor_run := TRUE,对应输出点(如Q0.0)应立即置位; - 若无响应,检查该变量是否被其他逻辑覆盖(如后续代码有
motor_run := FALSE),此时强制被覆盖,需将强制位置下移或检查逻辑流。
- 若强制
步骤4:取消强制(必须执行)
严禁在调试完成后遗留强制!未取消的强制会导致现场误动作。
- 单变量取消:Watch Table中,右键 强制变量 →
Remove force; - 全部取消:
Online→Forcing→Disable forcing(TIA/Codesys)或Force OFF(GX Works3); - 强制状态检查:TIA Portal中,
Online→Forcing→Forced variables列表显示所有当前强制项,可一键清除。
⚠️ 安全铁律:
- 强制仅用于调试,禁止在运行中强制安全相关变量(如
emergency_stop、safety_gate_open);- 强制前务必确认变量所属网络与权限(如PROFINET IO设备变量强制可能失败);
- Codesys中,若变量声明为
NON_RETAIN,强制后PLC断电重启即失效,属预期行为。
四、典型问题排查与绕过技巧
问题1:变量监控显示 <not available> 或 <invalid>
- 原因:变量未被编译进当前下载版本,或作用域不可见(如
VAR_TEMP),或PLC未运行。 - 解决:
- 重新编译并下载整个程序块;
- 将
VAR_TEMP改为VAR并重命名(如debug_speed_ref); - 确认PLC CPU模式为
RUN(非STOP或STARTUP)。
问题2:强制后变量值立即恢复原值
- 原因:代码中存在对该变量的写操作(如
motor_run := start_cmd AND not fault;),强制值被后续扫描覆盖。 - 解决:
- 在Watch Table中开启
Update on change(TIA)或Auto refresh(Codesys),确认值确实在变; - 在强制变量所在代码段前后加断点,单步执行,定位覆盖位置;
- 临时注释掉覆盖逻辑,再强制验证。
- 在Watch Table中开启
问题3:无法监控函数内部局部变量(如FB内VAR)
- 原因:IEC 61131-3标准规定,函数(FC)无内部状态,其
VAR变量不可监控;函数块(FB)的VAR变量需通过实例访问。 - 解决:
- 对FC:将关键中间变量提升为
VAR_IN_OUT参数,调用时传入全局变量; - 对FB:监控必须通过实例路径,如
MAIN.my_fb.calc_result,而非直接写calc_result。
- 对FC:将关键中间变量提升为
绕过技巧:利用__GET_VAR_PTR()获取变量地址(高级)
当标准监控失败且需底层验证时(仅限支持指针的平台如Codesys):
// 在ST中声明调试指针
ptr_debug : POINTER TO REAL;
// 在初始化段执行一次
ptr_debug := __GET_VAR_PTR(GVL.speed_ref);
// 后续可通过 ptr_debug^ 读取值(需配合在线查看内存)
🔒 注意:此方法需启用“Unsafe pointer operations”选项,存在风险,仅限资深工程师用于疑难杂症诊断。
五、效率提升组合技
-
快捷键矩阵(TIA Portal V18):
| 功能 | 快捷键 |
|----------------------|--------------|
| 切换在线/离线 |Ctrl + Shift + O|
| 打开Watch Table |Ctrl + Shift + W|
| 强制当前选中变量 |Ctrl + F|
| 清除所有强制 |Ctrl + Shift + F| -
Watch Table模板复用:
- 调试完一个电机控制逻辑后,导出Watch Table:右键表头 →
Export watch table→ 保存为.wtl文件; - 下次调试同类设备时,导入模板:
Import watch table,自动加载全部变量路径与格式。
- 调试完一个电机控制逻辑后,导出Watch Table:右键表头 →
-
条件监控(TIA Portal专属):
在Watch Table中,右键变量 →Trigger condition→ 输入布尔表达式(如GVL.speed_ref > 1500),仅当条件满足时高亮该行并记录变化,避免海量日志干扰。
六、避坑清单:新手最常犯的7个错误
| 错误现象 | 根本原因 | 矫正动作 |
|---|---|---|
| 监控值始终为0或FALSE | 变量未初始化,且未在主循环中赋值 | 检查变量声明处是否缺默认值(如 speed_ref : REAL := 0.0;) |
强制后PLC报错 Access denied |
用户权限不足或CPU保护启用 | 以Administrator登录PLC,或关闭Protection Level |
| Watch Table中变量名红色波浪线 | 路径拼写错误或变量不存在 | 复制变量声明行全文粘贴,勿手输 |
| 浮点数监控显示极大误差(如1250.000001) | 浮点精度限制与显示位数不足 | 在Watch Table中设小数位数为1,或改用LREAL类型 |
| 强制布尔量后输出点无反应 | 输出映射被禁用或硬件开关断开 | 检查PLC输出模块状态灯,确认OB1中Q地址未被屏蔽 |
结构体成员监控显示<not readable> |
UDT未下载或版本不匹配 | 重新下载UDT定义,确认工程与PLC固件版本兼容 |
| 调试时PLC意外停机 | 断点触发过多导致扫描周期超时 | 关闭非必要断点,或增大Cycle time monitoring阈值 |
七、结语:调试即设计
ST调试不是被动找错,而是主动验证控制意图。每一次对speed_ref的监控,都在确认算法模型是否匹配物理约束;每一次对motor_run的强制,都是在压力测试联锁逻辑的鲁棒性。将监控点嵌入代码注释、把Watch Table当作第二份程序文档、让强制操作成为可追溯的调试日志——这才是自动化工程师的专业本能。

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