数组

第1,2,3空的区域被看做元数据类型。数组既可以被定义POU的一部分声明,也可以是全局的可变列表。请注意可以使用隐性 边界检查

句法:

<Array_Name>:ARRAY [<ll1>..<ul1>,<ll2>..<ul2>] OF <elem. Type>

ll1, ll2, ll3定义区域的下限,ul1, ul2 ul3定义上限。数值必须为整数。

例子

Card_game: ARRAY [1..13, 1..4] OF INT;

 

初始化数组:

提示!

与 CoDeSys V2.3 相比,方括号中需放置初始化部分!

数组的完整初始化例子:

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

arr2 : ARRAY [1..2,3..4] OF INT := [1,3(7)]; (* short for 1,7,7,7 *)

arr3 : ARRAY [1..2,2..3,3..4] OF INT := [2(0),4(4),2,3];  

      (* short for 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];

 

元素没有值被预先分配,默认初始值被初始化为基本类型。在上面的例子中,元素anArray的[6] anArray的[10],初始化为0。

 

访问数组组件:

在数组的两个区域中,访问数组组件被定义为:

<Array-Name>[Index1,Index2]

例子:

Card_game [9,2]

检查数组边界函数

为了在运行时中访问数组元素,函数 CheckBounds 必须在应用中可用。因此添加对象 隐性检查的POU 到应用中,这是通过使用 添加对象 对话框,标记与CheckBounds类型相关的复选框实现的。选择一种执行语言,然后使用 “打开”按键确定你的设置, 在编辑界面检查边界函数将被打开。这种选择独立声明部分是预先设定的,不能被修改,除了增加本地变量。在ST编辑器中,会建议默认的可执行函数可能被修改。

此检查函数有适当的方法检车是否对边界侵犯(例如,通过检测到的错误标志设置或更改索引)。一个可变的数组类型被分配这个函数被称作隐藏的函数。

小心!

为了保持检查的函数性,不被改变声明的部分为一个隐藏的函数。

函数 CheckBounds的使用实例:

检查函数默认执行如下:

声明部分:

// Implicitly generated code : DO NOT EDIT

FUNCTION CheckBounds : DINT

VAR_INPUT

index, lower, upper: DINT;

END_VAR

执行部分:

// Implicitly generated code : Only an Implementation suggestion

IF  index < lower THEN

CheckBounds := lower;

ELSIF  index > upper THEN

CheckBounds := upper;

ELSE  

CheckBounds := index;

END_IF

 

当调用该函数参照以下输入参数:

  • 索引:字段元素的索引
  • 下限:字段部分的下限
  • 上限:字段部分的下限

只要索引的范围内,则返回值是索引本身。否则将被返回对应违反上限或下限范围内的字段。

 

在程序中超出数组”a“上限:

PROGRAM PLC_PRG

VAR a: ARRAY[0..7] OF BOOL;

b: INT:=10;

END_VAR

a[b]:=TRUE;

只要索引的范围内,则返回值是索引本身。否则将被返回对应违反上限或下限范围内的字段。 在这种情况下的隐式调用检查边界函数程序,将影响的分配前的影响,被改变的索引值从'10到上限'7'。因此值 TRUE 将会分配给数组元素a[7] 。 这是尝试读取外部的字段范围通过检查边界函数来修正。