文章目录

ST仿真测试:使用PLCSIM Advanced测试ST逻辑的方法

发布于 2026-03-19 06:59:11 · 浏览 7 次 · 评论 0 条

ST仿真测试:使用PLCSIM Advanced测试ST逻辑的方法


一、明确目标:为什么必须用PLCSIM Advanced测ST逻辑

ST(Structured Text)是IEC 61131-3标准定义的高级文本编程语言,语法类似Pascal,支持条件判断、循环、函数调用、数组操作和复杂表达式。在实际项目中,ST常用于实现PID控制算法、运动轨迹计算、配方管理、报警逻辑聚合等关键功能。这些逻辑一旦出错,轻则设备停机,重则引发安全风险。

但仅靠代码静态检查或在线监控无法暴露全部问题:

  • 边界值失效IF temp > 100.0 THEN ...temp = 99.999temp = 100.001 时行为是否一致?
  • 浮点精度陷阱IF (a * b) = c THEN ...a=0.1, b=0.2, c=0.3 会因IEEE 754舍入导致判断失败;
  • 时序耦合缺陷:某ST函数块在第1个扫描周期输出未初始化,被另一模块误读为有效信号;
  • 数组越界静默arr[10] := valarr 定义为 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项硬性前提

确保以下条件全部满足,否则后续步骤必然失败:

  1. 软件版本匹配

    • TIA Portal 版本 ≥ V16(推荐V18 SP1);
    • PLCSIM Advanced 版本必须与TIA Portal主版本完全一致(例如TIA V18需配PLCSIM ADV V3.0);
    • 检查方式:打开TIA Portal → 帮助 → 关于 → 查看“PLCSIM Advanced”条目版本号。
  2. CPU型号锁定

    • 在TIA Portal中新建项目 → 添加设备 → 必须选择 "S7-1500" 系列具体型号(如 CPU 1516F-3 PN/DP),禁止选择 "S7-1500 (generic)" 或 S7-1200
    • PLCSIM ADV仅支持S7-1500及S7-1500 Software Controller,其他型号无对应仿真内核。
  3. 许可证激活

    • 打开Windows开始菜单 → 启动 "Automation License Manager";
    • 必须存在且已激活以下两个许可证:
      • PLCSIM Advanced Runtime(运行时授权);
      • PLCSIM Advanced Engineering(工程授权,用于下载/调试)。
    • 若显示“试用期剩余0天”,需购买正式许可或申请临时试用码。
  4. 网络配置隔离

    • 在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:留空。

⚠️ 注意:若跳过此步,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内,仍需保证变量全部声明为VARVAR_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构建回归测试套件,杜绝人为遗漏。

评论 (0)

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

扫一扫,手机查看

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