变量表
变量表的是子程序中用于定义局部临时变量或传递输入输出参数的接口变量的表格。
变量表与符号表对比
符号表有两个要素:符号,地址。
变量表包含三要素:符号,变量类型,数据类型。
符号表的地址需要你自己定义,而变量表不需要自己定义地址,当你定义好符号后,系统会自动分配L存储器给相应的符号。每个子程序的变量表都有64个字节的L存储器可供分配和使用,但在梯形图编程时只能使用60个字节的临时寄存器,使用范围也就是LB0-LB59。
在子程序中使用变量表中的临时变量,同样支持绝对寻址和符号寻址两种方式,编程时可使用变量表中定义好的符号,也可以直接使用L开头的存储器地址。超出范围的存储器寻址会有红色的波浪线提示。
符号表不需要定义变量类型和数据类型,但变量表需要将变量定义在相应的变量类型中,并且必须指定明确的数据类型。
局部变量名称允许包含字母数字字符和下划线的数量最多为 23 个,也允许包含扩展字符(ASCII 128 至 ASCII 255)。第一个字符仅限使用字母和扩充字符。不允许使用关键字作为符号名,也不允许使用以数字开头的名称,或者包含非字母数字或扩展字符集中的字符的名称。局部变量名称下载到 CPU 存储器并存储在其中。使用较长的变量名称可能会降低可用于存储程序的存储器。
变量类型有四种:IN,IN_OUT,OUT,TEMP,前三种主要用于传递参数,最后一种TEMP类型主要用于定义子程序内部使用的临时变量。
定义传递参数的变量
IN是输入类型,仅用于将外部的变量值传递进子程序中使用。
OUT是输出类型,仅用于将子程序中的变量值传递出子程序。
IN_OUT是输入输出类型,用于先将外部变量值传递进子程序,最后再将程序最终的变量值传递出去。
OUT类型和IN_OUT类型都可以子程序向外传递变量值,他们的区别在哪里呢?OUT类型的变量,如果在子程序执行过程中没有对该变量赋值,那么该变量的值是不确定的,传递出去的结果可能不是你想要的值。IN_OUT类型的变量,如果在子程序中没有对该变量赋值,那该变量传递出去的值可以确定为传递进子程序的值,即传递出去的值是确定的。
例如下图所展示的子程序,子程序调用但RUNP未接通时,RUNTIME2,RUNTIME3,RUNTIME4,TEMP1,LW58这5个变量都没有执行明确的赋值指令,它们的值都是不确定的,因此RUNTIME2,RUNTIME3,RUNTIME4传递出子程序的值也是不确定的,唯一能确定的值是RUNTIME1的值。
定义局部临时变量
定义临时变量并使用该符号,也可以直接使用LB,LW,LD进行直接寻址而忽略数据类型。
数据类型一共有8种:BOOL,BYTE,WORD,INT,DWORD,DINT,REAL,STRING
使用L寄存器直接寻址时可以绕过数据类型的定义,位,字节,字,双字分别可对于如下变量。
其中DWORD类型可传递指针参数
可使用绝对寻址直接获取某个定义好符号的部分数值,例如上图中RUNTIME1系统分配的地址是LW1,在程序中可直接使用LB1或LB2寻址,读写RUNTIME1变量的部分数值。
注意
每个子例程调用的输入/输出参数的最大限制是16个。
梯形图中L寄存器只能使用LB0-LB59共60个字节。
在子程序变量表中定义的变量属于局部变量,仅在子程序内部有效。(上篇文章中所讲的符号表中定义的变量属于全局变量,在各个子程序中都能使用。)
可在主例程和中断例程中分配TEMP参数,但只有子例程可以使用 IN、IN_OUT 和 OUT 调用参数。
总结
变量表主要在子程序中使用,如果子程序只是为了将程序分类,增加整个程序易读性,处理的都是全局变量,那么将变量表控制或仅在变量表中定义临时变量即可。
如果子程序被做成了某个功能,需要在批量调用或者需要制作成相应的库文件,那就要根据需求在变量表中严格定义IN,IN_OUT,OUT三种类型的变量作为子程序的接口,只有这三种类型的变量能够起到传递参数的作用,它们是对接处理数据的桥梁。关于变量表的使用实例,可参考《如何制作库文件》
应特别注意,变量表中OUT类型的变量必须保证在程序调用时无条件赋值才能确保传递出去的变量值是确定的值,否则会导致子程序外使用该传出值的程序段出现意外的执行结果。
|