具有消息转发功能的Modbus客户端和服务器

时间:2018-10-03 06:39:45

标签: modbus modbus-tcp

我正在为工业SCADA系统开发传统的Modbus程序。

当前,C ++程序既充当Modbus TCP服务器又充当客户端。

enter image description here

客户行为: 它从站点上的许多供应商PLC(服务器)中读取数据,执行计算,并根据站点上收到的数据将控制命令发送回PLC。

服务器行为: 响应来自Web界面和现场笔记本电脑的各种TCP读写请求。

直到现在,此方法仍能正常工作,但我们最近在网络上安装了一个日志记录客户端,该客户端非常频繁地(不到一秒)轮询我们的程序,这揭示了计时问题:该程序可能会花费很长时间其客户端循环执行计算并读取PLC值,然后再充当服务器并响应传入的请求。

简便的解决方案是将程序拆分为Modbus服务器和客户端实例,并使它们都在同一台嵌入式PC上运行。

我遇到的问题是,远程Web界面(HMI)必须能够控制供应商PLC 2的行为,而供应商PLC 2仅允许来自嵌入式PC的一个TCP连接。过去,该程序通过将HMI的写请求通过打开的套接字转发给PLC 2来处理它们。

我很想在这里收集有关最佳做法的想法。

enter image description here

我的想法: modbus服务器程序将需要响应HMI请求并以某种方式存储供应商PLC 2所需的信息,它还需要设置一个状态寄存器以通知Modbus客户端有供应商PLC 2的数据。 modbus客户端程序将需要从服务器读取状态寄存器(和数据),并将其传递给供应商PLC 2。

我要朝正确的方向前进吗?

1 个答案:

答案 0 :(得分:0)

在没有实现细节的情况下,我只能猜到问题是您的程序是单线程的,并且延迟是由PLC的等待响应引起的。

因此,如果我的假设正确,则需要切换到“选择”功能,然后重新设计软件以使其完全异步。您必须将所有套接字(已连接和已接受)放入FD集中,并等待它们上的事件。

win32: https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-select

Linux: https://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=select&category=2

我很早以前就在win32上编写了相同的应用程序(但没有计算),它可以轻松处理大约200个PLC,并与SCADA在同一台机器上工作。