admin 管理员组文章数量: 1184232
2024年4月14日发(作者:锐角三角函数值表图片)
西门子 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 ”。 图 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 ”功能,系统会显示 S7 程序的结构。 通过工具
栏中的第二个按钮或者“Program > Compile All”功能编译程序。 在编译后, STEP 7
程序一致性将统一。 图 5 当新生成一个新的功能块,在功能块属性中多重背景功能默认
被选择(图 6)。也可以改变此 设置: 图 6 一旦已经生成了功能块,多重背景功能就不
可以被重新设置,是否具有多重背景的属性只可以 显示,除非按照一个冗长的过程来修改
它。 表 2 描述了如何声明一个已经生成的 FB 是否具有多重背景的能力: 步 过程: 骤
1 为了声明一个已经生成的 FB 是否具有多重背景的能力,打开 LAD/STD/FBD 编辑器,
通过“File > ”在对话框中生成一个 FB 的源文件。 在后续的对话框
中选 择项目并存储源文件到 S7 程序的源文件目录。 2 在“Generate source
的功能块,然后点击箭头将其添加到右边的列表中。点击“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 > Declaration 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 >
”生成此数据块的源文件。 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 > ”
生成此数据块的源文件。 3 Mark the generated source in the source in the SIMATIC
Manager and right-click it. Then select the "" command in the
pop-up menu. 4 在 “Export source”对话框中确定源文件导出文件加后, 选择“STL
source (*.awl)” 作为文 件类型且文件名中必须包含扩展名“.AWL ”, .AWL 例如
“Source_ 然后点击“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_DATA_BLOCK”之间的实际值以及通配符“:=”,将数据复制到
“STRUCT”和 “END_STRUCT”之间声明区域的相应数据类型之后,如图 08 所示。
图 08 12 复制完成后检查语法格式是否正确,例如: STRUCT Data_1 : BYTE :=
B#16#AA; ... END_STRUCT; 图 09 13 在 Excel 中保存文件,“文件 > 另存为...” 并
选择 ? 带格式文本文件(空格分隔)(*.prn) 作为文件类型。. 注意 执行上述操作后,文件
保存为“Source_”。但是,如果文件以另一文件名保存, 如
“Source_”,系统会将其保存为“Source_”文件。 此文件
需 通过删除扩展文件名 PRN 将“Source_”转换为
“Source_”。 PRN 扩展名是系统自动添加的,这种情况发生在保存文件时
已输入过一次以 AWL 结 尾的文件名。 14 在 SIMATIC Manager 中选择菜单命令
“Import > ”将 Excel 中处理 完成的 STL 源文件导入至 STEP 7 项
目下的 source 文件夹。 15 选择导入的源文件后点击右键, 在弹出菜单中选择
“”命令进行编译。编译完成 后,实际值便保存为初始值。 图 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:= 0 Input2:= 0 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:= 0 L DBB 0 10 表 02 调用系统功能块后 (SFB), 相
应的背景数据块号保存在 DB1 寄存器中。 然而, 使用 UC 或 CC 指令后,数据寄存
器始终保持不变,这是由于这些调用没有指定参数和背景数据块。 注意 为了避免在 STEP
编程过程中处理数据块时出现区域长度错误和访问错误,尽量只使用完整的 地址访问 DB
中变量。(如 或符号名 "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 > " ,生成 源文件。 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 )是不 允
许使用的。 “"”文件里包含了上面提到的例子程序,在一个 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 版本生成的
版权声明:本文标题:西门子FB块如何使用 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1713110165a620356.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论