【工業樹莓派】配置 Modbus RTU 主站

工業級樹莓派可做為工控機使用,型號和功能齊全,除控制器核心外,還包括各類工業協定網關以及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 RTU 主站應用

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

本文使用 RevPi Core用作ModbusRTU 主站。這樣就可以透過Modbus RTU連接溫度傳感器、按鈕、運動檢測器等從站,並在RevPiCore中處理這些從站的數據。

▍所需要的工具

  • RevPi Core
  • 從站
  • 帶D-Sub 9接口的電纜
  • USB轉RS232連接線
  • 網路連接

▍要求

  • 網路瀏覽器,例如google瀏覽器或MozillaFirefox。
  • RevPi Core位於你的網路中。

▍下面開始正式操作

  • 將RevPi Core的一個USB端口連接到USB轉RS232連接線。
  • 透過D-Sub 9接口將RS232接口連接到從站。
  • 明確從站的地址並做好記錄。如有必要可以在製造商的操作說明中找到相關訊息。

注意!如果您使用多個從站,則必須確保每個從站都有自己的地址。如果2個或更多從站具有相同的地址,則會發生通訊錯誤。

  • 將RevPi Core連接到電源。
  • 打開網頁瀏覽器。
  • 在瀏覽器的地址欄中輸入RevPi Core的IP地址。

之後將進入登錄界面。

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

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

  • 點擊“SERVICES”標籤。
  • 點擊“Enable/Disable ModbusSlave” 行中的“Enabled”。
  • 點擊“SAVE ALL”按鈕。

提示:你也可以在命令行上激活Master功能。輸入以下命令:“sudorevpi-config enable pimodbus-master”。

  • 點擊“APPS”標籤。
  • 點擊“PiCtory”後面的開始按鈕。

進入PiCtory界面。

  • 打開設備目錄中的“Virtual Devices”文件夾。
  • 選擇Modbus RTU Master。
  • 按住滑鼠左鍵並將Modbus RTU主站拖到RevPi Core旁。Modbus RTU主站現在將出現在配置面板的最右側。
  • 選中Modbus RTU Master。
  • 在“Device Data”窗口中設置該設備的基本設置。此設置是可選的。如果你使用大量設備並希望稍後在另一個程序中處理數據,則此輸入可能非常有用。
  • 在“Value Editor”中,進行連接的設置:

Input:你可以在此處配置輸入。每個主站總共可以使用32個值。值的寬度為16位。

Output:你可以在此處配置輸出。每個主站總共可以使用32個值。值的寬度為16位。

device_path:Linux設備文件的文件路徑,默認值為:/dev/ttyUSB0。

注意!如果您使用的是同一類型的多個設備,則重啟時Linux設備文件的路徑可能會發生變化。通過設置將Linux設備文件路徑分配給設備序列號的規則,可以防止這種情況。

baud_rate:波特率決定了串行連接的速度。預設值:19200。

parity:奇偶校驗位的配置。

None:沒有奇偶校驗位。

Even:偶校驗(預設)。

Odd:奇校驗。

data_bits:數據位數預設值:8。

stop_bits:停止位數預設值:1

  • 右鍵單擊配置面板中的Modbus RTU主站。
  • 會出現一個菜單。
  • 選擇“Extended Data”。

這會打開一個輸入掩碼。你可以在此處設置Modbus指令。

注意:一些製造商使用地址1作為其產品的第一個寄存器地址。一些製造商使用地址0作為其產品的第一個寄存器地址。需要明確從站是如何指定尋址的。如果要使用的從站使用地址0作為第一個寄存器地址,則必須在配置期間將特定值加1。

例如:從站的文檔指定了寄存器地址30053,而文檔中說明了地址從0開始。那麼在配置Modbus指令時,要使用地址30054作為該寄存器地址。

Slave Addr.:該地址直接在從站上設置。有關如何執行此操作的信息,請參閱製造商的說明手冊。

注意:如果你使用多個從站,請確保每個從站都有自己的地址。如果2個或更多從站具有相同的地址,則會發生通信錯誤。

“0”不能用作從機地址。它保留給Modbus進行傳播。

Function Code:Modbus具有允許以某種方式訪問數據的功能代碼。可以使用以下功能代碼:

READ_COILS

讀單個位

READ_DISCRETE_INPUTS

讀單個輸入位

READ_HOLDING_REGISTERS

讀取整個16位輸入/輸出寄存器

READ_INPUT_REGISTERS

讀取整個輸入寄存器(16位)

WRITE_SINGLE_COIL

寫單個位

WRITE_SINGLE_REGISTER

寫整個寄存器

WRITE_MULTIPLE_COILS

寫幾個連續的位

WRITE_MULTIPLE_REGISTERS

寫幾個連續的寄存器

Register Addr.:要訪問的數據的Modbus寄存器地址或位地址。

你將在從站的操作說明中找到有關如何分配從站寄存器的信息。

寄存器地址始終與相應的功能代碼一起生效。這意味著讀取保持寄存器地址17訪問的值與讀取輸入寄存器地址17訪問的值不同。

Quantity ofRegisters:讀/寫的寄存器(或位)數。

ActionInterval:發送指令的時間間隔(以毫秒為單位)。

需要注意的是如果系統負載過高,則無法實現非常短的間隔。只會在情況允許的情況下盡快發送命令。

Device Value:RevPi過程映像中讀取或寫入Modbus命令的首字或位的變量名。

確保不同的命令不重疊。

例如:從“Output_Word_1”開始的4個字節也佔用“Output_Word_2”。為避免重疊,你必須將下一個指令設置為指向“Output_Word_3”。

點擊“Add Row”來添加另一個指令。

你可以透過勾選在指令開頭的複選標記並單擊“RemoveSelected Rows”來刪除指令。

  • 點擊“File>Save”以保存文件。
  • 點擊“Tools>Reset Driver”。這將激活設備的更改。

需要繼續在logiCAD3或C中使用該配置?

  • 點擊“File>Export”。

這時會彈出一個窗口。你可以指定文件的格式和文件名。

您可以選擇2種文件格式:

Export 01創建一個適合在logiCAD3中使用的文件。

Export 02創建一個偏移量列表,你可以將其用作自己的C程序的基本訊息。

  • 選擇要繼續使用的格式。
  • 指定文件名。
  • 點擊“Ok”。

提示:針對你的項目,32個值不夠用?沒問題。只需要另一個主站並使用它訪問同一個從站。這樣你就有了64個值。

如果出現錯誤,在Modbus主站中,有指定的Modbus寄存器用於狀態報告。

如果發生通訊錯誤,錯誤代碼將寫入Modbus寄存器“Modbus_Master_Status”。

錯誤保留在該寄存器中,直到modbus寄存器“Master_Status_Reset”被手動置1。

錯誤碼0x10:找不到配置的設備。

檢查接線是否正確。

錯誤碼0x11:配置的設備不響應或您正在使用從站不允許的寄存器地址。

檢查配置是否正確。

Modbus主站可以處理32個任務。每個任務都有一個狀態寄存器和狀態復位寄存器。如果任務中發生錯誤,則錯誤代碼將寫入Modbus寄存器“Modbus_Action_Status_ [1 … 32]”。

該錯誤保留在該寄存器中,直到modbus寄存器“Action_Status_Reset_[1 … 32]”手動置1。

錯誤代碼對應於Modbus規範中指定的Modbus異常代碼。

這裡列出一些最重要的錯誤代碼:

1 非法功能碼:使用的功能代碼是不允許的。檢查你是否使用了正確的功能代碼。

2 非法數據地址:使用的Modbus寄存器地址無效。寄存器處於寫保護或無效狀態。檢查寄存器地址。

3 非法數據值:至少一部分數據值無效。可能是指定了過多寄存器。檢查你的值。

11 資源暫時不可用

12 無效的CRC:從從站接收到錯誤的數據包。在連接中斷後可能會發生這種情況。檢查你的接線。

13 無效數據:從站響應了不完整的數據包。在連接中斷後可能會發生這種情況。檢查你的接線。

104 CONNECTION RESET BY PEER     

110連接超時:從站沒有足夠快的反應或根本沒有反應。檢查你的配置和接線。

你可以在Modbus的規格中找到更多相關內容:

 http://www.modbus.org/specs.php

在接下來的示例中,將RevPi Core用作ModbusRTU主站並與溫濕度測量儀連接。

為了配置從站,需要事先獲得一些數據,以便可以通過RevPi Core對從站進行尋址。在從站的用戶手冊中可以找到這些數據。

請注意從站用戶手冊中的以下數據:

Baud rate:9600

Data bits:8

Stop bits:1

Parity:None

Slave address:1

Modbus function:ReadHolding Registers

接著在PiCtory的配置面板中選中ModbusRTU Master,然後在其“Value Editor”中進行串行連接的設置。

首先,需要知道USB轉RS232轉換線的連接位置。透過在命令行輸入’ls/dev/ttyU*’就可以顯示的當前USB設備的設備路徑。

另外我們已經從傳感器的用戶手冊中確定了我們的從站的值。

  • device_path:/dev/ttyUSB0
  • baud_rate:9600
  • parity:None
  • data_bits:8
  • stop_bits:1

右鍵點擊配置面板中的Modbus RTU主站。在彈出的菜單中選擇“ExtendedData”來創建一個輸入掩碼。

這是我們設置Modbus指令的地方。在本示例中,我們需要一個指令來讀取溫濕度傳感器的值。我們也已經從傳感器的操作說明中收集了必要的訊息:

Slave Addr.:1

Function Code:READ_INPUT_REGISTERS

Register Addr.:49

Quantity of Registers:5

▎定義Modbus 任務

為了方便使用,在“Value Editor”中將Input_Word_1至5分別命名為I_1至5。

  • 點擊“File>Save”以保存文件。
  • 點擊“Tools>Reset Driver”。激活設備的更改。

接著在命令行中輸入“piTest -d”命令,可以看到我們在PiCtory中完成的RevPiCore和Modbus RTU Master配置。

現在我們可以使用“piTest –r I_1”命令來讀I_1的值了。這個值也就是當前測得的溫度值。

使用“piTest –r I_2”命令來讀I_2的值。這個值是當前測得的濕度值。

使用“piTest –r I_4”命令來讀I_4的值。這個值是當前測得的氣壓值。