不依赖物理设备的协议演练:模拟器的设计与边界
没有设备时,返回几组随机 JSON 很容易,却跳过了连接、协议解析和读取过程。我在工业系统中加入可选的协议模拟器,让采集端通过真实软件协议读取虚拟点位,用于开发、演示和问题复现。
更新于 2026-09-09。依据模拟器设计、实现说明及 2026-09-07 运行记录整理;当前模拟范围为 Modbus 和 OPC UA,不覆盖 S7/MC 服务端模拟。
为什么采用同进程回环连接
模拟器与采集端可在同一 JVM 内运行:模拟端监听本地端口,采集端按普通设备配置连接回环地址。
ValueGenerator → 模拟点位存储 → Modbus / OPC UA 服务端
↑ 协议请求与响应
采集 Session → Handler
↓
规则、存储、页面
这样可以验证连接、协议编码与解码,以及数据进入后续处理的过程。它不依赖外部物理设备,但仍依赖本地 TCP/IP、端口和协议服务,不应称为“零网络依赖”。
同进程简化了部署,也让模拟与采集共享 CPU 和内存。它适合功能演练,不适合直接推导分布式网络延迟、设备处理能力或生产环境的故障隔离。
协议层与数据生成层分开
模拟器通过点位存储连接两类工作:协议层负责响应读写,生成层负责更新值。波形不需要知道值最终通过 Modbus 还是 OPC UA 被读取。
| 生成方式 | 适合验证的问题 |
|---|---|
| constant | 固定值、类型和缩放基准 |
| counter | 连续采集、回绕和变化检测 |
| sine | 趋势显示与采样关系 |
| square | 布尔状态与阈值切换 |
| random | 波动、边界和异常样例 |
| ramp | 渐变与周期复位 |
随机数据适合演示,但复现问题更适合固定值或可重复序列。生成周期与采集周期也不是同一个概念:1000 个点每秒更新一次,是每秒约 1000 次点位更新;若每个点每毫秒更新一次,则数量级完全不同。不能用混淆的单位论证单线程一定足够。
为什么只做两类协议
项目选择了与当前依赖和开发范围匹配的 Modbus、OPC UA 服务端方案。这能先验证寄存器、节点、类型与软件链路,而不用同时维护四套服务端实现。
这是一项范围取舍,不是“其他协议不存在模拟工具”的行业结论。需要测试 S7 或 MC 时,应使用对应工具或真实设备,并把结果与已有模拟演练分开记录。
配置模型区分端点、设备和点位
端点定义监听与协议服务,设备定义可管理的虚拟单元,点位定义地址、类型和生成方式。Modbus 多站号共享端点与独立端口是不同拓扑,不能简单把设备数当成监听端口数。
项目的一键镜像尝试从已有连接与模板派生模拟配置,减少两边手工对齐。它仍需检查协议范围、地址冲突和回环限制;自动生成了配置,不代表业务数据已经正确匹配。
运行开关与配置来源也应分开:模拟器是否启动,不应决定数据库中的模拟配置能否维护。YAML/DB 解决存储位置,模拟器开关解决是否运行。
手动写值为什么要冻结生成器
如果生成器每秒更新温度,手动写入一个测试值后,下个周期就会覆盖它。用户很难观察规则是否触发。
当前设计在手动写值时将点位标记为 frozen,生成器跳过该点位;恢复后再继续波形。采集端始终读取同一个点位存储,不需要知道值来自人工还是生成器。
这个功能适合构造“超限保持一段时间再恢复”的可控输入。它不能代替完整告警验收:还要分别观察规则判断、事件生成、通知结果与恢复记录。
模拟器 ID 不等于采集设备 ID
这是 3D 大屏联调中很具体的一次纠偏。运行记录里的关系是:
模拟器 SIM-WATER
→ sourceDeviceId = MODBUS-WATER(连接)
→ usage.templates = T-MODBUS-WATER
→ 采集指标 deviceId = T-MODBUS-WATER
不能靠添加或删除 T- 猜关联。一个连接还可能有多个模板,因此统计与模型选择需要使用明确映射。该轮有 11 个运行模拟器,但有效采集设备为 10 台,两个数字并不矛盾。
这也解释了为什么 3D 场景要以采集侧 ID 绑定数据,而不是给每个模拟器都画成“在线采集设备”。
已有运行记录与未覆盖范围
2026-09-07 的记录确认:10 台采集设备有 Modbus 或 OPC UA 模拟来源,点位持续变化,部分近期 MySQL 数据可查,并观察到采集与存储 WS 事件。
当时 MQTT 未启用,没有进行主动改值触发告警、断线重连全程和长期性能验证。因此可以说“模拟设备驱动的实际软件采集链路”,不能说所有输出和异常路径已经验收。
接口的调试便利也不是公开部署的授权策略。模拟器涉及启停与改值,应按演示环境边界管理,不能因为与主程序风格一致就默认开放。
实现入口包括模拟器 Registry、点位存储、生成器与镜像服务。它们为规则引擎、历史查询和系统展示提供了可控输入;物理设备兼容性仍需要单独验证。