西门子300创建fb.docx
《西门子300创建fb.docx》由会员分享,可在线阅读,更多相关《西门子300创建fb.docx(31页珍藏版)》请在冰豆网上搜索。
西门子300创建fb
西门子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,TIMERorCOUNTER)的编号。
例1:
FB块
FB1变量声明中定义了“Timer”类型的变量“Time_1”,在FB2中调用FB1,将定时器“T5”传递给变量“Time_1”。
如图01所示程序代码中数值5表示“T5”。
图. 01
例2FC
FC1变量声明中定义了“Timer”类型的变量“Time_1”,在FC2中调用FC1,将定时器“T8”传递给变量“Time_1”。
如图02所示程序代码中数值8表示“T8”。
图.02
在使用多重实例时,需要在图01所示程序中增加以下代码:
TAR2 //多重实例偏移地址
LAR1P##Time_1
+AR1 //多重实例偏移地址与当前地址相加
LW[AR1,P#0.0]
TMW00
“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
在SIMATICManager中,打开你希望生成多重背景的FB。
在静态变量定义部分,输入多重背景的名字,数据类型为FB或SFB。
图1
2
在程序中调用多重背景,可以在多重背景中的目录中选择托拽它到NETWORK中,也可以用CALL指令 调用它。
图2
在STEP7V5.4SP2中请注意:
如果在LAD/FBD编辑器的目录视图中多重背景未被列出,推荐在静态变量声明中先插入一个功能块,然后再删除它。
这样多重背景就再次可以被选择。
3
现在设置程序块的输入和输出并保存。
就可以在程序(例如OB1)中使用多重背景来调用FB。
创建一个背景数据块以供监控。
注意:
当生成多重背景时,如其在FB中作为一个多重背景被调用,注意要首先生成它,然后再指定一个多重背景调用。
如果不遵从这个顺序,程序中将会出现不一致的情况,这种不一致的情况也有可能在修改多重背景后出现。
4
一旦修改过了多重背景,并打开调用它的功能块。
当功能块被打开时,会出现一个消息显示在FB接口声明中有一个UDT或本地标签的被修改,并显示在功能块调用中至少有一个时间标签冲突。
确认此信息,修改过的背景调用在LAD/STL/FBD编辑器中将会以亮红色显示。
为了更新功能块调用,右击功能块,然后在弹出菜单中选择“UpdateBlockCall...”。
图3
5
在后续的对话框中,点击OK来执行接口更新。
图4
在STEP7V5.3中的注意事项:
当尝试通过“File>CheckandUpdateAccesses”来更新程序块调用时,STEP7V5.3不能发现变量间的唯一分配,调用还是保持红颜色,也无法通过“Edit>Call>Update”改正调用错误。
更新调用的唯一办法是删除调用,在声明中更新接口,然后再以多重背景方式调用功能块。
如果已经删除了FB接口中的变量,应该通过“Edit>Call>Update”来改正所有的多重背景调用,而不需使用前面的“CheckandUpdateAccesses”功能。
一旦已经更新了这些多重背景,就又可以与平时一样使用“CheckandUpdateAccesses”功能了。
6
推荐在更新功能块调用后进行一致性检查。
在SIMATICManager中,右击S7program文件夹,选择“Checkblockconsistency...”功能,系统会显示S7程序的结构。
通过工具栏中的第二个按钮或者“Program>CompileAll”功能编译程序。
在编译后,STEP7程序一致性将统一。
图5
当新生成一个新的功能块,在功能块属性中多重背景功能默认被选择(图6)。
也可以改变此设置:
图6
一旦已经生成了功能块,多重背景功能就不可以被重新设置,是否具有多重背景的属性只可以显示,除非按照一个冗长的过程来修改它。
表2 描述了如何声明一个已经生成的FB是否具有多重背景的能力:
步骤
过程:
1
为了声明一个已经生成的FB是否具有多重背景的能力,打开LAD/STD/FBD编辑器,通过“File>Generatesource...”在对话框中生成一个FB的源文件。
在后续的对话框中选择项目并存储源文件到S7程序的源文件目录。
2
在“Generatesource”对话框中(图7),在左边列表中选择你希望使能或取消多重背景能力的功能块,然后点击箭头将其添加到右边的列表中。
点击“OK”关闭对话框。
图7
3
关闭LAD/FBD/STL 编辑器,打开在SIMATICManager生成的源文件。
多重背景的能力依赖于在“Version:
0.1”后面输入的代码。
图8
∙如果希望FB具备多重背景的能力,删除“CODE_VERSION1”属性。
∙如果希望FB不具备多重背景的能力,按照图8中添加“CODE_VERSION1”属性。
保存并编译源文件,现在功能块即被使能或取消了多重背景的能力。
4
在使能或取消了多重背景能力之后,现在不得不重新编译所有的在FB,为了这个工作,我们推荐执行一致性检查(见表1,步骤6)
数据块初始值与实际值的含义
隐藏订货号显示订货号订货号:
描述
在数据块的变量声明表中可以定义变量的名称、数据类型、注释和变量初始值。
初始值为纯粹的组态值,当由UDT生成数据块或在全局数据块中生成新变量时,组态的初始值被用作为实际值。
可以通过菜单命令 “View>Dataview”来查看实际值。
初始值对于数据块或新声明的变量数据块来说,组态的有效次数仅为一次。
如果变量已经存在,实际值将不会随着初始值的变化而发生改变。
对于CPU来说,操作的数值为实际值,初始值虽也可以下载到CPU中并可在线监控,但不会被CPU采用。
有以下两种方法可以将初始值传送给CPU作为实际值:
1.切换到数据浏览状态“View>Dataview”,在“Actualvalue”栏输入新的初始值。
2.进入声明浏览状态“View>Declarationview”,在“Actualvalue”栏输入新的初始值;然后,切换到“Dataview”状态,执行菜单命令“Edit>InitializeDataBlock”将所有“Intialvalue”栏的数值传送至“Actualvalue”栏。
然后将数据块下载至CPU中。
由于初始值仅使用一次,因而没有必要将实际值装载至初始值,如装载“Actualvalue” 栏到“Initialvalue”栏。
STEP7中没有与之相关的菜单命令。
但是一些特殊应用需要将实际值保存为初始值。
这一过程可通过STL源文件或Excel来实现,以下将分别介绍其操作步骤。
在STL源文件中,将数据块的实际值直接保存为初始值
当生成STL源文件后,实际值可以逐行拷贝至STL源程序中的声明语句中。
No.
步骤
1
在SIMATICManager 选择菜单指令"View>Online" ,在线打开要执行操作的数据块。
选择菜单命令 “File>Save”或点击软盘图标保存该数据块。
2
通过菜单命令 “File>GenerateSource...”生成此数据块的源文件。
3
打开生成的源文件,该文件位于SIMATICManager的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
在SIMATICManager 选择菜单指令"View>Online" ,在线打开要执行操作的数据块。
选择菜单命令 “File>Save”或点击软盘图标保存该数据块。
2
通过菜单命令 “File>GenerateSource...”生成此数据块的源文件。
3
MarkthegeneratedsourceinthesourceintheSIMATICManagerandright-clickit.Thenselectthe"ExportSource..."commandinthepop-upmenu.
4
在“Exportsource”对话框中确定源文件导出文件加后,选择“STLsource(*.awl)”作为文件类型且文件名中必须包含扩展名“.AWL”,例如“Source_DB2.AWL”,然后点击“Save”按钮。
图 02
5
启动MicrosoftExcel,通过“文件>打开...”打开刚才导出的STL源文件,出现“文本导入向导”对话框。
注意
为了保证在“Open”对话框中可以找到该STL源文件,需要选择“Allfiles(*.*)”作为打开文件类型。
6
在文本倒入向导第一步,使能“Delimited“ 格式选项。
图 03
然后单击“Next”按钮。
7
在下一个文本倒入向导的对话框中,选择"tab" 或"space"作为分隔符。
图04
然后单击“Next”按钮。
8
在第三步文本倒入向导中,选择”standard”作为;栏数据格式。
图 05
然后单击“Finish”按钮。
转化的STL 源在Excel中打开。
9
选中所有属于STLsource 的单元格后点击右键。
在弹出菜单中选择“设置单元格格式...”。
图 06
10
在“对齐”页签中将水平对齐设置为“靠右”或“靠右(缩进)”点击确定。
图 07
11
选择位于“BEGIN”和“END_DATA_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
在SIMATICManager 中选择菜单命令“Import>ExternalSource...”将Excel中处理完成的STL源文件导入至STEP7项目下的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
更多信息可以参考STEP7在线帮助以下部分
∙“背景数据块”
∙“创建数据块(DB)”
∙“数据块(DB)的结构”
∙“使用多重背景”
从STEP7V4.02 升级到V5.x需要注意
当升级STEP7V4.02 到V5.x版本时,在LAD/STL/FBD编辑器中可能会在调用CALL功能时出现红色。
这种现象的原因是块中调用的一个背景数据块已经在符号表里被声明为全局数据块。
在STEP7编程规则中这是不允许的,并且在STEP7V5.x版本中也是不能被接受的。
补救措施
可以按照下列步骤来修改发生错误的数据块
1.在符号表中删除声明错误的DB所在行。
2.然后删除错误的DB块。
3.打开调用的块然后重新生成背景数据块。
调用CALL功能如何影响DB寄存器
当程序块在STEP5 或STEP7中被调用时,DB1和DB2寄存器的初始内容被保存。
打开数据块的指令保持有效,直到另一个打开数据块的指令。
DB寄存器的内容反映了当前打开的数据块(DB/DI)。
然后,必须明确,不是所有的S7编辑器/编译器对 DB寄存器的改变对用户来说都是明显的。
例如,当使用CALL指令调用FC时,如果给FC形参分配的是完整的数据块变量地址,编译器会打开指定的数据块。
当FC调用完成时,DB号仍然保存在DB1寄存器中。
在FC中改变DB寄存器不会影响调用完成后DB寄存器的值。
举例:
DB1寄存器
AUFDB1
1
LDBB0
CALLFC1
Input1:
=DB2.DBB0
Input2:
=DB3.DBB0
LDBB0
3
表01
如果调用功能块和相关的背景数据块,调用CALL指令后,背景数据块号保存在DB1寄存器中。
传输完整的数据块变量地址给FB,在FB中更改DB寄存器不会影响DB1寄存器的内容。
举例:
DB1寄存器
AUFDB1
1
LDBB0
CALLFB1,DB10
Input1:
=MW0
Input2:
=DB3.DBB0
LDBB0
10
表02
调用系统功能块后(SFB),相应的背景数据块号保存在DB1寄存器中。
然而,使用UC或CC指令后,数据寄存器始终保持不变,这是由于这些调用没有指定参数和背景数据块。
注意
为了避免在STEP编程过程中处理数据块时出现区域长度错误和访问错误,尽量只使用完整的地址访问DB中变量。
(如DBx.DBBy 或符号名"DBName".Variable_name)。
如何为用户创建的块添加访问保护?
说明:
STEP7为程序提供KNOW_HOW_PROTECT保护功能。
如果打开使用此保护功能的块时,仅块接口参数(IN,OUT 和IN/OUT参数) 和块注释可见,而无法显示程序代码、临时/静态变量和网段注释。
以下介绍如何为程序块 (FBs,FCsandDBs)设置KNOW_HOW_PROTECT 保护功能:
No.
步骤
1
打开要编辑的块,在LAD/STL/FBD编辑器中选择 "File>Generatesource...",生成源文件。
2
在打开的对话框中输入项目名称,如 "Protect_FB"。
3
弹出 "Generatesource<名称>" 对话框。
选中需要转换的块,点击箭头按钮将其移至右侧"BlocksSelected" 窗口中。
点击OK键进行确认后,生成STL源文件。
关闭LAD/STL/FBD 编辑器。
图01
4
在S7program的“Sources”文件夹中打开最近生成的源文件。
5
声明部分的"TITLE"语句下插入 "KNOW_HOW_PROTECT" 命令。
图 02
6
通过菜单 "File>Save" 和"File>Compile"保存编译STL源文件,完成块的保护。
注意:
只有通过STL源文件才能去除块的保护。
如果经“KNOW_HOW_PROTECT”命令的程序或者项目中的STL源文件不再可用,则不能再去除对块的保护。
下表介绍如何去除块(FBs,FCsandDBs)的KNOW_HOW_PROTECT 保护功能:
编号
步骤
1
打开源文件
2
删除 "KNOW_HOW_PROTECT" 语句行或用双斜杠将其标记为注释
3
使用菜单命令"File>Save" 和"File>Compile"保存编译该STL源文件。
4
至此去除对该块的保护。
如何参数化FB的IN_OUT区域的结构化数据类型并使用ARRAY变量调用?
问题描述
如果FB的传递参数(IN_OUT)是一个复杂数据类型的变量,则它实际上是作为一个6字节的指针(48位)保存在背景数据块中的。
这意味着它不再是一个变量,而是一个6字节的指针。
由于指针指向了实参,因此它是必须被参数化。
STEP7可以识别下面的复杂数据类型:
“Date_and_Time”、“String”、“Array”、“Struct”和“UDT”。
图01中提供了如何间接访问复杂数据类型的第一个字节的例程。
在例子中介绍的程序可用作数据备份。
图01
通过IN_OUT 变量“Symbol_des_InOut”装载6字节指针。
数据块的块号由这个6字节指针传送到临时变量“DB_Num”中。
通过语句“AUFDB[#DB_Num]”,打开被保存的块号的数据块,然后将该地址装载到地址寄存器AR1中。
“+AR1”指令作用为将ACCU1中INT类型的值扩展为有符号24位数并与地址寄存器的内容相加。
如果字节地址的最大范围超限(0...65535)也不会有影响,因为高位被剔除。
语句“LB[AR1,P#0.0]”中提供了被保存的数据和正确的地址。
在例程中如果用语句“LS