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