ABB機器人用戶定義的數據類型

發(fā)布日期:2012-06-09    蘭生客服中心    瀏覽:7855

三、用戶定義的數據類型

1、數組
  
支持一維、二維和三維數組的成員數據類型。數組可在POU的聲明部分和全局變量表中定義。

語法:

lt;數組名>:ARRAY[..,..]OF

ll1,ll2為數組維數的下限標識,ul1和ul2為數組維數的上限標識。數值范圍必須為整數。

示例:

Card_game:ARRAY[1..13,1..4]OFINT;

數組的初始化:

可以對數組中的所有元素進行初始化,或不進行初始化。

數組初始化示例:

arr1:ARRAY[1..5]OFINT:=1,2,3,4,5;

arr2:ARRAY[1..2,3..4]OFINT:=1,3(7);(*等同1,7,7,7*)

arr3:ARRAY[1..2,2..3,3..4]OFINT:=2(0),4(4),2,3;(*等同0,0,4,4,4,4,2,3*)

結構化中的數組初始化示例:

TYPESTRUCT1

TRUCT

1:int;

2:int;

3:dword;

END_STRUCT

ARRAY[1..3]OFSTRUCT1:=(p1:=1;p2:=10;p3:=4723),(p1:=2;p2:=0;p3:=299),

1:=14;p2:=5;p3:=112);

數組部分元素初始化示例:

arr1:ARRAY[1..10]OFINT:=1,2;

  數組中的元素如果沒有初始化值,則用基本類型的缺省值初始化其值。在上例中,元素arr1[3]到元素arr1[10]均被初始化為0。

二維數組的元素存取,使用下列語法:

lt;數組名>[Index1,Index2]

示例

Card_game[9,2]

注:
  如果你在項目中定義了一個名為CheckBounds的功能,則可以自動檢查數組的上下限超限錯誤!下圖中給出了如何實現該功能的示例。

  下面的示例用CheckBounds功能測試數組的超限問題。CheckBounds功能允許A[0]到A[7]元素分配值TRUE,而不會給A[10]分配值,這樣可以避免對數組元素的錯誤操作。

2、指針
  當程序運行時,變量或功能塊地址保存在指針中。指針聲明為如下句法形式:<指針名>:POINTERTO<數據類型/功能塊>;

  指針可指向任何數據類型、功能塊和用戶定義的數據類型。對地址操作的ADR功能,可將變量或功能塊的地址指向指針。指針后加內容操作符”^”可取出指針中的數據。

示例:

t:POINTERTOINT;

var_int1:INT:=5;

var_int2:INT;

t:=ADR(var_int1);

var_int2:=pt^;(*var_int2的值為5*)

3、牧舉
  
牧舉為用戶定義的數據類型,并由一組字符串常數組成。這些常數被視為牧舉值。牧舉值在項目中為全局使用的變量,即使它們在POU中為本地聲明的變量。創(chuàng)建牧舉變量的最好方法是在數據類型對象組織下創(chuàng)建。用關鍵字TYPE開始,END_TYPE結束。

句法:

TYPE<牧舉變量>:(,,...,);END_TYPE

牧舉變量可以取牧舉值中的任何一個值。缺省情況下,第一個牧舉值為零,其后依次遞增。

示例:

TRAFFIC_SIGNAL:(Red,Yellow,Green:=10);(*每個顏色的初始值為red0,yellow1,green10

*)

TRAFFIC_SIGNAL:=0;(*交通信號值為red*)

FORi:=RedTOGreenDO

i:=i+1;

END_FOR;

不能對同一個牧舉值多次使用。

示例:

TRAFFIC_SIGNAL:(red,yellow,green);

COLOR:(blue,white,red);

錯誤:red不能對TRAFFIC_SIGNAL和COLOR變量同時使用。

4、結構
  
結構作為對象在數據類型頁中創(chuàng)建。使用TYPE關鍵字開始,END_TYPE關鍵字結束。結構聲明的句法如下:

TYPE<結構名>:

TRUCT

.<聲明變量n>

END_STRUCT

END_TYPE

<結構名>是一種類型,在項目中為全程識別,并且可作為標準數據類型使用。允許內嵌結構。唯一的限制是變量不能帶地址(不允許用AT聲明!)。

下例為多邊形的結構示例:

TYPEPolygonline:

TRUCT

tart:ARRAY[1..2]OFINT;

oint1:ARRAY[1..2]OFINT;

oint2:ARRAY[1..2]OFINT;

oint3:ARRAY[1..2]OFINT;

oint4:ARRAY[1..2]OFINT;

End:ARRAY[1..2]OFINT;

END_STRUCT

END_TYPE

可以使用下面的句法存取結構中的成員。

<結構_名>.<成員名>

例如:結構名為“Week”,其中包含一個成員“Monday”,可以用Week.Monday獲取該值。

5、參考(別名類型)
  
可以使用用戶定義的參考數據類型,創(chuàng)建已經更名的變量、常數或功能塊。在數據類型頁中創(chuàng)建參考對象。使用TYPE關鍵字開始,END_TYPE關鍵字結束。

句法:

TYPE<標識符>:<分配項>;

END_TYPE

示例:

TYPEmessage:STRING[50];

END_TYPE;

6、替代范圍類型
  
替代范圍類型,是對其基本數據類型重新設置范圍的一種數據類型。聲明可以在數據類型頁中進行,但變量也可直接用子范圍類型聲明:

在數據類型頁中聲明的句法如下:

TYPE:(..)END_TYPE;

類型

說明

必須為有效的IEC標識符

數據類型中的一種。如SINT,USINT,INT,DINT,UDINT,BYTE,WORD,DWORD(LINT,UINT,LWORD).

常數,必須為基本類型,設定的下邊界在其類型范圍之內。

常數,必須為基本類型,設定的上邊界在其類型范圍之內。

示例:

TYPE

ubInt:INT(-4095..4095);

END_TYPE

用子范圍類型直接聲明的變量:

VAR

i1:INT(-4095..4095);

i2:INT(5...10):=5;

ui:UINT(0..10000);

END_VAR

  如果常數被分配為一個子范圍類型(在聲明或實現段中),但其值沒有落在該范圍之內(例i:=5000),系統將會發(fā)出錯誤信息。

  為了在運行期間檢查邊界范圍,推薦使用功能CheckRangeSigned或CheckRangeUnsigned。這樣,邊界有效性驗證可通過合適的方法和手段捕獲(例:數值可以截取或設置錯誤標志)。

示例:
  當變量屬于有符號子范圍類型時(如上例中的i),則功能CheckRangeSigned被調用;可以通過編程的方法使其值在允許范圍之內。

FUNCTIONCheckRangeSigned:DINT

VAR_INPUT

value,lower,upper:DINT;

END_VAR

IF(value

CheckRangeSigned:=lower;

ELSIF(value>upper)THEN

CheckRangeSigned:=upper;

ELSE

CheckRangeSigned:=value;

END_IF

  為了自動調用功能,功能名CheckRangeSigned被指定,并且接口也被指定:返回值和三個DINT類型的參數。

當調用時,功能參數如下:

分配給范圍類型的值

下限

下限邊界范圍

上限

上限邊界范圍

返回值

實際分配給范圍類型的值

對i:=10*y進行邊界有效性驗證的示例:

i:=CheckRangeSigned(10*y,-4095,4095);

示例中,y即使是1000,i經過上例賦值后其值仍然為4095。

同樣,功能CheckRangeUnsigned過程同上:功能名和接口必須正確。

FUNCTIONCheckRangeUnsigned:UDINT

VAR_INPUT

value,lower,upper:UDINT;

END_VAR

注意:
  如果沒有CheckRangeSigned和CheckRangeUnsigned,則運行時,沒有子類型的類型檢驗發(fā)生,變量i可以在–32768和32767之間取任何值。

注意:
  如果功能CheckRangeSigned和CheckRangeUnsigned按照上例實現,則在FOR循環(huán)中可對子范圍類型連續(xù)使用循環(huán)。

示例:

VAR

ui:UINT(0..10000);

END_VAR

FORui:=0TO10000DO

...

END_FOR

FOR循環(huán)不會剩余,因為ui不會大于10000。象CheckRange功能內容一樣,當在FOR循環(huán)中使用增量值時,也應考慮這些問題。