Modbus RTU 通信
Modbus RTU (Remote Terminal Unit) 是用于網絡中通信的標準協議,使用 RS232 或 RS422/485 連接在網絡中的 Modbus 設備之間進行串行數據傳輸。
Modbus RTU 使用主/從站網絡,其中整個通信僅由一個主站設備觸發,而從站只能響應主站的請求。 主站將請求發送到一個從站地址,并且只有該地址上的從站做出響應。
例外: Modbus 從站地址為 0 時會向所有從站發送廣播幀(從站均不響應)。
Modbus 功能代碼
作為 Modbus RTU 主站運行的 CPU 能夠在 Modbus RTU 從站中通過通信連接讀取和寫入數據和 I/O 狀態。
作為 Modbus RTU 從站運行的 CPU 允許利用通信連接進行連接的 Modbus RTU 主站在其自身的 CPU 中讀取并寫入數據和 I/O 狀態。
用于讀取數據的功能: 讀取分布式 I/O 和程序數據
Modbus 功能代碼 | 用于讀取從站(服務器)數據的功能 - 標準尋址 |
---|---|
01 | 讀取輸出位: 每個請求 1 至2000/19921) 位 |
02 | 讀取輸入位: 每個請求 1 至 2000/19921) 位 |
03 | 讀取保持寄存器: 每個請求 1 至 125/1241) 字 |
04 | 讀取輸入字: 每個請求 1 至 125/1241) 字 |
1) 用于擴展尋址 |
用于寫入數據的功能: 更改分布式 I/O 和程序數據
Modbus 功能代碼 | 用于向從站(服務器)寫入數據的功能 - 標準尋址 |
---|---|
05 | 寫入一個輸出位: 每個請求 1 位 |
06 | 寫入一個保持寄存器: 每個請求 1 個字 |
15 | 寫入一個或多個輸出位:每個請求 1 至 1960 位 |
16 | 寫入一個或多個保持寄存器:每個請求 1 至 122 個字 |
Modbus 功能代碼 08 和 11 提供從站設備的通信診斷選項。
Modbus 從站地址為 0 時會將廣播幀發送給所有從站(無從站響應;針對功能代碼 5、6、15、16)。
Modbus 網絡中的站地址
站 | 地址 | |
---|---|---|
RTU 站 | 標準站地址 | 1 到 247 , 0 用于廣播 |
擴展站地址 | 1 到 65535,0 用于廣播 |
Modbus 存儲器地址
可用的 Modbus 存儲器地址(輸入/輸出地址)的實際數量取決于 CPU 版本和可用的工作存儲器。
程序中的 Modbus RTU 指令
Modbus_Comm_Load:需要運行 Modbus_Comm_Load 來設置 PtP 參數,例如數據傳輸速率、奇偶校驗和數據流控制。 為 Modbus RTU 協議組態完通信模塊后,它只能由 Modbus_Master 指令或 Modbus_Slave 指令使用。
Modbus_Master:利用 Modbus 主站指令,CPU 可用作 Modbus RTU 主站設備,與一個或更多的 Modbus 從站設備進行通信。
Modbus_Slave:利用 Modbus 從站指令,CPU 可用作 Modbus RTU 從站設備,與一個 Modbus 主站設備進行通信。
Modbus_Comm_Load: 對 Modbus 的通信模塊進行組態
說明
Modbus_Comm_Load 指令通過 Modbus RTU 協議對用于通信的通信模塊進行組態。當在程序中添加 Modbus_Comm_Load 指令時,將自動分配背景數據塊。
Modbus_Comm_Load 的組態更改將保存在 CM 中,而不是 CPU 中?;謴碗妷汉筒灏螘r,將使用保存在設備配置中的數據組態 CM。必須在這些情況下調用 Modbus_Comm_Load 指令。
參數
參數 | 聲明 | 數據類型 | 標準 | 說明 | |
---|---|---|---|---|---|
S7- 1200/1500 |
S7- 300/400/ WinAC |
||||
REQ | IN | Bool | FALSE | 當此輸入出現上升沿時,啟動該指令。 | |
PORT | IN | Port | Laddr | 0 |
指定用于以下通信的通信模塊: 對于 S7-1500/S7-1200:設備組態中的“硬件標識符”。 符號端口名稱在 PLC 變量表的“系統常數”(System constants) 選項卡中指定并可應用于此處。 對于 S7-300/S7-400:設備組態中的“輸入地址”。 在 S7-300/400/WinAC 系統中,在 HWCN 中分配的輸入地址中分配端口參數。 |
BAUD | IN | UDInt | DWord | 9600 |
選擇數據傳輸速率 有效值為:300、600、1200、2400、4800、9600、19200、38400、57600、76800、115200?bit/s。 |
PARITY | IN | UInt | Word | 0 |
選擇奇偶校驗: 0 – 無 1 – 奇校驗 2 – 偶校驗 |
FLOW_CTRL | IN | UInt | Word | 0 |
選擇流控制: 0 – (默認)無流控制 1 – 硬件流控制,RTS 始終開啟(不適用于 RS422/485 CM) 2 – 硬件流控制,RTS 切換(不適用于 RS422/485 CM) |
RTS_ON_DLY | IN | UInt | Word | 0 |
RTS 接通延遲選擇: 0 – 從“RTS 激活”直到發送幀的第一個字符之前無延遲。 1 到 65535 - 從“RTS 激活”一直到發送幀的第一個字符之前的延遲(以毫秒表示)(不適用于 RS422/485 CM)。不論選擇 FLOW_CTRL 為何,都會使用 RTS 延遲。 |
RTS_OFF_DLY | IN | UInt | Word | 0 |
RTS 關斷延遲選擇: 0 - 從傳送上一個字符一直到“RTS 未激活”之前無延遲 1 到 65535 - 從傳送上一個字符直到“RTS 未激活”之前的延遲(以毫秒表示)(不適用于 RS422/485 端口)。不論選擇 FLOW_CTRL 為何,都會使用 RTS 延遲。 |
RESP_TO | IN | UInt | Word | 1000 |
響應超時: 5 ms 到 65535 ms - Modbus_Master 等待從站響應的時間(以毫秒為單位)。如果從站在此時間段內未響應,Modbus_Master 將重復請求,或者在指定數量的重試請求后取消請求并提示錯誤(請參見下文,RETRIES 參數)。 |
MB_DB | IN/OUT | MB_BASE | ? |
對 Modbus_Master 或 Modbus_Slave 指令的背景數據塊的引用。 MB_DB 參數必須與 Modbus_Master 或 Modbus_Slave 指令的(靜態,因此在指令中不可見)MB_DB 參數相連。 |
|
COM_RST | IN/OUT | --- | Bool | FALSE |
Modbus_Comm_Load 指令的初始化 將使用 TRUE 對指令進行初始化。隨后會將 COM_RST 復位為 FALSE。 注: 該參數僅適用于 S7-300/400 指令。 |
DONE | OUT | Bool | FALSE | 如果上一個請求完成并且沒有錯誤,DONE 位將變為 TRUE 并保持一個周期。 | |
ERROR | OUT | Bool | FALSE | 如果上一個請求完成出錯,則 ERROR 位將變為 TRUE 并保持一個周期。STATUS 參數中的錯誤代碼僅在 ERROR = TRUE 的周期內有效。 | |
STATUS | OUT | Word | 16#7000 | 錯誤代碼(請參見錯誤消息) |
執行 Modbus_Comm_Load 以對 Modbus RTU 協議的端口進行組態。為 Modbus RTU 協議組態完端口后,它只能由 Modbus_Master 指令或 Modbus_Slave 指令使用。
必須運行 Modbus_Comm_Load 來完成將用于 Modbus 通信的每個通信端口的組態。必須為使用的每個端口分配唯一的 Modbus_Comm_Load 背景數據塊。如果需要更改數據傳輸速率或奇偶校驗等通信參數,或者網絡已經恢復,只需再次運行 Modbus_Comm_Load。
例如,當在程序中添加 Modbus_Master 或 Modbus_Slave 指令時,將自動為指令分配背景數據塊。需要將 Modbus_Comm_Load 指令的 MB_DB 參數連接到 Modbus_Master 或 Modbus_Slave 指令的 MB_DB 參數。
Modbus_Comm_Load 數據塊變量
下表顯示了可在程序中使用的 Modbus_Comm_Load 背景數據塊中的公共靜態變量。
背景數據塊中的靜態變量
變量 | 數據類型 | 標準 | 說明 | |
---|---|---|---|---|
S7- 1200/1500 |
S7- 300/400/ WinAC |
? | ? | ? |
ICHAR_GAP | Word | 0 | 字符間的最長字符延遲時間。此參數以毫秒為單位指定,并且增加了所接收字符之間的預期周期。將此參數的相應位時間數添加到 Modbus 默認值 35 位時間(3.5 字符時間)。 | |
RETRIES | Word | 2 | 返回“無響應”錯誤代碼 0x80C8 之前主站執行的重復嘗試次數。 | |
EN_SUPPLY_VOLT | Bool | 0 | 啟用對電源電壓 L+ 缺失的診斷 | |
MODE | USInt | 字節 | 0 |
工作模式 有效的工作模式包括: 0 = 全雙工 (RS232) 1 = 全雙工 (RS422) 四線制模式(點對點) 2 = 全雙工 (RS 422) 四線制模式(多點主站,CM PtP (ET?200SP)) 3 = 全雙工 (RS 422) 四線制模式(多點從站,CM PtP (ET?200SP)) 4 = 半雙工 (RS485) 二線制模式 1) |
LINE_PRE | USInt | 字節 | 0 |
接收線路初始狀態 有效的初始狀態是: 0 =“無”初始狀態 1) 1 = 信號 R(A)=5 V,信號 R(B)=0 V(斷路檢測): 在此初始狀態下,可進行斷路檢測。 僅可以選擇以下項:“全雙工 (RS422) 四線制模式(點對點連接)”和“全雙工 (RS422) 四線制模式(多點從站)”。 2 = 信號 R(A)=0 V,信號 R(B)=5 V: 此默認設置對應于空閑狀態(無激活的發送操作)。在此初始狀態下,無法進行斷路檢測。 |
BRK_DET | USInt | 字節 | 0 |
斷路檢測 以下內容有效: 0 = 斷路檢測已禁用 1 = 斷路檢測已激活 |
EN_DIAG_ALARM | Bool | 0 |
激活診斷中斷: 0 - 未激活 1 - 已激活 |
|
STOP_BITS | USINT | 字節 | 1 |
停止位個數; 1 = 1 個停止位, 2 = 2 個停止位, 0、3 到 255 = 保留 |
1) 使用 PROFIBUS 電纜連接 CM 1241 的 RS485 時所需的設置 |
Modbus_Master: 作為 Modbus 主站進行通信
Modbus_Master 指令可通過由 Modbus_Comm_Load 指令組態的端口作為 Modbus 主站進行通信。當在程序中添加 Modbus_Master 指令時,將自動分配背景數據塊。Modbus_Comm_Load 指令的 MB_DB參數必須連接到 Modbus_Master 指令的(靜態)MB_DB參數。
參數 ?
參數 | 聲明 | 數據類型 | 標準 | 說明 | |
---|---|---|---|---|---|
S7- 1200/1500 |
S7- 300/400/ WinAC |
||||
REQ | IN | Bool | FALSE |
FALSE = 無請求 TRUE = 請求向 Modbus 從站發送數據 |
|
MB_ADDR | IN | UInt | Word | ? |
Modbus RTU 站地址: 標準地址范圍(1 到 247 以及 0用于 Broadcast) 擴展地址范圍(1 到 65535以及 0 ,用于 Broadcast) 值 0 為將幀廣播到所有 Modbus 從站預留。廣播僅支持 Modbus 功能代碼 05、06、15 和 16。 |
MODE | IN | USInt | Byte | 0 | 模式選擇:指定請求類型(讀取、寫入或診斷)。下面的 Modbus 功能表中提供了其它信息。 |
DATA_ADDR | IN | UDInt | DWord | 0 | 從站中的起始地址:指定在 Modbus 從站中訪問的數據的起始地址。下面的 Modbus 功能表中列出了有效地址。 |
DATA_LEN | IN | UInt | Word | 0 | 數據長度:指定此指令將訪問的位或字的個數。下面的 Modbus 功能表中列出了有效長度。 |
COM_RST | IN/OUT | --- | Bool | FALSE |
Modbus_Master 指令的初始化 將使用 TRUE 對指令進行初始化。隨后會將 COM_RST 復位為 FALSE。 注: 該參數僅適用于 S7-300/400 指令。 |
DATA_PTR | IN/OUT | Variant | Any | ? |
數據指針:指向要進行數據寫入或數據讀取的標記或數據塊地址。 自指令版本 V3.0 起: 該參數可指向優化存儲區。在優化存儲區中,允許使用以下數據類型的單個元素或數組:Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar。所有其它數據類型都會導致出現錯誤消息 16#818C。 |
DONE | OUT | Bool | FALSE | 如果上一個請求完成并且沒有錯誤,DONE 位將變為 TRUE 并保持一個周期。 | |
BUSY | OUT | Bool | ? |
FALSE – Modbus_Master 無激活命令 TRUE – Modbus_Master 命令執行中 |
|
ERROR | OUT | Bool | FALSE | 如果上一個請求完成出錯,則 ERROR 位將變為 TRUE 并保持一個周期。STATUS 參數中的錯誤代碼僅在 ERROR = TRUE 的周期內有效。 | |
STATUS | OUT | Word | 0 | 錯誤代碼(請參見錯誤消息) |
Modbus 主站數據塊中的變量
下表顯示了可在程序中使用的 Modbus_Master 背景數據塊中的公共靜態變量。
背景數據塊中的靜態變量
變量 | 數據類型 | 標準 | 說明 |
---|---|---|---|
Blocked_Proc_Timeout | Real | 3.0 |
在“激活”狀態移除此實例前,等待受阻的 Modbus 主站實例的持續時間(以秒為單位)。例如,如果輸出主站請求,隨后在其完全結束請求之前,程序停止并調用主站功能,則可能發生這種情況。時間值必須大于 0 秒而小于 55 秒,以避免發生錯誤。 另請參見“Modbus-Master 通信規則”和“使用不同的參數設置調用 Modbus_Master 指令”。 |
Extended_Addressing | Bool | FALSE |
將從站地址組態為單字節或雙字節。 FALSE = 1 字節地址;0 到 247 TRUE = 2 字節地址(對應于擴展地址); 0 到 65535 |
Compatibility_Mode 1) | Bool | FALSE |
對于 Modbus,使用 Modbus?RTU 驅動程序 的 CP?341、CP?441-2 和 ET 200SP 1SI,以及 ET?200SP?1SI 的兼容模式 默認值為 0。 FALSE = 根據 Modbus 規范,不兼容 TRUE = 兼容 對于 FC1 和 FC2:從幀中讀取的數據逐字寫入訪問的 CPU 存儲器內,并逐字節替換。 如果要傳輸的位數不是 16 的倍數,那么不相關的位將在最后一個字中設置為空值。 對于 FC15:要傳輸的字從訪問的存儲器中逐字讀取并逐字節寫入發送幀。 如果要傳輸的位數不是 8 的倍數,那么最后一個字節中不相關的位將從訪問的存儲器中讀取,并輸入到發送幀中。 |
MB_DB | MB_BASE | - | Modbus_Comm_Load 指令的 MB_DB 參數必須連接到 Modbus_Master 指令的此 MB_DB 參數。 |
1) 點對點通信模塊會根據 Modbus 規范中的定義進行響應。對于 Modbus,要保留與 CP 341, CP?441?2 和 ET?200SP?1SI一樣的響應,使用“Compatibility_Mode”參數。 |
程序可以向 Blocked_Proc_Timeout 和 Extended_Addressing 變量中寫入值來控制 Modbus 主站的操作。
Modbus-Master 通信規則
必須運行 Modbus_Comm_Load 來組態端口,以便 Modbus_Master 指令可以使用該端口進行通信。
要用來作為 Modbus 主站的端口不可作為 Modbus_Slave 使用。對于該端口,可以使用一個或多個 Modbus_Master1) 的實例。但是,所有版本的 Modbus_Master 都必須為該端口使用相同的背景數據塊。
Modbus 指令不會使用通信報警事件來控制通信過程。程序必須查詢 Modbus_Master 指令來獲得完整的命令(DONE、ERROR)。
我們建議為來自程序周期 OB 的特定端口調用 Modbus_Master 的所有執行。Modbus 主站指令只能在一個程序周期或一個周期/時間控制的處理級別中執行。它們無法在不同的處理級別中進行處理。由具有較高優先級的處理級別中的 Modbus 主站指令引起的 Modbus 主站指令的優先級中斷將導致操作不正確。Modbus 主站指令無法在啟動、診斷或時間錯誤級別中處理。
1) 此處的“Modbus 主站的實例”意味著,調用具有與 Modbus_Comm_Load 指令相同的互聯,并具有與 MB_ADDR、MODE、DATA_ADDR和 DATA_LEN參數相同的設置的 Modbus_Master 指令。
示例
MODE = 0 且 DATA_ADDR = 10 時會調用 Modbus_Master
此作業將一直處于激活狀態,直到通過參數 DONE=1 或 ERROR=1 完成,或者 Blocked_Proc_Timeout 參數中組態的監視時間到期。如果在看門狗時間用完且之前的命令還未完成時啟動了新命令,那么之前的命令將會中止而不會有錯誤消息。
如果在此命令正在運行期間使用相同的實例數據以不同的 MODE和 DATA_ADDR參數設置再次調用,則第二次的調用將以 ERROR = 1 和 STATUS = 8200 終止。
使用不同的參數設置調用 Modbus_Master 指令
如果程序中含有使用不同 MB_ADDR、MODE、DATA_ADDR或 DATA_LEN設置的多個 Modbus_Master 指令調用,必須確保在任意給定時間,只有一個調用處于激活狀態。否則,將輸出錯誤消息 16#8200(接口正忙于處理當前請求)。
如果無法完整地完成調用,那么看門狗會由 Blocked_Proc_Timeout 參數激活,并終止當前命令。
REQ 參數
FALSE = 無請求;TRUE = 請求向 Modbus 從站發送數據
啟用請求的傳輸。這會將緩沖區中的內容傳送到點對點通信接口。
可以使用 DATA_ADDR 和 MODE 參數來選擇 Modbus 功能代碼。
DATA_ADDR(從站中的 Modbus 起始地址):指定在 Modbus 從站中訪問的數據的起始地址。
Modbus_Master 指令使用 MODE 輸入,不使用功能代碼輸入。MODE 和 DATA_ADDR 結合使用可指定在實際 Modbus 幀中使用的功能代碼。下表顯示了 MODE 參數、Modbus 功能代碼和DATA_ADDR 中 Modbus 地址范圍之間的關系。
Modbus 功能
MODE | DATA_ADDR(Modbus 地址) |
DATA_LEN (數據長度) |
Modbus 功能代碼 | 運行和數據 | ||||||
---|---|---|---|---|---|---|---|---|---|---|
0 | ? | 每個請求的位數 | 01 | 讀取輸出位: | ||||||
1 | 到 | 9999 | 1 | 到 | 2000/1992 1 | 0 | 到 | 9998 | ||
0 | ? | 每個請求的位數 | 02 | 讀取輸入位: | ||||||
10001 | 到 | 19999 | 1 | 到 | 2000/1992 1 | 0 | 到 | 9998 | ||
0 | ? | 每個請求的字數 | 03 | 讀取保持寄存器: | ||||||
40001 | 到 | 49999 | 1 | 到 | 125/124 1 | 0 | 到 | 9998 | ||
400001 | 到 | 465535 | 1 | 到 | 125/124 1 | 0 | 到 | 65534 | ||
0 | ? | 每個請求的字數 | 04 | 讀取輸入字: | ||||||
30001 | 到 | 39999 | 1 | 到 | 125/124 1 | 0 | 到 | 9998 | ||
1 | ? | 每個請求的位數 | 05 | 寫入一個輸出位: | ||||||
1 | 到 | 9999 | 1 | ? | ? | 0 | 到 | 9998 | ||
1 | ? | 每個請求 1 個字 | 06 | 寫入一個保持寄存器: | ||||||
40001 | 到 | 49999 | 1 | ? | ? | 0 | 到 | 9998 | ||
400001 | 到 | 465535 | 1 | ? | ? | 0 | 到 | 65524 | ||
1 | ? | 每個請求的位數 | 15 | 寫入多個輸出位: | ||||||
1 | 到 | 9999 | 2 | 到 | 1968/1960 1 | 0 | 到 | 9998 | ||
1 | ? | 每個請求的字數 | 16 | 寫入多個保持寄存器: | ||||||
40001 | 到 | 49999 | 2 | 到 | 123/122 | 0 | 到 | 9998 | ||
400001 | 到 | 465534 | 2 | 到 | 123/122 1 | 0 | 到 | 65534 | ||
2 2 | ? | 每個請求的位數 | 15 | 寫入一個或多個輸出位: | ||||||
1 | 到 | 9999 | 1 | 到 | 1968/1960 1 | 0 | 到 | 9998 | ||
2 2 | ? | 每個請求的字數 | 16 | 寫入一個或多個保持寄存器: | ||||||
40001 | 到 | 49999 | 1 | 到 | 123 | 0 | 到 | 9998 | ||
400001 | 到 | 465535 | 1 | 到 | 122 1 | 0 | 到 | 65534 | ||
11 | 此功能將忽略 Modbus_Master 的 DATA_ADDR 和 DATA_LEN 操作數。 | 11 | 讀取從站通信的狀態字和事件計數器。狀態字表示“忙”(0 - 不忙,0xFFFF - 忙)。事件計數器隨著幀的每次成功處理而遞增。 | |||||||
80 | ? | 每個請求 1 個字 | 08 | 使用數據診斷代碼 0x0000 檢查從站狀態(回送測試 - 從站返回請求的回應) | ||||||
- | ? | ? | 1 | ? | ? | - | ? | ? | ||
81 | ? | 每個請求 1 個字 | 08 | 利用數據診斷代碼 0x000A 重新設置從站事件計數器 | ||||||
- | ? | ? | 1 | ? | ? | - | ? | ? | ||
104 | ? | 每個請求的字數 | 04 | 讀取輸入字 | ||||||
0 | 到 | 65535 | 1 | 到 | 125/124 1 | 0 | 到 | 65535 | ||
3 到 10, 12 到 79, 82 到 103,105 到 255 |
- | ? | ? | - | ? | ? | ? | 保留 | ||
1 在擴展尋址中(請參見 Extended_Adressing 參數),最大數據長度根據功能的數據類型而縮減 1 字節或 1 個字。 2 MODE 2 允許使用 Modbus 功能 15 和 16 寫入 1 個或多個輸出位和 1 個或多個保持寄存器。 MODE 1 使用 Modbus 功能 5 和 6 寫入 1 個輸出位和 1 個保持寄存器,使用 Modbus 功能 15 和 16 寫入多個輸出位和多個保持寄存器。 |
DATA_PTR 參數
DATA_PTR 參數指向在其中執行讀取或寫入的數據塊或位存儲器地址。如果使用數據塊,則必須創建全局數據塊,以便為 Modbus 從站上的讀取或寫入過程提供數據存儲器。
說明 S7-1200/1500 - 使用 DATA_PTR 的訪問的數據塊必須支持直接尋址 數據塊必須允許直接(絕對)尋址和符號尋址。 |
說明 使用功能代碼 5 功能代碼 5 用于設置或刪除各個位。 設置位時,必須在通過 DATA_PTR 尋址到的 DB 或位存儲區的首個字中指定值“16#FF00”。 對于 S7-1200,也可以指定值“16#0100”以設置位。 為復位某個位,必須在通過 DATA_PTR 尋址到 DB 或位存儲區的首個字中指定值“16#0000”。 所有其它值通過 ERROR = TRUE 和 STATUS = 16#8384 拒絕。 |
DATA_PTR 參數的數據塊結構
這些數據類型對讀取 Modbus 地址范圍 (DATA_PTR) 30001 到 39999、40001 到 49999 和 400001 到 465535 中的字有效,以及對寫入 Modbus 地址范圍(DATA_PTR 參數)40001 到 49999 和 400001 到 465535 中的字有效。
數據類型 WORD、UINT 或 INT 的標準數組
WORD、UINT 或 INT 類型的指定結構,其中每個元素都有唯一的名稱和一個 16 位的數據類型。
指定的復雜結構,其中每個元素都有唯一的名稱和一個 16 位或 32 位的數據類型。
用于讀/寫 Modbus 地址范圍(DATA_PTR 參數)00001到 09999 中的位和用于讀取 10001 到 19999 中的位。
布爾數據類型的標準字段。
來自明確指定的布爾變量的指定布爾結構。
給每個 Modbus_Master 指令分配各自的獨立存儲區并不是必須進行的操作,但我們建議進行此操作。原因是,如果多個 Modbus 指令都在同一個存儲區讀取和寫入,那么數據損壞的可能性將大大增高。
DATA_PTR的數據區不必位于相同的全局數據塊中??梢詾?Modbus 讀取過程創建具有多個區域的數據塊,為 Modbus 寫入過程創建數據塊或為每個從站創建數據塊。
Modbus_Slave:作為 Modbus 從站進行通信
說明
程序可利用 CM(RS422/485 或 RS232)端口,使用 Modbus_Slave 指令來作為 Modbus 從站進行通信。添加指令時,STEP 7 將自動創建背景數據塊。Modbus_Comm_Load 指令的 MB_DB 參數必須連接到 Modbus_Slave 指令的(靜態)MB_DB 參數。
參數
參數 | 聲明 | 數據類型 | 標準 | 說明 | |
---|---|---|---|---|---|
S7- 1200/1500 |
S7- 300/400/ WinAC |
||||
MB_ADDR | IN | UInt | Word | ? |
Modbus 從站的標準尋址: 標準尋址范圍(1 到 247) 擴展尋址范圍(0 到 65535) 注:0 是廣播地址 |
COM_RST | IN/OUT | --- | Bool | FALSE |
Modbus_Slave 指令的初始化 將使用 TRUE 對指令進行初始化。隨后會將 COM_RST 復位為 FALSE。 注: 該參數僅適用于 S7-300/400 指令。 |
MB_HOLD_REG | IN/OUT | Variant | Any | ? |
Modbus 保持寄存器 DB 的指針:Modbus 保持寄存器可能為標志的存儲區或者數據塊。 自指令版本 V4.0 起: 該參數必須指向長度為 16 位以上的存儲區,否則會導致出現錯誤消息 16#8187。這一要求對于單個元素、數組、STRUCT 和 UDT 均適用。例如,如果 Single Bool 或數組中包含的布爾元素個數小于 16,則會導致出現錯誤消息。 如果長度不是 16 位的倍數,則存儲區末端的剩余位無法通過Modbus_Slave 指令讀取或寫入。 該參數可指向優化存儲區。在優化存儲區中,允許使用以下數據類型的單個元素或數組:Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar。所有其它數據類型都會導致出現錯誤消息 16#818C。 |
NDR | OUT | Bool | FALSE |
可用的新數據: FALSE - 無新數據 TRUE – 表示新數據已由 Modbus 主站寫入 如果上一個請求完成并且沒有錯誤,NDR 位將變為 TRUE 并保持一個周期。 |
|
DR | OUT | Bool | FALSE |
讀取數據: FALSE - 未讀取數據 TRUE - 表示該指令已將 Modbus 主站接收到的數據存儲在目標區域中。 如果上一個請求完成并且沒有錯誤,DR 位將變為 TRUE 并保持一個周期。 |
|
ERROR | OUT | Bool | FALSE | 如果上一個請求完成出錯,則 ERROR 位將變為 TRUE 并保持一個周期。如果執行因錯誤而終止,則 STATUS 參數中的錯誤代碼僅在 ERROR = TRUE 的周期內有效。 | |
STATUS | OUT | Word | 0 | 錯誤代碼(請參見錯誤消息) |
Modbus 通信的功能代碼(1、2、4、5 和 15)可直接在 CPU 的過程映像輸入和過程映像輸出中讀取或寫入位和字。對于這些功能代碼,必須將 MB_HOLD_REG 參數定義為大于一個字節的數據類型。下表顯示了將 Modbus 地址分配給 CPU 中過程映像的示例。
將 Modbus 地址分配給過程映像
Modbus 功能 | S7-1200 | ||||||||
---|---|---|---|---|---|---|---|---|---|
代碼 | 功能 | 數據區 | 地址區 | 數據區 | CPU 地址 | ||||
01 | 讀取位 | 輸出 | 0 | 到 | 8191 | 過程映像輸出 | O0.0 | 到 | O1023.7 |
02 | 讀取位 | 輸入 | 0 | 到 | 8191 | 過程映像輸入 | I0.0 | 到 | I1023.7 |
04 | 讀取字 | 輸入 | 0 | 到 | 511 | 過程映像輸入 | IW0 | 到 | IW1022 |
05 | 寫入位 | 輸出 | 0 | 到 | 8191 | 過程映像輸出 | O0.0 | 到 | O1023.7 |
15 | 寫入位 | 輸出 | 0 | 到 | 8191 | 過程映像輸出 | O0.0 | 到 | O1023.7 |
將 Modbus 地址分配給過程映像
Modbus 功能 | S7-1500/S7-300/S7-400 | ||||||||
---|---|---|---|---|---|---|---|---|---|
功能代碼 | 功能 | 數據區 | 地址區 | 數據區 | CPU 地址 | ||||
01 | 讀取位 | 輸出 | 0 | 到 | 9998 | 過程映像輸出 | O0.0 | 到 | A1249.6 |
02 | 讀取位 | 輸入 | 0 | 到 | 9998 | 過程映像輸入 | I0.0 | 到 | I1249.6 |
04 | 讀取字 | 輸入 | 0 | 到 | 9998 | 過程映像輸入 | IW0 | 到 | IW19996 |
05 | 寫入位 | 輸出 | 0 | 到 | 9998 | 過程映像輸出 | O0.0 | 到 | A1249.6 |
15 | 寫入位 | 輸出 | 0 | 到 | 9998 | 過程映像輸出 | O0.0 | 到 | A1249.6 |
說明 可用的地址區可能更小,具體取決于 CPU 的存儲器組態。 |
Modbus 通信的功能代碼(3、6 和 16)使用 Modbus 保持寄存器,此寄存器是標志的存儲區或者數據塊中的一個地址區。保持寄存器的類型由 Modbus_Slave 指令的 MB_HOLD_REG 參數指定。
說明 S7-1200/1500 - MB_HOLD_REG 數據塊的類型 具有 Modbus 保持存器的數據塊必須允許直接(絕對)尋址和符號尋址。 |
診斷功能
S7-1200 Modbus_Slave 的 Modbus 診斷功能 | ||
---|---|---|
功能代碼 | 子功能 | 說明 |
08 | 0000H | 輸出回應測試的請求數據:Modbus_Slave 指令會將所接收數據字的回應返回到 Modbus 主站。 |
08 | 000AH | 清除通信事件計數器:Modbus_Slave 指令將清除用于 Modbus 功能 11 的通信事件計數器。 |
11 | ? | 調用通信事件計數器:Modbus_Slave 指令使用內部通信事件計數器來檢測將發送到 Modbus 從站的成功的 Modbus 讀取和 Modbus 寫入數量。該計數器不隨功能 8、功能 11 和廣播請求而遞增。它也不會隨導致通信錯誤(例如,奇偶校驗或 CRC 錯誤)的請求而遞增。 |
Modbus_Slave 指令支持來自 Modbus 主站的廣播寫入請求,只要該請求包括到有效地址的訪問即可。針對廣播功能不支持的功能代碼,Modbus_Slave 指令將生成錯誤代碼 16#8188。
指令版本 V3.0 中 Modbus 從站的變量
下表顯示了可在程序中使用的 Modbus_Slave 背景數據塊中的公共靜態變量。
Modbus 從站的變量
變量 | 數據類型 | 標準 | 說明 |
---|---|---|---|
HR_Start_Offset | Word | 0 | 為 Modbus 保持寄存器指定起始地址(默認 = 0) |
QB_Start | Word | 0 |
輸出的有效可寫入尋址范圍起始地址(字節 0 到 65535) 注: 該變量不適用于 S7-300、S7-400 和 WinAC。 |
QB_Count | Word | 0xFFFF |
可由 Modbus 主站寫入的輸出字節數。 注: 該變量不適用于 S7-300、S7-400 和 WinAC。 |
Extended_Addressing | Bool | FALSE |
擴展尋址,將從站尋址組態為單字節或雙字節。 (FALSE = 單字節地址,TRUE = 雙字節地址) |
Request_Count | Word | 0 | 該從站接收的所有請求的數量 |
Slave_Message_Count | Word | 0 | 該特定從站接收的所有請求的數量 |
Bad_CRC_Count | Word | 0 | 存在 CRC 錯誤的已接收請求的數量 |
Broadcast_Count | Word | 0 | 已接收的廣播請求的數量 |
Exception_Count | Word | 0 | 使用主站的例外進行確認的 Modbus 特定錯誤 |
Success_Count | Word | 0 | 該特定從站接收的無協議錯誤的請求數量 |
MB_DB | MB_BASE | - | Modbus_Comm_Load 指令的 MB_DB 參數必須連接到 Modbus_Master 指令的此 MB_DB 參數。 |
程序可以向 HR_Start_Offset 和 Extended_Addressing 變量中寫入值來控制 Modbus 從站的操作。可以讀取其它變量來監視 Modbus 狀態。
?
審核編輯:劉清
評論
查看更多