标准数据类型就那几个常用的,BOOL占8位存TRUE或FALSE,INT是16位有符号整数,DINT是32位,REAL是32位浮点,LREAL是64位,STRING是字符串,TIME是时间类型,BYTE、WORD、DWORD、LWORD按位宽分,这些在声明的时候直接写就行,不用记太多。
局部变量用VAR和END_VAR包起来,声明在POU的声明区,只能在当前POU里用,外面访问不到,这种变量没有任何外部关连,从外部写不进来也读不出去。全局变量用VAR_GLOBAL声明,放在GVL里或者程序对象的声明区,整个项目都能访问,I/O映射也是全局的。局部和全局同名的时候,POU内部局部优先,外面要用全局加个点前缀`.变量名`,或者带上GVL名字`globlist1.ivar`来区分。
输入输出变量是功能块和函数用的。VAR_INPUT声明输入,调用的时候传值进来,VAR_OUTPUT声明输出,值送到调用它的POU里。VAR_IN_OUT是输入加输出,按引用传递,相当于指针,传进来的值改了就改了,所以输入值不能是常量,调用的时候必须传变量不能传字面量。VAR_IN_OUT CONSTANT是只读引用,可以传STRING或WSTRING的常量或者变量,调用的时候字面量也能传,字符串长度不受参数声明的长度限制。功能块的VAR_IN_OUT不能从外面直接读或写,只能通过调用传进去。

VAR_TEMP是临时变量,每次调用POU都重新初始化,声明只能在程序PRG和功能块FB里用,函数FC里不能声明VAR_TEMP,只能在POU主体里访问。用VAR_TEMP代替VAR能减少POU需要的存储器空间,只是临时用一下的变量就声明成VAR_TEMP。VAR_STAT是静态变量,功能块和函数里都能用,值在多次调用之间保持,相当于加了存储记忆的VAR。VAR_INST是实例变量,只能声明在功能块的方法里,每个方法有自己独立的一份。VAR_EXTERNAL声明的是外部已经存在的全局变量,在POU里用全局变量之前必须先声明成VAR_EXTERNAL,IEC标准里禁止不声明就直接在POU里用全局变量。
常量用CONSTANT修饰符,接在VAR或VAR_GLOBAL后面。VAR CONSTANT声明局部常量,VAR_GLOBAL CONSTANT声明全局常量,必须赋初始值。全局常量要在POU里用,也得声明成VAR_EXTERNAL CONSTANT。RETAIN修饰符用于掉电保持的变量,PERSISTENT也是保持但跨应用程序下载也保留,两个修饰符加在VAR或VAR_GLOBAL后面。
声明语法是`<作用域> <修饰符> <变量名> AT <地址> : <数据类型> := <初始值>;`,作用域就是VAR、VAR_GLOBAL、VAR_INPUT这些,修饰符可选CONSTANT、RETAIN、PERSISTENT,地址可选。变量名不区分大小写,VAR1和var1是同一个,下划线连续两个不行,关键字不能当变量名用。带反引号的变量名可以用特殊字符,比如`´Variable+9´`,反引号本身算标识符的一部分。
GVL里可以加`{attribute 'qualified_only'}`,加了之后必须用`GVL名.变量名`来访问,不加的话直接写变量名就行。加了`{attribute 'linkalways'}`的变量每次编译都重新链接,改GVL里的常量不用重新编译整个项目。GVL之间同名变量不冲突,用GVL名字前缀区分就行。库里的GVL要用库命名空间前缀,比如`lib1.globlist1.ivar`,嵌套库的话命名空间要一层层写全。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删