codesys编译器相关功能和指令介绍。文章使用markdown语法,可在网页左侧查看目录。
数据相关
可变数组 ARRAY[星] OF
可变数组只可以在FB中定义为IN_OUT类型变量,一维数组定义为ARRAY[星号]OF ...,二维数组定义ARRAY[星号,星号] OF ...。
定义为可变数组后,在外部调用时数组便不受限制。
在功能块外部使用可变数组,内部需要确定数组的上限和下限,防止数组调用时出现越界情况,导致plc宕机。可变数组的上限使用方法UPPER_BOUND( 变量名 , 维数),下限使用LOWER_BOUND( 变量名 , 维数)获取。用法如下:
引用类型 reference to
引用类型类似指针,在定义一些对象数据时使用比较安全,不必像指针^(显) ADR(隐)调用,使用简单。引用的安全性在于不可变址,防止空指针,建议在轴、结构体、联合体等对象类型的数据中使用。
比如系统指令相关的轴指令中,Axis变量的定义就是引用类型。
retain、persistent区别
对象属性property
与本地变量隐藏相对应的就是查看和修改本地变量,由于安全考虑,不开放本地变量,但是部分变量有可能需要被外界修改,需要使用属性对本地变量进行中转修改。
属性属于FB的一种特性,属性的本质和input、output类型一致,都是读或写类型的变量,属性的存在对比输入输出类型,相当于多了一层保护,安全性能更好。属性添加之后,会出现读取方法Get、写入方法Set,在对应的方法中去读写本地变量,就可以从外部调用属性对本地变量进行读写。
声明相关
结构数据对齐 Pack_Mode
数据对齐的功能是让多个变量按照设定的间隔地址进行排列,可以使变量地址更易查找,但是过大的间隔会引起内存的浪费。
一般在结构体中会用到对齐功能,在指定结构体的初始地址后,很容易就获取到其余变量的地址,部分编译器此功能可能异常,可在软件F1中搜索Pack_Mode查找相关说明。
数组初始化
数组在定义后,如果需要其存在一组初始值,可在定义的时候就进行初始化,用来防止数据运算异常。
显示进制转换 displaymode
编译器默认的显示进制为10进制,如果仅需要一部分数据需要显示为2进制或16进制,就可以更改这些数据的显示模式,尤其是在字位转换的过程中,使用2进制显示数据调试更方便。
隐藏本地变量 hide_all_locals
本地变量默认在本地范围内有效,但是在视图和监视中都可以调用到本地变量,外部空间修改内部变量可能会引起数据安全问题,而且本地变量过多不利于变量的查找,所以在FB和FC中的最上方,建议声明隐藏本地变量
变量权限 qualified_only
数据定义之后,仅在声明的区间内生效,若在不同的区域设定相同的变量名,容易导致混淆,所以部分场合需要用到权限,限定变量的调用需要使用 (区域.变量名)的方式。
对于权限,一般在全局变量表和枚举中使用,例如在gvl全局变量列表中定义了xData1,那么在声明权限后,调用变量的方式为gvl.xData1。枚举类型在新建后默认开启了权限。
数据运算
取整 trunc
取整函数对于个数计算非常实用,例如 trunc(1.8)=1 , trunc(-1.8)=-1,不同于强制类型转换,强制类型转换默认使用四舍五入,例如any_to_int(1.8)=2 , any_to_int(-1.8)=-2。
选择语句SEL、MUX、MAX、MIN、LIMIT
选择语句SEL(判断 , 结果0,结果1 ),功能和if else 相同,但是表达更为简洁,同c和js中的(判断)?(结果0):(结果1);。
选择MUX(判断 , 结果0,结果1,... ),功能和case 相同,但是表达更为简洁。
选择语句Max(数据0,数据1,..,)取最大值,Min(数据0,数据1,..,)取最小值,limt(下限,数据,上限)限定数据在范围内。
多个数据的最大值和最小值选择可以使用Max或Min,同时Max和Min可以单边限定数据范围,部分数据可能只要求限制最大值、或最小值,使用limit不满足要求,那么就可以使用Max(自身数据,下限)限定数据不小于下限,Min(自身数据,上限)限定数据不小于下限。
)
强制类型转换anyto
强制类型转换一般需要指定源类型和转换类型,使用any_to_type 可以自动识别源类型,提高便携性。