我正在研究用于工业SCADA系统的传统modbus程序 .
目前,c程序既充当modbus TCP服务器又充当客户端 .
Client behaviour: 它从现场的许多供应商PLC(服务器)读取,执行计算并根据站点接收的数据将控制命令发送回PLC .
Server behaviour: 响应来自Web界面和笔记本电脑的各种TCP读写请求 .
到目前为止,这已经运行良好,但我们最近在网络上安装了一个日志记录客户端,它非常频繁地轮询我们的程序(亚秒级),这揭示了时间问题:程序在其客户端循环中可能需要很长时间在充当服务器并响应传入请求之前执行计算和读取PLC值 .
简单的解决方案是将程序拆分为modbus服务器和客户端实例,并使它们在同一台嵌入式PC上运行 .
我的问题是远程Web界面(HMI)必须能够控制供应商PLC 2的行为,供应商PLC 2将只允许来自嵌入式PC的一个TCP连接 . 在过去,程序通过打开的插座将它们转发到PLC 2,处理来自HMI的写入请求 .
我很想在这里收集有关最佳实践的想法 .
我的想法:modbus服务器程序需要响应HMI请求并以某种方式存储供应商PLC 2所需的信息,并且还需要设置状态寄存器以通知modbus客户端有供应商PLC 2的数据 . modbus客户端程序需要从服务器读取状态寄存器(和数据)并将其传递给供应商PLC 2 .
我正朝着正确的方向前进吗?
1 回答
如果没有关于实现的详细信息,我只能猜测问题是您的程序是单线程的,并且延迟是由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的同一台机器上工作 .