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