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 仿真变量:液位、温度、压力 脚本注入:故障、边界值 测试用例:自动序列 硬件I/O DI:急停、限位、按钮 DO:接触器、指示灯 AI/AO:4~20mA、0~10V 信号映射层 PLC地址 ↔ 仿真变量 量程换算:0~27648 有效电平/取反约定 数据类型与工程单位 映射表版本管理 PLC / 仿真控制器 输入映像区 I 输出映像区 Q 用户程序 OB/FB/FC 扫描周期 T_scan 过程映像刷新 写入 采集 映射 实时性约束:仿真步长 T_sim ≤ 扫描周期 T_scan / 2 高速脉冲/编码器信号建议走硬件I/O;慢变量可用虚拟I/O 数据流方向:虚拟/硬件输入 → 映射层 → PLC输入映像 → 程序运算 → 输出映像 → 映射层 → 虚拟/硬件输出

数据流路径与刷新机制

仿真环境的数据流通常遵循“采集—映射—运算—回写”的循环。以输入方向为例:虚拟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或专用仿真板卡。

除了步长,还要关注抖动和延迟。仿真环境运行在通用操作系统上时,调度抖动可能达到几毫秒到几十毫秒。如果联调对象对时序敏感,例如飞剪、追剪、多轴同步,就必须评估最坏情况下的延迟,必要时改用实时操作系统或硬件在环方案。

判断实时性是否达标的一个实用方法:在PLC程序中用一个高速计数器记录两次输入变化之间的扫描周期数,同时在仿真侧记录时间戳。若两者偏差稳定且小于允许误差,说明链路可用;若偏差随机跳动,则需要检查仿真步长、通信周期和操作系统调度。

联调中的典型问题与排查方向

当联调结果与预期不符时,可以按数据流路径逐段排查。先确认虚拟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各司其职,映射层负责翻译和约定,数据流路径决定刷新顺序,实时性要求约束步长和方案选择。把这四件事在联调前定义清楚,后续的调试效率会显著提高。