python實現(xiàn)MC協(xié)議(SLMP 3E幀)的TCP服務端是一件稍微麻煩點的事情。它不像modbusTCP那樣,可以使用現(xiàn)成的pymodbus模塊去實現(xiàn)。但是,我們可以根據(jù)協(xié)議幀進行組包,自己去實現(xiàn)幀的格式,而這一切可以基于socket模塊。本文為第一篇。
一、了解MC協(xié)議
參考文檔:三菱PLC之SLMP協(xié)議報文說明 - 知乎 (zhihu.com)
1、MC協(xié)議與SLMP協(xié)議
查閱三菱PLC官方文檔,發(fā)現(xiàn)SLMP協(xié)議的3E幀,其實就是MC協(xié)議的3E幀,因此可通用。
2、3E/4E幀報文
查閱三菱PLC官方文檔,發(fā)現(xiàn)3E/4E幀報文格式如下圖所示
3、SLMP的3E幀與4E幀格式的區(qū)別
4E幀的格式相對靈活,可以用于更復雜的通信場景,支持更多的命令和參數(shù)。
4、3E幀指令
詳見三菱PLC官方文檔。
5、3E幀請求報文
SLMP 3E幀:50 00 00 FF FF 03 00 0C 00 10 00 01 04 00 00 00 00 00 A8 05 00
(1)幀頭(Header):不顯示,因為是TCP/IP及UDP/IP用的幀頭。幀頭在外部設備側進行添加及發(fā)送。此外,通常根據(jù)外部設備自動被添加。
(2)副幀頭(Sub-Header):50 00
,固定值,占用4字節(jié),沒什么好說的。
(3)請求目標網(wǎng)絡編號:00
,占用2字節(jié),表示請求的目標網(wǎng)絡編號。
(4)請求目標站號:FF
,占用2字節(jié),表示請求的目標站號。
(5)請求目標模塊T/0編號:FF 03,占用4字節(jié),表示請求的目標模塊T/0編號。
(6)請求目標多點站號:00
,占用2字節(jié),表示請求的目標多點站號。
(7)請求數(shù)據(jù)長:0C 00
,占用4字節(jié),表示請求數(shù)據(jù)的長度(16字節(jié),即后續(xù)的數(shù)據(jù)部分的長度)。
(8)監(jiān)視定時器:10 00
,占用4字節(jié),表示監(jiān)視定時器的值。
(9)請求數(shù)據(jù):01 04 00 00 00 00 00 A8 05 00,這20個字節(jié)表示具體的請求數(shù)據(jù),但沒有數(shù)據(jù)本身。
01 04:命令碼,占用4字節(jié),表示讀取請求。
00 00
:子命令碼,占用4字節(jié)(通常為0)。
00 :固定值,占用2字節(jié)
00 00 A8 05 00:系統(tǒng)區(qū)域,占用10字節(jié)
(10)幀腳:不顯示,因為是TCP/IP及UDP/IP用的頁腳。頁腳在外部設備側進行添加及發(fā)送。此外,通常根據(jù)外部設備自動被添加。
?
6、3E幀響應報文
SLMP 3E幀:D0 00 00 FF FF 03 00 0C 00 00 00 73 00 00 00 00 00 00 00 00 00
(1)幀頭:不顯示。
(2)副幀頭:D0 00。
(3)請求目標網(wǎng)絡編號:00。
(4)請求目標站號:FF。
(5)請求目標模塊T/0編號:FF 03。
(6)請求目標多點站號:00。
(7)響應數(shù)據(jù)長:0C 00。
(8)結束代碼:00 00 存儲指令處理結果,正常結束時存儲0。異常結束時存儲訪問目標的出錯代碼。
(9)響應數(shù)據(jù):73 00 00 00 00 00 00 00 00 00,正常結束時,存儲對于指令的讀取數(shù)據(jù)等。?常結束時,存儲出錯響應站的信息、與請求報文相同的指令及子指令、異常結束時的響應數(shù)據(jù)(通過指令定義的情況下)
(10)幀腳:不顯示。