python Modbus基础
2019獨角獸企業重金招聘Python工程師標準>>>
modbus 協議 數據格式
00 00 00 00 00 06 01 03 00 00 00 02???? ascii碼
第一位:事務處理標識符 由服務器復制,通常為0
第二位:事務處理標識符 由服務器復制,通常為0
第三位:協議標識符=0
第四位:協議標識符=0
第五位:長度字段 (上半部分字節) = 0 (所有的消息長度小于 256)
第六位:長度字段 (下半部分字節) = 后面字節的數量? 這里的06表示? 后面只有6個字節的數據
第七位:單元標識符 (原“從站地址”)
第八位:modbus的功能代碼
第九位:寄存器的起始位置
第十位:寄存器的起始位置
第十一位:寄存器的個數
第十二位:寄存器的個數
modbus功能代碼:
功能碼 名稱 作用?
? 01 讀取線圈狀態 取得一組邏輯線圈的當前狀態( ON/OFF)????
? 02 讀取輸入狀態 取得一組開關輸入的當前狀態( ON/OFF)????
? 03 讀取保持寄存器 在一個或多個保持寄存器中取得當前的二進制值????
? 04 讀取輸入寄存器 在一個或多個輸入寄存器中取得當前的二進制值????
? 05 強置單線圈 強置一個邏輯線圈的通斷狀態????
? 06 預置單寄存器 把具體二進值裝入一個保持寄存器????
? 07 讀取異常狀態 取得 8 個內部線圈的通斷狀態,這 8 個線圈的地址由控制器決定,用戶邏輯可以將這些線圈定義,以說明從機狀態,短報文適宜于迅速讀取狀態????
? 08 回送診斷校驗 把診斷校驗報文送從機,以對通信處理進行評鑒????
? 09 編程(只用于 484 )?
?? 使主機模擬編程器作用,修改 PC 從機邏輯????
? 10 控詢(只用于 484 )?
?? 可使主機與一臺正在執行長程序任務從機通信,探詢該從機是否已完成其操作任務,僅在含有功能碼 9 的報文發送后,本功能碼才發送????
? 11 讀取事件計數?
?? 可使主機發出單詢問,并隨即判定操作是否成功,尤其是該命令或其他應答產生通信錯誤時????
? 12 讀取通信事件記錄?
?? 可是主機檢索每臺從機的 ModBus 事務處理通信事件記錄。如果某項事務處理完成,記錄會給出有關錯誤????
? 13 編程( 184/384 484 584 ) 可使主機模擬編程器功能修改 PC 從機邏輯????
? 14 探詢( 184/384 484 584 ) 可使主機與正在執行任務的從機通信,定期控詢該從機是否已完成其程序操作,僅在含有功能 13 的報文發送后,本功能碼才得發送????
? 15 強置多線圈 強置一串連續邏輯線圈的通斷????
? 16 預置多寄存器 把具體的二進制值裝入一串連續的保持寄存器????
? 17 報告從機標識 可使主機判斷編址從機的類型及該從機運行指示燈的狀態????
? 18 ( 884 和 MICRO 84 ) 可使主機模擬編程功能,修改 PC 狀態邏輯????
? 19 重置通信鏈路 發生非可修改錯誤后,是從機復位于已知狀態,可重置順序字節????
? 20 讀取通用參數( 584L ) 顯示擴展存儲器文件中的數據信息????
? 21 寫入通用參數( 584L ) 把通用參數寫入擴展存儲文件,或修改之????
? 22 ~ 64 保留作擴展功能備用???????
? 65 ~ 72 保留以備用戶功能所用??? 留作用戶功能的擴展編碼????
? 73 ~ 119 非法功能???????
? 120 ~ 127 保留 留作內部作用????
? 128 ~ 255 保留 用于異常應答
實例程序(讀取報文,解析報文):
?
import socket,struct import binascii Modbus="000000000006010300010002" Modbus_16=b'' while Modbus: Modbus_16+=struct.pack("b",int(Modbus[0:2],16)) Modbus=Modbus[2:] print("16:") print(Modbus_16) s=socket.socket() s.connect(("127.0.0.1",502)) try: s.send(Modbus_16) reply_16=s.recv(100) print(reply_16) except: reply_16="" s.close() s=socket.socket() reply_temp="" reply=str(reply_16) reply_temp=reply[4:] mb="" while reply_temp: mb+=reply_temp[0:2] reply_temp=reply_temp[4:] print(mb); strFont=mb[9:10] print("bytes 5:"+strFont) strLast=mb[11:12] print("bytes 6:"+strLast) s.close()轉載于:https://my.oschina.net/OkamiLiu/blog/519873
總結
以上是生活随笔為你收集整理的python Modbus基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA 11038 How Many O
- 下一篇: PostgreSQL 9.4版本的物化视