自定義數據類型(DUT)
新建自定義數據類型:結構,枚舉,引用,子范圍,數組,指針。
結構(Structures)
結構聲明的語法如下:
TYPE <結構名>:
STRUCT
<變量的聲明1>
..
<變量聲明n>
END_STRUCT
END_TYPE
<結構名>是一種可以在整個工程中被識別的數據類型,可以像標準數據類型一樣使用。
您可以使用互鎖結構。唯一的限制是不可以指定結構中變量的地址(不允許使用AT來指定變量的地址)
定義名為Polygonline的結構舉例:
TYPE Polygonline:
STRUCT
Start:ARRAY [1..2] OF INT;
Point1:ARRAY [1..2] OF INT;
Point2:ARRAY [1..2] OF INT;
END_STRUCT
END_TYPE
結構的初始化:
結構初始化舉例:
Poly_1:polygonline := ( Start:=[3,3], Point1 =[5,2], Point2:=[7,3];
不能以變量作為初始化的值。參見“數組”中結構數組的初始化舉例。
結構成員的訪問:
您可以使用下述的語法訪問結構的成員:
<結構名>.<結構成員名>
因此對于上述的結構“polygonline”,您可以用Poly_1.Start訪問結構成員“start”。
枚舉(Enumerations)
枚舉是由很多字符串常量組成的用戶定義數據類型。這些常量稱為枚舉值。
即使在POU之內聲明枚舉值,枚舉值仍然可以在整個工程范圍內被識別。
用戶可以通過添加對象對話框建立“DUT”對象來創建一個枚舉。
語法:
TYPE <標識符>:(<Enum_0>,<Enum_1>, ...,<Enum_n>) |<base data type>;
END_TYPE
<標識符>變量可以代表枚舉值 <Enum_..> 并被初始化為第一個值。這些值與所有的數字類型兼容,也就是說可以像使用整形變量一樣對其進行操作。您也可以把數x賦給這個值。如果在聲明中枚舉值沒有被初始化為指定的值,將從0開始遞增依次進行初始化。請確保初始化時的初始值在內部元素中遞增。運行時將會檢查這些值的有效性。
例如:
TYPE TRAFFIC_SIGNAL: (red,yellow, green:=10); (* 每個顏色的初始值是Red=0,Yellow=1,Green=10 *)
END_TYPE
TRAFFIC_SIGNAL1 :TRAFFIC_SIGNAL;
TRAFFIC_SIGNAL1:=0; (* 交通信號的值是Red *)
FOR i:= red TO green DO
i := i + 1;
END_FOR;
IEC 61131-3標準的擴展:
枚舉類型的名稱可以(作為范圍操作符)用來確定需要訪問的枚舉常量。
因此,您可以在不同枚舉中使用相同的常量。
例如:
定義兩個枚舉:
TYPE COLORS_1: (red, blue);
END_TYPE
TYPE COLORS_2: (green,blue, yellow);
END_TYPE
在POU中使用枚舉值Blue:
聲明:
colorvar1 : COLORS_1;
colorvar2 : COLORS_2;
實現:
(* 可以這樣使用:*)
colorvar1 := colors_1.blue;
colorvar2 := colors_2.blue;
(* 不能這樣使用:*)
colorvar1 := blue;
colorvar2 := blue;
可以明確指定枚舉所指向的數據類型(默認類型是INT)。
例如:
需要將枚舉BigEnum的數據類型指定為DINT:
TYPE BigEnum : (yellow,blue, green:=16#8000) DINT;
END_TYPE
引用(References)
引用是一個對象的別名。這個別名可以通過標識符讀寫。與指針不同的是,引用所指向的數據將被直接改變,因此引用的賦值和所指向的數據是相同的。設置引用的地址用一個特定的賦值操作完成。一個引用是否指向一個有效的數據(不等于0),可以使用一個專門的操作符來檢查,如下所示。
用以下語法聲明引用:
語法
<標識符> : REFERENCE TO<數據類型>
聲明示例:
ref_int : REFERENCE TO INT;
a : INT;
b : INT;
此時ref_int可以作為整型變量的別名使用
使用示例:
ref_int REF= a; (* 此時ref_int指向a *)
ref_int := 12; (* 此時a的值為12 *)
b := ref_int * 2; (* 此時b的值為24 *)
ref_int REF= b; (* 此時ref_int指向b *)
ref_int := a / 2; (* 此時b的值為6 *)
ref_int REF= 0; ( *引用的顯式初始化 *)
子范圍(子范圍(Subrangetypes) )
子范圍是一種用戶自定義類型,其值的范圍是基本數據類型的一個子集。注意可以使用隱含的范圍邊界校驗(Range boundary checks)。
在DUT中聲明子范圍。您也可以把一個變量直接聲明為子范圍:
聲明為一個DUT對象的語法如下:
TYPE <名稱> : <Inttype>(<ug>..<og>) END_TYPE;
<名稱> | 必須是一個有效的IEC標識符。 |
<Inttype> | 是以下數據類型中的一個:SINT、USINT、INT、UINT、DINT、UDINT、BYTE、WORD、DWORD (LINT、ULINT、LWORD)。 |
<ug> | 是一個與基本數據類型相兼容的常量,它設定了范圍數據類型的下界。下界本身也屬于這個范圍。 |
<og> | 是一個與基本數據類型相兼容的常量,它設定了范圍數據類型的上界。上界本身也屬于這個范圍。 |
例如:
TYPE
SubInt : INT (-4095..4095);
END_TYPE
把變量直接聲明為子范圍:
VAR
i : INT (-4095..4095);
ui : UINT (0..10000);
END_VAR
如果一個(在聲明或實現中)被指定為子范圍的值不在子范圍的界限之內(如令以上聲明中的i:=5000),系統將報錯。
導致死循環的例子:
VAR
ui : UINT (0..10000);
END_VAR
FOR ui:=0 TO 10000 DO
...
END_FOR
由于校驗函數使變量ui的值不會超過10000,故程序永遠無法跳出這個FOR循環。
數組(數組(Arrays) )
一維、二維和三維數組屬于基本的數據類型。您可以在POU的聲明部分或者全局變量表中定義數組。請注意可以使用隱含的邊界檢查。
語法:
<數組名>:ARRAY[<ll1>..<ul1>,<ll2>..<ul2>] OF <基本數據類型>
ii1, ll2, ll3表示字段范圍的最小值,ul1, ul2 and ul3表示字段范圍的最大值。字段范圍必須是整數。
例如:
card_game: ARRAY [1..13, 1..4] OF INT;
數組的初始化:
數組的完全初始化舉例:
arr1 : ARRAY [1..5] OF INT := [1,2,3,4,5];
arr2 : ARRAY [1..2,3..4] OF INT := [1,3(7)]; (* 即1,7,7,7的縮寫形式 *)
arr3 : ARRAY [1..2,2..3,3..4] OF INT := [2(0),4(4),2,3];
(* 即0,0,4,4,4,4,2,3的縮寫形式 *)
結構數組的初始化舉例:
結構定義:
TYPE STRUCT1
STRUCT
p1:int;
p2:int;
p3:dword;
END_STRUCT
END_TYPE
數組初始化:
ARRAY[1..3] OF STRUCT1:= [(p1:=1,p2:=10,p3:=4723),(p1:=2,p2:=0,p3:=299),
(p1:=14,p2:=5,p3:=112)];
數組的部分初始化舉例:
arr1 : ARRAY [1..10] OF INT := [1,2];
對于那些沒有預先賦值的元素,按照基本數據類型的缺省初始值進行初始化。在上例中,元素[3]到[10]被初始化為0。
數組元素的訪問:
在二維數組中訪問數組元素,使用下面的語法:
<數組名>[Index1,Index2]
指針(Pointers)
指針用來在應用程序運行時存儲變量、程序、功能塊、方法和函數的地址。它可以指向上述的任何一個對象以及任意數據類型,包括用戶定義數據類型。請注意,您可以使用隱含的指針校驗功能。
聲明指針的語法如下:
<標識符>: POINTER TO <數據類型 | 功能塊 | 程序 | 方法 | 函數>;
取指針地址內容即意味著讀取指針當前所指地址中存儲的數據。通過在指針標識符后添加內容操作符“^”,可以取得指針所指地址的內容: 請看下面“pt^”的使用示例。
通過地址操作符ADR可以將變量的地址賦給指針。
示例:
VAR
pt:POINTER TO INT; (* 聲明一個指針pt *)
var_int1:INT := 5; (* 聲明變量var_int1和var_int2 *)
var_int2:INT;
END_VAR
pt := ADR(var_int1); (* 將varint1的地址賦給指針pt *)
var_int2:= pt^; (* 通過取指針pt的地址內容,將var_int1的值5賦給var_int2 *)
建立好自定義數據類型的引用
其中:數組,指針可以在局部和全局變量中獨自定義并引用。
自定義數據引用開始前必須聲明引用的自定義數據
可以在全局和局部變量中關聯引用聲明。
在程序中輸入引用名后加“.”選擇相應的后綴名來使用引用的數據:
對于數據交流量大,數據流多的可以采用該方法來區別和方便的使用數據。
其中:數組,可以是等于一個數據表格,通過尋表找出我們所需要的值;枚舉,是我們這個數據可能存在的不同值的可能,當其等于某個值的時候代表這某些值;指針,一般用在間接尋址,從而簡化了大量數據的存取賦值等操作(需結合FOR語句來使用),同時也實用與間接性過度值的一些數據應用;子范圍,也就是局限了數據的肯能值范圍,防止數據超出范圍或者不在范圍內。
該文僅此記錄相關概念,留個存檔。相關應用歡迎交流。