2

我们正在编写一个 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 寄存器(这会导致性能问题)。

我在这里错过任何一点吗?有没有更好的方法来随机读取一个或多个寄存器?

4

2 回答 2

0

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

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

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

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

于 2017-08-28T19:22:19.410 回答
0

影响最终速度数据读取的部分有很多,例如您的PLC每个周期可以响应多少个请求,我认为知道哪种方式更有效的唯一解决方案是两者都尝试。

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

于 2017-08-29T17:17:44.160 回答