Modbus TCP:有没有更好的方法可以随机读取一个或多个寄存器?

时间:2017-08-12 06:18:38

标签: sockets tcp modbus plc modbus-tcp

我们正在编写Windows服务,通过c#中的套接字编程,使用 Modbus TCP 协议以1秒的轮询间隔从PLC读取数据。 Windows服务将接收PLC的随机寄存器以读取寄存器值。 预期的寄存器是随机的,如40150,40250,40270,40320。

从上面的案例中如何创建 Modbus TCP请求标题?我们可以找到两种可能的方法:

  1. 使用功能代码3 ,我们可以读取特定范围内的寄存器值,例如从40150到40320,这样我们就可以读取这些40150,40250,40270,40320注册值。
  2. 另一种方法是逐个请求这些40150,40250,40270,40320寄存器(这会导致性能问题)。
  3. 我在这里错过了什么意思吗? 是否有更好的方法可以随机读取一个或多个寄存器?

2 个答案:

答案 0 :(得分:0)

典型的OPC服务器软件,例如Wonderware的DASMBTCP,将通过尝试找到检索所需数据的最高性能请求组合来完成此任务。你可以设置这样的东西,并使用wireshark来嗅探modbus数据包,看看其他软件正在做出的决定。

来自内存的功能代码3一次只能提供125个寄存器,因此您可以一起请求40150,40250,40270,但需要单独请求40320。

如果您担心设备可能不支持某个范围(我遇到过支持功能代码3但最多只有60个寄存器的设备),那么您必须使程序自适应。例如,制作功能代码3,如果失败,则将这些寄存器标记为需要单独的请求。

在回答您的问题时,您并没有忽略这一点,没有更好的方法来读取多个寄存器,并且您的方法仅受您正在阅读的设备是否支持该功能代码的限制。

答案 1 :(得分:0)

有许多部分会影响最终的速度数据读取,例如PLC可以回答的每个周期的请求数量,我认为唯一能够知道哪种方式更有效的解决方案是尝试这两种方法。

我建议您还评估使用Modbus OPC UA服务器或与PLC兼容的其他OPC服务器,使用OPC UA可以在单个请求中读取非连续的内存位置,但是如果必须实现它在您的C#代码中,它可能比原始Modbus更复杂