modbus_tk與Modubs Slave結合使用
Modbus Slave/Poll
Modbus Slave(用來模擬客戶端(從))和Modbus Poll(用來模擬服務端(主))
Modbus Poll是非常流行的Modbus Master模擬器,用於測試和調試從設備。支持Modbus RTU/ASCII和Modbus TCP/IP。
一、模擬器的使用
1.1 配置Modbus Poll
配置Modbus Poll的連接
配置Modbus Poll的參數
參數說明
Tx:向主站發送數據幀的次數
Err:通訊錯誤次數
ID:模擬Modbus子設備的設備地址
F:使用的Modbus功能碼SR:掃描周期Slave ID:Modbus從站地址
Function:寄存器的功能碼
Address:寄存器起始地址,默認從0開始
Quantity:寄存器連續個數,默認為10個
Scan Rate:讀取數據的周期,單位毫秒,默認1000ms
寄存器功能碼
代碼 | 中文名稱 | 寄存器PLC地址 | 位操作/字操作 | 操作數量 |
---|---|---|---|---|
01 | 讀線圈狀態 | 00001-09999 | 位操作 | 單個或多個 |
02 | 讀離散輸入狀態 | 10001-19999 | 位操作 | 單個或多個 |
03 | 讀保持寄存器 | 40001-49999 | 字操作 | 單個或多個 |
04 | 讀輸入寄存器 | 30001-39999 | 字操作 | 單個或多個 |
05 | 寫單個線圈 | 00001-09999 | 位操作 | 單個 |
06 | 寫單個保持寄存器 | 40001-49999 | 字操作 | 單個 |
15 | 寫多個線圈 | 00001-09999 | 位操作 | 單個 |
16 | 寫多個保持寄存器 | 40001-49999 | 字操作 | 單個 |
1.2 配置Modbus Slave
配置Modbus Slave的連接
選擇的TCP/IP協議。配置IP地址(只能是本地)、端口號。
配置Modbus Slave的參數
參數說明
Slave ID:Modbus從站地址,默認為1
function:寄存器功能碼
寄存器功能碼
代碼 | 中文名稱 | 寄存器PLC地址 | 位操作/字操作 | 操作數量 |
---|---|---|---|---|
01 | 讀線圈狀態 | 00001-09999 | 位操作 | 單個或多個 |
02 | 讀離散輸入狀態 | 10001-19999 | 位操作 | 單個或多個 |
03 | 讀保持寄存器 | 40001-49999 | 字操作 | 單個或多個 |
04 | 讀輸入寄存器 | 30001-39999 | 字操作 | 單個或多個 |
二、模擬器的測試連接
==兩端模擬器的配置,直接按照上面的介紹時配置的。==
兩個窗口都打開Communication-Traffic界面(在Display->Communication...)。用來查看記錄。
方式一:
設置Modbus Slave的數值
- 讓2號寄存器每秒增加數值1
如上圖,點擊OK,就可以在兩個窗口中查看到數據信息了。
如下圖所示:
數據信息的內容:
- 前6個字節:序號
- 第7個字節:地址
- 第8個字節:功能碼
方式二:
設置Modbus Poll的數值
- 讓第一個寄存器的數值變為9
如上圖,可以看到對應位置的寄存器數值已經改為9。
數據信息的內容
與上一種方式返回出來的數據格式不同
- 前6個字節:序號
- 第7個字節:地址
- 第8個字節:功能碼
- 後4個字節:數值
三、Modbus的Python模塊包 -- modbus_tk
環境python3.6.2
編寫操控Modbus的Python文件
需要先導入modbus_tk模塊
pip install modubs_tk
非常簡單的代碼,只是連接+執行
import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md
# 遠程連接到slave端(從)
master = mt.TcpMaster("127.0.0.1", 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
aa = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=1, quantity_of_x=3, output_value=5)
print(aa) # 取到的所有寄存器的值
print(aa[0]) # 獲取第一個寄存器的值
得到的結果:
(11, 753, 18)
11
與Modbus Slave作對照:
modbus_tk與Modubs Slave結合使用