首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有消息转发的Modbus客户端和服务器

带有消息转发的Modbus客户端和服务器
EN

Stack Overflow用户
提问于 2018-10-03 06:39:45
回答 1查看 244关注 0票数 0

我正在为一个工业SCADA系统开发一个遗留的modbus程序。

目前,c++程序充当modbus服务器和客户端。

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

服务器行为:响应来自web接口和站点上膝上型计算机的各种TCP读写请求。

到目前为止,这还不错,但我们最近在网络上安装了一个日志客户端,它非常频繁地(次秒级)轮询我们的程序,这暴露了计时问题:程序可能需要很长时间在其客户端循环中执行计算和读取PLC值,然后才能充当服务器并响应传入的请求。

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

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

我很想在这里收集关于最佳实践的想法。

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

我朝正确的方向走了吗?

EN

回答 1

Stack Overflow用户

发布于 2018-11-22 12:58:43

没有关于您的实现的详细信息,我只能猜测问题在于您的程序是单线程的,延迟是由来自PLC的等待响应造成的。

因此,如果我的假设是正确的,您需要切换到'select‘函数,并重新设计您的软件是完全异步的。您必须将所有套接字(连接的和接受的)放在FDs集中,并等待事件发生在它们上。

win32: https://learn.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在同一台机器上工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52621089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档