Modbus 的起源:
Modbus 是一種最初由 Modicon 公司於 1979 年開發的通信協議,用於工業控制系統中的數據通信。最初的目的是讓不同品牌的自動化設備能夠互相通信,並且容易地集成到控制系統中。由於其簡單、可靠和廣泛的應用,Modbus 成為了工業領域中最常用的通信協議之一。
Modbus 的實際應用場境及設備:
- 工業自動化:Modbus 最常見的應用場境之一是在工業自動化系統中。在工廠設施中,各種自動化設備(如 PLC、傳感器、執行器等)通常使用 Modbus 協議進行通信,從而實現生產過程的監控、控制和數據收集。
- 能源管理系統:Modbus 也被廣泛應用於能源管理系統中,用於監控和控制發電廠、能源分配系統、太陽能系統等。透過 Modbus,運營商可以實時監測能源生產和消耗情況,從而進行有效的能源管理和節能措施。
- 建築自動化:在大型建築物中,Modbus 通常用於控制 HVAC(暖通空調)、照明系統、安全系統等。通過 Modbus,各種設備可以相互通信並根據需要進行自動調節,從而提高建築的舒適性和節能性。
- 遠程監控和控制:Modbus 也被廣泛應用於遠程監控和控制系統中,例如在遠程油氣井監控、水務系統監控、智能農業系統等方面。通過 Modbus,操作員可以遠程監控設備的狀態,並且可以遠程發送控制指令。
總的來說,Modbus 是一種經典且廣泛應用的通信協議,在工業控制和自動化領域中扮演著重要的角色,並且在各種應用場境中都能夠發揮其優勢。
Master vs Slave:
Modbus 是一種工業控制系統中常見的通訊協議,用於在不同裝置之間進行數據傳輸。在 Modbus 通訊中,有兩個主要的角色:Master(主站)和 Slave(從站)。
- Master(主站):
- Master 是控制系統中的主要控制單元,負責發起通訊請求。
- Master 可以向一個或多個 Slave 裝置發送讀取(Read)或寫入(Write)請求。
- Master 控制通訊的時序,包括發送請求、接收回應以及處理錯誤等。
- 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 協議中的記憶體規劃如下:
- 線圈(Coils):線圈是一個包含單個位元的可讀寫數據區域,通常用於控制輸出設備(如繼電器、燈光等)。每個線圈的狀態可以是開(ON)或關(OFF)。
- 輸入線圈(Input Coils):輸入線圈是一個包含單個位元的只讀數據區域,通常用於表示輸入信號(如開關狀態、傳感器狀態等)。
- 保持寄存器(Holding Registers):保持寄存器是一個包含 16 位元資料的可讀寫數據區域,用於存儲控制器的參數、配置等信息。
- 輸入寄存器(Input Registers):輸入寄存器是一個包含 16 位元資料的只讀數據區域,用於表示輸入信號的狀態、測量值等。
這些內存區域的地址範圍從 0 開始,每個區域都有自己的地址空間。通常,線圈和輸入線圈的地址範圍是從 0 到 65535,而保持寄存器和輸入寄存器的地址範圍也是從 0 到 65535。
通過這種內存規劃,Modbus 協議可以簡單而高效地管理不同類型的數據,並提供了對這些數據的讀取和寫入操作。
PLC的實體Input接線端通常對應到Modbus協議中的「輸入線圈(Input Coils)」或「輸入寄存器(Input Registers)」。這取決於PLC和Modbus裝置之間的通信配置和數據交換方式。
- 如果PLC的實體Input接線端代表的是開關狀態或二進制信號,則通常對應到Modbus協議中的「輸入線圈(Input Coils)」。這些輸入線圈的狀態可以是開(ON)或關(OFF),並且可以由Modbus Master訪問和讀取。
- 如果PLC的實體Input接線端代表的是模擬量(如溫度、壓力等)或其他數值型信號,則通常對應到Modbus協議中的「輸入寄存器(Input Registers)」。這些輸入寄存器中存儲的是16位元的數值資料,可以由Modbus Master訪問和讀取。
因此,PLC的實體Input接線端對應的Modbus記憶體規劃取決於具體的應用場景和通信配置。
PLC的實體Output接線端通常對應到Modbus協議中的「線圈(Coils)」或「保持寄存器(Holding Registers)」。同樣地,這取決於PLC和Modbus裝置之間的通信配置和數據交換方式。
- 如果PLC的實體Output接線端用於控制開關類型的設備(如繼電器、閥門等),則通常對應到Modbus協議中的「線圈(Coils)」。這些線圈的狀態可以是開(ON)或關(OFF),並且可以由Modbus Master寫入和控制。
- 如果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 Numbers | Data Addresses | Type | Table Name |
1-9999 | 0000 to 270E | Read-Write | Discrete Output Coils |
10001-19999 | 0000 to 270E | Read-Only | Discrete Input Contacts |
30001-39999 | 0000 to 270E | Read-Only | Analog Input Registers |
40001-49999 | 0000 to 270E | Read-Write | Analog Output Holding Registers |
線圈/暫存器編號可以被視為位置名稱,因為它們不會出現在實際訊息中。資料地址用於訊息中。
例如,第一個保持暫存器(編號為 40001)的資料位址為 0000。這兩個值之間的差值就是偏移量。每個表都有不同的偏移量。 1、10001、30001 和 40001。
Function Code | Action | Table Name | Memo |
01 (01 hex) | Read | Discrete Output Coils | Read Coil Status |
02 (02 hex) | Read | Discrete Input Coils | Read Input Status |
03 (03 hex) | Read | Analog Output Holding Registers | Read Holding Registers |
04 (04 hex) | Read | Analog Input Registers | Read Input Registers |
05 (05 hex) | Write Single | Discrete Output Coil | Force Single Coil |
06 (06 hex) | Write Single | Analog Output Holding Register | Preset Single Register |
15 (0F hex) | Write Multiple | Discrete Output Coils | Force Multiple Coils |
16 (10 hex) | Write Multiple | Analog Output Holding Registers | Preset Multiple Registers |
Data Addresses | Read | Write Single | Write Multiple |
Discrete Output Coils 0xxxx | FC01 | FC05 | FC15 |
Discrete Input Contacts 1xxxx | FC02 | NA | NA |
Analog Input Registers 3xxxx | FC04 | NA | NA |
Analog Output Holding Registers 4xxxx | FC03 | FC06 | FC16 |
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 Numbers | Data Addresses | Type | Table Name |
40001-49999 | 0000 to 270E | Read-Write | Analog Output Holding Registers |
Data Addresses | Read | Write Single | Write Multiple |
Analog Output Holding Registers 4xxxx | FC03 | FC06 | FC16 |
從位址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