我们正在编写Windows服务,通过c#中的套接字编程,使用 Modbus TCP 协议以1秒的轮询间隔从PLC读取数据。 Windows服务将接收PLC的随机寄存器以读取寄存器值。 预期的寄存器是随机的,如40150,40250,40270,40320。
从上面的案例中如何创建 Modbus TCP请求标题?我们可以找到两种可能的方法:
我在这里错过了什么意思吗? 是否有更好的方法可以随机读取一个或多个寄存器?
答案 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更复杂