1. 程式人生 > >[原創]python下通過modbus_tk實現modbus主機上位機

[原創]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()

摘出幾個要點:

  1. 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:流控制沒用

  2. 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)

  3. pycharm實現的是主機,從機是飛思卡爾K60,移植了freeModbus,具體細節可參考
    https://blog.csdn.net/ysgjiangsu/article/details/81512310

  4. 除錯建議,從機先用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
  1. 下一篇寫個介面友好的QT吧,方便些

---------------------------------------------------本篇結束-------------------------------------------
在這裡插入圖片描述