有人知道可以自动设置modbus地址的方案吗?在我的情况下
我知道这是一篇古老的帖子,但是我只是遇到这个帖子,以为我会给我的答案,以防万一有人试图现在或将来这样做。如果目标是为新的从属分配一个从ID(并且您正在为从设备开发固件),则可以将ID存储在保存寄存器中,您可以将新ID编写为。这确实需要:
- 您已经知道ID。也许所有新的奴隶都有一个默认ID,例如ID = 1,所以您会事先知道ID。
- 您一次只能添加一个从属,必须更改ID,然后再向网络添加另一个从属。例如:连接并供电第一个从设备,该设备的默认ID为1。发送一个将ID更改为2并向主发送响应的写入命令(在响应中使用1的从ID,以便它't超时)。现在,从属ID为2。接下来,将下一个从从网络添加为ID。只需重复您需要多次。
您在谈论从属ID吗?如果是这样,那就不会发生……对于客户而言,奴隶制对于能够解决串行网络上的奴隶至关重要。(RS485串行网络,大概是...)。
因此,甚至没有办法发送一个modbus消息并将其解决到SlaveID 1,然后以某种方式使该设备成为SlaveID 1,因为在这种情况下,所有设备都会尝试响应。更不多
您是否在谈论执行某种类型的查询来询问他们拥有的从Modbus 寄存器的从设备?同样,没有modbus的方法可以做到这一点,但是有了一些代码,您可以查询40001,如果回到错误2,那么您知道寄存器将不可用。如果您然后循环浏览所有寄存器,跟踪哪些寄存器返回,那么,您可以做"自动配置"的形式,但是……老实说?我不建议这样做,而且我也看不到很多价值,因为您不仅必须知道寄存器号寄存器实际上是指!
您到底要做什么?也许还有另一种实现这一目标的方法?
您认为想要的东西:Modbus RTU中的自动从属ID分配。
您实际想要的:带有Modbus TCP的常见,常见的从ID
简而言之,所有的modbus从属ID都将其设置为固定的共同值,然后您用TCP堆栈桥接它们,该堆栈支持链接 - 本地地址或DHCP之类的东西。然后,可以在为每个单元保留一个恒定的从属时动态处理TCP地址分配。
这里有三个广泛的选择,具体取决于您已经拥有的硬件:
-
有可以通过RTU模拟TCP的商业现成设备。我没有太深入地研究他们的支持以及它们的工作能力。
-
您还可以向RTU桥添加一整吨TCP,这些TCP将对TCP/IP层具有内置管理,然后使用真实的以太网电缆。对于许多设备,这可能会变得昂贵,但是对于以太网,您拥有各种奖励功能,例如基本无限距离和改进的CRC。如果您想在廉价上这样做,请抓住双端口Linux SBC(例如此或此),然后将MBUSD(从这里)扔在上面。
-
如果您可以自己访问或正在开发固件,则可以调整诸如UIP(更简单)或LWIP(更快)之类的东西,以通过RS-485(UART)进行通信。这肯定是最便宜的选择。请注意,您还应该能够检测RS-485上的碰撞以正确实现IP堆栈 - 这涉及始终回声接收器并检查数据输入和数据输出匹配。