我们可以将相同的寄存器地址映射到MODBUS TCP IP中的多个从站吗

标签 c modbus-tcp

我正在c中开发MODBUS TCP/IP服务器。对于此开发,我使用 libmodbus (stephane) 库。如何为多个从机配置相同的寄存器地址。

基本上,我正在开发一个 MODBUS TCP/IP 网关。有 10 个相同类型的传感器连接到该网关。使用 MODBUS TCP/IP 客户端(基于 PC 的软件)配置此网关后。我想通过相同的寄存器地址读取所有这些参数的参数,例如所有传感器的 param-1 为 10000,param-2 为 10001。我们可以这样做吗?或者我们需要为所有传感器参数分配不同的寄存器?

说明: 基本上,支持 我有一台安装了 kepware 软件(MODBUS-TCP 客户端)的 PC。现在我们连接一台网关设备(MODBUS-TCP 服务器)。我们已通过有线连接将 10 台设备连接到此网关设备。现在根据我的理解,如果我想配置客户端,那么一种方法是为每个设备参数分配 10 个寄存器地址,例如设备 1 分配 10000,设备 2 分配 10001,依此类推。但如果所有设备都属于同一类别,那么我认为这是错误的开发方式。那么我们是否可以将每个设备分配为一个unic编号,并通过寄存器地址10000获取设备的参数值。如果可以的话,您能向我解释一下如何实现这一点吗?

[设备通过UART、I2C等方式连接到服务器,但所有设备的参数都是相同的电压、电流。那么,我可以只使用 2 个电压和电流寄存器吗?如果是,那么您有任何引用如何使用它吗?]

如果有任何引用或示例代码,那么它对我很有帮助。

最佳答案

理论上,Modbus/TCP 协议(protocol)包含一个从站地址字节。这适用于转发 Modbus/TCP 和 Modbus/RTU 之间通信的网关。它还可用于在单个 Modbus/TCP 从站中实现一些虚拟从站或不同的寄存器映射。例如,您可以使用从机地址 1 和寄存器地址 10000 来读取设备 1 的电压,从机地址 2 和寄存器地址10000 从设备 2 等读取电压。

我认为 libmodbusmaster 分支版本不允许您出于自己的目的访问从属地址字节,因此您可能必须修改该库以实现这个。

这就是为什么最好为您的设备定义寄存器地址 block ,例如使用地址 1000010001 表示设备 1 的电压和电流,使用 1000210003 表示设备的电压和电流2 等(或者为设备预留一些空间,并为设备 1 使用 10000/1000110010/10011 对于设备 2 等)

使用libmodbusmaster分支版本,您可以定义映射结构并运行循环函数来读取值并将它们放入寄存器映射内存中。如果您已经拥有包含所有值的内存映射结构,您可以使用此现有内存进行寄存器映射。在这种情况下,寄存器布局将与您现有的数据结构相匹配。

对于少量数据,循环轮询您的设备以将所有值复制到内存中的寄存器结构可能就足够了。

如果您使用添加回调支持的拉取请求,则可以实现仅在回复特定 Modbus 请求时从设备读取值或向设备写入值的回调函数。这可能更适合大型数据结构。

我没有可用的示例代码。

关于我们可以将相同的寄存器地址映射到MODBUS TCP IP中的多个从站吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54460623/

相关文章:

javascript - 如何将负二进制数转换为int?

python - 如何通过 TCP 使用 pymodbus 读取/写入连接到网关的设备寄存器

telnet - 通过 Internet 向 Modbus 设备发送查询

python - 多个服务器 pymodbus 连接问题 Modbus TCP

c - C语言在头文件中定义外部函数(模块)

c - 如何用变量画一条线

c - C语言从链表任意位置删除元素

c - 为什么调用 sbrk(0) 两次会给出不同的值?

c - 限制限定符编译错误

java - 使用 Java 实现 TCP 上的 ModBus