《2022年西门子S-高级编程培训教材PRO_附录间接访问FC和FB参数 .pdf》由会员分享,可在线阅读,更多相关《2022年西门子S-高级编程培训教材PRO_附录间接访问FC和FB参数 .pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ST-7PRO2附录 2: 间接访问参数第 1页SITRAIN自动化与驱动培训教材目录页码使用复杂数据类型的功能调用 .2复杂数据类型的参数传递 .3间接访问复杂数据类型 .4指针的参数传递.5参数类型的参数传递.6DB中的基本实参和常量的特点.7A2.1 习题:在 FC中计算 Date-and-Time参数.8使用复杂数据类型的FB 调用 .9间接访问输入/输出参数.10间接访问输入/输出参数 .11“ 嵌套传递 ” 参数 .12A2.2 习题:在 FB中计算 Date-and-Time参数.13A2.3 习题:在 FB中计算 In/Out 参数 .14A2.1 习题解答:在FC 中访问 D
2、T 参数.15A2.2 习题解答:在FB 中访问 DT 参数.16A2.3 习题解答:在FB 中访问 I/O参数 (第1部分 ).17A2.3 习题解答:在FB 中访问 I/O参数 (第2部分 ).18日期:2011-3-17文件:PRO2_15E.1SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材附录 2:间接访问 FC 和FB 参数Closed-loop controllerClosed-loop controllerOB 1Motor 1Motor 1FB1Motor 2Motor 2FB1Valve islandValve islan
3、dFB2FB5Meas_ValueARRAY1.20REALSumREALMean_valueREALLP#Meas_ValueLAR1LW AR1,P#0.0T#DB_NumOPNDBDB_NumLD AR1,P#2.0LAR1.FC10. . . . . . .名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 2页SITRAIN自动化与驱动培训教材综述复杂数据类型的参数(ARRAY
4、 和STRUCT) 提供了一种清晰而高效的方法,用于在主调块和被调块之间传递大量相关数据,这符合“ 结构化编程 ” 的概念。数组或者结构可以作为一个完整的变量传递到被调用功能。参数赋值为实现这种传递,必须在被调功能中声明一个参数,该参数具有与待传递实参相同的数据类型。该参数(数据类型:数组、结构、日期和时间,以及字符串)只能通过符号地址被赋值。由于复杂数据类型的变量只能在数据块或者局部数据堆栈中建立,实参必须位于数据块(全局或背景 DB) 或者主调块的局部数据堆栈中。对于在 FC 参数传递中的实参和块参数,在STL/LAD/FBD编辑器中检查它们的数据类型的兼容性之后,仅向被调FC传递一个带有
5、DB 序号的 POINTER 和指向实参的区域交叉指针。该POINTER 在主调块( V区)的 L堆栈中通过 CALL 宏建立。该 POINTER 对于编程人员十分重要,特别是当所传递的参数只能间接访问时(见附录 )。注意?通过选择菜单项View - Block Properties,可以设定所占用局部堆栈的大小。事项?如果块参数与ARRAY 或STRUCT 的分量具有相同的数据类型的话,ARRAY 或STRUCT 的分量也可以传递给块参数。日期:2011-3-17文件:PRO2_15E.2SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材DB
6、5 TemperatureFC21参数的赋值只能通过符号地址程序段 1:在 FC21 中,声明 Meas_Val 为一个数组。CALL FC 21Meas_Val:=Temperature.sequence使用复杂数据类型的功能调用实例实例: :向功能传递数组名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 3页SITRAIN自动化与驱动培训教材参数传递具有复杂数据类型(DT、 STR
7、ING 、ARRAY 、 STRUCT 和UDT) 的实参位于数据块或者主调块的 L堆栈中 (V区域 )。因为 32位区域交叉指针不能访问DB 中的实参,所以编辑器保存一个48位的指向实参的指针,位于被调块的L堆栈中。在调用时,一个32位的区域交叉指针传递给该“POINTER ”。在 FC中,通过将 32位指针转换成 48 位指针(双分支,double branching)来实现对实参的参数访问。在实际切换到被调FC之前,在主调块的L堆栈中建立 “POINTER ” 。结果复杂数据类型的参数与基本参数类型相比“ 更平易近人 ” 。可以不假思索地在被调FC中写入复杂数据类型的输入参数。同样可以不
8、假思索地扫描输出参数。日期:2011-3-17文件:PRO2_15E.3SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材复杂数据类型的参数传递OB1功能 FC10执行程序CALL FC10On:= Value.FieldOff:= Q8.0inOnARRAY1.10INTout OffBOOL.L #On8.= #Off.OB1BLD1= L20.0L5TLW21LP#DBX0.0TLD23UCFC10P#L 21.0P#Q8.0BLD2L 堆栈 (OB1)Field ARRAY1.10INTLW 21.12复杂的实参复杂的实参: :L堆栈数
9、据块DB-No: 5 区域交叉指针DB5: Value在L堆栈中建立指针名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 4页SITRAIN自动化与驱动培训教材间接访问传递复杂数据类型如ARRAY 和STRUCT 时,仅当在被调块中把参数传递和间接访问结合起来,才能充分利用其功能。间接访问所传递的复杂数据类型实参,分两个步骤:1.首先,决定指向POINTER 的区域交叉指针, 该指针已
10、经传递到主调方的局部数据堆栈,操作如下:L P#Meas_Val.2.对于实参的实际访问,必须分析POINTER 中的信息,这涉及当前操作数,例如:L P#Meas_Val/ 返回指向 POINTER 的区域交叉指针LAR1/ 读入指向地址寄存器的区域交叉指针L WAR1,P#0.0/ 返回实参的 DB序号,如果它/ 保存在 DB中,否则返回0L DAR1,P#2.0/返回指向实参的区域交叉指针然后通过常规方式计算结果。注意事项为获得以上实例中的访问,程序员必须设置DB寄存器和 AR1 寄存器的内容,由此可以寻址所传送字段的第一个分量。语句LMeas_Val0也确保了使用DB 寄存器打开了所需
11、数据块,并且设置了AR1 寄存器来启动所传送的ARRAY 。日期:2011-3-17文件:PRO2_15E.4SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材间接访问复杂数据类型地址地址声明声明名称类型起始值注释0.0inMeas_ValARRAY1.8*4.0REAL32.0outSumREAL36.0outMean_ValREALin_out0.0tempDB_NumWORD网络 1: 确定 DB-No. 和起始地址LP# Meas_Val/ ACCU1 读入指针地址LAR1/ 再加载到 AR1;LW AR1,P#0.0/ 决定 DB号T
12、#DB_Num/ 并加载到温度变量;OPNDBDB_Num/ 打开 DBLD AR1,P#2.0/ 决定区域指针LAR1/ 并加载到 AR1;网络 2: 计算和L0.000000e+000 / ACCU1 清零 (sum=0.0)L8 / ACCU1 读入计数值 ; ACCU2 读入sum=0BEGN:TAK/ ACCU1 读入 sum ,ACCU2 读入计数值ENT/ ACCU3 读入计数值L DAR1,P#0.0 / ACCU1 读入场分量+R / ACCU1 读入 sum ,ACCU2 读入计数值+AR1P#4.0; / AR1 增加 4字节TAK/ ACCU1 读入循环计数,ACCU2
13、 读入 sumLOOP BEGN; / 循环计数减少,必要时跳转T#Sum/ 将sum 传到 #Sum名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 5页SITRAIN自动化与驱动培训教材参数传递如果向 FC 传递 “POINTER ”或 “ANY ” 数据类型的参数,那么编辑器在主调块的L堆栈中设置相关数据结构。在FC调用中,一个32位的指向该数据结构的区域交叉指针(“POINTE
14、R ”或ANY) 传递到被调 FC 。在被调 FC 中,不能直接访问参数,因为缺少通过该“POINTER ”或“ANY ” 指针引用的数据类型信息。必须在被调 FC 中,由用户对“POINTER ”或“ANY ” 的内容进行分析。在实际切换到被调FC之前,必须在主调块的L堆栈中建立“POINTER ”或“ANY ” 结构。例外以上规则的一个例外是STL/LAD/FBD编辑器,当在一个“ANY ” 数据类型的块参数上,建立了一个附加的“ANY ” 数据类型的实参,保存在主调块的L堆栈中。在这种情况下,STL/LAD/FBD编辑器不在主调方的L堆栈中建立附加的“ANY ” 指针,而是在 FC 调用
15、中直接传递32 位区域交叉指针到已存在的ANY 指针 (在主调方的 L堆栈)。这样,在运行时,该“ANY ” 指针可以由主调块操作,并因此实现了使用实参为FC进行“ 间接 ” 赋值。日期:2011-3-17文件:PRO2_15E.5SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材指针的参数传递OB1功能 FC10执行程序CALL FC10On:= P#I 0.0 INT 10Off:= Q8.0inOnANYoutOffBOOL.L P#On.= #Off.OB1BLD1= L20.0LW#16#1005TLW21L10TLW23L 0TLW
16、25LP#I 0.0TLD27ACFC10P#L21P#Q8.0BLD2L 堆栈 (OB1)LW 21.12POINTER 和ANY 参数10H 数据类型数据类型: :05重复重复: :10DB 号:0 区域交叉指针指针: : P#I0.0.在L堆栈中建立 ANY 指针名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 6页SITRAIN自动化与驱动培训教材参数传递传递参数的类型:TIM
17、ER 、COUNTER 和BLOCK_x 最容易。此时,不使用32位区域交叉指针,而是简单地传递当前TIMER 或COUNTER 或BLOCK 的序号到被调FC 。日期:2011-3-17文件:PRO2_15E.6SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材参数类型的参数传递OB1功能 FC10程序执行CALL FC10On:= DB35Off:= Q8.0inOnBLOCK_DBout OffBOOL.OPN #ON.= #Off.BLD1= L20.0ACFC10P#4.3P#Q8.0BLD2块参数块参数: :定时器定时器, ,计数器
18、BLOCK_xxOB1名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 7页SITRAIN自动化与驱动培训教材参数传递如果 FB的输入、输出或输入/输出参数被赋值为常量,或保存在DB 中的参数,那么STL/LAD/FBD编辑器首先在主调L堆栈中保留必要的存储空间,然后复制带有输入和输入 /输出参数 L堆栈中实参的值。对于输出参数,在L堆栈中保留存储区域,但没有初始化。然后才实际切换到被
19、调FC,此时 STL/LAD/FBD编辑器在每次传递一个区域交叉指针到被调 FC 的L堆栈存储区域。跳转回主调块之后,结果带有输入和输入/输出参数将复制到实参。结果这个机制表明了在被调FC中,输入参数只能被扫描,输出参数只能被写入。如果输入参数被写入,相应值保存在L堆栈,但是在FC 处理之后不能复制到实参。同样,输出参数只能写不能读。扫描输出参数时,从L堆栈读到未定义值,因为没有初始化。输入 /输出参数引起的问题较少。它们在FC调用之前赋值为实参的值,在调用之后移除。注意事项在被调 FC 中,必须写输出参数(避免使用指令如“S”和”R ”),否则将从 L堆栈中复制未定义值到实参。如果不能确保写
20、入输出参数,应选择使用输入/输出参数来代替。日期:2011-3-17文件:PRO2_15E.7SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材DB 中的基本实参和常量的特点OB1功能 FC10程序执行CALL FC10On_1:= I 0.1On_2:= DB5.DBX2.2Off:= DB5.DBX2.4inOn_1BOOLinOn_2BOOLoutOffBOOl.A #On_1A #On_2= #Off.OB1BLD1= L20.0OPNDB5ADBX2.2=L20.1ACFC10P#I 0.1P#L 20.1P#L 20.2AL20.2
21、OPNDB5=DBX2.4BLD2L 堆栈 (OB1)DB5LB 20.01.00010100.123DBB2 基本实参基本实参: :常量在数据块中0名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 8页SITRAIN自动化与驱动培训教材总览下面的习题显示了如何在功能内间接访问复杂数据类型的输入、输出和输入/输出参数。如果要间接访问其它复杂数据类型,必须使用相同方法,如ARRAY 、S
22、TRUCT 或STRING 。任务创建 FC51 ,具有以下属性:?FC51 有一个输入参数#IN_DT ,数据类型为:DATE_AND_TIME?在它的 3个输出参数 #Sec 、#Min 和#Hour 中, FC51 返回传递给它的DT 参数的秒、分种、小时分量。步骤1.创建 FC51 ,具有要求的属性。2.在OB1 中调用 FC51 。使用 OB1 启动信息中的变量OB1_DATE_TIME为块参数#IN_DT 提供数值。3.下载块到 CPU ,测试程序。日期:2011-3-17文件:PRO2_15E.8SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动
23、化与驱动培训教材A2.1 练习练习: :在FC中计算 Date-and-Time参数FC51ENENOIN_DTSecQB13MinQB12OB1_DATE_TIMEHourQB8名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 9页SITRAIN自动化与驱动培训教材复杂数据类型与功能一样,复杂数据类型(ARRAY 、STRUCT 、DATE_AND_TIME和 STRING) 的地址
24、可以整个传递到被调功能块。为了传递,必须在被调功能块中声明一个与待传递实参具有同样数据类型的参数。该参数的赋值只能通过符号地址。输入和输出参数对于复杂数据类型的输入和输出参数,必须在背景DB中创建用于实参值的相应区域。调用 FB 时,在实际切换到FB 的指令部分之前,使用SFC 20 (BLKMOV) (“ 按值传递”),复制输入参数的实参到背景DB中。以同样方式,在FB处理以后,从背景DB中复制输入参数值回到实参。结果,赋值输入和输出参数时需要大量的复制工作(处理时间 )。使用输入 /输出参数可减少复制量。输入 /输出参数对于复杂数据类型的输入/输出参数,不进行“ 按值传递 ” 。在背景数据
25、区域,为每个输入/输出参数仅保留六个字节。在这些字节中输出一个指向实参的POINTER ( “ 按参传递”)。注意事项复杂数据类型的输入和输出参数可以在FB 的声明表中初始化,但是输入/输出参数不能。复杂数据类型的输入和输出参数不必在FB 调用中赋值。输入/输出参数则必须。存储器或寄存器间接访问输入/输出参数或者复杂数据类型的输入/输出参数,与访问基本参数不同。日期:2011-3-17文件:PRO2_15E.9SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材使用复杂数据类型的FB 调用实例实例: :传递数组到功能块FB17复杂参数的赋值仅通过
26、符号地址程序段 1: CALL FB 17, DB 30Meas_1:=Temperature.CylinderSum_1:=MD20Sum_2:=MD30Meas_2:=Temperature.ShaftDB2 Temperature名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 10 页SITRAIN自动化与驱动培训教材间接访问传递复杂数据类型如ARRAY 和STRUCT 时,仅
27、当在被调块中把参数传递和间接访问结合起来,才能充分利用其功能。间接访问所传递的复杂数据类型的输入和输出参数,分两个步骤:1.首先,通过指令:LAR1 P#Meas_1/ 区域交叉指针指向参数/ 无地址偏移在背景 DB中指向参数的区域交叉指针被读到AR1 。这种方式定义的指针包含区域标志符DI和同样的字节.位地址,也显示在编辑器中,位于声明表的第一列的参数声明部分。对于多个实例的情况,这不对应背景DB中的输入 /输出参数的实际地址。必须将来自 AR2 的地址偏移加到AR1 中的指针上,来自AR2 的地址偏移是用于识别在多实例情况下背景数据区域的开始点。TAR2/ 读入地址偏移量到ACCU1+AR
28、1/地址偏移量加到AR1;2.然后,可以实际访问输入/输出参数。背景 DB不必单独打开,因为FB 调用中的 CALL 宏已经打开它了。L DAR1,P#0.0 / 读入 Meas_1 第一个元素等注意事项间接访问基本数据类型的输入、输出和输入/输出参数或静态变量,与上面介绍的方式相同,因为这时地址值也保存在背景DB 中。日期:2011-3-17文件:PRO2_15E.10SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材间接访问输入 /输出参数AddressDeclarationNameTypeStart valueComment0.0inMe
29、as_1ARRAY1.10*4.0REAL40.0outSum_1REAL0.000000e+00044.0outSum_2REAL0.000000e+00048.0in_outMeas_2ARRAY1.15*4.0in_outREAL54.0statDB_NumINT0程序段 1: 决定 Meas_1 的起始地址LAR1P#Meas_1/ 区域交叉指针加载到参数,/ 在AR1中无地址偏移 ( 多重执行个体 ) TAR2/ 载入 ACCU1中的地址偏移量+AR1/ 把地址偏移量加到AR1;/ AR1现在指向背景 DB中的参数/ 背景 DB已经打开程序段2: 访问 Meas_1L0.000000
30、e+000 / ACCU1清零 (Summe =0.0)L10 / ACCU1读入计数值 ;ACCU2 读入 Sum=0 BEGN:TAK/ Sum在ACCU1, 计数值在 ACCU2ENT/ ACCU3读入计数值L DAR1,P#0.0 / ACCU1中的域分量+R / Sum在ACCU1,ACCU2 读入计数值+AR1P#4.0; / AR1增加 4字节TAK/ 在ACCU1中循环计数 , sum在ACCU2LOOP BEGN; / 减循环计数,必要时跳转T#Sum_1/ 将sum传递到 #Sum_1名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
31、- - - - - - 名师精心整理 - - - - - - - 第 10 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 11 页SITRAIN自动化与驱动培训教材间接访问间接访问复杂数据类型的输入/输出参数,与访问输入和输出参数比较,在结构上不同。对于复杂数据类型的输入/输出参数,复制的不是数值,而是指向背景DB中输入 /输出参数的 POINTER 。实际访问分三个步骤:1.首先,通过指令:LAR1 P#Meas_2/ 传递区域交叉指针到POINTER一个指向所传递的POINTER 的区域交叉指针被读入AR1 寄存器。和前一种介绍的情况相同
32、,AR1 中的字节 .位地址不同于背景DB中POINTER 的实际地址。对于多实例情况,来自AR2 中的地址偏移量必须加到AR1 寄存器的指针上:TAR2/ 读入地址偏移量到ACCU1 ,加到 AR1;+AR1/ AR1 现在指向背景DB中的 POINTER;2.下一步,分析POINTER 中的信息,如有必要,打开包含实参的DB,读入指向实参的区域交叉指针到AR1 寄存器:L W AR1,P#0.0 / 从POINTER 读入 DB 序号到 ACCU1T #DB_Num / DB 序号 (或0)转换为变量OPN DB #DB_Num / 打开 DBL D AR1,P#2.0 /读入区域交叉指针
33、到参数LAR1/ 指针读入 AR1, AR1 指向参数3.然后,可以实际访问输入/输出参数:L DAR1,P#0.0 /读入 Meas_2 第一个元素等日期:2011-3-17文件:PRO2_15E.11SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材间接访问输入 /输出参数AddressDeclarationNameTypeStart valueComment0.0inMeas_1ARRAY1.10*4.0REAL40.0outSum_1REAL0.000000e+00044.0outSum_2REAL0.000000e+00048.0in
34、_outMeas_2ARRAY1.15*4.0in_outREAL54.0statDB_NumINT0网络 3:决定 Meas_2 的起始地址LAR1P#Messung_2/ POINTER读入区域交叉指针,不TAR2/ 读入 ACCU1中地址偏移量 , 加到 AR1;+AR1/ AR1现在指向背景 DB中的 POINTERL W AR1,P#0.0 / ACCU1从POINTER 读取 DB号T #DB_Num / 把DB号(或者 0) 设为静态变量OPN DB #DB_Num / 打开 DBL D AR1,P#2.0 / 区域交叉指针加载到参数LAR1/ AR1读入指针, AR1指向参数网
35、络 4: 访问 Meas_2L0.000000e+000 / ACCU1请零 (Sum =0.0)L15 / ACCU1读入计数值 ;ACCU2 读入 Sum=0BEGN:TAK/ Sum在ACCU1中,计数值在 ACCU2中ENT/ ACCU3读入计数值L DAR1,P#0.0 / 域分量在 ACCU1+R / Sum在ACCU1中, ACCU2读入计数值./ .名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 18 页 - - - - - - - - - ST-7PR
36、O2附录 2: 间接访问参数第 12 页SITRAIN自动化与驱动培训教材总览块参数的 “ 嵌套传递 ” 是一种特殊的访问或块参数赋值形式。“ 嵌套传递 ” 意味着主调块的形参变为被调功能的实参。关于引用参数类型作为通用规则,实参必须具有与形参同样的数据类型。的限制另外,主调块的输入参数只能在被调块的输入参数处设置,输出参数只能在输出参数处设置。原则上主调块的输入/输出参数可以设置为被调块的输入、输出、和输入/输出参数。关于引用数据类型关于对数据类型的引用,限制决定于在FC 或FB调用中块参数的不同保存方式。的限制基本数据类型的块参数可以无限制传递。复杂数据类型输入和输出参数只能当主调块为FB
37、 时才能传递。参数类型为:TIMER 、COUNTER 和BLOCK_x 的块参数只能当被调块为FB 时,才能从输入参数传到输入参数。注意事项参数类型为:TIMER 、COUNTER 和BLOCK_x 的“ 嵌套传递 ” ,可以在 FC中通过间接寻址实现。期望的TIMER 、COUNTER 或BLOCK_x 的序号作为一个WORD 数据类型的参数,从主调块到被调块传递。在最后一个被调块内,该参数可以转换到临时变量,需要的TIMER 、COUNTER 或BLOCK_x 可以通过该变量进行处理。日期:2011-3-17文件:PRO2_15E.12SIMATIC S7Siemens AG 2001。
38、保留所有权利。SITRAIN自动化与驱动培训教材“ 嵌套传递 ” 参数嵌套深度嵌套深度: :S7-300: 最多 8 S7-400: 最多 16 . . . 嵌套传递决定于块嵌套传递决定于块、数据和参数类型数据和参数类型:调用FC调用 FCFB调用 FCFC调用 FBFB 调用 FB数据类型E C PE C PE C PE C P输入 -输入x -x x -x -xx xx输出 -输出x -x x -x -x x-输入 /输出 -输入x -x -x -x -输入 /输出 - 输出x -x -x -x -输入 /输出 -输入 /输出x -x -x -x -E:基本数据类型C: 复杂数据类型P:参
39、数类型 (定时器,计数器,块_x)FBsFBsFCsOB名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 13 页SITRAIN自动化与驱动培训教材总览以下习题显示如何在支持多实例的功能块中,间接访问复杂数据类型的输入或输出参数。如果要间接访问其它复杂数据类型,如ARRAY 、STRUCT 或STRING ,必须使用相同方法。任务创建 FB63 ,具有以下属性:?FB63 有一个输入
40、参数#IN_DT ,数据类型为DATE_AND_TIME ?在它的 3个输出参数 #Sec, #Min 和#Hour 中, FB63 返回传递给它的DT 参数的秒、分种、小时分量。步骤1.创建 FB63 ,具有要求的属性。2.测试创建的 FB63 是否真正支持多实例调用,一个更高级FB 中的 FB63 的实例创建一个更高级的FB83 。首先,在 FB83 中声明输入参数#IN_DT,类型为 DT 。然后声明静态变量#DUMMY,类型为 ARRAY1.100 OF INT,一个 FB63 的实例,名为 #FB63_DT 。3.在FB83 内调用实例 #FB63_DT ,为该实例的输入参数#IN_
41、DT 提供 FB83 的输入参数#IN_DT 。为实例 FB63_DT 的输出参数提供输出字节QB8 、QB12 和QB13 。4.在OB1 中,调用带背景DB83 的FB83 。为输入参数 #IN_DT 提供来自 OB1 启动信息中的变量 OB1_DATE_TIME。5.下载块到 CPU ,测试程序。日期:2011-3-17文件:PRO2_15E.13SIMATIC S7Siemens AG 2001。保留所有权利。SITRAIN自动化与驱动培训教材A2.2 练习练习: :在FB 中计算 Date-and-Time参数FB63ENENOIN_DTSecQB13MinQB12OB1_DATE_
42、TIMEHourQB8FB83IN_DT0.0inIN_DTDATE_AND_TIMEDT#90-1-1-0:0:0.0outin_out8.0statDUMMYARRAY1.100*2.0statINT208.0statFB63_DTFB63名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 14 页SITRAIN自动化与驱动培训教材总览以下习题显示如何在支持多实例的功能块中,间接访
43、问复杂数据类型的输入/输出参数。必须使用相同方法,如果要间接访问其它复杂数据类型,如ARRAY 、STRUCT 或STRING 。任务说明创建 FB64 ,具有以下属性:?FB64 有一个输入 /输出参数 #IO_DT ,类型为 DT ?在它的 3个输出参数 #Sec 、#Min 和#Hour 中, FB64 返回传递给它的DT参数的秒、分种、小时分量。执行1.创建 FB64 ,具有要求的属性。2.创建一个 FB84 。首先,在FB84 中声明一个输入参数#IN_DT ,类型为 DT。然后声明静态变量#DUMMY,类型为 ARRAY1.100 OF INT,一个 FB64 的实例,名为#FB6
44、4_DT3.在FB84 中调用实例 #FB64_DT,为该实例的输入/输出参数 #IO_DT 提供 FB84 的输入参数 #IN_DT 的值。注意不允许直接传递一个输入参数到输入/输出参数。推荐使用何种解决方案?为该实例 FB64_DT 的输出参数提供输出字节QB8 、QB12 和QB13 ,像前一个任务一样。4.使用 OB1 中的背景 DB84 调用 FB84 , 为FB84 的输入参数 #IN_DT 提供来自 OB1 启动信息中的变量OB1_DATE_TIME。5.下载块到 CPU ,测试程序。日期:2011-3-17文件:PRO2_15E.14SIMATIC S7Siemens AG 2
45、001。保留所有权利。SITRAIN自动化与驱动培训教材A2.3 练习练习: :在FB 中计算 In/Out 参数FB64ENENOIO_DTSecQB13MinQB12OB1_DATE_TIMEHourQB8FB84IN_DT0.0inIN_DTDATE_AND_TIMEDT#90-1-1-0:0:0.0outin_out8.0statDUMMYARRAY1.100*2.0statINT208.0statFB64_DTFB64.名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14
46、页,共 18 页 - - - - - - - - - ST-7PRO2附录 2: 间接访问参数第 15 页SITRAIN自动化与驱动培训教材A2.1习题解答:在 FC中访问DT参数FUNCTION FC 51 : VOIDTITLE =VERSION : 0.1VAR_INPUTIN_DT : DATE_AND_TIME ;END_VARVAR_OUTPUTSec : BYTE ;Min : BYTE ;Hour : BYTE ;END_VARVAR_TEMPDB_Num : WORD ;END_VARBEGINNETWORKTITLE =/ 对于复杂数据类型的输入、输出、输入/输出参数,/在
47、主调方 L堆栈中使用 CALL 宏建立一个指向POINTER 变量 (6字节 )的区域交叉指针,/ 传送到被调功能,以传递参数。/ POINTER 变量的内容指向实际操作数。为间接访问,/ 首先创建一个指向POINTER 变量的区域交叉指针,/ 然后,读取 POINTER 变量的内容,/ 通过该信息访问实际操作数。/L P#IN_DT; / 读入区域交叉指针POINTER 到ACCU1LAR1 ; / 读入指针到 AR1 ,AR1 现在指向 POINTERL W AR1,P#0.0; / 从ACCU1 中的 POINTER 读入 DB序号T #DB_Num; / 传送 DB序号 (或0)到临时
48、变量OPN DB #DB_Num; / 打开 DBL D AR1,P#2.0; /读入区域交叉指针到DT 变量/ 来自 POINTERLAR1 ; /读入指针到 AR1, AR1 现在指向 DT 变量L B AR1,P#3.0; / 从DT变量读入小时元素T #Hour; / 传到输出参数#HourL B AR1,P#4.0; /从DT 变量读入分钟元素T #Min; /传到输出参数#MinL B AR1,P#5.0; /从DT 变量读入秒元素T #Sec; /传到输出参数#SecSET ; SAVE ; / BR 位置 1END_FUNCTIONORGANIZATION_BLOCK OB1T
49、ITLE =VERSION : 0.1VAR_TEMPOB1_TEMP: ARRAY1.20 OF BYTE; /OB1 的启动信息BEGINNETWORKTITLE =CALL FC 51 (IN_DT := #OB1_DATE_TIME,Sec := QB 13,Min := QB 12,Hour := QB 8);END_ORGANIZATION_BLOCK名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 18 页 - - - - - - - - - ST-7PRO
50、2附录 2: 间接访问参数第 16 页SITRAIN自动化与驱动培训教材A2.2 习题解答:在 FB中访问DT参数FUNCTION_BLOCK FB 63TITLE =VERSION : 0.1VAR_INPUTIN_DT : DATE_AND_TIME ;END_VARVAR_OUTPUTSec : BYTE ;Min : BYTE ;Hour : BYTE ;END_VARBEGINNETWORKTITLE =/对于复杂数据类型的输入、输出参数/ 复杂变量的值被复制或复制回背景DB。/对于间接访问,在多实例情况下,首先创建/指向此 POINTER 的、包括地址偏移量AR2 的区域交叉指针。