2. 仿真环境I/O体系结构
在PLC联调工程中,仿真环境并不是“把程序跑起来”这么简单。真正决定联调能否顺利推进的,是I/O体系结构是否清晰:哪些信号是虚拟的、哪些来自真实硬件、它们在哪里完成映射、数据沿什么路径流动、以及整条链路能否满足实时性要求。理解这五个问题,才能避免“程序逻辑正确但联调结果不对”的常见困境。
虚拟I/O与硬件I/O的分工
虚拟I/O是仿真环境内部生成的信号,它不经过物理端子,而是由仿真模型、脚本或测试用例直接写入和读取。例如在仿真PLC中,可以用一个内部变量模拟“料仓满”开关量,用斜坡函数模拟“温度变送器”的4~20 mA对应值。虚拟I/O的优点是可控、可重复、可注入故障,适合验证逻辑分支和边界条件。
硬件I/O则是真实存在的物理通道,包括数字量输入/输出模块、模拟量输入/输出模块、通信接口等。硬件I/O的价值在于验证电气特性、接线正确性、信号调理和真实执行机构的响应。联调时,通常需要把一部分信号保留为硬件I/O,另一部分用虚拟I/O替代,形成“半实物仿真”结构。
两者不是替代关系,而是互补关系。一个典型的联调策略是:对安全相关的急停、限位等信号使用硬件I/O,确保真实回路有效;对温度、压力等慢变量使用虚拟I/O,便于快速构造工况;对高速计数或脉冲信号,则根据仿真步长决定是否必须走硬件。
信号映射:从物理地址到仿真变量
信号映射是I/O体系结构的核心环节。PLC程序中的I/O地址(如I0.0、Q0.1、IW64、QW80)必须与仿真环境中的变量建立一一对应关系。映射表通常包含以下字段:PLC地址、信号名称、方向、数据类型、量程、工程单位、仿真变量名、硬件通道号、备注。
以模拟量为例,假设PLC的模拟量输入模块量程为0~10 V,对应数字量0~27648。若仿真变量“水箱液位”用百分比表示,则映射关系为:液位0%对应数字量0,液位100%对应数字量27648。仿真环境写入液位值后,需要按此比例换算成原始数字量,再写入PLC的输入映像区。反向读取时则做逆变换。这个换算关系必须在映射表中明确,否则会出现“仿真显示50%,PLC读到13824”却无法判断对错的情况。
数字量映射相对简单,但要注意有效电平定义。例如急停按钮通常为常闭触点,PLC输入为1表示正常、0表示急停。仿真变量若用“急停按下=1”表示,就必须在映射时取反,否则逻辑会完全相反。这类约定应在映射表备注中写清楚,并在全文和图示中保持一致。
数据流路径与刷新机制
仿真环境的数据流通常遵循“采集—映射—运算—回写”的循环。以输入方向为例:虚拟I/O或硬件I/O产生原始值,映射层将其转换为PLC可识别的数据格式,写入PLC的输入映像区;PLC在扫描周期开始时读取输入映像区,执行用户程序,更新输出映像区;映射层再把输出映像区的内容转换后写回虚拟I/O或硬件输出通道。
这里有一个容易被忽视的细节:过程映像区的刷新时机。大多数PLC在扫描周期的固定阶段刷新输入映像和输出映像,而不是每个指令都直接访问物理I/O。仿真环境如果绕过映像区直接读写物理地址,就可能出现“程序读到的值”和“仿真显示的值”不一致。因此,联调时应明确仿真接口是操作映像区还是操作物理通道,并在映射表中标注。
对于分布式I/O或远程I/O,数据流还要经过通信链路。例如PROFINET或EtherCAT从站的数据,需要经过网络周期刷新。仿真环境若通过通信接口读写这些从站,就必须考虑通信周期和抖动,不能假设数据是瞬时到达的。
实时性要求与步长选择
实时性是仿真联调中最容易出问题的环节。仿真步长T_sim表示仿真环境更新一次I/O数据的时间间隔,PLC扫描周期T_scan表示PLC完成一次程序循环的时间。如果T_sim大于T_scan,PLC可能会连续多次读到同一个旧值,导致逻辑判断滞后;如果T_sim远小于T_scan,又可能造成仿真环境空转、资源浪费。
工程上通常建议T_sim ≤ T_scan / 2,即仿真更新速度至少是PLC扫描速度的两倍,以保证每个扫描周期都能看到相对新鲜的数据。对于高速计数、脉冲输出、编码器位置等信号,T_sim可能需要达到1 ms甚至更小,此时虚拟I/O往往无法满足,必须使用硬件I/O或专用仿真板卡。
除了步长,还要关注抖动和延迟。仿真环境运行在通用操作系统上时,调度抖动可能达到几毫秒到几十毫秒。如果联调对象对时序敏感,例如飞剪、追剪、多轴同步,就必须评估最坏情况下的延迟,必要时改用实时操作系统或硬件在环方案。
联调中的典型问题与排查方向
当联调结果与预期不符时,可以按数据流路径逐段排查。先确认虚拟I/O或硬件I/O的原始值是否正确;再检查映射层的量程换算和取反约定;然后确认PLC输入映像区是否刷新;最后检查输出回写是否到达执行机构。每一段都可以用强制变量、监视表或示波器工具观察。
例如,仿真显示液位为60%,PLC读到IW64=16589,而程序判断“液位高于50%”却未动作。此时应检查:16589对应的百分比是否为60%(27648×0.6≈16589,说明换算正确);程序比较的是否为IW64;比较指令是否在正确的OB中执行;输入映像区是否在比较前已刷新。逐项排除后,问题往往落在映像区刷新或程序块调用条件上。
另一个常见问题是数字量取反遗漏。急停按钮常闭触点在硬件上为1,仿真变量若定义为“按下=1”,映射时未取反,PLC就会把正常状态误判为急停。这类问题在映射表中增加“有效电平”字段即可提前避免。
映射表示例
下面给出一份可直接参考的映射表结构,字段根据实际项目增减。示例参数属于教学假设,不是实测数据。
| PLC地址 | 信号名称 | 方向 | 类型 | 量程/有效电平 | 仿真变量 | 硬件通道 | 备注 |
|---|---|---|---|---|---|---|---|
| I0.0 | 急停按钮 | 输入 | BOOL | 1=正常,0=急停 | EStop_NC | DI0 | 常闭,映射时取反 |
| I0.1 | 料仓满 | 输入 | BOOL | 1=满 | Bin_Full | DI1 | 虚拟/硬件可切换 |
| IW64 | 水箱液位 | 输入 | INT | 0~27648 ↔ 0~100% | Level_Pct | AI0 | 线性换算 |
| QW80 | 变频器频率 | 输出 | INT | 0~27648 ↔ 0~50 Hz | VFD_Freq | AO0 | 输出回写 |
| Q0.0 | 运行指示灯 | 输出 | BOOL | 1=亮 | Run_Lamp | DO0 | 直接映射 |
映射表不是一次写完就固定不变的。随着联调推进,信号方向、量程、取反约定都可能调整,因此需要版本管理。每次修改后,应同步更新仿真变量定义和PLC程序中的地址引用,避免“表里改了、程序没改”的隐性错误。
总结来看,仿真环境I/O体系结构的核心是“分层清晰、映射明确、路径可追踪、实时性可验证”。虚拟I/O和硬件I/O各司其职,映射层负责翻译和约定,数据流路径决定刷新顺序,实时性要求约束步长和方案选择。把这四件事在联调前定义清楚,后续的调试效率会显著提高。