python modbus_tk庫學習記錄


轉自 http://blog.csdn.net/gaoxuefeng/article/details/7382122

注:目前的開發只涉及 modbus master即 client端的開發,未涉及 slave端服務器的開發,slave服務器的設計,一般開發嵌入式設備作為數據采集器的時候用到,市面上有現成的slave數據采集器使用。

 

python封裝的modbus庫有這幾個:

modbus_tk :完整modbus協議棧的實現,支持modbus tcp/RTU{1.提供slave模擬器,即模擬modbus server:502),  web-based hmi master支持}

pymodbus:使用twisted實現的modbus完整協議(支持異步通訊)

MinimalModbus :只支持modbus rtu

 

使用modbus tcp模式通訊是推薦modbus_tk庫

==============================================================================

modbus master 為client,連接遠程的slave來請求采集到的數據。

modbus slave 為 server ,監聽502端口,一般slave為plc,plc為嵌入式設備從modbus網絡上采集數據。master發送modbus協議數據請求salve獲取數據。

 

1.連接到遠程的slave(即modbus server的502端口服務器)

master = modbus_tcp.TcpMaster("192.168.2.20",502)

master.set_timeout(5.0)

 

2.進行調用modbus_tk庫的接口,向slave請求采集的數據

 類TcpMaster下有如下接口:

set_timeout(秒)

_send(modbus請求) modbus請求,即:需要自己封裝modbus協議頭和請求命令

_recv() 返回modbus協議數據

open()

close()

execute(slave,功能代碼,開始地址,quantity_of_x=0,output_value=0,data_format="",指定長度=-1)//execute為線程安全函數

使用例子:

import modbus_tk.defines as de

master.execute(slave_id=1,de.READ_HOLDING_REGISTERS,100,3)

slave_id:1

  •  slave_id : identifier of the slave. from 1 to 247.  0為廣播所有的slave

    功能代碼:de.READ_HOLDING_REGISTE  定義見:defines.py

    開始地址為: 100

  • quantity_of_x = 3 (寄存器或者線圈的數量)

  • output_value: (一個整數或者可迭代的值) 如:

  • output_value = 1或 54 或 output_value=[1,1,0,1,1,0,1,1] 或者 output_value = xrange(12)

  • 返回的一個元祖類型的數據,返回的元祖取決於查詢的功能碼,參考詳細的modbus協議說明書來構造data_format
  •  

    modbus 功能代碼: defines.py

    #modbus 異常代碼

    ILLEGAL_FUNCTION = 1  功能代碼不合法
    ILLEGAL_DATA_ADDRESS = 2  數據地址不合法
    ILLEGAL_DATA_VALUE = 3  數據值不合法
    SLAVE_DEVICE_FAILURE = 4 slave設備失敗
    COMMAND_ACKNOWLEDGE = 5  命令已收到
    SLAVE_DEVICE_BUSY = 6    slave設備忙
    MEMORY_PARITY_ERROR = 8 內存奇偶誤差

    #supported modbus 功能代
    READ_COILS = 1 讀線圈
    READ_DISCRETE_INPUTS = 2 讀離散輸入
    READ_HOLDING_REGISTERS = 3  【讀乘法寄存器】
    READ_INPUT_REGISTERS = 4  讀輸入寄存器
    WRITE_SINGLE_COIL = 5  寫單一線圈
    WRITE_SINGLE_REGISTER = 6  寫單一寄存器
    WRITE_MULTIPLE_COILS = 15 寫多個線圈 【強制多點線圈】
    WRITE_MULTIPLE_REGISTERS = 16  寫多寄存器 【寫乘法寄存器】

    #supported block types 支持的塊類型
    COILS = 1   線圈
    DISCRETE_INPUTS = 2  離散輸入(數字量輸入)
    HOLDING_REGISTERS = 3  乘法寄存器
    ANALOG_INPUTS = 4 模擬量輸入

     

  •  

    下面這段話來自網絡

  • The master uses function codes 5, 6, 15 & 16 to send data to the slave.
    Function code 5 allows the master to write a single coil (address 00001->) to the slave device
    Function code 15 allows the master to write multiple coils (address 00001->) to the slave device
    Function code 6 allows the master to write a single holding register (address 40001->) to the slave device
    Function code 16 allows the master to write multiple holding registers (address 40001->) to the slave device
     

  • 3.接下來的工作就是進行modbus協議的封裝 對接受的modbus數據解析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM