轉自 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數據解析