MODBUSPN 說明
說明
該 MODBUSPN 指令允許在帶有集成 PN 接口的 CPU 和支持 Modbus/TCP 協(xié)議的伙伴之間進行通信。支持功能代碼 1、2、3、4、5、6、15 和 16。根據參數分配,該指令可用作客戶端(S7 為客戶端),也可用作服務器(S7 為服務器)。使用 MODBUSPN 指令在通信伙伴之間建立連接以傳送數據并控制連接終止。
數據傳輸期間執(zhí)行以下操作:
發(fā)送時,生成 MODBUS 特定的消息幀報頭
接收時,檢查 MODBUS 特定的消息幀報頭
檢查由客戶端尋址的數據區(qū)是否存在
發(fā)生錯誤時,生成異常消息幀(僅限 S7 為服務器時)
與組態(tài)的數據塊進行數據傳輸
還將對建立連接、終止連接以及數據接收所使用的時間進行監(jiān)視。
“MODBUSPN”指令 V2.0 可用于 S7-300 及 S7-400。通過本地 CPU 接口進行連接。使用該指令時,無需其它任何硬件模塊。
指令的工作原理
初始化
在“Init”輸入中有上升沿時初始化指令 MODBUSPN。
必須根據設備組態(tài)分配初始化參數。
初始化參數將應用于背景 DB。
啟動過程中不會評估運行時參數。
將檢查參數數據塊中數據的有效性。
如果在 Init 參數中檢測到上升沿,則執(zhí)行上述操作。如果檢查完成后沒有錯誤,則重置 Init,Init_Error 和 Init_Status 顯示 0。
如果在檢查期間出現(xiàn)錯誤,則會顯示在輸出 Init_Error 和 Init_Status 中。只要存在 Init 錯誤,就不能通過此塊進行 Modbus/TCP 通信。必須首先更正 Init 錯誤。
循環(huán)模式
循環(huán)模式下,將在 OB1 或循環(huán)中斷 OB 中調用 MODBUSPN。
將根據運行時參數激活塊功能。
處理作業(yè)期間不會評估運行時參數的更改。
只要未執(zhí)行初始化,就不會評估初始化參數。
處理連接
Modbus客戶端主動建立連接。從參數數據塊中的連接參數讀取所需數據。
連接參數塊中的參數 (active_est) 指定 PN CPU 將作為主動通信伙伴還是被動通信伙伴。
對于兩種連接類型(主動和被動),在運行時均會通過 TCON 指令打開一個到鏈接伙伴的通信通道。
通過參數數據塊中的 connect_at_startup 參數指定連接建立的時間。
通過 MODBUSPN 指令中的 DISCONNECT 參數終止連接。
“S7 為客戶端”的作業(yè)初始化或“S7 為服務器”的指令激活
輸出參數為動態(tài)顯示,因此未決狀態(tài)僅持續(xù) 1 個 CPU 周期。也就是說,必須將其復制到其它存儲區(qū),才能進一步處理或在監(jiān)視表中顯示。
S7 為客戶端:作業(yè)初始化
作業(yè)通過觸發(fā)輸入 ENQ_ENR 的上升沿變化激活。根據輸入參數 UNIT、DATA_TYPE、START_ADDRESS、LENGTH 和 WRITE_READ,會生成 MODBUS 請求幀,并通過 TCP/IP 連接發(fā)送到伙伴站。客戶端等待服務器響應的組態(tài)時間 RECV_TIMEOUT。
如果發(fā)生超時(服務器沒有響應),則激活的作業(yè)將正常結束。可啟動新作業(yè)。
接收到響應消息后將執(zhí)行有效性檢查。如果檢查成功,將執(zhí)行所需動作,且作業(yè)成功執(zhí)行未出現(xiàn)錯誤;輸出 DONE_NDR 置位。如果在檢查期間檢測到錯誤,則作業(yè)正常結束,置位位 ERROR,并在 STATUS 中顯示錯誤編號。
S7 為服務器:指令激活
指令已準備好在觸發(fā)輸入 ENQ_ENR 的上升沿接收來自客戶端的請求消息。在這種情況下,服務器處于被動狀態(tài),并等待來自客戶端的消息幀。將檢查接收到的消息幀。如果檢查成功,則對請求消息做出應答。DONE_NDR 位置位時,即通知用戶消息通信已完成。此時,已執(zhí)行的函數會顯示在輸出 UNIT、DATA_TYPE、START_ADDRESS、LENGTH 和 WRITE_READ 中。
錯誤的請求消息或導致錯誤消息。置位位 ERROR,在 STATUS 中顯示錯誤編號,并且不處理客戶端的請求。將根據錯誤情況向客戶端發(fā)送異常消息幀。
參數
下表列出了指令“MODBUSPN”的參數:
參數 | 聲明 | 數據類型 | 說明 | 取值范圍 | Init |
---|---|---|---|---|---|
id | Input | WORD | 連接 ID 必須與參數 DB 中相關的 id 參數相同。 |
1 到 4095 W#16#1 到 W#16#FFF |
是 |
db_param | Input | BLOCK_DB | 參數 DB 的編號,包含此 Modbus 塊實例的所有連接和 Modbus 數據 | 取決于 CPU | 是 |
REG_KEY_DB | Input | BLOCK_DB | 具有可用于授權的注冊表項的數據塊 | 取決于 CPU | 否 |
RECV_TIMEOUT | Input | TIME |
鏈接伙伴接收數據的監(jiān)視時間 可以設置的最短時間為 20 ms。 |
T#20ms 到 T#+24d20h31m23s647ms | 否 |
CONN_TIMEOUT | Input | TIME |
建立或終止連接的監(jiān)視時間 可以設置的最短時間為 100 ms。 |
T#100ms 到 T#+24d20h31m23s647ms | 否 |
DISCONNECT | Input | BOOL |
通過該參數,可以控制與 Modbus服務器建立和終止連接: S7 為客戶端: TRUE:接收到響應消息后將立即建立連接。 S7 為服務器: TRUE:如果 ENQ_ENR = FALSE,連接將終止。 |
TRUE FALSE |
否 |
ENQ_ENR | Input | BOOL |
S7 為客戶端: 在上升沿啟動作業(yè) 在服務器作出響應或輸出錯誤消息之前,對輸入參數所做的更改不會生效。 如果在 Modbus 請求期間再次設置了參數 ENQ_ENR,此后將不會進行任何其它傳輸。 S7 為服務器: 準備接收 TRUE 信號 |
TRUE FALSE |
否 |
LICENSED | Output | BOOL |
塊的授權狀態(tài) 塊已授權 塊未授權 |
TRUE FALSE |
否 |
CONN_ESTABLISHED | Output | BOOL |
與鏈接伙伴的連接已建立 與鏈接伙伴的連接已終止 |
TRUE FALSE |
否 |
BUSY | Output | BOOL |
編輯 T 函數(TCON、TDISCON、TSEND 或 TRCV)的狀態(tài) T 函數正在進行中 T 函數未在進行中 |
TRUE FALSE |
否 |
DONE_NDR | Output | BOOL |
S7 為客戶端: TRUE:激活作業(yè)完成,且未出現(xiàn)錯誤。 S7 為服務器: TRUE:已執(zhí)行來自客戶端的請求且已發(fā)送響應 |
TRUE FALSE |
否 |
ERROR | Output | BOOL |
FALSE:無錯誤 TRUE:出錯。出錯原因由 STATUS 參數指示。 |
FALSE TRUE |
否 |
STATUS | Output | WORD | 錯誤編號或狀態(tài)信息 | 0 到 FFFF | 否 |
STATUS_FUNC | Output | STRING[8] | 引起 STATUS 中出現(xiàn)的錯誤的指令名稱 | 字符 | 否 |
IDENT_CODE | Output | STRING[18] |
授權的標識號 可以使用該代碼請求許可證的注冊密鑰REG_KEY。 |
字符 | 否 |
Init_Error | Output | BOOL | TRUE:初始化期間出現(xiàn)錯誤。 | TRUE/FALSE | 否 |
Init_Status | Output | WORD | 初始化狀態(tài) | 0 到 FFFF | 否 |
UNIT | InOut | BYTE |
單元標識符 (INPUT 用于客戶端功能,OUTPUT 用于服務器功能) |
0 到 255 B#16#0 到 B#16#FF |
否 |
DATA_TYPE | InOut | BYTE |
要編輯的數據類型: (客戶端功能的 INPUT、服務器功能的 OUTPUT) 線圈 輸入 保持寄存器 輸入寄存器 |
1 2 3 4 |
否 |
START_ADDRESS | InOut | WORD |
MODBUS 起始地址 (客戶端功能的 INPUT、服務器功能的 OUTPUT) |
0 到 65535 W#16#0000 到 W#16#FFFF |
否 |
LENGTH | InOut | WORD |
待處理值的數目(INPUT 用于客戶端功能,OUTPUT 用于服務器功能) 線圈 讀取功能 寫入功能 輸入 讀取功能 保持寄存器 讀取功能 寫入功能 輸入寄存器 讀取功能 |
1 到 2000 1 到 1968 1 到 2000 1 到 125 1 到 123 1 到 125 |
否 |
WRITE_READ | InOut | BOOL |
寫入訪問或 讀取訪問 (INPUT 用于客戶端功能,OUTPUT 用于服務器功能) |
TRUE FALSE |
否 |
Init | InOut | BOOL | 在上升沿進行初始化 | TRUE/FALSE | 否 |
Modbus 地址的解釋
MODBUS 數據模型包括以下區(qū)域:
線圈
輸入
保持寄存器
輸入寄存器
部分系統(tǒng)(例如 MODICON PLC)會通過寄存器地址或位地址區(qū)分這些存儲器。 例如,偏移量為 0 的保持寄存器被稱為寄存器 40001(存儲器類型 4xxxx,Reference 0001)。
這往往會引起混淆,因為一些手冊中描述或表示的是 Application Layers 的寄存器地址,而其它手冊使用的是協(xié)議中實際傳送的寄存器地址/位地址。
MODBUSPN 在其 start、end 和 START_ADDRESS 參數中使用的是實際傳送的 Modbus 地址。 也就是說,可通過各個功能代碼傳送從 0000H 到 FFFFH 的寄存器地址/位地址。
實例
在參數 DB 中可以按十進制或十六進制格式指定 Modbus 地址。
參數 | 十進制表示法 | 十六進制表示法 | 含義 |
data_type | 3 | B#16#3 | 保持寄存器 |
db | 11 | W#16#B | DB 11 |
start | 0 | W#16#0 | 起始地址: 0 |
end | 499 | W#16#1F3 | 結束地址: 499 |
data_type | 3 | B#16#3 | 保持寄存器 |
db | 12 | W#16#C | DB 12 |
start | 720 | W#16#2D0 | 起始地址: 720 |
end | 900 | W#16#384 | 結束地址: 900 |
下圖顯示了 SIMATIC 存儲區(qū)與按寄存器劃分和按位劃分的 Modbus 設備存儲器分配的對比。 分配基于上述參數分配。
在 Modbus 設備中:
以黑色顯示的 Modbus 地址表示Data Link Layer;以灰色顯示的地址表示Applikation Layer。
在 SIMATIC 中:
第一列中的 SIMATIC 地址是 DB 中的偏移量。 Modbus 寄存器編號顯示在括號中。
Modbus 通信的參數分配
無需在網絡編輯器中為使用 CPU 的集成 PN 接口的通信組態(tài)連接。將利用 TCON 和 TDISCON 指令建立和終止連接。
參數數據塊
建立連接和處理 Modbus 消息所需的數據在 PLC 數據類型 MB_PN_PARAM 中定義。此 PLC 數據類型包含連接專用的數據結構和 Modbus 參數結構。
數據塊中每個與通信伙伴的連接都需要一個 PLC 數據類型的實例;可以在其中定義連接參數和 Modbus 參數。可以為各個附加連接擴展數據塊,也可以創(chuàng)建新數據塊。
該數據塊或這些數據塊僅用于連接和 Modbus 參數;請勿用其保存任何其它參數。
“MODBUSPN”指令的每個實例都需要一個唯一的連接。為該指令的每個實例創(chuàng)建一個單獨的連接描述結構。
Param_DB 結構
“Connection settings”結構中的連接參數
在第一個結構“Connection settings”中,定義連接專用的參數,例如,通信伙伴的本地硬件接口和 IP 地址。指令 TCON 和 TDISCON 使用這些參數來建立或終止連接。
必須嚴格遵守連接參數塊的數據結構,否則無法建立連接。
“Modbus settings”結構中的 Modbus 參數
第二個結構“Modbus settings”中存儲操作模式和地址引用所需的數據,例如,數據塊中映射的 Modbus 區(qū)域和作為 Modbus 服務器或 Modbus 客戶端的 S7 的操作模式。必須遵守 Modbus 參數的數據結構,否則將無法正確處理。
組態(tài)
有兩種組態(tài)連接和 Modbus 參數的方式可供選擇。
選項:
創(chuàng)建新的全局數據庫并將其打開。添加參數并為該參數選擇數據類型 MB_PN_PARAM。如果下拉列表中未顯示該數據類型,可手動輸入。
對于該方式,可在一個數據塊中插入多個實例。
選項:
通過“添加新塊”(Add new block) 創(chuàng)建新的數據塊,并將“類型”(Type) 選擇為 MB_PN_PARAM。帶有已插入連接和 Modbus 結構的新數據塊將打開。
該塊為只讀。無法添加任何其它參數。可以編輯現(xiàn)有參數。
更改值
不可在運行期間更改參數數據塊中的值。更改參數后,必須通過 Init = TRUE 重新初始化塊。
“Connection settings”連接參數
參數 | 說明 | |
---|---|---|
block_length |
該參數定義連接參數的長度,且無法更改。 固定值: W#16#40 |
|
id |
為每個邏輯連接分配一個新連接 ID。此 ID 在整個 CPU 中必須是唯一的。調用 MODBUSPN 時指定 ID;該 ID 將用于 T 塊(TCON、TSEND、TRCV 和TDISCON)的內部調用。 值范圍: W#16#1 到 W#16#FFF |
|
connection_type |
建立連接的連接類型通過 TCON 指令定義。CPU 決定必須要設置的值。 TCP(兼容模式): B#16#01 針對 CPU 315 或 317 <= FW V2.3 TCP: B#16#11 針對 CPU 315 或 317 >= FW V2.4、IM 151-8 PN/DP CPU、CPU314C、CPU319、CPU412、CPU414 和 CPU416 該信息可能因固件不同而有所不同。 |
|
active_est |
該參數表示連接建立類型,主動或被動。Modbus 客戶端負責建立主動連接而 Modbus 服務器負責建立被動連接。 主動連接的建立: TRUE 被動連接的建立:FALSE |
|
local_device_id | local_device_id 定義所用 PN CPU 的 IE 接口。根據不同的 PN CPU 類型,需要不同的設置。 | |
IM 151-8 PN/DP CPU: CPU 314C、315 或 317: CPU 319: CPU 412、414 或 CPU 416 |
B#16#1 B#16#2 B#16#3 B#16#5 |
|
local_tsap_id_len |
參數 local_tsap_id(= 本地端口號)的長度是特定的。 主動連接的建立: 0 被動連接建立: 2 |
|
rem_subnet_id_len | 目前尚未使用此參數,必須將其分配為 B#16#0。 | |
rem_staddr_len |
指定 rem_staddr 參數的長度,該參數為通信伙伴的 IP 地址。如果要通過未指定的連接進行通信,則不為伙伴指定 IP 地址。 未指定的連接: B#16#0 指定的連接: B#16#4 |
|
rem_tsap_id_len |
此參數指示參數 rem_tsap_id 的長度和遠程通信伙伴的端口號。 主動連接的建立: 2 被動連接建立: 0 |
|
next_staddr_len |
在此處定義參數 next_staddr 的長度。 對于 PN 接口: B#16#0 |
|
local_tsap_id | 使用該參數設置本地端口號。表示類型會因 connection_type 參數不同而有所不同。CPU 決定值范圍。端口號在 CPU 中必須唯一。 | |
對于 connection_type B#16#01: local_tsap_id[1] local_tsap_id[2] local_tsap_id[3-16] 對于 connection_type B#16#11: local_tsap_id[1] local_tsap_id[2] local_tsap_id[3-16] |
用十六進制格式表示的端口號low byte 用十六進制格式表示的端口號high byte B#16#00 用十六進制表示的端口號high byte 用十六進制格式表示的端口號low byte B#16#00 |
|
rem_subnet_id | 目前尚未使用此參數,必須將其分配為 0。 | |
rem_staddr | 在此字節(jié)數組中輸入遠程通信伙伴的 IP 地址。使用未指定的連接時,不輸入 IP 地址。表示類型取決于 connection_type 參數。示例:IP 地址 192.168.0.1: | |
對于 connection_type B#16#01: rem_staddr[1] = rem_staddr[2] = rem_staddr[3] = rem_staddr[4] = rem_staddr[5-6]= 對于 connection_type B#16#11: rem_staddr[1] = rem_staddr[2] = rem_staddr[3] = rem_staddr[4] = rem_staddr[5-6]= |
B#16#01 (1) B#16#00 (0) B#16#A8 (168) B#16#C0 (192) B#16#00(保留) B#16#C0 (192) B#16#A8 (168) B#16#00 (0) B#16#01 (1) B#16#00(保留) |
|
rem_tsap_id | 使用該參數設置remote端口號。表示類型會因 connection_type 參數不同而有所不同。CPU 決定值范圍。 | |
對于 connection_type B#16#01: rem_tsap_id[1] rem_tsap_id[2] rem_tsap_id[3-16] 對于 connection_type B#16#11: rem_tsap_id[1] rem_tsap_id[2] rem_tsap_id[3-16] |
用十六進制表示的端口號low byte 用十六進制表示的端口號low byte B#16#00 用十六進制表示的端口號high byte 用十六進制表示的端口號low byte B#16#00 |
|
next_staddr |
該參數定義所用 CP 的機架和插槽編號。使用 CPU 的集成 PN 接口時,必須將該參數設置為 0。 next_staddr[1-6] B#16#00 |
|
spare | 未使用此參數,必須將其設設置為默認值 0。 |
“Modbus settings”Modbus 參數
參數 | 說明 | ||
---|---|---|---|
server_client |
TRUE: S7 是服務器 FALSE: S7 是客戶端 |
||
single_write |
在“S7 為客戶端”操作模式下,如果參數 single_write = TRUE ,則功能代碼 5 和 6 用于執(zhí)行長度為 1 的寫入作業(yè)。 如果 single_write = FALSE,則功能代碼 15 和 16 用于所有寫入作業(yè)。 |
||
connect_at_startup |
指定連接建立的時間。 如果將 connect_at_startup 設置為 TRUE,將在 CPU 重新啟動后立即建立連接。此種情況下,只有正確建立連接 (CONN_ESTABLISHED = TRUE) 后才能啟動數據請求,否則將在 ERROR 和 STATUS 中顯示相應的錯誤。 FALSE:如果 ENQ_ENR,則連接建立 設置為TRUE: 重新啟動后立即建立連接 |
||
八個數據區(qū) |
S7 存儲器中有八個可以用于映射 MODBUS 地址的數據區(qū)。必須至少定義第一個數據區(qū),其余七個數據區(qū)可選擇性定義。根據作業(yè)類型,將從數據區(qū)讀取數據或向其中寫入數據。 任何作業(yè)都只能從一個 DB 讀取數據或向一個 DB 寫入數據。訪問寄存器或位于多個 DB 中的位值時,即使編號連續(xù)無間隔,也將分為兩個作業(yè)。組態(tài)時請務必注意。 一個數據塊中可以映射的 Modbus 區(qū)(寄存器或位值)數目比一個消息幀可以處理的數目多。 |
||
data_type | data_type 參數指定該數據塊中映射的 MODBUS 數據類型。如果在 data_type 中輸入值 0,則不使用相應的區(qū)域。 | ||
標識符 0 1 2 3 4 |
數據類型 未使用區(qū)域 線圈 輸入 保持寄存器 輸入寄存器 |
數據寬度 Bit Bit Word Word |
|
db |
db 參數指定映射 MODBUS寄存器或下面定義的位值的數據塊。DB 編號 0 為系統(tǒng)保留,不允許使用。 DB 編號 1 到 65535(W#16#0001 到 W#16#FFFF) 數據塊必須比已組態(tài)數據所需的長度多兩個字節(jié)。最后的兩個字節(jié)供內部使用。 |
||
start end |
start 指定 DB 的數據字 0 中映射的第一個 Modbus 地址。end 參數定義最后一個 MODBUS 地址。 對于寄存器訪問,帶有最后一個 Modbus 地址輸入的 S7 DB 中的數據字編號如下計算: DBW 編號 = (end – start) * 2 對于位訪問,帶有最后一個 Modbus 地址輸入的 S7 DB 中的數據字節(jié)編號如下計算: DBB 編號 = (end – start + 7) / 8 定義的數據區(qū)不得重疊。end 參數不得小于 start。如果發(fā)生錯誤,指令啟動將中止并提示錯誤。如果兩個值相同,則將分配一個 Modbus 地址(1 個寄存器或 1 個位值)。 在 S7 存儲器區(qū)域映射 MODBUS 地址的示例。 MODBUS 地址 0 到 65535(W#16#0000 到 W#16#FFFF) |
||
internal_send_buffer | 該數組用于發(fā)送數據的指令中。不允許訪問或更改該區(qū)域。 | ||
internal_recv_buffer | 該數組用于接收數據的指令中。不允許訪問或更改該區(qū)域。 |
審核編輯:劉清
-
處理器
+關注
關注
68文章
19170瀏覽量
229187 -
S7-300
+關注
關注
8文章
225瀏覽量
34249 -
S7-400
+關注
關注
1文章
63瀏覽量
14675 -
MODBUS總線
+關注
關注
0文章
22瀏覽量
10024 -
TCP通信
+關注
關注
0文章
146瀏覽量
4217
原文標題:西門子博途: MODBUSPN
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論