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