1. 程式人生 > >modbus_tk與Modubs Slave結合使用

modbus_tk與Modubs Slave結合使用

fin ati 功能 毫秒 python3 dea cut 所有 結果

下載兩個軟件:

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結合使用