天天看點

PLC 程式設計基礎知識——操作數的使用和尋址

PLC 程式設計基礎知識——操作數的使用和尋址

操作數的基本知識

簡介

程式設計指令時,必須指定指令應該處理的資料值。這些值稱為操作數。例如,可以使用下列元素作為操作數:

  • PLC 變量
  • 常量
  • 背景資料塊中的變量
  • 全局資料塊中的變量

絕對位址和符号名

操作數可以通過絕對位址和符号名加以識别。可以在 PLC 變量表或塊的變量聲明中定義名稱與位址。

可優化通路的資料塊 (S7-1200、S7-1500)

可優化通路的資料塊中的資料元素隻能接收聲明中的符号名,無法接收絕對位址。

關鍵字

SIMATIC 識别一系列關鍵字,這些關鍵字有固定的定義且在程式中有特定含義。不應使用這些關鍵字作為變量或常量的名稱。

關鍵字表,下表列出了所有關鍵字。

關鍵字

德語助記符

關鍵字

英語助記符

說明
& & “與”邏輯表達式的邏輯運算
^ ^ 讀取或寫入引用值的操作符
A Q 輸出,位
A1 CC1 條件代碼位
A0 CC0 條件代碼位
AB QB 輸出,位元組
AD QD 輸出,雙字
AND AND “與”邏輯表達式的邏輯運算
ANY ANY 資料類型,指針
AR1 AR1 位址寄存器 1
AR2 AR2 位址寄存器 2
ARRAY ARRAY 引入數組規範,其後是“[”和“]”括起來的下标清單
AT AT 覆寫變量聲明
AUTHOR AUTHOR 作者名、公司名、部門名或其它名稱(最多 8 個字元,不含空格)
AW QW 輸出,字
B B 位元組
BEGIN BEGIN 引入代碼塊的指令部分或資料塊的初始化部分
BIE BR 二進制結果
BLOCK_FB BLOCK_FB 指定 FB 的參數類型
BLOCK_FC BLOCK_FC 指定 FC 的參數類型
BLOCK_SDB BLOCK_SDB 指定 SDB 的參數類型
BOOL BOOL 資料類型
BY BY FOR 循環的增量
BYTE BYTE 資料類型
CALL CALL 調用
CASE CASE 引入 CASE 語句
CHAR CHAR 基本資料類型
CODE_VERSION1 CODE_VERSION1 标簽,可确定 FB 是否具有多重執行個體功能。如果要聲明多重執行個體,則 FB 不得具有該特性。
CONST CONST 開始常量聲明
CONTINUE CONTINUE 在 SCL 中退出循環的指令
COUNTER COUNTER 指定計數器的參數類型
DATA_BLOCK DATA_BLOCK 引入資料塊
DATE DATE 資料類型
DATE_AND_TIME DATE_AND_TIME 資料類型
DB DB 資料塊
DB_ANY DB_ANY 資料類型
DBB DBB 資料塊,資料位元組
DBD DBD 資料塊,資料雙字
DBLG DBLG 資料塊長度
DBNO DBNO 資料塊編号
DBW DBW 資料塊,資料字
DBX DBX 資料塊,資料位
DI DI 背景資料塊
DIB DIB 背景資料塊,資料位元組
DID DID 背景資料塊,資料雙字
DILG DILG 背景資料塊長度
DINO DINO 背景資料塊編号
DINT DINT 資料類型
DIW DIW 背景資料塊,資料字
DIX DIX 背景資料塊,資料位
DO DO 在 FOR 和 WHILE 指令中引入指令部分
DT DT 資料類型
DTL DTL 資料類型
DWORD DWORD 資料類型
E I 輸入(通過過程映像),位
EB IB 輸入(通過過程映像),位元組
ED ID 輸入(通過過程映像),雙字
ELSE ELSE IF 和 CASE 語句中的選擇分支
ELSIF ELSIF IF 指令的選擇條件
EN EN EN/ENO 機制的系統操作數
ENO ENO EN/ENO 機制的系統操作數
END_CASE END_CASE 結束 CASE 語句
END_DATA_BLOCK END_DATA_BLOCK 結束資料塊
END_FOR END_FOR 結束 FOR 語句
END_FUNCTION END_FUNCTION 結束函數
END_FUNCTION_BLOCK END_FUNCTION_BLOCK 結束函數塊
END_IF END_IF 結束 IF 指令
END_ORGANIZATION_BLOCK END_ORGANIZATION_BLOCK 結束組織塊
END_REGION END_REGION 塊結束
END_REPEAT END_REPEAT 結束 REPEAT 語句
END_STRUCT END_STRUCT 結束結構說明
END_SYSTEM_FUNCTION END_SYSTEM_FUNCTION 結束系統函數
END_SYSTEM_FUNCTION_BLOCK END_SYSTEM_FUNCTION_BLOCK 結束系統函數塊
END_TYPE END_TYPE 結束 PLC 資料類型
END_VAR END_VAR 結束聲明塊
END_WHILE END_WHILE 結束 WHILE 指令
EW IW 輸入(通過過程映像),字
EXIT EXIT 在 SCL 中退出循環的指令
FALSE FALSE 預定義的布爾型常數:邏輯條件為假,值等于 0
FAMILY FAMILY 塊系列名稱:如,控制器
FB FB 函數塊
FC FC 函數
FOR FOR 引入 FOR 語句
FUNCTION FUNCTION 引入函數
FUNCTION_BLOCK FUNCTION_BLOCK 引入函數塊
GOTO GOTO 引入 GOTO 語句
IF IF 引入 IF 指令
INSTANCE INSTANCE 資料類型
INT INT 資料類型
KNOW_HOW_PROTECT KNOW_HOW_PROTECT 塊保護
L L 局部資料位
LB LB 局部資料位元組
LD LD 局部資料雙字
LDT LDT 資料類型
LINT LINT 資料類型
LTIME LTIME 資料類型
LTOD LTOD 資料類型
LW LW 局部資料字
LWORD LWORD 資料類型
M M 存儲器位
MB MB 存儲器位元組
MD MD 存儲器雙字
MOD MOD 求模運算符
MW MW 存儲器字
NAME NAME 塊名稱
NETWORK NETWORK 程式段
NOT NOT 邏輯取反
NULL NULL 零指針
OB OB 組織塊
OF OF 引入資料類型規範/引入 CASE 語句的指令部分
OR OR “或”邏輯表達式的邏輯運算
ORGANIZATION_BLOCK ORGANIZATION_BLOCK 引入組織塊
OS OS 儲存溢出
OV OV 溢出
PA PQ 輸出(直接的外圍輸出),位
PAB PQB 輸出(直接的外圍輸出),位元組
PAD PQD 輸出(直接的外圍輸出),雙字
PAW PQW 輸出(直接的外圍輸出),字
PE PI 輸入(直接的外圍輸入),位
PEB PIB 輸入(直接的外圍輸入),位元組
PED PID 輸入(直接的外圍輸入),位元組
PEW PIW 輸入(直接的外圍輸入),字
POINTER POINTER 資料類型
PRAGMA_BEGIN PRAGMA_BEGIN 引入 Pragma
PRAGMA_END PRAGMA_END Pragma 結束
READ_ONLY READ_ONLY 資料塊寫保護
REAL REAL 資料類型
REF REF 生成引用的指令
REF_TO REF_TO 聲明引用的指令
REGION REGION 引入塊
REPEAT REPEAT 引入 REPEAT 語句
RET_VAL RET_VAL 傳回值
RETURN RETURN SCL 中的 RETURN 語句
S5T S5T 資料類型 S5TIME 的文法
S5TIME S5TIME 資料類型
S7_ S7_ 系統屬性關鍵字
SDB SDB 系統資料塊
SFB SFB 系統函數塊
SFC SFC 系統函數
SINT SINT 資料類型
STRING STRING 資料類型
STRUCT STRUCT 引入結構規範,其後是元素清單
STW STW 狀态字
SYSTEM_FUNCTION SYSTEM_FUNCTION 系統函數
SYSTEM_FUNCTION_BLOCK SYSTEM_FUNCTION_BLOCK 系統函數塊
T T 時間元件(定時器)
THEN THEN 引入 IF 指令的指令部分
THIS THIS 通路 ARRAY 資料塊的文法
TIME TIME 提供時間資訊的基本資料類型
TIME_OF_DAY TIME_OF_DAY 資料類型
TIMER TIMER 指定定時器的參數類型
TITLE TITLE 可選塊标題或程式段标題
TO TO 定義 FOR 語句的整個範圍值
TOD TOD 資料類型
TRUE TRUE 預定義的布爾型常數:邏輯條件為真,值不等于 0
TYPE TYPE PLC 資料類型說明
UDT UDT 全局或 PLC 資料類型
UDINT UDINT 資料類型
UINT UINT 資料類型
ULINT ULINT 資料類型
UNLINKED UNLINKED 标記“與運作無關”
UNTIL UNTIL 結束 REPEAT 語句的指令部分
USINT USINT 資料類型
UO UO (Q1=1) AND (Q0=1) 後的查詢
VAR VAR 引入聲明塊
VAR_IN_OUT VAR_IN_OUT 引入聲明塊
VAR_INPUT VAR_INPUT 引入聲明塊
VAR_OUTPUT VAR_OUTPUT 引入聲明塊
VAR_TEMP VAR_TEMP 引入聲明塊
VARIANT VARIANT 資料類型
VERSION VERSION 塊的版本号
VOID VOID 函數沒有傳回值
WCHAR WCHAR 資料類型
WSTRING WSTRING 資料類型
WHILE WHILE 引入 WHILE 指令
WORD WORD 資料類型
XOR XOR 邏輯運算
Z C 計數器

在程式中使用變量

定義

變量是可以在程式中更改的數值的占位符。數值的格式已定義。使用變量使程式變得更靈活。例如,對于每次塊調用,可以為在塊接口中聲明的變量配置設定不同的值。進而可以重複使用已程式設計的塊,用于實作多種用途。

變量由以下元素組成:

  • 名稱
  • 資料類型
  • 絕對位址
    • 标準通路塊中的 PLC 變量和 DB 變量都采用絕對位址。
    • 可優化通路塊中的 DB 變量不使用絕對位址。
  • Value(可選)

聲明變量

可以為程式定義具有不同範圍的變量:

  • 在 CPU 的所有區域中都适用的 PLC 變量
  • 全局資料塊中的 DB 變量可用于整個 CPU 範圍内的所有塊。
  • 背景資料塊中的 DB 變量,通常在對其進行聲明的塊中使用。

下表顯示的是變量類型之間的差別:

PLC 變量 背景 DB 中的變量 全局 DB 中的變量
應用範圍

在整個 CPU 中有效。

CPU 所有塊均可使用。

該名稱在 CPU 中唯一。

主要用于定義它們的塊中。

該名稱在背景 DB 中唯一。

CPU 中的所有塊均可使用。

該名稱在全局 DB 中唯一。

可用的字元

字母、數字、特殊字元

不可使用引号。

不可使用保留關鍵字。

字母、數字、特殊字元

不可使用保留關鍵字。

字母、數字、特殊字元

不可使用保留關鍵字。

使用

I/O 信号(I、IB、IW、ID、Q、QB、QW、QD)

位存儲器(M、MB、MW、MD)

塊參數(輸入、輸出和輸入/輸出參數)

塊的靜态資料

靜态資料
定義位置 PLC 變量表 塊接口 全局 DB 聲明表

常量

定義

常量是具有固定值的資料,其值在程式運作期間不能更改。常量在程式執行期間可由各種程式元素讀取,但不能被覆寫。不同的常量值通常會指定相應的表示方式,具體取決于資料類型和資料格式。類型與非類型表示方式不同。

無類型的常量

在無類型的表示法中,僅輸入常量值即可,無需輸入資料類型。對于無類型的常量,隻有在首次算術運算和邏輯運算中使用後,才會獲得資料類型。

以下示例為無類型的表示法:

SCL
#My_Int1 := #My_Int2 + 12345

(*常量“12345”的資料類型

取決于加數 My_Int。2.此時,“12345”的資料類型為 INT。*)

#My_Real1 := #My_Real2 + 12345 (*常量“12345”的資料類型取決于加數 My_Real2。此時,“12345”的資料類型為 REAL。*)

帶有資料類型的常量

在有類型的表示法中,除指定常量值外還指定資料類型。

以下示例為有類型的表示法:

SCL
#My_Int1 := INT#12345 (*The data type of the constant is always INT.*)

符号常量

可以選擇聲明常量符号名,進而使程式中名稱下的常量值可用。這使得在更改常量值時,程式更具有可讀性并且更易于維護。

符号常量由以下元素組成:

  • 名稱
  • 資料類型
  • 符号常量始終有資料類型;無類型表示法不适用于符号常量。
  • 常量值
  • 可以選擇指定資料類型值範圍内的任意值作為常量值。有關值範圍的資訊,請參見“資料類型”一章。

常量聲明

可以定義具有不同适用範圍的常量:

  • 全局常量适用于 CPU 的所有區域
  • 局部常量僅在塊内适用

下表顯示常量類型之間的差別:

全局常量 局部常量
适用範圍

在整個 CPU 中有效。

該名稱在 CPU 中唯一。

僅在聲明它們的塊中有效。

該名稱在塊中唯一。

允許的字元 常量名稱允許使用的字元包括字母、數字和特殊字元。 常量名稱允許使用的字元包括字母、數字和特殊字元。
定義位置 PLC 變量表的“常量”(Constants) 頁籤 塊接口
表示法

括在引号中,例如:

"Glob_Const"

帶有數字元号字首,例如:

#Loc_Const

如果聲明的局部常量和全局常量具有相同的符号名稱,并将此重複指定的名稱用作變量的預設值,則會發生名稱沖突。此時,系統将自動使用局部常量。

允許的資料類型

對于常量,允許使用所有基本資料類型和所有衍生資料類型:

  • 二進制數,位字元串,整數,浮點數,定時器,日期和時間,字元串

所有顯式和隐式類型轉換的通用規則均适用。

無類型常量的資料類型

無類型常量不顯式指定資料類型。隻有在首次算術運算和邏輯運算中使用後,才會獲得資料類型。

以下示例說明如何使用無類型常量:

SCL
#My_Int1 := #My_Int2 + 12345

(*常量“12345”的資料類型

取決于加數 My_Int。2.此時,“12345”的資料類型為 INT。*)

#My_Real1 := #My_Real2 + 12345 (*常量“12345”的資料類型取決于加數 My_Real2。此時,“12345”的資料類型為 REAL。*)

尋址操作數

尋址全局變量

要對全局 PLC 變量進行尋址,可以使用絕對位址或符号名稱。

說明

LWORD、LINT、ULINT、LREAL、LTIME、LTOD 和 LDT 資料類型隻能通過符号名尋址。

按符号名對全局變量尋址

使用符号名稱進行尋址時,則需輸入 PLC 變量表中的變量名稱。全局變量的符号名自動用引号括起來.

可以使用 PLC 變量的符号名稱,對基于 PLC 資料類型的結構化變量進行尋址。也可以使用句點分隔各元素的名稱。

按絕對位址對全局變量尋址

使用絕對位址尋址時,則需輸入 PLC 變量表中的變量位址。對于每個操作數範圍,絕對位址使用以零開頭的數值位址位址辨別符 % 被自動設定為全局變量絕對位址的字首。

示例

以下示例顯示的是符号名與絕對位址尋址的應用:

尋址 說明
%Q1.0 絕對位址:輸出 1.0
%I16.4 絕對位址:輸入 16.4
%IW4 絕對位址:輸入字 4
"Motor" 符号名位址"Motor"
"Value" 符号名位址"Value"
"Structured_Tag" 基于 PLC 資料類型的變量符号位址
"Structured_Tag".Component 結構化變量的元素符号位址。

通路IO裝置

CPU 的過程映像是每個周期更新一次。但是,在對時間要求苛刻的應用中,讀取或傳送數字輸入或輸出目前狀态的頻率可能必須高于每個周期一次。為此,可以在操作數中使用 I/O 通路辨別符的字尾直接通路 I/O。

如果要從 I/O 直接讀取輸入,則需使用 I/O 輸入存儲區 (PI),而非過程映像輸入 (I)。外圍裝置存儲區可按位、位元組、字或雙字讀取。

如果要直接寫入輸出中,則需使用 I/O 輸出存儲區 (PQ),而非過程映像輸出 (Q)。可以位、位元組、字或雙字形式對外圍輸出存儲區執行寫操作。

要直接從外圍裝置輸入讀取或寫入信号,可以給操作數添加 I/O 通路字尾“:P”。

也可以通過“:P”尋址結構化 PLC 變量中的元素。但無法使用“:P”通路上一級變量。

示例

下列示例顯示的是 I/O 通路辨別符的應用:

尋址 說明
"Motor" 對過程映像中的 "Motor" 變量進行尋址。
"Motor":P 對 I/O 存儲器區(PI 或 PQ)中的 "Motor" 變量進行尋址。
"Structured_Tag".Component 對過程映像中結構化 PLC 變量的元素進行尋址。
"Structured_Tag".Component:P 對 I/O 存儲器區(PI 或 PQ)中結構化 PLC 變量的元素進行尋址。

全局資料塊中的變量尋址

全局資料塊中的變量可以按符号名或絕對位址進行尋址。對于符号尋址,可以使用資料塊的名稱和變量名,并用圓點分隔。資料塊的名稱用引号括起來。

對于絕對尋址,可以使用資料塊的編号和資料塊變量的絕對位址,并用圓點分隔。位址辨別符 % 被自動設定為絕對位址的字首。

S7-1200/1500 提供了一個選項,用于通路程式設計期間處于未知狀态的資料塊。為此,請在通路塊的塊接口中建立一個 DB_ANY 資料類型的塊參數。資料塊名稱或資料塊編号将在運作期間傳送到此參數。為了通路資料塊的内部變量,請使用 DB_ANY 資料類型的塊參數名稱以及變量的絕對位址,并用圓點分隔。

說明

按絕對位址對 DB 變量尋址

以下變量無法進行絕對尋址:

  • 優化通路塊中的變量。
  • LWORD、LINT、ULINT、LREAL、LTIME、LTOD 和 LDT 資料類型的變量。
最佳做法是對這些變量使用更為便捷的符号尋址。

ARRAY 資料塊

ARRAY 資料塊是一種特殊類型的全局資料塊。這些資料塊包含一個任意資料類型的 ARRAY。例如,可以是 PLC 資料類型 (UDT) 的 ARRAY。

可通過關鍵字“THIS”尋址 ARRAY 資料塊中的元素。然後再在方括号中指定下标。下标可以是一個常量,也可以是一個變量。變量類型的下标最大可支援長度為 32 位的整數。

尋址 ARRAY 資料塊的擴充選項位于“指令”(Instructions) 任務卡的“移動”(Move) 區域中。例如,可以通過這些指令對資料塊名稱進行間接尋址。

尋址 ARRAY 資料塊

ARRAY 資料塊是一種特殊形式的 ARRAY。ARRAY 資料塊是僅包含一個 ARRAY 的全局資料塊。可通過以下文法尋址 ARRAY 資料塊中的元素:

"<GlobArrayDBname>".THIS[#i].<元素名稱>

SCL:

"<GlobArrayDBname>"."THIS"[#i].<元素名稱>

示例

以下示例說明了如何尋址 ARRAY 資料塊中的元素:

在 SCL 中尋址 說明
"My_ARRAY_DB"."THIS"[0]

"My_ARRAY_DB" 是一個 ARRAY 資料塊,元素的資料類型為 REAL。

在此,将尋址 "My_ARRAY_DB" 中的第一個元素。

"MY_UDT_ARRAY_DB"."THIS"[3].MyREAL

"MY_UDT_ARRAY_DB" 是一個 ARRAY 資料塊,元素的資料類型為 PLC 資料類型 (UDT)。在 PLC 資料類型中,各元素的資料類型為 BYTE。

在此,将尋址 "MY_UDT_ARRAY_DB" 中第四個 ARRAY 元素和該元素中的 "MyREAL" 子元素。

尋址 ARRAY 資料塊的指令

在“移動 > ARRAY 資料塊”(Move > ARRAY DB) 區域的“指令 > 基本指令”(Instructions > Basic instructions) 任務卡中,包含有各種 ARRAY 資料塊的尋址方式。例如,使用這些指令間接尋址該資料塊的名稱。

  • ReadFromArrayDB:讀取數組資料塊
  • WriteToArrayDB:寫入數組資料塊
  • ReadFromArrayDBL:從裝載存儲器的數組型資料塊中讀取
  • WriteToArrayDBL:寫入裝載存儲器的 ARRAY 資料塊中

間接尋址

間接尋址允許使用者尋址在運作之前不計算位址的操作數。采用間接尋址方式時,各程式段可多次執行,而且每次運作時使用的操作數不同。例如,在程式循環中,每次運作都使用不同的下标。

這種方法具有以下優勢:

  • 程式更為靈活。
  • 間接尋址可在所有 STEP 7 程式設計語言中使用。
  • 程式代碼更為清晰易讀。
  • 可使用資料塊和變量的現有名稱(符号化尋址),因為顯著提高了程式代碼的可讀性。

S7-1200 和 S7-1500 中的正常間接尋址選項

所有的程式設計語言都提供以下間接尋址選項:

  • 通過指針間接尋址
  • ARRAY 元素的間接索引
  • 通過 DB_ANY 資料類型間接尋址資料塊。

語言特定的間接尋址選項

以下指定尋址選項還可以在多種程式設計語言中提供:

  • 在 STL 中,可以直接通過位址寄存器尋址操作數。
  • 在 SCL 中,可以通過以下指令讀寫變量存儲區:
    • POKE - 寫入存儲器位址
    • POKE_BOOL - 寫入存儲器位
    • PEEK - 讀取存儲器位址
    • PEEK_BOOL - 讀取存儲器位
    • POKE_BLK - 寫入存儲區域

1.程式示例

在以下示例中,可以使用下标通路來自不同存儲區的三個變量。

分别配置設定給相應下标的三個變量總覽:

下标 通路變量 存儲區
1 Input_WORD_0 IW 0
2 "Processdata".Temperature DB 1
3 Output_WORD_4 QW 4

在“預設變量表”(Default tag table) 中聲明以下兩個變量:

PLC 程式設計基礎知識——操作數的使用和尋址

建立全局資料塊:

  1. 輕按兩下“添加新塊”(Add new block) 指令。
  2. 這樣會打開“添加新塊”(Add new block) 對話框。
  3. 單擊“資料塊 (DB)”(Data block (DB)) 按鈕。
  4. 指定名稱“DB_Processdata”。
  5. 選擇“Global DB”作為資料塊的類型。
  6. 單擊“确定”(OK)。
  7. 聲明資料塊元素“Temperature”:

使用指針間接尋址

對于間接尋址,要求特定的資料格式,應包含位址或者還包含操作數的範圍和資料類型。該資料格式稱為指針。可以使用以下類型的指針:

  • 引用 (S7-1500)
  • VARIANT (S7-1200/1500)
  • POINTER (S7-1500)
  • ANY(S7-1500,僅适用于可标準通路的塊)

有關指針資料類型的更多資訊,請參考“另請參見”。

說明

SCL 中的 POINTER

在 SCL 中,POINTER 的使用具有一定限制。隻能将其轉發到被調用塊中。

示例

以下舉例說明了使用區域内指針進行間接尋址:

在 STL 中尋址 說明
L P#10.0 // 在累加器 1 中(P#10.0)加載指針
T MD20 // 将指針傳遞給操作數 MD20
L MW [MD20] // 在累加器 1 中加載 MW10
.... // 任意程式
L MD [MD20] // 在累加器 1 中加載 MD10
.... // 任意程式
= M [MD20] // 若 RLO=1,則設定存儲器位 M10.0

clipboard

将指針 P#10.0 傳遞給操作數 MD20。若程式設計時操作數 MD20 用方括号括起,則在運作時其将被指針中包含的位址替換。

PLC 程式設計基礎知識——操作數的使用和尋址

繼續閱讀