python實現(xiàn)FINS協(xié)議的TCP服務(wù)端是一件稍微麻煩點的事情。它不像modbusTCP那樣,可以使用現(xiàn)成的pymodbus模塊去實現(xiàn)。但是,我們可以根據(jù)協(xié)議幀進(jìn)行組包,自己去實現(xiàn)幀的格式,而這一切可以基于socket模塊。本文為第一篇。
一、了解FINS協(xié)議
參考文檔:FinsTCP協(xié)議報文詳細(xì)分析 - 知乎
1、什么是FINS協(xié)議
FINS(Factory Interface Network Service)是歐姆龍(Omron)工業(yè)自動化設(shè)備使用的通信協(xié)議,這表明我們需要查閱官方文檔來實現(xiàn)這個協(xié)議,而該協(xié)議具有以下特點:
高效性: FINS協(xié)議是為了在工業(yè)自動化環(huán)境中實現(xiàn)高效通信而設(shè)計的,具有較低的通信延遲和高速數(shù)據(jù)傳輸能力。
靈活性: FINS協(xié)議支持多種通信方式,包括串行通信、以太網(wǎng)通信等,可以適應(yīng)不同的網(wǎng)絡(luò)環(huán)境和硬件設(shè)備。
多功能性: FINS協(xié)議支持多種通信功能,包括讀寫PLC的數(shù)據(jù)、控制PLC的操作、監(jiān)控PLC的狀態(tài)等,提供了豐富的通信能力。
可靠性: FINS協(xié)議具有良好的錯誤檢測和糾正機制,確保通信數(shù)據(jù)的可靠性和完整性。
擴展性: FINS協(xié)議支持多種數(shù)據(jù)類型和數(shù)據(jù)格式,可以滿足不同應(yīng)用場景下的需求,具有較強的擴展性。
標(biāo)準(zhǔn)化: FINS協(xié)議是歐姆龍PLC的標(biāo)準(zhǔn)通信協(xié)議,得到了廣泛應(yīng)用和認(rèn)可,在工業(yè)自動化領(lǐng)域具有一定的標(biāo)準(zhǔn)性和通用性。
易用性: FINS協(xié)議的通信指令相對簡單,易于理解和實現(xiàn),使得工程師能夠快速開發(fā)和部署與歐姆龍PLC通信的應(yīng)用程序。
2、FINS TCP與TCP的關(guān)系
FINS TCP(Factory Interface Network Service over TCP/IP)是FINS協(xié)議在TCP/IP網(wǎng)絡(luò)上的實現(xiàn)方式。它是FINS協(xié)議的一種變體,使用TCP/IP作為傳輸層協(xié)議,用于在工業(yè)自動化系統(tǒng)中實現(xiàn)設(shè)備之間的通信。
TCP(Transmission Control Protocol)是互聯(lián)網(wǎng)上的一種通信協(xié)議,它是面向連接、可靠的、基于字節(jié)流的傳輸層協(xié)議。TCP提供了數(shù)據(jù)的可靠傳輸,確保數(shù)據(jù)在傳輸過程中不會丟失或損壞。TCP協(xié)議在網(wǎng)絡(luò)通信中廣泛應(yīng)用,用于建立可靠的、穩(wěn)定的數(shù)據(jù)傳輸連接。
FINS TCP是在TCP協(xié)議的基礎(chǔ)上實現(xiàn)的FINS協(xié)議,它使用TCP連接來傳輸FINS協(xié)議的數(shù)據(jù)。在FINS TCP中,F(xiàn)INS幀(Frame)被封裝在TCP報文中進(jìn)行傳輸。FINS幀包含了FINS協(xié)議的控制信息和數(shù)據(jù)內(nèi)容,通過TCP連接傳輸?shù)侥繕?biāo)設(shè)備,然后在目標(biāo)設(shè)備上進(jìn)行解析和處理。
FINS TCP的使用使得在工業(yè)自動化系統(tǒng)中,不同設(shè)備(如PLC、傳感器、HMI等)之間可以通過TCP/IP網(wǎng)絡(luò)進(jìn)行可靠的通信。這種通信方式廣泛應(yīng)用于現(xiàn)代工廠自動化系統(tǒng)中,為設(shè)備間的數(shù)據(jù)交換提供了高效、可靠的解決方案。
這也是為什么我們可以通過socket模塊來實現(xiàn)的原因。
3、TCP的三次握手+一次FINS握手
(1)握手請求
46494E53?0000000C?00000000?00000000?00000000
"46494E53":ASCII編碼,表示"FINS",表明這是一個FINS協(xié)議的數(shù)據(jù)幀。
"0000000C":指示后面跟隨的字節(jié)長度,即12字節(jié)。
"00000000":固定命令部分,通常為零。
"00000000":錯誤代碼,通常為零,表示沒有錯誤。
"00000000":PC節(jié)點IP地址,當(dāng)設(shè)置為0時,通常表示會自動獲取節(jié)點IP。
這個指令是一個典型的FINS TCP握手指令,用于建立FINS通信連接。在該指令中,"46494E53"表示"FINS",指示這是一個FINS數(shù)據(jù)幀。接著,"0000000C"表示后續(xù)數(shù)據(jù)的長度為4字節(jié)。然后,"00000000"和"00000000"分別表示固定命令和錯誤代碼,通常為零。最后,"00000000"表示PC節(jié)點的IP地址,當(dāng)設(shè)置為0時,表示會自動獲取節(jié)點IP。
(2)握手響應(yīng)
46494E53?00000010?00000000?00000000?00000001 00000001
- "46494E53":ASCII編碼,表示"FINS",指示這是一個FINS協(xié)議的數(shù)據(jù)幀。
- "00000010":指示后面跟隨的字節(jié)長度,即16字節(jié)。
- "00000001":固定命令部分,通常為1,表示這是一個特定類型的FINS命令。
- "00000000":錯誤代碼,通常為零,表示沒有錯誤。
- "00000001":本機電腦的節(jié)點IP地址。
- "00000001":PLC節(jié)點的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:目標(biāo)網(wǎng)絡(luò)號00
DA1:目標(biāo)節(jié)點號01
DA2:目標(biāo)單元號00
SNA:源網(wǎng)絡(luò)號00
SA1:源節(jié)點號01
SA2:源單元號00
SID:3D?
MRC:主請求碼,固定值01
SRC:次請求碼,固定值01
Area:82,不同存儲區(qū)對應(yīng)不同值,表示保持寄存器?
Address:00 64 00,起始地址+位地址
Length:讀取長度01
5、響應(yīng)包(讀保持寄存器)
(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:目標(biāo)網(wǎng)絡(luò)號00
DA1:目標(biāo)節(jié)點號01
DA2:目標(biāo)單元號00
SNA:源網(wǎng)絡(luò)號00
SA1:源節(jié)點號01
SA2:目標(biāo)單元號00
SID:源網(wǎng)絡(luò)號 3E(也可能是其他)
MRC:01
SRC:02
Area:82
Address:03 EC 00
length:01 0B
value:...
7、響應(yīng)包(寫保持寄存器)
(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