python实现FINS协议的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模块。本文为第一篇。
一、了解FINS协议
参考文档:FinsTCP协议报文详细分析 - 知乎
1、什么是FINS协议
FINS(Factory Interface Network Service)是欧姆龙(Omron)工业自动化设备使用的通信协议,这表明我们需要查阅官方文档来实现这个协议,而该协议具有以下特点:
高效性: FINS协议是为了在工业自动化环境中实现高效通信而设计的,具有较低的通信延迟和高速数据传输能力。
灵活性: FINS协议支持多种通信方式,包括串行通信、以太网通信等,可以适应不同的网络环境和硬件设备。
多功能性: FINS协议支持多种通信功能,包括读写PLC的数据、控制PLC的操作、监控PLC的状态等,提供了丰富的通信能力。
可靠性: FINS协议具有良好的错误检测和纠正机制,确保通信数据的可靠性和完整性。
扩展性: FINS协议支持多种数据类型和数据格式,可以满足不同应用场景下的需求,具有较强的扩展性。
标准化: FINS协议是欧姆龙PLC的标准通信协议,得到了广泛应用和认可,在工业自动化领域具有一定的标准性和通用性。
易用性: FINS协议的通信指令相对简单,易于理解和实现,使得工程师能够快速开发和部署与欧姆龙PLC通信的应用程序。
2、FINS TCP与TCP的关系
FINS TCP(Factory Interface Network Service over TCP/IP)是FINS协议在TCP/IP网络上的实现方式。它是FINS协议的一种变体,使用TCP/IP作为传输层协议,用于在工业自动化系统中实现设备之间的通信。
TCP(Transmission Control Protocol)是互联网上的一种通信协议,它是面向连接、可靠的、基于字节流的传输层协议。TCP提供了数据的可靠传输,确保数据在传输过程中不会丢失或损坏。TCP协议在网络通信中广泛应用,用于建立可靠的、稳定的数据传输连接。
FINS TCP是在TCP协议的基础上实现的FINS协议,它使用TCP连接来传输FINS协议的数据。在FINS TCP中,FINS帧(Frame)被封装在TCP报文中进行传输。FINS帧包含了FINS协议的控制信息和数据内容,通过TCP连接传输到目标设备,然后在目标设备上进行解析和处理。
FINS TCP的使用使得在工业自动化系统中,不同设备(如PLC、传感器、HMI等)之间可以通过TCP/IP网络进行可靠的通信。这种通信方式广泛应用于现代工厂自动化系统中,为设备间的数据交换提供了高效、可靠的解决方案。
这也是为什么我们可以通过socket模块来实现的原因。
3、TCP的三次握手+一次FINS握手
(1)握手请求
46494E53 0000000C 00000000 00000000 00000000
"46494E53":ASCII编码,表示"FINS",表明这是一个FINS协议的数据帧。
"0000000C":指示后面跟随的字节长度,即4字节。
"00000000":固定命令部分,通常为零。
"00000000":错误代码,通常为零,表示没有错误。
"00000000":PC节点IP地址,当设置为0时,通常表示会自动获取节点IP。
这个指令是一个典型的FINS TCP握手指令,用于建立FINS通信连接。在该指令中,"46494E53"表示"FINS",指示这是一个FINS数据帧。接着,"0000000C"表示后续数据的长度为4字节。然后,"00000000"和"00000000"分别表示固定命令和错误代码,通常为零。最后,"00000000"表示PC节点的IP地址,当设置为0时,表示会自动获取节点IP。
(2)握手响应
46494E53 00000010 00000000 00000000 00000001 00000001
- "46494E53":ASCII编码,表示"FINS",指示这是一个FINS协议的数据帧。
- "00000010":指示后面跟随的字节长度,即16字节(包括这个长度字段自身)。
- "00000001":固定命令部分,通常为1,表示这是一个特定类型的FINS命令。
- "00000000":错误代码,通常为零,表示没有错误。
- "00000001":本机电脑的节点IP地址。
- "00000001":PLC节点的IP地址。
4、请求包
46 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 80 00 02 00 01 00 00 01 00 0F 01 01 82 00 64 00 00 01
5、响应包
46 49 4E 53 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 00 00 73 00