使用UDP没有TCP普遍。
一般认为TCP是可靠的通讯,因此优先考虑TCP。
但是,UDP也有它存在的价值。
UDP通讯,不需要通讯双方事先握手,事后也不需要维护两者之间的连接,所以,UDP是开销资源较TCP少的通讯协议。
但是UDP也有缺点,就是它无法确认数据是否准确到达目的地,如有多个数据包,到达目的地也不能区分数据包的先后顺序。
但是,有些场合,UDP的缺点并不构成问题。
比如,我用UDP传送Modbus-RTU数据到串口服务器,并向RS485串口透传,在此场景下,不会出现多个数据包的问题,而且,相对来讲,RS485通讯的可靠性比UDP还差,所以,UDP作RS485的网关协议,正合适。
我使用UDP,有一些经验可供参考:
1、在固件V2.5之前的CPU上使用OUC之UDP,遇到第一个连接就一直BUSY的问题,而且这个问题有时存在,有时不存在,有时更换一个连接ID可消除,有时也不能成功。
在固件V2.7的CPU上测试,上述问题一直没有遇到,所以,我认为应当是固件V2.5以前的CPU对UDP支持有问题。
使用UDP的库指令,并不能改变问题性质。因为,库指令只是帮使用者维护通讯所需要的表格,和直接使用UDP指令没有本质区别。
如果有人遇到相同的问题,建议直接放弃在V2.5版本以前CPU上玩UDP,改为固件V2.7版本的CPU。
2、UDP连接始终是被动连接,没有主动UDP连接类型。
在串口世界,主站控制总线,因此,从站没有主动发起通讯的权力。
在以太网世界,UDP、TCP等并不控制底层硬件,所以,即使是被动连接,也能主动发起通讯。
另外,在创建UDP连接时,没有发生和远端设备进行握手,所以,在执行TCON指令时,只须提供本地端口,无须提供远端IP、远端端口,这些IP、端口在表格中置为0。
3、远端IP、远端端口在发送指令TSEND中提供,原理上来讲,一个UDP连接,可以向不同的远端IP、不同的远端端口发送数据。
我测试了在同一个UDP连接下,向同一个IP地址,不同的两个端口发送数据,偶尔会出现状态字节报16#A7错误。
这个测试利用了同一个发送表格,没有测试各自独立使用一个表格的情况。
如果一个UDP连接,只固定向1个IP地址、1个端口发送数据,没有遇到任何问题。
也许是使用同一个表格造成的交叉感染,因为手册要求,在TSEND执行过程中,表格中的参数不能改变。这个问题,没有进一步测试确认。
4、接收指令TRECV,属于即时完成型指令,也就是指令执行完,有无数据收到立即可判断,而且后续收到的数据,与本次执行的指令已无关系。
所以,多个TRECV指令,可以共用一个表格,不会出现交叉感染的问题。
相对于TSEND,前一个TSEND指令是否完成,还要置REQ=0后再次调用指令进行查询。