| 加入桌面 | 手机版 | 无图版

ABB机器人用户定义的数据类型

放大字体  缩小字体 发布日期:2013-05-17  来源:网络  浏览次数:2310
核心提示:三、用户定义的数据类型1、数组  支持一维、二维和三维数组的成员数据类型。数组可在POU的声明部分和全局变量表中定义。语法:

 

三、用户定义的数据类型

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中为本地声明的变量。创建牧举变量的最好方法是在数据类型对象组织下创建。用关键字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、结构
结构作为对象在数据类型页中创建。使用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、参考(别名类型)
可以使用用户定义的参考数据类型,创建已经更名的变量、常数或功能块。在数据类型页中创建参考对象。使用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),系统将会发出错误信息。

  为了在运行期间检查边界范围,推荐使用功能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,则运行时,没有子类型的类型检验发生,变量i可以在–32768和32767之间取任何值。

注意:
如果功能CheckRangeSigned和CheckRangeUnsigned按照上例实现,则在FOR循环中可对子范围类型连续使用循环。

示例:

VAR

ui:UINT(0..10000);

END_VAR

FORui:=0TO10000DO

...

END_FOR

FOR循环不会剩余,因为ui不会大于10000。象CheckRange功能内容一样,当在FOR循环中使用增量值时,也应考虑这些问题。

 

 

 
 
[技术搜索] [] [告诉好友] [打印本文] [关闭窗口]
分享到:

免责声明:凡资讯来源注明为其他媒体来源的信息,均为转载自其他媒体,并不代表本网站赞同其观点,也不代表本网站对其真实性负责,当您对该文章的内容有任何疑问或质疑,请立即与我们联系(info@Chinarobotic.com.cn),本网站将迅速给您回应并做出恰当处理。

0条 [查看全部]  相关评论

推荐图文

点击排行