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