[原創]python下通過modbus_tk實現modbus主機上位機
如果你的開發環境是python3及以上
pip3 install modbus_tk
否則使用
pip install modbus_tk
直接貼Python程式碼
系統:win10
IDE:pycharm + Qtdesigner
目標:實現簡單modbus通訊
import serial import serial.tools.list_ports import modbus_tk import modbus_tk.defines as cst from modbus_tk import modbus_rtu PORT = 'COM10' def main(): try: master= modbus_rtu.RtuMaster(serial.Serial(port=PORT,baudrate=115200,bytesize=8,parity='O',stopbits=1,xonxoff=0) ) master.set_timeout(5) master.set_verbose(True) print('connected') print(master.execute(35,cst.READ_HOLDING_REGISTERS,102,10))#slaveAddr funCode startAddr regNum except modbus_tk.modbus.ModbusError as exc: print('err') if __name__ == '__main__': main()
摘出幾個要點:
-
serial.Serial(port=PORT,baudrate=115200,bytesize=8,parity=‘O’,stopbits=1,xonxoff=0)
port:對應裝置的埠號,win下是COMn,linux下是/dev/ttyp5n
bytesize:通訊資料長度,可選FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8),常用的還是8,我便沒有嘗試其他的
parity:奇偶校驗,可選PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE = ‘N’, ‘E’, ‘O’, ‘M’, ‘S’。不建議不校驗,我選擇ODD校驗
stopbits:注意這裡注意!!!MB協議要求的,若無parity,停止位應該是2位。我已經使用奇校驗,故而停止位是1位
xonoff:流控制沒用 -
master.execute(35,cst.READ_HOLDING_REGISTERS,102,10))
#slaveAddr : 35(0x23)
#funCode : cst.READ_HOLDING_REGISTERS (0x03)不要自己寫0x03,程式不認
#startAddr : 102(0x66)
#regNum : 10(0x0A) -
pycharm實現的是主機,從機是飛思卡爾K60,移植了freeModbus,具體細節可參考
https://blog.csdn.net/ysgjiangsu/article/details/81512310 -
除錯建議,從機先用Modbus Poll調通,再寫上位機,以便定位問題。此前,從機用Modbus Poll通訊30000+次,0錯誤,結果如下:
而我用Python寫的上位機,除錯結果如下:
D:\Python35\python.exe "D:\Program Files\JetBrains\PyCharm 2018.3\helpers\pydev\pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 2984 --file F:/研究生/咖盟/AMP/prj/pythonserial/test1.py
pydev debugger: process 14416 is connecting
Connected to pydev debugger (build 183.4284.139)
connected
(4370, 4884, 5398, 5912, 6426, 6940, 7454, 7968, 8482, 8996)
Process finished with exit code -1
- 下一篇寫個介面友好的QT吧,方便些
---------------------------------------------------本篇結束-------------------------------------------