跳转到内容

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 联动。工程关系示意。

先以教学 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 生成的程序将这些调用组织成完整流程,并处理返回结果与任务收尾。

采集程序首先确认模块地址,再按资源名读取,最后把持续轮询交给 BMCLI。下面分别说明这三个环节。

程序先用原始读取核对从站地址、响应长度和寄存器数值,再按 Profile 换算为温度等工程值。

Terminal window
# 读取原始保持寄存器,核对从站地址、返回长度与原始值。
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

程序加载 Profile 后,按资源名读取温度。寄存器的类型、缩放和单位由 BMCLI 解释,页面可以直接使用工程值。

Terminal window
# 加载数据库并登记资源名,供后续解析或协议操作复用。
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

程序创建 500 ms 轮询任务,再读取最新值和历史记录供页面显示。页面的更新时间与质量提示来自这些返回值,轮询本身无需在浏览器中实现。

Terminal window
# 创建 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。

要让页面控制输出,应用仍然按资源名调用 BMCLI。例如下面把教学从站的 Enable 线圈设为 true;这个字段在 Profile 中声明为可读写,因此 BMCLI 会写入并读回。页面分别显示请求值、通信结果和读回值,换成实际继电器时,再按模块接线接入独立反馈。

Terminal window
# 向无实际负载的教学从站写 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

将教学线圈的交互方式用于低压台架时,先按模块说明确认输出含义、掉线策略和负载条件,再通过读回值和实际输出检查动作。

设备手册中的 40001 一类地址,常常是显示编号,BMCLI 使用从零开始的协议地址。把手册地址和协议地址列成对照表,通常能省去不少初次调试时间。

建立 TCP 连接后,再用一次资源读取确认 Unit ID;涉及写入时,保留目标值与读回值。组合写入可能部分完成,响应异常后先确认设备当前值,再决定下一步处理。

进一步探索:让工业 I/O 与汽车总线联动

Section titled “进一步探索:让工业 I/O 与汽车总线联动”

这个案例还可以继续完善,也可以延伸到更多工作中。您可以从感兴趣的一项出发,与 AI 讨论下一步的实现。

可以请 AI 将 ECU 的 CAN 信号与 Modbus 温度、电压资源放到同一页面,统一显示工程单位和数据更新时间。BMCLI 分别承担总线解码与模块轮询,应用按观测时间组织曲线,同时标明不同采样节拍和过期数据。再把工况切换标在图上,就能观察控制器状态与外部物理量之间的关系。这个扩展通常只需要现成采集模块与配置,能够补上单看 ECU 报文时缺少的实验信息。

如果台架已有 Modbus 继电器模块,可以结合统一信号网关,将已确认的 CAN 请求映射到相应输出资源。参考做法是先定义信号含义、有效期和失效时的输出策略,再在低压隔离台架上验证请求、写入与反馈之间的对应关系。模块返回写入成功只代表通信完成,实际触点或负载状态可由独立反馈输入确认并显示。这样,CAN 工况与通用工业模块便能组成一套看得见输入、输出和结果的实验。涉及设备保护的联锁仍由台架的独立保护回路承担。

以下文档介绍本篇涉及的接口;具体参数可通过本机 JSON Help 查询。

下载本篇配套示例 ZIP


上一篇 · 系列目录 · 下一篇