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