【工業樹莓派】配置 Modbus TCP從站

工業級樹莓派可做為工控機使用,型號和功能齊全,除控制器核心外,還包括各類工業協定網關以及IO擴展模塊等。

工業級樹莓派具有高度工業適用性,工作溫度範圍達到-40 ~55 °C ,靜電保護達到4 kV / 8 kV ,且浪湧/爆裂測試以及EMI測試都達到了EN61131-2和IEC 61000-6-2標準的要求。支援Node-RED、Python、或純C等多種編程語言;支援通用的工業物聯網(IIoT )協議,如MQTT和OPC UA;含兩個以太網接口,其中一個可以透過Modbus TCP協議連接工業現場網路,另一個可以連接上級的IT系統或是雲端服務器。  

配置 Modbus TCP從站

本例適用於Jessie Image。但並不適用於Wheezy。

在以下示例中,我們提供了一個Modbus TCP主站,它採集RevPi Core的CPU溫度訊息。我們使用的RevPi Core被視為從站。

提醒!在此示例中,我們使用Windows 計算機中的“qModMaster”軟體來模擬Modbus主站。可以在https://sourceforge.net/projects/qmodmaster下載此軟體。

▍正式操作

  • 通過RJ45連接器將RevPi Core連接到主站網路。
  • 將RevPi Core連接到電源。

首先啟用Modbus-TCP 從站功能。

  • 打開網頁瀏覽器。
  • 在瀏覽器的地址欄中輸入RevPi Core的IP地址。

之後將進入登錄界面。

  • 使用用戶名“admin”登錄。
  • 輸入密碼。(可以在RevPi Core側面的標籤上找到)
  • 點擊“LOGIN”。

現在你可以看到RevPi Core的當前設備狀態。

  • 單擊“SERVICES”標籤。
  • 單擊“Enable/Disable ModbusSlave” 行中的“Enabled”。
  • 單擊“SAVE ALL”按鈕。
  • 點擊“APPS”標籤。
  • 點擊“PiCtory”後面的開始按鈕。

進入PiCtory界面。

下面進行Modbus TCP從站配置。

打開設備目錄中的“Virtual Devices”文件夾。

選擇Modbus TCP Slave。

按住鼠標左鍵並將Modbus TCP從站拖到RevPi Core旁。Modbus TCP從站現在將出現在配置面板的最右側。

在“Device Data”窗口中設置該設備的基本設置。此設置是可選的。如果你使用大量設備並希望稍後在另一個程序中處理數據,則此輸入可能非常有用。

在“Value Editor”中,我們進行有關TCP連接的設置。在本示例中的設置是:

TCP_port:502。

根據Modbus規範,TCP端口的預設值為“502”。你可以更改這個值。這是可行的,如果你想在同一網路中實現2個不同的控制器,它們不應相互干擾。

max._modbus_TCP_connections:10。

下面保存PiCtory配置。

點擊“File>Save”以保存文件。

點擊“Tools>Reset Driver”。這將激活設備的更改。

▍ 如何查詢CPU溫度

你可以在命令行中使用以下命令查詢RevPi Core的CPU溫度:

/usr/bin/vcgencmdmeasure_temp

可以得到當前的溫度輸出:

為了在Modbus上處理這個值,需要轉換此輸出量。溫度需要x10即去掉小數點之後再用作輸出量:

/usr/bin/vcgencmdmeasure_temp | awk ‘ { print substr($0,6,2) substr($0,9,1) } ‘

現在使用piTest將數據寫入Modbus寄存器:

piTest-w Output_1, $(/usr/bin/vcgencmd measure_temp | awk ‘ { print substr($0,6,2)substr($0,9,1) } ‘)

為確保溫度不僅一次寫入寄存器,而是連續寫入,整個過程必須循環運行:

whiletrue; do piTest -w Output_1,$(/usr/bin/vcgencmd measure_temp | awk ‘ { printsubstr($0,6,2) substr($0,9,1) } ‘); sleep 1; done &

以下進行Modbus-TCP主站配置。

本例使用工具 “qModMaster” 來查詢值。

針對本示例進行以下設置:

  • 通過Modbus TCP連接進行通訊:

Modbus模式:TCP

  • 與設備地址為1的從站通訊:

SlaveAddr:1

  • 以1000毫秒的周期提取數據:

掃描速率(毫秒):1000

  • 數據應作為一個完整的Modbus寄存器被讀取:

功能碼:Read Input Registers (0x04)

  • 數據應以十進制形式輸出:

DataFormat:Dec

  • 應從Modbus寄存器地址0開始讀取數據:

起始地址:0

  • 要讀取完整的寄存器:

寄存器數量:1

單擊“選項”,然後選擇“Modbus TCP”。

在“從站IP”欄中設置RevPi Core的IP地址。

設置TCP口。對於Modbus TCP連接,通常為“502”。

點擊“連接”。這將從站連接到Modbus主站。

點擊“讀/寫”。這將透過Modbus提取值。

現在可以看到值505。這說明RevPi Core的CPU溫度為50.5°C

▎ Modbus 功能

Modbus從站模塊為你提供以下Modbus功能:

  • 讀保持寄存器(0x03)

讀輸入

  • 讀輸入寄存器(0x04)

讀輸出

  • 寫單寄存器(0x06)

寫入一個輸入寄存器

  • 寫多個寄存器(0x10)

寫入多個輸入寄存器

接著再介紹一些簡單的操作示例。

首先仍使用主站讀輸入寄存器功能(0x04)來讀取從站的輸出。

將寄存器數量改為5。

點擊“連接”,將從站連接到Modbus主站。

提取數據時可以選擇單次抓取數據:

或者連續抓取數據:

這裡使用連續抓取數據的“掃描”功能。

在已建立的SSH連接的命令行中輸入“piTest -w Output_1,10”,隨後可以在主站中讀取到這個數據。

輸入“piTest -w Output_2,20”,這個數據隨後也出現在主站中。

同樣的,由主站向從站寫入數據也是可行的。

這時將功能碼改為”Write Multiple Registers”(0x10),仍然選擇向前5個寄存器寫入數據,但將Data Format改為“十六進制”。

之後點擊“連接”,將從站連接到Modbus主站。選擇“掃描”方式連續處理數據。在五個寄存器中分別輸入簡單的1,2,3,4,5幾個數據。

然後在命令行中輸入“piTest -r Input_1”來讀取從站輸入口1的數據。

在主站中將1號寄存器的值改為“10”,讀取的從站輸入口1的數據也隨之變化。

▎如何一次性讀取5個從站輸入端口的數據

首先需要明確從站輸入口1 的Offset值。在命令行輸入“piTest-v Input_1”可以獲取詳細訊息。

從顯示的訊息可以看到Input_1的Offset值為11。

這樣就可以使用“piTest -r 11,10,h”命令來讀取從offset11開始的10個字節,並且以十六進制的格式顯示。

一個Modbus TCP從站有32個輸入寄存器和32個輸出寄存器可供使用。如果你需要更多,也可以在PiCtory裡配置多個Modbus TCP從站。