Modbus協議是由Modicon公司(如今的施耐德電氣Schneider Electric)推出,主要創建在物理串口、以太網TCP/IP層之上,目前已經成爲工業領域通訊協議的業界標準,普遍應用在工業電子設備之間的互聯。
Modbus Poll和Modbus Slave是兩款很是流行的Modbus設備仿真軟件,支持Modbus RTU/ASCII和Modbus TCP/IP協議 ,常常用於測試和調試Modbus設備,觀察Modbus通訊過程當中的各類報文。
當用於支持Modbus RTU/ASCII協議時,ModbusPoll做爲一個主站設備, ModbusSlave做爲一個從站設備,從站設備接收主站設備的命令並返回數據。而當用於支持Modbus TCP/IP時,ModbusSlave做爲一個服務器,ModbusPoll做爲一個客戶端,服務器接收客戶端的命令並返回數據。客戶端須要填寫指定鏈接的遠程服務器IP地址和端口號。bash
這裏主要介紹下用Python實現ModbusTCP客戶端功能,同時使用ModbusSlave模擬一個服務器,用於互聯調試。服務器
Python中提供了支持Modbus協議的第三方庫——modbus_tk,下載地址爲:pypi.org/project/mod…
slave:Modbus從站ID地址 。
function_code:寄存器的功能碼,主要的寄存器功能碼以下所示:tcp
starting_address:寄存器起始地址,從0開始。
quantity_of_x:寄存器連續個數。
output_value:寫命令時的數值。
Scan Rate:讀取數據的週期,程序中體現爲執行 execute()方法的週期。ide
以下例程實現了01和03兩條命令讀取服務器的數據,以下所示:測試
import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md
# 遠程鏈接到服務器端
master = mt.TcpMaster("192.168.1.10", 502)
master.set_timeout(5.0)
# @slave=1 : identifier of the slave. from 1 to 247. 0爲廣播全部的slave
# @function_code=READ_HOLDING_REGISTERS:功能碼
# @starting_address=1:開始地址
# @quantity_of_x=3:寄存器/線圈的數量
# @output_value:一個整數或可迭代的值:1/[1,1,1,0,0,1]/xrange(12)
# @data_format
# @expected_length
Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=1, quantity_of_x=3, output_value=5)
Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=1, quantity_of_x=3, output_value=5)
Coils_value = master.execute(slave=1, function_code=md.READ_COILS, starting_address=1, quantity_of_x=3, output_value=5)
print(Hold_value) # 取到的寄存器的值格式爲元組(55, 12, 44)
print(Hold_value) # 取到的寄存器的值格式爲元組(1, 1, 1)複製代碼