1、这是之前练习测试写的,框架是完整的。目的是为了与串口设备进行通信的时候,取代官方的ModbusTCP的Client指令。官方的体积太大了,一个FB代码就占20K工作内存。
另外与串口设备通信,都是轮询,用TCP开销大,且从道理上讲没有意义。而且TCP慢,尤其是连接通道的建立和断开。
UDP不怕网线的插拔,不怕有线和无线之间的切换,这是无连接通信的好处。断两小时也没事,插上网线立马恢复通信。用用下面这个块就知道了。
因为是给自己用的,如果解析中的数据类型不符合需求,各位自行修改。
2、把串口服务器设置为UDP Server。把网关功能关闭,串口侧不做协议转换,直接是UDP拆包之后或打包之前的数据部分透传往来。这数据部分就是完整的ModbusRTU报文。
如果是ModbusTCP,网关做的转换是:把报文前面的MAP(Modbus Application Protocal)的6字节报文头添加或去掉,报文后面的CRC16去掉或添加。
3、指令接口与Modbus指令类似,但是需要一个UDP连接的ID,而不是485端口。还需要包含串口服务器的地址端口信息的一个结构化参数。用博途V14 SP1写的。你可以把它改写成任何自定义的串口协议。
ModbusUDP.rar
4、这个指令需要一个UDP连接。关于建立连接这件事,说起来还是有点小讲究的,所以额外提供一个如何建立连接的指令块源码。其中的道理不只是对UDP,对TCP连接一样,具体看源码。其实这个也是我从全球库中德国工程师写的改的。理念保持一样,但是原来的组织方式我觉得代码之间的耦合有点高,就重新改写了。你会看到残留的变量注释。
BuildConnection.rar
5、博途中所说的以太网连接,其实是指在PLC后台一个独立运行的通信线程。
了解一点上位机开发的知道,你自己用比如C#建立一个socket对象进行通信的时候,都是把它单独放在一个线程里。每个Socket用一个线程,大家都在同时监听各自的端口。所谓异步,就是指并行的线程,各干各的不等别人。
PLC中连接资源的限制,就是指后台可以运行的通信线程的数量限制。这就解释了,为什么UDP是无连接通信,但它还要占用一个连接资源。它必须要占用一个线程。
6、关于以太网连接,除了TCON和TDISCON,还有两条指令。
一个是T_DIAG,可以知道某个连接的状态和属性。我觉得作用一般,你还是得需要健壮的策略能成功新建、断开、重建,另建才行。
另一个是T_RESET,这个很有用。它可以把阻塞的连接重新建立起来,也就是对应的线程被憋死了需要重现。这在串口应用很少,在常规以太网中很有用,阻塞不少见。
7、关于如何使用这个块建立UDP连接和一些参数设置,参考下图。最终得到的连接ID在Connect结构变量里面的ID,把它连接到modbusUDP模块的管脚就可以了。包含串口服务器的地址端口信息的结构化参数,也要连接到modbusUDP模块的管脚。
8、有兴趣研究的朋友,建议买个带端口镜像的交换机,一百多块钱。以太网侧用wireshark抓包,串口侧用串口助手抓包,可以实时对比观察协议报文的细节和转换,还有时间因素等。
通信的东西说到底,要落到网络报文的内容上。无论出现任何问题,抓包看报文,是高效靠谱的排查手段,单靠软件很多时候就是猜测。
UDP在抓包诊断上有绝对优势。使用UDP的通信,底层往来的场景是非常干净的。没有TCP内在那些复杂度。一看就知道应用层的问题出在哪。
9、UDP真正有魅力的地方是自建应用层协议实现可靠传输,这是当前的发展趋势,TCP有点落伍了。腾讯抖音快手,鸿蒙软总线等都有UDP在里面。你在家wifi玩游戏,走到外面已经切换到手机4G了,但是游戏依然不会掉线,这后面都是UDP。
在PLC中同样可以自建协议实现可靠传输。单个UDP连接复用,组播。可以很大程度替代TCP。如果PLC通信全部是UDP,网络被堵死的可能性大大降低。参考下面这个帖子。
UDP的可靠传输与应用
10、这个ModbusUDP指令的地位和使用方式,与官方Master指令、自己用PtP做的Master指令、官方ModbusTCP指令是一样的。做为不同的Modbus通道方式,都是设备功能执行的资源选项。我通常把这些指令做为参数传递到设备FB内部供调度机制使用,图例如下。