西门子FB块如何使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西门子S7-300 中FB 功能块的使用方法:1.创建功能块FB1 准备完成如下功能:将“整型”变量转换成“实型”变量2.打开功能块FB1 3.在功能块FB1 中添加入口参数、出口参数、静态变量入口参数=IN0 ---> 整型(INT) 出口参数=OUT1 ---> 实型(REAL) 静态变量=STAT2 ---> 整型(INT) 局部变量=TEMP3 ---> 长整型(DINT)4.创建背景数据块DB2 5.打开DB2 背景数据块,可以看到系统默认建立了三个数据IN0 ---> 入口参数(整型)OUT1 ---> 出口参数(实型)STAT2---> 静态变量(整型)6.打开FB1 功能块,编写如下代码,实现将“整型”变量转换成“实型”变量同时再编写一段静态变量自加 1 代码7.打开OB1 主程序,添加FB1 功能块如何确定程序参数类型的块编号并传送给FC ?介绍使用以下程序代码可确定参数类型(BLOCK_FC, BLOCK_FB, TIMER or COUNTER)的编号。
例 1 :FB 块FB1 变量声明中定义了“ Timer” 类型的变量“ Time_1” ,FB2 中调用FB1,在将定时器“T5” 传递给变量“ Time_1”。
如图01 所示程序代码中数值5 表示“T5”。
图. 01 例 2 FC FC1 变量声明中定义了“ Timer” 类型的变量“ Time_1” ,FC2 中调用FC1,在将定时器“T8” 传递给变量“ Time_1”。
如图02 所示程序代码中数值8 表示“T8”。
图. 02 在使用多重实例时,需要在图01 所示程序中增加以下代码:TAR2 LAR1 P##Time_1 +AR1 L W[AR1,P#0.0] T MW00 //多重实例偏移地址//多重实例偏移地址与当前地址相加“BLOCK_DB”类型参数在调用FC 时不可以直接传送给FC 。
如果在调用功能时试图使用此参数类型,将产生如下的错误消息:“非法的参数传输<参数名>” 非法的参数传输<参数名> “BLOCK_DB”类型参数仅在FB 被调用(从一个FB 或FC 中)时可被传送。
“BLOCK_DB”类型参数不可以在FC 被调用(从一个FB 或FC 中)时可被传送。
相关详细信息可参考STEP7 在线帮助中“合法的传输参数类型”。
然而,如果希望将BLOCK_DB 参数类型传送给FC,DB 块的编号可以通过基本数据类型(例如WORD)传送。
在下面的例子中,FB100 拥有一个“BLOCK_DB” 的输入参数类型。
为了在调用FC101 时将参数传送给它,“BLOCK_DB”中的DB 块编号被传送给WORD 临时变量(DB_No)。
FC 被当调用,数据块序号以一个WORD 参数类型替代BLOCK_DB 参数类型。
图. 03 如果FB 的接口参数能被定义成WORD 参数类型来传送DB 块编号,当FC 被调用时,此参数可以被直接传送给FC。
如何生成和更新多重背景?显示订货号说明:如果在结构化编程时经常使用功能块,那么在每次调用FB 时都要为其指定一个单独的背景数据块。
对于非常小的FB, 它的背景数据块经常由很少的几个字组成。
当频繁调用和指定背景数据块给这些小的FB 时,程序会变得非常不清晰,或者DB 块的数量会达到CPU 所支持的最大数量。
由于一个背景数据块可以长于FB 实际需要的长度,因此多个背景数据块可以合并成一个多重背景。
但是,这种合并必须在一个FB 中通过编程完成。
1. 表1:编程多重背景和更新修改过的背景2. 表2:对已经存在的FB 多重背景能力的后续声明表1:编程多重背景和更新修改过的背景步过程:骤1 在SIMATIC Manager 中,打开你希望生成多重背景的FB。
在静态变量定义部分,输入多重背景的名字,数据类型为FB 或SFB。
图 1 2 在程序中调用多重背景,可以在多重背景中的目录中选择托拽它到NETWORK 中,也可以用CALL 指令调用它。
图2 STEP 在STEP 7 V5.4 SP2 中请注意:如果在LAD/FBD 编辑器的目录视图中多重背景未被列出,推荐在静态变量声明中先插入一个功能块,然后再删除它。
这样多重背景就再次可以被选择。
3 现在设置程序块的输入和输出并保存。
就可以在程序(例如OB1)中使用多重背景来调用FB。
创建一个背景数据块以供监控。
注意:当生成多重背景时,如其在FB 中作为一个多重背景被调用,注意要首先生成它,然后再指定一个多重背景调用。
如果不遵从这个顺序,程序中将会出现不一致的情况,这种不一致的情况也有可能在修改多重背景后出现。
4 一旦修改过了多重背景,并打开调用它的功能块。
当功能块被打开时,会出现一个消息显示在FB 接口声明中有一个UDT 或本地标签的被修改,并显示在功能块调用中至少有一个时间标签冲突。
确认此信息,修改过的背景调用在LAD/STL/FBD 编辑器中将会以亮红色显示。
为了更新功能块调用,右击功能块,然后在弹出菜单中选择“Update Block Call...”。
图 3 5 在后续的对话框中,点击OK 来执行接口更新。
图4 在STEP 7 V5.3 中的注意事项:当尝试通过“File > Check and Update Accesses”来更新程序块调用时,STEP7 V5.3 不能发现变量间的唯一分配,调用还是保持红颜色,也无法通过“Edit > Call > Update”改正调用错误。
更新调用的唯一办法是删除调用,在声明中更新接口,然后再以多重背景方式调用功能块。
如果已经删除了FB 接口中的变量,应该通过“Edit > Call > Update”来改正所有的多重背景调用,而不需使用前面的“Check and Update Accesses”功能。
一旦已经更新了这些多重背景,就又可以与平时一样使用“Check and Update Accesses”功能了。
6 推荐在更新功能块调用后进行一致性检查。
在SIMATIC Manager 中,右击S7 program 文件夹,选择“Check block consistency...”功能,系统会显示S7 程序的结构。
通过工具栏中的第二个按钮或者“Program > Compile All”功能编译程序。
在编译后,STEP 7 程序一致性将统一。
图5 当新生成一个新的功能块,在功能块属性中多重背景功能默认被选择(图6)。
也可以改变此设置:图 6 一旦已经生成了功能块,多重背景功能就不可以被重新设置,是否具有多重背景的属性只可以显示,除非按照一个冗长的过程来修改它。
表 2 描述了如何声明一个已经生成的FB 是否具有多重背景的能力:步过程:骤 1 为了声明一个已经生成的FB 是否具有多重背景的能力,打开LAD/STD/FBD 编辑器,通过“File > Generate source...”在对话框中生成一个FB 的源文件。
在后续的对话框中选择项目并存储源文件到S7 程序的源文件目录。
2 在“Generate source <name_block>”对话框中(图7),在左边列表中选择你希望使能或取消多重背景能力的功能块,然后点击箭头将其添加到右边的列表中。
点击“OK”关闭对话框。
图7 3 关闭LAD/FBD/STL 编辑器,打开在SIMATIC Manager 生成的源文件。
多重背景的能力依赖于在“Version : 0.1”后面输入的代码。
图8 ? ? 如果希望FB 具备多重背景的能力,删除“CODE_VERSION1”属性。
如果希望FB 不具备多重背景的能力,按照图8 中添加“CODE_VERSION1”属性。
保存并编译源文件,现在功能块即被使能或取消了多重背景的能力。
4 在使能或取消了多重背景能力之后,现在不得不重新编译所有的在FB ,为了这个工作,我们推荐执行一致性检查(见表1,步骤6)数据块初始值与实际值的含义显示订货号描述在数据块的变量声明表中可以定义变量的名称、数据类型、注释和变量初始值。
初始值为纯粹的组态值,当由UDT 生成数据块或在全局数据块中生成新变量时,组态的初始值被用作为实际值。
可以通过菜单命令“View > Data view” 来查看实际值。
初始值对于数据块或新声明的变量数据块来说,组态的有效次数仅为一次。
如果变量已经存在,实际值将不会随着初始值的变化而发生改变。
对于CPU 来说,操作的数值为实际值,初始值虽也可以下载到CPU 中并可在线监控,但不会被CPU 采用。
有以下两种方法可以将初始值传送给CPU 作为实际值: 1. 切换到数据浏览状态“View > Data view”,在“Actual value” 栏输入新的初始值。
2. 进入声明浏览状态“View > Declar ation view ”,在“Actual value” 栏输入新的初始值;然后,切换到“Data view” 状态,执行菜单命令“Edit > Initialize Data Block”将所有“Intial value”栏的数值传送至“Actual value”栏。
然后将数据块下载至CPU 中。
由于初始值仅使用一次,因而没有必要将实际值装载至初始值,如装载“Actual value” 栏到“Initial value”栏。
STEP 7 中没有与之相关的菜单命令。
但是一些特殊应用需要将实际值保存为初始值。
这一过程可通过STL 源文件或Excel 来实现,以下将分别介绍其操作步骤。
在STL 源文件中,将数据块的实际值直接保存为初始值当生成STL 源文件后,实际值可以逐行拷贝至STL 源程序中的声明语句中。
No. 步骤1 在SIMATIC Manager 选择菜单指令"View > Online" ,在线打开要执行操作的数据块。
选择菜单命令“File > Save” 或点击软盘图标保存该数据块。
2 通过菜单命令“File > Generate Source...”生成此数据块的源文件。
3 打开生成的源文件,该文件位
于SIMATIC Manager 的Source 文件夹。
4 在STL 源文件中,将位于“BEGIN”和“END_DATA_BLOCK”语句之间的实际值逐行复制到相应的声明行(初始值)及相应的数据类型之中。
图01 如图01 所示,通配符“:=”也必须和实际值一起复制到初始值的声明行。
以下是声明行定义的一个示例:? Data_1 : BYTE := B#16#AA; 5 保存编译STL 源程序? ? File > Save File > Compile 此时,实际值被用作初始值将数据块的实际值保存为初始值(便利方法)使用Excel 将数据块的实际值保存为初始值(便利方法)数据块的实际值也能在Excel 中被存为初始值。
当数据量较大时,推荐使用Excel 进行操作,这是因为此时数据是逐块而不是逐行被复制到声明区域的。
下述表格介绍了如何导入/导出STL 源文件及将其保存在Excel 中。
No 步骤. 1 在SIMATIC Manager 选择菜单指令"View > Online" ,在线打开要执行操作的数据块。
选择菜单命令“File > Save” 或点击软盘图标保存该数据块。
2 通过菜单命令“File > Generate Source...”生成此数据块的源文件。
3 Mark the generated source in the source in the SIMATIC Manager and right-click it. Then select the "Export Source..." command in the pop-up menu. 4 在“Export source”对话框中确定源文件导出文件加后,选择“STL source (*.awl)” 作为文件类型且文件名中必须包含扩展名“.AWL ”,.AWL 例如“Source_DB2.AWL 然后点击“Save” .AWL”,.AWL 按钮。
图02 5 启动Microsoft Excel,通过“文件> 打开...”打开刚才导出的STL 源文件,出现“文本导入向导”对话框。
注意为了保证在“Open”对话框中可以找到该STL 源文件,需要选择“All files (*.*)”作为打开文件类型。
6 在文本倒入向导第一步,使能“Delimited“ 格式选项。
图03 然后单击“Next” 按钮。
7 在下一个文本倒入向导的对话框中,选择"tab" 或"space" 作为分隔符。
图04 然后单击“Next” 按钮。
8 在第三步文本倒入向导中,选择”standard” 作为;栏数据格式。
图05 然后单击“Finish”按钮。
转化的STL 源在Excel 中打开。
9 选中所有属于STL source 的单元格后点击右键。
在弹出菜单中选择“设置单元格格式...”。
图06 10 在“对齐”页签中将水平对齐设置为“靠右”或“靠右(缩进)”点击确定。
图07 11 选择位于“BEGIN”和“END_DA TA_BLOCK”之间的实际值以及通配符“:=”,将数据复制到“STRUCT”和“END_STRUCT”之间声明区域的相应数据类型之后,如图08 所示。
图08 12 复制完成后检查语法格式是否正确,例如:STRUCT Data_1 : BYTE := B#16#AA; ... END_STRUCT; 图09 13 在Excel 中保存文件,“文件> 另存为...” 并选择? 带格式文本文件(空格分隔)(*.prn) 作为文件类型。
. 注意执行上述操作后,文件保存为“Source_DB2.AWL”。
但是,如果文件以另一文件名保存,如“Source_DB20.AWL”,系统会将其保存为“Source_DB20.AWL.PRN”文件。
此文件需通过删除扩展文件名PRN 将“Source_DB20.AWL.PRN”转换为“Source_DB20.AWL”。
PRN 扩展名是系统自动添加的,这种情况发生在保存文件时已输入过一次以AWL 结尾的文件名。
14 在SIMATIC Manager 中选择菜单命令“Import > External Source...”将Excel 中处理完成的STL 源文件导入至STEP 7 项目下的source 文件夹。
15 选择导入的源文件后点击右键,在弹出菜单中选择“Compile...”命令进行编译。
编译完成后,实际值便保存为初始值。
图10 注意如果数据块中有UDT 类型的数据,使用时有限制:不能将实际值附着在变量后作为初始值。
虽然UDT 可以被导出,但其初始值的改变将会影响到所有使用该UDT 的数据块,因此无法做到在不同数据块中的差别化应用。
关键词:编成帮助,初始化,初始值,系统行为全局数据块和背景数据块的区别在使用全局数据块的情况下,所有的程序块(FB,FC 和OB)可以读写数据块中的数据。
背景数据块被分配到特定的功能块,包含所分配的FB 的本地数据。
? 全局数据块o o 可以增加变量,改变初始值和当前值。
在数据块中添加,删除,改变变量。
? 背景数据块o o 不能添加或删除变量,不能改变变量的初始值和当前值。
在相关连的功能块中添加,删除,改变变量。
图01 不同FB 的数据可以存储在单个背景数据块中(多重背景)。
图02 给出了一个例子,说明了在FB1 中FB5 和FB6
如何作为多重背景的。
两个FB 将它们的背景数据保存在调用它们的FB1 的背景数据块DB1 中。
在FB1 的声明中,多重背景块保存为静态变量。
图02 更多信息可以参考STEP 7 在线帮助以下部分? ? ? ? “背景数据块” “创建数据块(DB)” “数据块(DB) 的结构” “使用多重背景” V5.x 从STEP 7 V4.02 升级到V5.x 需要注意当升级STEP 7 V4.02 到V5.x 版本时,LAD/STL/FBD 编辑器中可能会在调用CALL 功能在时出现红色。
这种现象的原因是块中调用的一个背景数据块已经在符号表里被声明为全局数据块。
在STEP7 编程规则中这是不允许的,并且在STEP7 V5.x 版本中也是不能被接受的。
补救措施可以按照下列步骤来修改发生错误的数据块1. 在符号表中删除声明错误的DB 所在行。
2. 然后删除错误的DB 块。
3. 打开调用的块然后重新生成背景数据块。
功能如何影响调用CALL 功能如何影响DB 寄存器当程序块在STEP 5 或STEP 7 中被调用时,DB1 和DB2 寄存器的初始内容被保存。
打开数据块的指令保持有效,直到另一个打开数据块的指令。
DB 寄存器的内容反映了当前打开的数据块(DB / DI)。
然后,必须明确,不是所有的S7 编辑器/编译器对DB 寄存器的改变对用户来说都是明显的。
例如,当使用CALL 指令调用FC 时,如果给FC 形参分配的是完整的数据块变量地址,编译器会打开指定的数据块。
当FC 调用完成时,DB 号仍然保存在DB1 寄存器中。
在FC 中改变DB 寄存器不会影响调用完成后DB 寄存器的值。
举例:AUF DB1 L DBB 0 CALL FC1 DB1 寄存器1 Input1:= DB2.DBB0 Input2:= DB3.DBB0 3 L DBB 0 3 表01 如果调用功能块和相关的背景数据块,调用CALL 指令后,背景数据块号保存在DB1 寄存器中。
传输完整的数据块变量地址给FB,在FB 中更改DB 寄存器不会影响DB1 寄存器的内容。
举例:AUF DB1 L DBB 0 CALL FB1, DB10 DB1 寄存器1 Input1:= MW0 Input2:= DB3.DBB0 L DBB 0 10 表02 调用系统功能块后(SFB),相应的背景数据块号保存在DB1 寄存器中。
然而,使用UC 或CC 指令后,数据寄存器始终保持不变,这是由于这些调用没有指定参数和背景数据块。
注意为了避免在STEP 编程过程中处理数据块时出现区域长度错误和访问错误,尽量只使用完整的地址访问DB 中变量。
(如DBx.DBBy 或符号名"DBName".Variable_name)。
如何为用户创建的块添加访问保护?说明:STEP 7 为程序提供KNOW_HOW_PROTECT 保护功能。
如果打开使用此保护功能的块时,仅块接口参数(IN, OUT 和IN/OUT 参数) 和块注释可见,而无法显示程序代码、临时/静态变量和网段注释。
以下介绍如何为程序块(FBs, FCs and DBs) 设置KNOW_HOW_PROTECT 保护功能:No. 步骤 1 打开要编辑的块,在LAD/STL/FBD 编辑器中选择"File > Generate source..." ,生成源文件。
2 3 在打开的对话框中输入项目名称,如"Protect_FB"。
弹出"Generate source <名称>" 对话框。
选中需要转换的块,点击箭头按钮将其移至右侧"Blocks Selected" 窗口中。
点击OK 键进行确认后,生成STL 源文件。
关闭LAD/STL/FBD 编辑器。
图01 4 5 在S7 program 的“Sources” 文件夹中打开最近生成的源文件。
声明部分的"TITLE" 语句下插入"KNOW_HOW_PROTECT" 命令。
图02 6 通过菜单"File > Save" 和"File > Compile" 保存编译STL 源文件,完成块的保护。
注意:只有通过STL 源文件才能去除块的保护。
如果经“KNOW_HOW_PROTECT”命令的程序或者项目中的STL 源文件不再可用,则不能再去除对块的保护。
下表介绍如何去除块(FBs, FCs and DBs)的KNOW_HOW_PROTECT 保护功能:编号步骤1 2 3 4 打开源文件删除"KNOW_HOW_PROTECT" 语句行或用双斜杠将其标记为注释使用菜单命令"File > Save" 和"File > Compile" 保存编译该STL 源文件。
至此去除对该块的保护。
如何参数化FB 的IN_OUT 区域的结构化数据类型并使用ARRAY 变量调用?问题描述如果FB 的传递参数(IN_OUT)是一个复杂数据类型的变量,则它实际上是作为一个6 字节的指针(48 位)保存在背景数据块中的。
这意味着它不再是一个变量,而是一个 6 字节的指针。
由于指针指向了实参,因此它是必须被参数化。
STEP 7 可以识别下面的复杂数据类
型:“Date_and_Time”、“String”、“ Array”、“Struct”和“UDT”。
图01 中提供了如何间接访问复杂数据类型的第一个字节的例程。
在例子中介绍的程序可用作数据备份。
图01 通过IN_OUT 变量“Symbol_des_InOut” 装载6 字节指针。
数据块的块号由这个 6 字节指针传送到临时变量“DB_Num”中。
通过语句“AUF DB[#DB_Num]”,打开被保存的块号的数据块,然后将该地址装载到地址寄存器AR1 中。
“+AR1”指令作用为将ACCU1 中INT 类型的值扩展为有符号24 位数并与地址寄存器的内容相加。
如果字节地址的最大范围超限(0 ... 65535)也不会有影响,因为高位被剔除。
语句“L B[AR1,P#0.0]”中提供了被保存的数据和正确的地址。
在例程中如果用语句“L Symbol_des_InOut[1]”代替,那么数据直接来自于IN_OUT 参数,而不能从地址寄存器中装载被保存的数据,即使这些数据的值可能已经发生了改变。
请参考STEP 7 在线帮助的相关信息。
? “Avoiding errors when calling blocks” 。
注意例程的描述仅对DB 区有效,因此用于其它区域CPU 将进入停机状态。
编号0(DB0 )是不允许使用的。
“InOutvar.zip"”文件里包含了上面提到的例子程序,在一个STEP 7 项目下有两个S7 站:? ? 站:Beispiel in deutsch” 具有德文注释“ 站:Example in English” 具有英文注释“ 给带有复杂数据类型的功能分配参数复杂数据类型参数提供了一种在调用块和被调用块间传送大量相关数据的有效方式。
一个区域或者一个结构可以作为复杂数据类型传送到被调用的功能中。
复杂数据类型变量只能保存在数据块或者本地数据堆栈中。
因此,被调用块的实际参数必须定义在数据块(共享或者背景数据块)或者在本地数据堆栈中。
为了传送的目的,必须定义一个传送的实参,参数的类型与被调用的块类型一致。
提供的这些参数(数据类型:ARRAY, STRUCT, DATE_AND_TIME 和STRING) 必须使用符号方式。
LAD/STL/FBD 编辑器检查实际的参数与块的定义参数的兼容性。
实际参数的传送是通过带有DB 块号和地址的指针实现的。
该指针通过CALL 指令调用块时在临时堆栈生成。
图. 02 复杂数据类型必须仅保存在临时数据堆栈(FC12 的临时变量)或者在数据块(DB5)中。
创建环境本FAQ 的图片和下载项目是通过STEP 7 V5.4 版本生成的。