python实现FINS协议的TCP服务端(篇一)

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":指示后面跟随的字节长度,即12字节。

"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、请求包(读保持寄存器)

(1)包

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 3D 01 01 82 00 64 00 00 01

(2)解释

Header:46 49 4E 53 固定值

Length:00 00 00 1A 包的长度

Command:00 00 00 02 固定值

Error Code:00 00 00 00 固定值

ICF:固定值80

RSV:固定值00

GCT:固定值02

DNA:目标网络号00

DA1:目标节点号01

DA2:目标单元号00

SNA:源网络号00

SA1:源节点号01

SA2:源单元号00

SID:3D?

MRC:主请求码,固定值01

SRC:次请求码,固定值01

Area:82,不同存储区对应不同值,表示保持寄存器?

Address:00 64 00,起始地址+位地址

Length:读取长度01

5、响应包(读保持寄存器)

(1)包

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 00 01

(2)解释

Header:46 49 4E 53 固定值

Length:00 00 00 18 包的长度

Command:00 00 00 00 固定值

Error Code:00 00 00 00 固定值

ICF:00

RSV:00

GCT:00

DNA:00

DA1:00

DA2:00

SNA:00

SA1:00

SA2:00

SID:00

MRC:01

SRC:01

Error Code:00 00

Value:00 01 (因为请求中的Length:读取长度01,因此为Length*2)

6、请求包(写保持寄存器)

(1)包

46 49 4E 53 00 00 02 30 00 00 00 02 00 00 00 00 80 00 02 00 01 00 00 01 00 3E 01 02 82 03 EC 00 01 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

(2)解释

Header:46 49 4E 53 固定值

Length:00 00 02 30 包的长度

Command:00 00 00 02 固定值

Error Code:00 00 00 00 固定值

ICF:固定值80

RSV:固定值00

GCT:固定值02

DNA:目标网络号00

DA1:目标节点号01

DA2:目标单元号00

SNA:源网络号00

SA1:源节点号01

SA2:目标单元号00

SID:源网络号 3E(也可能是其他)

MRC:01

SRC:02

Area:82

Address:03 EC 00

length:01 0B

value:...

7、响应包(写保持寄存器)

(1)包

46 49 4E 53 00 00 00 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 00 00

(2)解释

Header:46 49 4E 53 固定值

Length:00 00 00 16 包的长度

Command:00 00 00 00 固定值

Error Code:00 00 00 00 固定值

ICF:00

RSV:00

GCT:00

DNA:00

DA1:00

DA2:00

SA1:00

SA2:00

SID:00

MRC:01

SRC:01

Error Code:00 00

二、简单了解官方文档

1、实验系统

2、PLC网络设置

3、握手信号请求

4、命令格式

5、ICF 数据格式

6、使用 0101 代码读取 D0 D1 数据

7、使用 0102 代码写 D100 数据

8、握手信号响应

9、使用 0101 代码读取 D0 D1 数据的响应

10、使用 0102 D100 数据的响应

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值