ST仿真测试:使用PLCSIM Advanced测试ST逻辑的方法
一、明确目标:为什么必须用PLCSIM Advanced测ST逻辑
ST(Structured Text)是IEC 61131-3标准定义的高级文本编程语言,语法类似Pascal,支持条件判断、循环、函数调用、数组操作和复杂表达式。在实际项目中,ST常用于实现PID控制算法、运动轨迹计算、配方管理、报警逻辑聚合等关键功能。这些逻辑一旦出错,轻则设备停机,重则引发安全风险。
但仅靠代码静态检查或在线监控无法暴露全部问题:
- 边界值失效:
IF temp > 100.0 THEN ...在temp = 99.999和temp = 100.001时行为是否一致? - 浮点精度陷阱:
IF (a * b) = c THEN ...中a=0.1,b=0.2,c=0.3会因IEEE 754舍入导致判断失败; - 时序耦合缺陷:某ST函数块在第1个扫描周期输出未初始化,被另一模块误读为有效信号;
- 数组越界静默:
arr[10] := val当arr定义为ARRAY[0..9] OF INT,部分PLC固件不报错但写入相邻内存。
PLCSIM Advanced(以下简称PLCSIM ADV)是西门子官方推出的高保真PLC仿真器,它不是简单模拟指令执行,而是完整复刻S7-1500 CPU的运行时环境,包括:
- 精确的扫描周期调度(支持μs级定时器);
- 真实的地址空间映射(DB块、I/O映像区、优化/标准访问模式);
- ST编译器与目标CPU完全一致(TIA Portal V18编译的ST代码,在PLCSIM ADV中运行效果 = 实际S7-1500);
- 支持在线修改变量、强制位、触发断点——这是纯文本仿真器无法做到的。
因此,ST逻辑必须在PLCSIM ADV中完成闭环测试,而非跳过直连实物PLC。
二、环境准备:4项硬性前提
确保以下条件全部满足,否则后续步骤必然失败:
-
软件版本匹配:
- TIA Portal 版本 ≥ V16(推荐V18 SP1);
- PLCSIM Advanced 版本必须与TIA Portal主版本完全一致(例如TIA V18需配PLCSIM ADV V3.0);
- 检查方式:打开TIA Portal → 帮助 → 关于 → 查看“PLCSIM Advanced”条目版本号。
-
CPU型号锁定:
- 在TIA Portal中新建项目 → 添加设备 → 必须选择 "S7-1500" 系列具体型号(如
CPU 1516F-3 PN/DP),禁止选择 "S7-1500 (generic)" 或 S7-1200; - PLCSIM ADV仅支持S7-1500及S7-1500 Software Controller,其他型号无对应仿真内核。
- 在TIA Portal中新建项目 → 添加设备 → 必须选择 "S7-1500" 系列具体型号(如
-
许可证激活:
- 打开Windows开始菜单 → 启动 "Automation License Manager";
- 必须存在且已激活以下两个许可证:
PLCSIM Advanced Runtime(运行时授权);PLCSIM Advanced Engineering(工程授权,用于下载/调试)。
- 若显示“试用期剩余0天”,需购买正式许可或申请临时试用码。
-
网络配置隔离:
- 在Windows设置 → 网络和Internet → 更改适配器选项中,禁用所有物理网卡和VPN虚拟网卡;
- 仅保留
PLCSIM Advanced Ethernet Adapter(名称可能为Ethernet Adapter PLCSIM Advanced); - 右键该适配器 → 属性 → Internet协议版本4(TCP/IPv4)→ 手动设置IP:
- IP地址:
192.168.0.1 - 子网掩码:
255.255.255.0 - 网关/DNS:留空。
- IP地址:
⚠️ 注意:若跳过此步,TIA Portal将无法通过ISO-on-TCP协议连接到PLCSIM ADV实例,报错“无法建立与目标的连接”。
三、创建可测试的ST程序:3个强制规范
ST代码必须按以下规则编写,否则PLCSIM ADV无法正确加载或调试:
(1)主程序必须位于OB1中
- 禁止将核心逻辑写在FB/FC中却不调用;
- 必须在OB1中显式调用含ST逻辑的FB/FC,例如:
// OB1中 MyControlLogic( inTemp := #tempSensor, inSetpoint := #setpointDB.setVal, outValvePos => #valveOutput ); - 若逻辑直接写在OB1内,仍需保证变量全部声明为
VAR或VAR_GLOBAL,不可使用未声明标识符。
(2)所有外部变量必须通过接口传递
- 禁止在FB/FC内部直接读写全局DB块(如
DB1.DBW2 := 100;); - 必须通过输入/输出参数(
VAR_INPUT,VAR_OUTPUT)或IN_OUT参数(VAR_IN_OUT)传入; - 示例(正确):
FUNCTION_BLOCK MyPID VAR_INPUT sp : REAL; // 设定值 pv : REAL; // 过程值 en : BOOL; // 使能 END_VAR VAR_OUTPUT out : REAL; // 输出 END_VAR // 内部逻辑使用sp/pv/en/out,不碰DB
(3)避免未初始化变量依赖
- ST中未赋初值的
VAR变量,PLCSIM ADV初始值为0(数值)、FALSE(布尔)、空字符串(STRING),但不同CPU固件版本可能不同; - 强制做法:所有关键变量在声明时初始化,例如:
VAR lastError : INT := 0; isRunning : BOOL := FALSE; logBuffer : ARRAY[0..99] OF STRING[32] := ['']; END_VAR - 对于数组/结构体,使用
:= []清零(如myStruct := ();)。
四、PLCSIM Advanced启动与TIA Portal联机
步骤1:启动PLCSIM Advanced实例
- 打开Windows开始菜单 → 启动 "PLCSIM Advanced";
- 首次运行时弹出向导 → 选择 "Create a new instance" → 下一步;
- “Controller Type”下拉框中选择与TIA Portal中完全一致的CPU型号(如
CPU 1516F-3 PN/DP); - “Instance Name”建议命名为
SIM_1516F_Test(避免空格和特殊字符); - 点击“Finish”,等待状态栏显示 "Running" 且图标变绿。
步骤2:在TIA Portal中配置PLCSIM连接
- 在TIA Portal项目树中,展开“设备配置” → 双击“以太网接口”;
- 在“常规”选项卡中,将“IP协议”设为 "ISO-on-TCP"(非TCP/IP);
- 在“连接”选项卡中,点击“添加新连接” → 类型选 "PLCSIM Advanced";
- “远程端点”自动填充为
192.168.0.2(PLCSIM ADV默认监听此IP); - 点击“确定”保存。
步骤3:下载程序至仿真器
- 在项目树中右键CPU设备 → 选择 "下载到设备...";
- 在下载对话框中,勾选 "仅下载更改的块" 和 "保持运行中"(首次下载可不勾);
- 点击“开始下载”,等待进度条完成;
- 成功后,CPU状态灯在TIA Portal中显示为绿色(RUN),PLCSIM ADV界面显示“CPU: RUN”。
✅ 验证联机成功:在TIA Portal中打开“监视表”,添加任意一个DB中的变量,能实时看到数值变化即表示通信正常。
五、ST逻辑动态测试:5类必做验证
1. 单步执行与断点调试
- 在ST代码编辑器中,将光标置于某行代码(如
IF errorCount > 3 THEN),按F9设置断点; - 点击工具栏 "启动监视"(绿色三角形图标);
- 当执行流到达断点时自动暂停,此时可:
- 查看所有局部变量值(悬停变量名);
- 右键变量 → "强制值" 修改输入(如将
errorCount强制为4); - 按
F8单步执行,观察THEN分支是否进入; - 按
F5继续运行至下一断点。
2. 边界值压力测试
构造极端输入组合,验证逻辑鲁棒性:
| 测试场景 | 操作步骤 |
|---|---|
| 浮点临界值 | 在监视表中,将温度输入变量强制为 99.999, 100.0, 100.001,观察输出跳变是否符合预期 |
| 数组索引越界 | 强制循环计数器 i := 100,运行含 arr[i] := val 的代码,检查是否触发系统错误报警(需在CPU属性中启用“访问保护”) |
| 字符串长度溢出 | 向STRING[20]变量写入21字符,确认截断行为是否符合IEC标准(保留前20字符) |
3. 时序逻辑验证
使用PLCSIM ADV的“时间刻度”功能观测扫描周期行为:
- 点击PLCSIM ADV菜单栏 "View" → "Cycle Time Monitor";
- 运行程序后,观察“Cycle Time”曲线是否稳定(如恒定
2ms); - 若出现周期突增(如跳至
15ms),说明ST中存在阻塞操作(如未设超时的WAIT、大数组拷贝); - 结合TIA Portal的“诊断缓冲区”,定位耗时语句。
4. 故障注入测试
模拟真实异常,检验容错能力:
- 强制输入故障:在监视表中将传感器输入变量强制为
LREAL#-999.0(典型故障码); - 断开通信:在PLCSIM ADV界面点击“Stop Instance”,观察ST中
ORGANIZATION_BLOCK OB86(机架故障组织块)是否触发; - 电源波动:在TIA Portal中,右键CPU → “重置为出厂设置”,验证
OB100(启动组织块)能否正确初始化所有变量。
5. 数据持久化验证
测试掉电保持功能:
- 在DB块属性中,将某变量勾选 "Retain"(保持);
- 在PLCSIM ADV中点击“Stop Instance”;
- 重新启动实例并下载(不重启TIA Portal);
- 检查该变量值是否恢复为停止前的数值(而非初始值)。
六、常见失败原因与修复方案
| 现象 | 根本原因 | 解决方法 |
|---|---|---|
| 下载失败,提示"Connection refused" | PLCSIM ADV实例未运行,或IP配置错误 | 检查PLCSIM ADV状态是否为"Running";确认Windows只启用PLCSIM虚拟网卡且IP为192.168.0.1 |
| 断点不生效,代码直接跳过 | ST代码未编译进块,或OB1未调用该FB | 在项目树中右键FB → “编译”;检查OB1中是否有对该FB的调用语句 |
| 强制变量后值立即恢复 | 变量被其他逻辑覆盖(如FB内部又写回) | 在监视表中开启“强制”列,确认强制标志为绿色;或改用VAR_IN_OUT参数避免重复赋值 |
| 浮点运算结果与计算器不符 | 未使用REAL而误用INT参与运算 |
检查所有参与计算的变量类型,确保0.1 + 0.2中至少一个为REAL类型 |
| DB块数据不保持 | "Retain"属性未在CPU硬件配置中启用 | 在设备配置中双击CPU → "属性" → "常规" → 勾选"启用保持性存储器" |
七、自动化测试扩展(可选进阶)
当项目规模增大,手动测试效率低下时,可集成脚本实现批量验证:
使用TIA Portal Openness API自动触发测试
- 编写C#程序,引用
Siemens.Automation.TiaPortal.Openness.dll; - 通过API连接到运行中的TIA Portal;
- 控制PLCSIM ADV实例启停、下载程序、读写变量、记录日志;
- 示例伪代码:
var portal = new TiaPortal(TiaPortalMode.WithoutUserInterface); var project = portal.Projects.Open(@"C:\MyProject.ap18"); var plc = project.Devices.First(d => d.Name == "PLC_1"); plc.Download(); // 自动下载 var db = plc.Blocks.Find("DB_Test"); db.Variables["inputVal"].Write(150.0); // 自动写入 Thread.Sleep(100); // 等待1个扫描周期 var result = db.Variables["outputVal"].Read(); // 自动读取 Assert.AreEqual(100.0, result); // 自动断言
导出测试报告
- 在PLCSIM ADV中启用“诊断日志”:菜单栏 "File" → "Enable Diagnostic Logging";
- 运行测试后,日志文件生成路径为
%LOCALAPPDATA%\Siemens\PLCSIMAdvanced\Logs\; - 日志包含每毫秒的CPU周期、错误事件、变量变更记录,可导入Excel分析。
八、关键结论:ST测试的不可妥协原则
- 不跳过PLCSIM ADV:任何未经过PLCSIM ADV闭环验证的ST逻辑,都不允许下载至真实PLC;
- 不接受“应该没问题”:每个IF分支、每个FOR循环、每个函数调用,必须有对应测试用例覆盖;
- 不忽视时序维度:ST不是普通软件,其执行严格绑定扫描周期,必须测量实际cycle time;
- 不混淆仿真与调试:PLCSIM ADV用于验证功能正确性,真实PLC用于验证IO响应、抗干扰等物理层特性;
- 不放弃自动化:当测试用例超过20个,必须用Openness API构建回归测试套件,杜绝人为遗漏。

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