我们可以将相同的寄存器地址映射到MODBUS TCP IP

时间:2019-01-31 12:29:04

标签: c modbus-tcp

我正在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个寄存器来存储电压和电流吗?如果是,那么您对如何使用它有任何参考吗?]

如果有任何参考或示例代码,那么对我有帮助。

1 个答案:

答案 0 :(得分:1)

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

我认为master的{​​{1}}分支版本不能让您出于自己的目的访问从站地址字节,因此您可能必须修改库才能实现此目的。

这就是为什么最好为设备定义寄存器地址块的原因,例如将地址libmodbus10000用于设备1的电压和电流,1000110002用于设备2的电压和电流等。(或为设备和设备保留一些空间。对于设备1使用10003 / 10000之类的东西,对于设备2使用10001 / 10010等)

使用10011的{​​{1}}分支版本,您可以定义一个映射结构并运行一个循环函数,该函数读取值并将其放入寄存器映射存储器中。如果您已经具有包含所有值的内存映射结构,则可以使用此现有内存进行寄存器映射。在这种情况下,寄存器布局将与您现有的数据结构匹配。

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

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

我没有示例代码。