发布于 2014-03-13 14:31:27
56楼
==== 小编分享(四)=====
上次分享了在功能块中如何按位访问已声明变量的两种方法,下面再介绍两种方法。
[方法三] 指针寻址最神通
刚刚接触PLC编程的网友们可能看到“指针”两字就顿感云里雾里,高深莫测,实际上指针寻址对于解决一些复杂问题绝对是立竿见影、药到病除。掌握此项绝技,便可轻松应对各种编程难题。下面我们就来看看西门子的工程师们如何利用指针寻址来搞定这个问题的吧。
以单独访问双字类型变量DWORD中的位为例。首先在功能块中定义32个BOOL类型的TEMP变量用于存储双整型变量的各个位 ,例如,bitvar_0, bitvar_1…bitvar_31。
然后采用符号寻址将需要进行操作的变量(下例中为MD10)传送至临时变量bitvar_0至bitvar_31。具体实现方法见下:
L P##bitvar_0 //装载临时变量的地址指针到累加器ACCU1;
LAR1 //将ACCU1值传递到地址寄存器AR1,为了储存好后续间接寻址的地址入口;
L MD10 //将MD10的值装载到ACCU1;
T LD [AR1,P#0.0] //将ACCU1的值传递到临时变量,起始地址由AR1指定,地址偏移量为P#0.0,寻址长度为D(即双字);
此段程序运行后,变量MD10的各个位都会传递到对应的临时变量中,可以通过访问临时变量来访问变量MD10中的位。
这种通过局部变量配合指针寻址的方法,可以应用于任何程序块中,代码可读性强,且无需占用额外的数据块或变量存储器。短短4行,高大上啊~
西门子技术资源库有文档对上述方法进行阐述,请见链接:http://support.automation.siemens.com/CN/view/zh/22819143
[方法四] “AT”指令短平快~
如果您使用的是SCL语言,在声明变量时可以利用AT指令实现覆盖。
如下例所示,变量M_VAR是WORD类型变量,M_BIT是包含8个BOOL 类型变量的数组。
M_VAR:WORD;
M_BIT AT M_VAR: ARRAY[0..7] OF BOOL;
如果想访问M_VAR变量的第xx位,就可以通过M_BIT[xx]来访问。
至此,实现功能块中按位访问已声明变量的四种方法已全部介绍完毕,不知是否启发了大家的思路。相信广大网友们还有更好点子,不妨详细的介绍下与大家分享,共同进步是我们的目标!
来自西门子技术支持与服务