raspberry-pi - 使用节点 red 模拟多个 modbus 从设备
问题描述
我已经设法在我的树莓派上使用节点红色模拟单个从设备,使用函数将数据随机值发送到 Modbus flex 服务器。但是,现在我希望能够在端口号上模拟多个 Modbus 从设备,但我不确定如何执行此操作。
我尝试创建另一个具有相同端口号的 Modbus flex 服务器,但这会导致整个 node-red 应用程序在部署时崩溃。其次,我尝试使用不同的 Modbus flex-write 节点来模拟不同的从设备,但我不确定这是否正确,如果是,我将如何将它们配置为不同的从设备。这是因为到目前为止,我的树莓派显示为奴隶 1,但我不确定这是从哪里来的。我猜这与 Modbus flex-server 的 unit-id 有关,但是当我将 unit-id 更改为不同的数字并将该数字输入为主地址时,它表示没有连接。
总之,是否可以使用单个树莓派来使用 node-red-contrib-modbus 在 node-red 上模拟多个从设备,如果可以,你怎么做?
解决方案
Modbus TCP 中从站的概念与Modbus TCP 规范中规定的 RTP 有所不同:
通常在 MODBUS 串行线路上使用的 MODBUS“从地址”字段被 MBAP 报头中的单字节“单元标识符”替换。“单元标识符”用于通过使用单个 IP 地址支持多个独立 MODBUS 终端单元的网桥、路由器和网关等设备进行通信。
因此,Modbus RTP 和 TCP 在术语上存在差异,并且该字段的预期用途也存在差异。该规范建议的解决方案是在不同的端口上设置多个服务器(您不能在单个端口上运行多个服务器)。
话虽如此,一些 TCP->RTP 网关(和其他设备)使用 unitid 作为从 ID,所以我假设您正在尝试模拟这样的事情?
Modbus Flex Server
第一个问题是( reported ) 中似乎存在一个错误,即当您更改 unit-id 时,它被存储为字符串而不是数字。如果您导出流程,您将看到类似的内容"unitId": "3",
;将其更改为"unitId": 3,
(3 周围没有引号)并导入修复了问题(因此这可能解释了为什么您无法使其正常工作)。
话虽如此,更改unit-id
类似这样对您没有帮助,因为它只支持一个 ID。但是,如果您将其设置unit-id
为 255,那么它将侦听所有单元 ID(这是内部使用的modbus-serial模块的一个功能)。请记住,由于该错误,您当前需要手动修复配置以使其正常工作。
完成此操作后,您可以执行以下操作来响应对不同单元 ID 的请求(该示例将返回所有地址的单元 ID(1 或 2),因此没有用,但显示了概念):
推荐阅读
- javascript - 运行测试 TypeError 后的 Jest+Puppeteer:无法读取未定义的属性“waitForSelector”
- php - php会话:来自同一客户端的多个会话
- .htaccess - 如何编写用于将不存在的页面重定向到 404 页面的 htaccess 重写规则
- angular8 - RROR 错误:找不到带有路径的控件:'IncomeList -> 已验证'
- python - 将 python o/p 导入到 ms 访问时出错
- python - Pandas:错误可能是由于使用多字符分隔符时忽略引号引起的
- javascript - 从 php 代码中的 php 变量定义 javascript 变量
- sql-server - 用于报告的 SQL Server 过程
- sql - SQL 显示每个类
- android - Android:带有形状的淡入/淡出会产生白色闪光