杭州西门子电缆6XV1830-3EH10 杭州西门子电缆6XV1830-3EH10
浔之漫 智控技术有限公司 上海诗慕自动化设备有限公司
本公司销售西门子自动化产品,,质量保证,价格优势
西门子PLC,西门子触摸屏,西门子数控系统,西门子软启动,西门子以太网
西门子电机,西门子变频器,西门子直流调速器,西门子电线电缆
我公司大量现货供应,价格优势,,德国
- DB寄存器和AR1受到影响的操作
1. 使用完整的DB路径(如L DB20.Val)或者调用FC/FB时使用DB块完整地址作为其参数,则DB寄存器内容被覆盖。
例如在OB1中调用FC1后,DB寄存器变成20。
OPN DB1
Call FC1
bbbbb(bit):DB20.DBX0.2
因此在编程的时候,OPN 指令打开数据块,通过DBX x.y的方式访问其中内容, 但是如果在打开数据块后DB寄存器的内容被修改了,则DBX x.y的方式访问变量则 会访问到错误的地址。可以通过使用符号寻址的方式或者使用完整路径编程避免,当 然重新使用 OPN指令也是可以的。
2. 调用FC时使用bbbbbb, array, structure ,UDT作为其形参或者调用FB时使用bbbbbb, array, structure 或者UDT作为其in out形参,在FC/FB程序中访问这些地址则AR1寄存器内容被覆盖,因此当使用AR1进行间接寻址时需要注意AR1内容的正确性。 - AR2地址寄存器和DI寄存器在FB中作为参数和静态变量的基址寻址使用。AR2和DI如果被修改,会影响FB的参数访问,如果希望在FB中使用DI寄存器或者地址寄存器AR2,必须预先保存它们中的内容,并在使用后恢复它们,例如:
TAR2 #AR2_SAVE; //AR2寄存器状态保存到#AR2_SAVE
L DINO;
T #DB2_SAVE; //DI寄存器状态保存到#DB2_SAVE
User Program
LAR2 #AR2_SAVE; //AR2寄存器恢复到使用前状态
OPN DI [#DB2_SAVE]; //DI寄存器恢复到使用前状态
1.4 如何得到多重背景FB中的变量在背景DB里的偏移量呢?
可以用下面的方法处理:
TAR2 (得到多重背景FB在背景DB里的偏移地址)
AD DW#16#00FFFFFF (屏蔽掉存储区ID,可参考32位指针格式)
L P##Variable (得到变量在多重背景FB里的地址)
+D (多重背景FB的偏移地址与变量在多重背景FB里地址相加,即得到实际偏移量)
LAR1
上述语句就是就得到了变量在背景DB中的偏移量,从而供后续程序处理。 1.5如何在程序中使用ANY 型指针? 简要说明如下:
L P##bbbbb //指向存储地址指针bbbbb首地址
//这个参数是一个Any类型,P##bbbbb指向参数bbbbb的值所在地址,这就是指针的指针
LAR1 //装载到地址寄存器AR1中。
L W [AR1,P#4.0] //打开DB块
// 由Any类型结构知道Any类型的Byte4、Byte5存放的数据块号
T #BLOCK_NO
OPN DB [#BLOCK_NO] //如果是DB块,打开的DB块。
L W [AR1,P#2.0] //判断ANY指针中数据长度
// Any类型的Byte2、Byte3是重复系数,如P#DB1.DBX0.0 Byte 8后面的Byte 8
_001:T #DATA_LEN //通常此处做loop循环!!
L D [AR1,P#6.0] //找出需要计算数据区的开始地址
// Any类型Byte6~Byte9是32位区域地址
理解Pointer、Any的类型的数据结构,对于正确使用指针有很大帮助。
为正确使用指针,应仔细阅读如下内容:
"SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 参数类型 如下的程序实现了SFC20的部分功能,可以作为Any使用的参考。
FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1
VAR_bbbbb
SRCBLK : ANY ;
END_VAR
VAR_OUTPUT
RETVAL : INT ;
DSTBLK : ANY ;
END_VAR
VAR_TEMP
LOOP : INT ;
BLOCK_NO_DB : WORD ;
BLOCK_NO_DI : WORD ;
SRC_ADD : DWORD ;
DST_ADD : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =
L P##SRCBLK; //读取输入any的首地址
LAR1 ; //装载到ar1
L P##DSTBLK; //读取输出any的首地址
LAR2 ; //装载到ar2
L W [AR1,P#4.0]; //打开DB块
T #BLOCK_NO_DB;
L W [AR2,P#4.0]; //打开DI块
T #BLOCK_NO_DI;
OPN DB [#BLOCK_NO_DB]; //打开DB块
OPN DI [#BLOCK_NO_DI]; //打开DI块
L D [AR1,P#6.0];
T #SRC_ADD; //读取地址
L D [AR2,P#6.0];
T #DST_ADD; //读取地址 L W [AR1,P#2.0]; //读取循环次数
_001: T #LOOP;
L DBB [#SRC_ADD];
T DIB [#DST_ADD]; //赋值
//地址偏移1个字节
L P#1.0;
L #SRC_ADD;
所有评论仅代表网友意见,与本站立场无关。