Modbus 扩展:把通用工业采集与控制模块接入汽车实验台
通过 BMCLI,通用 Modbus 采集与控制模块也能接入汽车实验台,与 CAN/CAN FD 设备一起工作。本篇从模块资源读写开始,再探索如何把这些现成的工业模块用于同屏观察与跨总线联动。
例如,在一款电池控制器的联调工作中,CAN/CAN FD 数据已经能看了,台架却还缺几样东西:壳体温度、辅助电压采集,以及风扇或测试负载的开关控制。为这些辅助量单独开发一块 CAN 采集板,未必是最省事的办法。
给台架补一个温度输入或低压继电器输出,往往可以先看看现成模块。工业领域已有大量采用 Modbus RTU/RS-485 或 Modbus TCP 的温度采集、模拟量输入和继电器模块。在淘宝等常见采购渠道找到符合条件的成品后,就能把精力放在系统本身,而不必再为一个辅助温度量或开关量设计电路、开发固件和约定私有协议。通用模块的成本优势来自复用;具体量程、隔离、精度和质量仍按项目要求核对。
把它们接入 BMCLI,就可以让工业 I/O 与汽车总线共用一套采集、展示和自动化流程。这正是支持 Modbus 的意义:把现成模块的生态接进实验室,而不只是增加一个协议名称。
例如,电脑通过 BUSMUST 分析仪接控制器 CAN/CAN FD,通过合适的 RS-485 接口接温度和继电器模块。页面同时显示 ECU 报文、温度、电压与开关状态。辅助 I/O 采用合适的通用模块,高压测量与保护仍采用符合台架要求的专用设备,各自承担适合的工作。
BMCLI 负责 Modbus 事务、资源转换与轮询,AI 根据模块手册和您的操作需求生成应用。接线、串口参数、站号与寄存器含义可以整理到同一份设备配置中,让第一次接入也有清楚的检查路径。
图 11-1 先接入资源,再扩展同屏观察与 CAN 联动。工程关系示意。
给 AI 的输入:描述采集工具
Section titled “给 AI 的输入:描述采集工具”先以教学 TCP 从站作为明确输入:准备 tutorial-modbus-profile.yaml,并启动符合该定义的从站,地址为 127.0.0.1:15020、Unit ID 为 1。本次先做 Modbus 采集,并用教学线圈演示写入与读回;接入 ECU 信号和真实继电器联动放在扩展部分。
我要先做一个 Modbus 模块采集工具,请使用 BMCLI 作为后端。我已准备 tutorial-modbus-profile.yaml,并在 127.0.0.1:15020 启动匹配的教学 TCP 从站,Unit ID 为 1。请检查 Profile 的地址、类型、比例和单位,读取资源清单及初始值,然后每 500 ms 采集一次 Temperature,将 1500 ms 未更新的值标为过期。请生成本地页面,展示温度、最近历史、数据质量和更新时间,并提供启动、停止入口。另设一个操作区,只允许将教学从站的 Enable 线圈写为 true 或 false,显示目标值与读回值。请验证从站正常响应、停止响应和恢复响应时的显示,交付采集程序、页面与简短检查报告。本次写入仅限这个没有连接真实负载的教学从站,不控制实际继电器,也不接入 CAN 联动。
AI 会检查 Profile,读取教学从站响应,再创建轮询任务并生成展示页面。随文 Profile 和设备清单描述了寄存器布局;运行时需要准备符合这些定义的从站。这个 TCP 示例无需 CAN 分析仪,也适合先在开发机上熟悉接口。
成品与效果:看看转换后的数据
Section titled “成品与效果:看看转换后的数据”这段提示词让 AI 生成资源采集程序、教学线圈操作页面和简短检查报告。随文 Profile 定义了资源转换规则,下面以教学 TCP 从站的数据说明页面如何呈现工程值。
先用教学 TCP 从站熟悉数据转换,再接入台架设备。本篇示例端点为 127.0.0.1:15020,Unit ID 为 1,资源值如下:
| 资源 | 地址与类型 | 显示结果 |
|---|---|---|
| Temperature | Holding 0,Uint16 × 0.1 | 1234 → 123.4 ℃ |
| Setpoint | Holding 2,Uint16 | 321 count |
| Enable | Coil 1,Bool | true |
| InputOnly | Input 0,Uint16 | 300 raw |
| Mode | Holding 3,带枚举 | 1 → On |
这些结果是 BMCLI 提供给页面的数据,已经具有名称和单位。更有价值的是,它还能表达更新状态:
| 实验阶段 | 样本结果 |
|---|---|
| 从站正常响应 | 温度值,quality=good |
| 从站停止响应 | 记录读取错误,quality=bad |
| 从站恢复,原始值为 250 | 25 ℃,quality=good |
这样,断线前的最后一个值可以留作参考,同时明确显示它是否仍然有效。
实现解析:BMCLI 在成品中承担的工作
Section titled “实现解析:BMCLI 在成品中承担的工作”下面结合关键调用说明应用的实现方式。AI 生成的程序将这些调用组织成完整流程,并处理返回结果与任务收尾。
采集程序怎样取得工程值
Section titled “采集程序怎样取得工程值”采集程序首先确认模块地址,再按资源名读取,最后把持续轮询交给 BMCLI。下面分别说明这三个环节。
确认原始寄存器
Section titled “确认原始寄存器”程序先用原始读取核对从站地址、响应长度和寄存器数值,再按 Profile 换算为温度等工程值。
# 读取原始保持寄存器,核对从站地址、返回长度与原始值。bmcli modbus read --transport=tcp --host=127.0.0.1 --tcp-port=15020 ` --unit-id=1 --table=holding-registers --address=0 --count=2 ` --format=json将地址解释成 Temperature
Section titled “将地址解释成 Temperature”程序加载 Profile 后,按资源名读取温度。寄存器的类型、缩放和单位由 BMCLI 解释,页面可以直接使用工程值。
# 加载数据库并登记资源名,供后续解析或协议操作复用。bmcli database load --file=tutorial-modbus-profile.yaml ` --name=tutorial-modbus --type=modbus-edgex# 列出 Profile 中的资源名称与类型。bmcli modbus resource list --database=tutorial-modbus --format=json# 按 Temperature 资源读取,直接取得转换后的温度。bmcli modbus resource read --database=tutorial-modbus ` --resource=Temperature --transport=tcp --host=127.0.0.1 ` --tcp-port=15020 --unit-id=1 --format=json持续采集并向页面供数
Section titled “持续采集并向页面供数”程序创建 500 ms 轮询任务,再读取最新值和历史记录供页面显示。页面的更新时间与质量提示来自这些返回值,轮询本身无需在浏览器中实现。
# 创建 500 ms 轮询任务,设置 1500 ms 的过期判断时间。bmcli modbus poll start --job=tutorial-temperature --interval=500 ` --stale-after=1500 --database=tutorial-modbus --resource=Temperature ` --transport=tcp --host=127.0.0.1 --tcp-port=15020 --unit-id=1 --format=json# 取得最近一次资源样本及其时间与质量。bmcli modbus value latest --job=tutorial-temperature --format=json# 从指定序号之后读取历史记录,供曲线增量更新。bmcli modbus value history --job=tutorial-temperature ` --after=0 --count=100 --format=json轮询由 daemon 持续执行,每条结果带有序号、时间和质量。本例保留有界历史,客户端按 sequence 读取新增记录;需要更长时间的数据时,可以将结果继续保存到文件或数据库。
Profile 还可以定义 Snapshot 等组合命令,一次调用返回多个资源,便于组织设备状态。
后台轮询由 daemon 持有。先准备 daemon,再启动指定 job;modbus value latest/history 读取该 job 的采样结果,结束时停止本次创建的 job。
从读取资源到操作输出
Section titled “从读取资源到操作输出”要让页面控制输出,应用仍然按资源名调用 BMCLI。例如下面把教学从站的 Enable 线圈设为 true;这个字段在 Profile 中声明为可读写,因此 BMCLI 会写入并读回。页面分别显示请求值、通信结果和读回值,换成实际继电器时,再按模块接线接入独立反馈。
# 向无实际负载的教学从站写 Enable=true,并读回可读写资源。bmcli modbus resource write --database=tutorial-modbus ` --resource=Enable --value=true --transport=tcp --host=127.0.0.1 ` --tcp-port=15020 --unit-id=1 --format=json将教学线圈的交互方式用于低压台架时,先按模块说明确认输出含义、掉线策略和负载条件,再通过读回值和实际输出检查动作。
接到实际设备时
Section titled “接到实际设备时”设备手册中的 40001 一类地址,常常是显示编号,BMCLI 使用从零开始的协议地址。把手册地址和协议地址列成对照表,通常能省去不少初次调试时间。
建立 TCP 连接后,再用一次资源读取确认 Unit ID;涉及写入时,保留目标值与读回值。组合写入可能部分完成,响应异常后先确认设备当前值,再决定下一步处理。
进一步探索:让工业 I/O 与汽车总线联动
Section titled “进一步探索:让工业 I/O 与汽车总线联动”这个案例还可以继续完善,也可以延伸到更多工作中。您可以从感兴趣的一项出发,与 AI 讨论下一步的实现。
把外部测量加入同一张工况图
Section titled “把外部测量加入同一张工况图”可以请 AI 将 ECU 的 CAN 信号与 Modbus 温度、电压资源放到同一页面,统一显示工程单位和数据更新时间。BMCLI 分别承担总线解码与模块轮询,应用按观测时间组织曲线,同时标明不同采样节拍和过期数据。再把工况切换标在图上,就能观察控制器状态与外部物理量之间的关系。这个扩展通常只需要现成采集模块与配置,能够补上单看 ECU 报文时缺少的实验信息。
用 CAN 工况请求驱动低压负载
Section titled “用 CAN 工况请求驱动低压负载”如果台架已有 Modbus 继电器模块,可以结合统一信号网关,将已确认的 CAN 请求映射到相应输出资源。参考做法是先定义信号含义、有效期和失效时的输出策略,再在低压隔离台架上验证请求、写入与反馈之间的对应关系。模块返回写入成功只代表通信完成,实际触点或负载状态可由独立反馈输入确认并显示。这样,CAN 工况与通用工业模块便能组成一套看得见输入、输出和结果的实验。涉及设备保护的联锁仍由台架的独立保护回路承担。
以下文档介绍本篇涉及的接口;具体参数可通过本机 JSON Help 查询。