Node-RED Modbus

Modbus 的起源:

Modbus 是一種最初由 Modicon 公司於 1979 年開發的通信協議,用於工業控制系統中的數據通信。最初的目的是讓不同品牌的自動化設備能夠互相通信,並且容易地集成到控制系統中。由於其簡單、可靠和廣泛的應用,Modbus 成為了工業領域中最常用的通信協議之一。

Modbus 的實際應用場境及設備:

  1. 工業自動化:Modbus 最常見的應用場境之一是在工業自動化系統中。在工廠設施中,各種自動化設備(如 PLC、傳感器、執行器等)通常使用 Modbus 協議進行通信,從而實現生產過程的監控、控制和數據收集。
  2. 能源管理系統:Modbus 也被廣泛應用於能源管理系統中,用於監控和控制發電廠、能源分配系統、太陽能系統等。透過 Modbus,運營商可以實時監測能源生產和消耗情況,從而進行有效的能源管理和節能措施。
  3. 建築自動化:在大型建築物中,Modbus 通常用於控制 HVAC(暖通空調)、照明系統、安全系統等。通過 Modbus,各種設備可以相互通信並根據需要進行自動調節,從而提高建築的舒適性和節能性。
  4. 遠程監控和控制:Modbus 也被廣泛應用於遠程監控和控制系統中,例如在遠程油氣井監控、水務系統監控、智能農業系統等方面。通過 Modbus,操作員可以遠程監控設備的狀態,並且可以遠程發送控制指令。

總的來說,Modbus 是一種經典且廣泛應用的通信協議,在工業控制和自動化領域中扮演著重要的角色,並且在各種應用場境中都能夠發揮其優勢。

Master vs Slave:

Modbus 是一種工業控制系統中常見的通訊協議,用於在不同裝置之間進行數據傳輸。在 Modbus 通訊中,有兩個主要的角色:Master(主站)和 Slave(從站)。

  1. Master(主站)
    • Master 是控制系統中的主要控制單元,負責發起通訊請求。
    • Master 可以向一個或多個 Slave 裝置發送讀取(Read)或寫入(Write)請求。
    • Master 控制通訊的時序,包括發送請求、接收回應以及處理錯誤等。
  2. Slave(從站)
    • Slave 是控制系統中的被控制單元,被 Master 控制和訪問。
    • Slave 裝置回應 Master 的讀取或寫入請求,並提供所需的數據。
    • 每個 Slave 都有一個唯一的地址,Master 使用該地址來識別和定位特定的從站。

差異

  • 功能:Master 負責控制和調度整個通訊過程,而 Slave 則負責回應 Master 的請求並提供所需的數據。
  • 控制權:Master 擁有主動權,可以隨時發起通訊請求,而 Slave 則被動地回應 Master 的請求。
  • 數量限制:通常一個 Modbus 系統只有一個 Master,但可以有多個 Slave。這是因為 Master 負責控制整個系統的操作,而 Slave 則 passively 等待 Master 的命令。
  • 數據交換:Master 和 Slave 之間通過 Modbus 協議進行數據交換,通常是通過串口(如 RS-232、RS-485)、以太網或其他通訊介質進行連接。

在典型的工業自動化系統中,Master 負責收集各種傳感器和設備的數據,控制執行器的動作,並將數據傳輸到其他系統。而 Slave 裝置則是傳感器、執行器或其他智能設備,負責收集和執行 Master 下發的指令。

電端程式為視覺檢測程式會將工件的檢測結果透過Modbus發送檢測結果給PLC。請問電腦端程式是否為 Mdobus 的Master端,而PLC是否為 Modbus的Slave端?

在這種情況下,電腦端程式是 Modbus 的 Master 端,而 PLC 是 Modbus 的 Slave 端。

這是因為電腦端程式負責發送檢測結果給 PLC,而 PLC 則被動地接收和處理電腦端程式發送的數據。換句話說,電腦端程式具有主動權,它主導通信的發起和控制,因此它是 Master;而 PLC 被動地等待並響應電腦端程式的指令,因此它是 Slave。

Modbus 協議中的記憶體

Modbus 協議中的記憶體規劃如下:

  1. 線圈(Coils):線圈是一個包含單個位元的可讀寫數據區域,通常用於控制輸出設備(如繼電器、燈光等)。每個線圈的狀態可以是開(ON)或關(OFF)。
  2. 輸入線圈(Input Coils):輸入線圈是一個包含單個位元的只讀數據區域,通常用於表示輸入信號(如開關狀態、傳感器狀態等)。
  3. 保持寄存器(Holding Registers):保持寄存器是一個包含 16 位元資料的可讀寫數據區域,用於存儲控制器的參數、配置等信息。
  4. 輸入寄存器(Input Registers):輸入寄存器是一個包含 16 位元資料的只讀數據區域,用於表示輸入信號的狀態、測量值等。

這些內存區域的地址範圍從 0 開始,每個區域都有自己的地址空間。通常,線圈和輸入線圈的地址範圍是從 0 到 65535,而保持寄存器和輸入寄存器的地址範圍也是從 0 到 65535。

通過這種內存規劃,Modbus 協議可以簡單而高效地管理不同類型的數據,並提供了對這些數據的讀取和寫入操作。

PLC的實體Input接線端通常對應到Modbus協議中的「輸入線圈(Input Coils)」或「輸入寄存器(Input Registers)」。這取決於PLC和Modbus裝置之間的通信配置和數據交換方式。

  1. 如果PLC的實體Input接線端代表的是開關狀態或二進制信號,則通常對應到Modbus協議中的「輸入線圈(Input Coils)」。這些輸入線圈的狀態可以是開(ON)或關(OFF),並且可以由Modbus Master訪問和讀取。
  2. 如果PLC的實體Input接線端代表的是模擬量(如溫度、壓力等)或其他數值型信號,則通常對應到Modbus協議中的「輸入寄存器(Input Registers)」。這些輸入寄存器中存儲的是16位元的數值資料,可以由Modbus Master訪問和讀取。

因此,PLC的實體Input接線端對應的Modbus記憶體規劃取決於具體的應用場景和通信配置。

PLC的實體Output接線端通常對應到Modbus協議中的「線圈(Coils)」或「保持寄存器(Holding Registers)」。同樣地,這取決於PLC和Modbus裝置之間的通信配置和數據交換方式。

  1. 如果PLC的實體Output接線端用於控制開關類型的設備(如繼電器、閥門等),則通常對應到Modbus協議中的「線圈(Coils)」。這些線圈的狀態可以是開(ON)或關(OFF),並且可以由Modbus Master寫入和控制。
  2. 如果PLC的實體Output接線端用於輸出數值型信號(如控制閥門的開度、調節器的設置值等),則通常對應到Modbus協議中的「保持寄存器(Holding Registers)」。這些保持寄存器中存儲的是16位元的數值資料,可以由Modbus Master寫入和控制。

因此,PLC的實體Output接線端對應的Modbus記憶體規劃也取決於具體的應用場景和通信配置。

Modbus 參考網站  https://www.simplymodbus.ca/index.html

Modbus (http://www.simplymodbus.ca/FC01.htm)

兩個表格儲存開/關離散值(線圈),兩個表格儲存數值(暫存器)。線圈和暫存器各有一個只讀表和讀寫表。

每個表有 9999 個值。

每個線圈或觸點都是 1 位,並分配一個 0000 到 270E 之間的資料位址。

每個暫存器為 1 個字 = 16 位元 = 2 個位元組,資料位址在 0000 到 270E 之間。

Coil/Register NumbersData AddressesTypeTable Name
1-99990000 to 270ERead-WriteDiscrete Output Coils
10001-199990000 to 270ERead-OnlyDiscrete Input Contacts
30001-399990000 to 270ERead-OnlyAnalog Input Registers
40001-499990000 to 270ERead-WriteAnalog Output Holding Registers

線圈/暫存器編號可以被視為位置名稱,因為它們不會出現在實際訊息中。資料地址用於訊息中。

例如,第一個保持暫存器(編號為 40001)的資料位址為 0000。這兩個值之間的差值就是偏移量。每個表都有不同的偏移量。 1、10001、30001 和 40001。

Function Code ActionTable NameMemo
01 (01 hex)ReadDiscrete Output CoilsRead Coil Status 
02 (02 hex)ReadDiscrete Input CoilsRead Input Status
03 (03 hex)ReadAnalog Output Holding RegistersRead Holding Registers
04 (04 hex)ReadAnalog Input RegistersRead Input Registers 
05 (05 hex)Write SingleDiscrete Output CoilForce Single Coil 
06 (06 hex)Write SingleAnalog Output Holding RegisterPreset Single Register 
15 (0F hex)Write MultipleDiscrete Output CoilsForce Multiple Coils 
16 (10 hex)Write MultipleAnalog Output Holding RegistersPreset Multiple Registers
Data AddressesReadWrite SingleWrite Multiple
Discrete Output Coils 0xxxxFC01FC05FC15
Discrete Input Contacts 1xxxxFC02NANA
Analog Input Registers 3xxxxFC04NANA
Analog Output Holding Registers 4xxxxFC03FC06FC16

Register 40108 could be defined as any of these 16-bit data types:
    A 16-bit unsigned integer (a whole number between 0 and 65535)
                register 40108 contains AE41 = 44,609 (hex to decimal conversion)

     A 16-bit signed integer (a whole number between -32768 and 32767)
                                                AE41 = -20,927
          (hex to decimal conversion that wraps, if its over 32767 then subtract 65536)

     A two character ASCII string (2 typed letters)
                                                AE41 = ® A

     A discrete on/off value (this works the same as 16-bit integers with a value of 0 or 1.
                                  The hex data would be 0000 or 0001)

Register 40108 could also be combined with 40109 to form any of these 32-bit data types:
    A 32-bit unsigned integer (a number between 0 and 4,294,967,295)
                    40108,40109 = AE41 5652 =  2,923,517,522

     A 32-bit signed integer (a number between -2,147,483,648 and 2,147,483,647)
                                              AE41 5652 = -1,371,449,774

   A 32-bit single precision IEEE floating point number.
  This is a mathematical formula that allows any real number (a number with decimal
  points) to represented by 32 bits with an accuracy of about seven digits.
                                              AE41 5652 = -4.395978 E-11

   Here is a spreadsheet IEEE float calculator for inputs of 4 bytes or 2 words.
  To download a copy, right click and select Save Target As…

     A four character ASCII string (4 typed letters)
                                                AE41 5652 = ® A V R

More registers can be combined to form longer ASCII strings.  Each register being used to store two ASCII characters (two bytes).

Modbus 元件匯入

Modbus Example 匯入

Modbus-Server元件

Modbus-Flex-Write 元件

設定  執行寫入指令 所要連接的  Modebus Server

Modbus-Flex-Getter 元件

設定  執行讀取指令 所要連接的  Modebus Server

練習讀寫數據

Coil/Register NumbersData AddressesTypeTable Name
40001-499990000 to 270ERead-WriteAnalog Output Holding Registers
Data AddressesReadWrite SingleWrite Multiple
Analog Output Holding Registers 4xxxxFC03FC06FC16

從位址0開始,寫入10個數字,數字內容為[1,0,1,0,1,0,1,1,1,1]

從位址0開始,讀取10個Word.

從位址0,寫入數字2345

從位址0,讀取數字

chart

Modbus 

FC6 Write

msg.payload = Math.random() * 100

msg.topic = ‘Power’

msg.payload = { value: msg.payload, ‘fc’: 6, ‘unitid’: 1, ‘address’: 10 , ‘quantity’: 1 };

return msg;

FC3 Read

msg.payload = { input: msg.payload, ‘fc’: 3, ‘unitid’: 1, ‘address’: 10 , ‘quantity’: 1 }

return msg;

var msg1 = {}

msg1.payload = msg.payload.data[0]

msg1.topic = ‘Power’

return msg1

分類: Node-RED,標籤: , 。這篇內容的永久連結

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *