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