最近在学习CODESYS。官方的一个讲解以太网通讯的视频连接如下:
C05实战.CODESYS通信实例介绍_哔哩哔哩_bilibili
在这个视频中讲解了CODESYS做TCP Server的方法。具体方法这里不讲解。我的好奇点在于:我们都知道对于一个SERVER,最基本的要求是一个SOCKET与多个CLIENT同时连接。那么视频中讲解的SERVER可以吗?视频没有给出答案,本文就是要填补视频的空白。
首先,创建一个SERVER,这个步骤在视频中有详解讲解,这里不赘述。
其次,声明2个连接:
SerConnect1: NBS.TCP_Connection;
SerConnect2: NBS.TCP_Connection;
这2个连接进行监听的语句
SerConnect1(xenable := TRUE, hserver := server.hServer);
SerConnect2(xenable := TRUE, hserver := server.hServer);
这2个连接都监听同一个socket(server.hServer).
当一个客户端连接到这个主机的SOCKET时,SerConnect1处于激活状态(SerConnect1.xActive信号为1)。当第二个客户端连接到这个主机的SOCKET时,SerConnect2也处于激活状态。这一测试表明CODESYS的server的一个SOCKET是可以连接2个客户端的。
测试到此已经有一个重要的结论了。继续测试,当第一个客户端主动断开连接时,发现SerConnect1仍然处在连接状态,当第二个客户端主动断开连接时,发现SerConnect2也还是处在连接状态。这就带来一个问题,就是server如何判断当前的连接状态是好的还是已经断开了。为此我问询了deepseek。AI给出的解决办法是server为每个连接定时发送心跳信号。如果心跳信号反馈正常,那么说明当前这个连接是正常的。如果收不到反馈,说明这个连接已经断开了。这个办法是可行的,可惜的是在CODESYS教学视频中对此是没有讲解的。
附带说明一下,当心跳信号有问题时,应该复位该连接监听语句的xenable信号。之后再次置位该信号,这样就可以释放资源,再次进行监听。
注:以上测试的环境是Control Win V3。
最后强调一个事情,这其实在上一篇“FB和对象”文档已经有所表述。这里在重复一遍。就是虽然一个server的socket可以建立多个客户端连接,但是连接的数量不是动态的,而是在编程阶段已经在声明区声明好的,连接数量是确定的。