我在c中的MODBUS TCP/IP服务器上工作。对于这个开发,我使用libmodbus (stephane)库。如何为多个从机配置相同的寄存器地址。
基本上,我正在开发一个MODBUS TCP/IP网关。有10个相同类型的传感器连接到此网关。在使用MODBUS TCP/IP客户端(基于PC的软件)配置此网关之后。我想通过相同的寄存器地址来读取所有这些参数的参数,例如所有传感器的参数-1的寄存器地址为10000,参数-2的寄存器地址为10001。我们可以这样做吗?或者我们需要为所有的传感器参数分配一个不同的寄存器?
说明:基本上,支持我有一台PC上安装了kepware软件(MODBUS-TCP客户端)。现在我们连接一个网关设备(MODBUS-TCP服务器)。我们已通过有线连接将10台设备连接到此网关设备。现在,根据我的理解,如果我想配置客户端,那么一种方法是为每个设备参数分配10个寄存器地址,如10000用于device-1,10001用于device-2,依此类推。但如果所有设备都属于同一类别,那么我认为这是错误的开发方式。因此,我们是否可以将每个设备分配为一个unic编号,并通过寄存器地址10000获取设备的参数值。如果这是可能的,那么你可以向我解释如何实现这一点。
设备通过串口、I2C等方式与服务器相连,但所有设备的参数均为电压、电流。那么,我可以只使用2个寄存器来表示电压和电流吗?如果是,那么你有任何参考资料如何使用它吗?
如果有任何参考或示例代码,那么它对我很有帮助。
发布于 2019-02-01 21:52:30
理论上,Modbus/TCP协议包含一个从属地址字节。这适用于在Modbus/TCP和Modbus/RTU之间转发通信的网关。它还可用于在单个Modbus/TCP从机中实现一些虚拟从机或不同的寄存器映射。因此,例如,可以使用带有寄存器地址10000
的从机地址1
读取器件1的电压,使用带有寄存器地址10000
的从机地址2
读取器件2的电压,等等。
我认为libmodbus
的master
分支版本没有为您自己的目的提供访问从属地址字节的权限,因此您可能必须修改该库来实现这一点。
这就是为什么最好为您的设备定义寄存器地址块,例如,使用地址10000
和10001
表示设备1的电压和电流,使用地址10002
和10003
表示设备2的电压和电流等(或者为设备保留一些空间,并使用类似于设备1的10000
/10001
,设备2的10010
/10011
等)。
使用libmodbus
的master
分支版本,您可以定义一个映射结构,并运行一个循环函数来读取值并将它们放入寄存器映射内存中。如果您已经有了一个包含所有值的内存映射结构,那么您也许能够将此现有内存用于您的寄存器映射。在这种情况下,寄存器布局将与您现有的数据结构匹配。
循环轮询您的设备以将所有值复制到内存中的寄存器结构可能足以处理少量数据。
如果使用添加回调支持的pull请求,则可以实现仅在回复特定Modbus请求时才从设备读取或向设备写入值的回调函数。这可能更适合大型数据结构。
我没有可用的示例代码。
https://stackoverflow.com/questions/54460623
复制相似问题