结构化编程 FC OB1 FB SFC 操作系统 SFB OBs 其它 目录 页码 IEC 1131 标准........................................................................................................................................ 2-3 SIMATIC 管理器下的项目结构................................................................................................................. 4 STEP7的块 .............................................................................................................................................. 5 块的组成部分............................................................................................................................................ 6 块的结构 .............................................................................................................................................. 7 结构化编程 .............................................................................................................................................. 8 利用局部数据进行控制............................................................................................................................. 9 局部变量 .............................................................................................................................................. 10 临时变量 .............................................................................................................................................. 11 局部数据堆栈的大小 .............…............................................................................................................. 12 块所需要的局部数据区的长度 ............................................................................................................ 13 程序所占用的局部数据区的总长度 ................................................................................................... 14 练习1.1: 使用临时变量.................................………….......................................................................... 15 示例:故障信息指示.............................................................................................................................. 16 可以分配参数的块 ................................................................................................................................. 17 定义形式参数 ......................................................................................................................................... 18 编辑一个可分配参数的块 ...................................................................................................................... 19 调用一个分配了参数的块 .................................................................................................................... 20 在块调用时使用EN/ENO参数 .....................................……….............................................................. 21 练习1.2-3: FC块................................................................................................................................. 22-23 FB块................................................... ................................................................................................... 24 用FB实现的故障信息显示 ............................…….................................................................................. 25 生成背景数据块 ......................................…............................................................................................ 26 多重背景模型 ........................................................................................................................................ 27 练习1.4-5: FB块............................................................................................................................... 28-29 插入/删除块的参数可能遇到的问题 ........................……………............................................................ 30 调用被修改过的块时应做的更正 ..............................……...................................................................... 31 练习1.6-7:风扇监控功能的扩展........................................................................................................ 32-33 练习1.8: 识别变量的类型..................................................................................................................… 34 总结: 块的调用 .............................…………………................................................................................ 35
第七章 结构化编程 程序设计方法:线性化编程、模块化编程和结构化编程。 线性化编程是将整个用户程序放在组织块OB1中,在CPU循环扫描时执行OB1中的全部指令。其特点是结构简单、但效率低下。另一方面,某些相同或相近的操作需要多次执行,这样会造成不必要的编程工作。再者,由于程序结构不清晰,会造成管理和调试的不方便。所以在编写大型程序时,避免线性化编程。
模块化编程是将程序根据功能分为不同的逻辑块,且每一逻辑块完成的功能不同。在OB1中可以根据条件调用不同的功能或功能块。 其特点是易于分工合作,调试方便。由于逻辑块是有条件的调用,所以可以提高CPU的利用率。
结构化编程是将过程要求类似或相关的任务归类,在功能或功能块中编程,形成通用解决方案。通过不同的参数调用相同的功能或通过不同的背景数据块调用相同的功能块。 其特点是结构化编程必须对系统功能进行合理分析、分解和综合,所以对设计人员的要求较高,另外,当使用结构化编程方法时,需要对数据进行管理。 传送带系统中所有交流电机的通用逻辑控制块; 装配线机械中所有电磁线圈的通用逻辑控制块; 造纸机器中所有驱动装置的通用逻辑控制块。
结构化编程 OB 1 电机 1 FC 1 电机 2 FC 1 电机 3 FC 1 什是结构化编程 ? 结构化程序把过程要求的类似或相关的功能进行分类,并试图提供可以用于几个 任务的通用解决方案。向指令块提供有关信息(以参数形式),结构化程序能够重复 利用这些通用模块。 这些模块的例子包括: - 传送带系统中所有交流电机的通用逻辑控制的块 - 装配线机械中所有电磁线圈的通用逻辑控制的块 - 造纸机器中所有驱动装置的通用逻辑控制的块 它如何执行? OB1 (或其他块)中的程序调用这些通用执行块。和模块化编程不同,通用的数据 和代码可以共享。 优点和缺点是什么? 不需要重复这些指令,然后对不同的设备代入不同的地址,可以在一个块中写程 序,用程序把参数(例如:要操作的设备或数据的地址)传给程序块。这样,可 以写一个通用模块,更多的设备或过程可以使用此模块。当使用结构化编程方 法时,需要管理程序存储和使用数据。
练习 电动机启保停电路 按下按钮,一个数加1,当此数值超过20时,输出指示
利用局部数据进行控制 OB1 FC1 (数学功能) I0.5 FC1 MW5 Input1 Output_A QW12 3369 TEMP1 int sample measure 1 0.0 in FC1 2.0 in int constant 4.0 in MW5 int offset Input1 Output_A QW12 6.0 out int result 3369 Input2 8.0 temp int intermediate MW10 Input3 ADD_I IN1 IN2 M5.0 O #TEMP1 #INPUT1 #INPUT2 M5.1 SUB_I IN1 IN2 ( ) I0.5 O #Output_A FC1 #TEMP1 #INPUT3 MW2 为了在FC或FB中使用局部内存,使用的名字和大小必须在块的声明部分中确定。 当FC或 FB被 调用时,实参被传递到局部内存区。如果你希望使用这个真实值,可以在代码部分中使用局部 符号名。 在上面的例子中,有一个根据I0.5状态从OB1对FC1的条件调用。不同的值被传递给FC1,同时输 出值返回给OB1。 Input1 Output_A QW20 6869 Input2 MW16 Input3 带有实际参数 的调用块 局部声明区 (定义形式参数) 被调用块的代码 部分,使用来自 局部内存区的值
局部变量 局部变量 / 数据 (只在一个块中有效) 全局变量/数据 (在全部程序中有效) • PII / PIQ • I/ O • M / T / C • DB areas 临时变量 • 当相关块执行完毕后被清除 • 临时存储在 L stack中 • 可在下列块中使用 OBs / FCs / FBs 静态变量 •当相关块执行完毕后仍然 保留 • 永久存储在DBs中 • 只能在FBs中使用 绝对地址 访问方式 符号地址 概述 到目前为止, 我们使用实际参数来访问瓶子灌装生产线的输入和输出,块不能被分配参数,这样你编辑的程序只能用于特定的设备。 但是,在很多情况下一个大的程序要多次调用某一个功能,这时应建立通用的可分配参数的块(FC, FB)。这些块的输入输出使用形式参数,当调用时赋给实际参数。 上述两种块的区别在于块调用时的是否有参数的传递,其内部功能没有变化。 局部变量 到目前为止,我们使用全局变量(标志位和数据块)来存储数据,例如生产数据。在这章中我们将学习如何利用局部变量来存储数据。 临时变量 临时变量是一种在块执行时,用来暂时存储数据的变量。他们可以被用于所有的块中。 静态变量 如果有一些变量在块调用结束后还需保持原值,他们必须被存储为静态变量,静态变量只能被用于FB块中。
临时变量 概述 临时变量可以用于所有块中 (OB, FC, FB)。当块执行的时候它们被用来临时存储数据,当退出该块时这些数据将丢失。这些临时数据存储在 L stack (局部数据堆栈)中。 定义方法 临时变量是在块的变量声明表中定义的,在“temp”行中输入变量名和数据类型,注意临时变量不能赋予初值。当块保存后,“Address”栏中将显示其在L stack 中的位置。 访问方法 Network 1为一个用符号地址访问临时变量的例子。减运算的结果被存储在临时变量“result”中。当然,也可以采用绝对地址来访问临时变量 (T LW0),然而,为了使程序更加易读,最好不要采用该方式。 注意 程序编辑器可以自动地在局部变量名前加上# 号来标识它们,局部变量只能在变量表中对它们定义过的块中使用。
局部数据堆栈的大小 总容量: 1.5 Kbyte (CPU 313..316) 执行的程序 对于 S7-300: 优先级 局部堆栈大小 启动程序 (只执行一次) 27 256 bytes 循环扫描程序 1 256 bytes 12 3 2 时间中断 日时钟中断 延时处理中断 循环处理中断 局部数据堆栈 局部数据堆栈(L stack)是用来存储临时变量的内存区域。 局部数据堆栈的大小 当操作系统执行一个OB时(不论优先级如何),将打开一个256 字节大小的局部堆栈区,供该OB及其中所调用的块使用 。 313..316 CPUs中局部堆栈区的总容量为1536字节 (1.5kByte)。 OB的优先级 S7-300中共有8个优先级,同时激活的优先级不能超过6个。详细介绍见 “组织块”一章。 S7-400 对于 S7-400 CPUs, 可以通过组态工具来定义每一个优先级所对应的局部堆栈的大小。还可以不选无用的优先级,为其他优先级保留更多的局部数据。 循环扫描中的错误处理中断 256 bytes 16 28 26 事件驱动中断 硬件中断 启动过程中的错误处理中断
块所需要的局部数据区的长度 显示所需字节数 在块的属性中,我们可以看到块所需要的局部数据区的字节数。 rechts 显示所需字节数 在块的属性中,我们可以看到块所需要的局部数据区的字节数。 操作步骤 1. 在SIMATIC Manager中, 用鼠标右键选中块,然后在菜单中选择 -> Object Properties。或 2. 在SIMATIC Manager中,用鼠标左键选中块,然后选择菜单功能Edit -> Object Properties。 注意 对于S7-300,操作系统分配给每一个OB的局部数据区的最大数量为 256 字节。 OB的调用自己占去 20或22字节,则还剩下最多 234字节可分配给FC或FB。 如果块中定义的局部数据的数量大于256字节,该块将不能下装到CPU中。在下装过程中将出现错误提示:“The block could not be copied”。如果单击错误信息框中的“Details”按钮,将弹出帮助信息:“Incorrect local data length”。
程序所占用的局部数据区的总长度 OB 1 FC 1 FC 2 FC 3 事件 所占用的 L stack OB1 操作系统 有临时 变量 256 Bytes 事件 所占用的 L stack 1 OB1 OB 1 操作系统 FC 1 有临时 变量 2 OB1 FC1 FC 2 有临时 变量 OB1 FC2 FC1 3 OB1 FC1 4 FC 3 有临时 变量 OB1 FC3 FC1 5 7 OB1 OB1 FC1 6 局部数据区的 利用“Reference Data”工具(详见“故障检测和排除”一章),可查看程序 占用情况 所占用的局部数据区的字节数(包括总的字节数和每次调用所占的字节数)。 操作步骤 在SIMATIC Manager中选中block文件夹,然后选择菜单功能 Options -> Reference Data -> Display. 注意 在程序执行过程中,如果所使用的局部数据超出了最大限额,则CPU进入 Stop 模式,并将错误信息“STOP caused by error when allocating local data”记入 diagnostics buffer(诊断缓冲区)中。
练习1: 使用临时变量 替换为临时变量 目的 了解如何使用临时变量。 QW6 目的 了解如何使用临时变量。 要求 在S7 程序“Fill”的FC 19块中,用临时变量代替标志字来暂存数据。 在上图LAD或 FBD形式的程序中, 标志字被用来连接除法器的输出和数制转换器的输入。 如果你用STL来写程序则不需要标志字,直接插入临时变量来存储中间结果。 步骤 • 打开S7 程序“FILL”中的FC 19 。 • 在变量声明表中定义一个临时变量 “Packages”,其类型为“Integer”。 • 在程序里将包装的数量保存在临时变量“packages”中。 • 将修改后的程序下装并调试。
示例:计算公式
可以分配参数的块 不可以 分配参数的块 可以分配参数的块 程序 调用 FC 20 I 1.3 Disturb_ input Display A i 1.2 R m 40.0 A i 1.3 Fp m 40.1 S m 40.0 A m 40.0 A m 10.3 O Anm 40.0 = Q 4.3 A #Acknowledge R #Report memory A #Disturb_input FP #Edge_mem_bit S #Report_memory A #Report_memory A #Flash_freq O AN #Report_memory = #Display I 1.3 Disturb_ input Display Q 4.3 I 1.2 Acknowledge M 10.3 Flash_freq M 40.0 Edge_ mem_bit Report_ memory M 40.1 引言 当需要对程序的某部分频繁调用时,可以使用分配了参数的块,这样做有下列优点: • 程序只需生成一次 • 该块只在用户存储器中保存一次,却可以被程序任意次调用。 • 该块采用形式参数( input, output 或 in/out参数)编程,当用户程序调用该块 时,要用实际地址(实际参数)给这些参数赋值。 参数传递举例 当上面的块被执行时,操作系统扫描语句“A Disturb_input”时要给形式参数 “Disturb_input”分配实际地址。例如, 实际地址为I 1.3,则将执行如下语句: “A I 1.3” 。 FC / FB 可以分配参数的块为 FC 或 FB。 可传递参数的块FC20 在本例中,故障显示功能在控制系统中将被使用10次,所以将该功能用可传递参数的块FC 20来编写,在程序中用不同的参数对其调用10次。 形式参数 实际参数
定义形式参数 形式参数 参数类型 定义 使用方法 图形显示 输入参数 in 只能读 在块的左侧 输出参数 out 只能写 在块的右侧 输入/输出 参数 In_out 可读/可写 在块的左侧 形式参数 对于可传递参数的块,在编写程序之前,必须在变量声明表中定义形式参数。 参数的类型 在上面的表中,列举了三种类型的参数及定义方法。 注意,当需对某个参数做读、写访问时,必须将它定义为in/out 型参数。 以 FC20为例 幻灯片下面的表为该块的变量声明表。因为对故障信息标志位既要读(扫描)又要写 (set/reset),所以它被定义为in/out型参数。 说明 在最初的声明表中,每一种参数只占一行。如果需要定义多个参数,可以用“Return”键来增加新的参数定义行。另一种方法是:选中一个定义行后,用菜单功能 Insert -> Declaration Row -> Before Selection / After Selection 来插入一个新的参数定义行。 注意! 当块已被调用后,再插入或删除定义行,必须重新编写调用指令。
编辑一个可分配参数的块 说明 形式参数名称用大、小写字母没有区别。编程器可自动地在其前面加“#”号,以表示该参数为局部变量,是在块的变量声明表中定义的。 当采用LAD / FBD 语言编写程序时,参数的名称在一行中可能显示不全。这取决于程序编辑器的习惯设置 (Options -> Customize -> "LAD/FBD" tab -> Width of address field)。 符号名 1. 如果在编程一个块时使用符号名,编辑器将在该块的变量声明表查找该符号 名。 如果该符号名存在,编辑器将把它当作局部变量,并在符号名前加 “#”号。 2. 如果它不属于局部变量,则编辑器将在全局符号表中搜索。如果找到该符号 名,编辑器将把它当作全局变量,并在符号名上加引号。 3. 如果在全局变量表和变量声明表中使用了相同的符号名,编辑器将始终把它 当作局部变量。然而,如果输入该符号名时加了引号,则可成为全局变量。 对于无参数分配的块,此处可能是: • 绝对地址: I1.3 • 符号地址: “End_left”
调用一个分配了参数的块 绝对的 寻址方式 符号的 符号 Network 3: First Call .... Disturb_input Acknowledge Flash_freq Report_memory Edge_mem_bit Display ENO EN FC20 “End left” “Position error” 绝对的 “Acknow.button” M10.3 M40.0 寻址方式 M40.1 Network 4: Second Call Q4.1 EN 符号的 FC20 “End right” Disturb_input Display Q5.4 符号表 全局符号 调用 在 LAD/FBD方式下, 可以从“Program Elements” 浏览器中选择要调用的块。块的参数端上显示为问号 (??.?) ,应在此处输入实际参数。 说明 调用分配了参数的 FC 块时,必须输入所有的参数 ( EN和ENO除外)。 “Acknow.button” Acknowledge M10.3 Flash_freq M40.2 Edge_mem_bit ENO M40.3 Report_memory 符号 局部符号 -->形式参数
在块调用时使用EN/ENO参数 LAD/FBD STL FC 1 无条件调用 ?? . ? EN ENO CALL FC 1 NOP 0 A I 0.1 JNB _001 CALL FC 1 _001: A BR = Q 5.0 FC 1 EN ENO I 0.1 = Q 5.0 条件调用 标准FC 标准FC 执行时将遵循下列规则: • 如果EN=0, 块不被执行且ENO=0。 • 如果EN=1, 块被执行,执行过程中如果不出现错误则ENO=1,如果出现错误 ENO=0。 用户FC 当用LAD/FBD调用块时,EN和ENO参数也被加在块上,这样可根据RLO来调用该块。 在STL 中,没有EN/ENO参数。可以用跳转指令来仿效它们。 无论采用何种语言,必须编写程序来检查错误。 互相连接 在LAD/FBD中,几个功能方框可通过EN / ENO参数串联在一起使用 例子 ?? . ? FC 1 EN ENO FC 2 FC 3 =
练习2: 生成一个分配了参数的FC块 1. FC 20 的变量声明表 无参数的块 分配了参数的块 FC 20 2. A I 1.2 R M 40.0 A I 1.3 FP M 40.1 S M 40.0 A M 40.0 A M 10.3 O AN M 40.0 = Q 5.3 A #Acknowledge R #Report_memory A #Disturb... : 2. 要求 将故障显示程序用分配了参数的块来编写。变量声明表和程序的开头部分已在幻灯片中给出。 步骤 • 在S7 程序“My Program”中插入FC 20 • 在FC 20 中编写程序 • 保存FC 20
练习3: 调用一个分配了参数的FC块 FC 20 I 1.3 Disturb_input I 1.2 Acknowledge Display Q 5.3 第一次调用FC20时 的参数分配 M 10.3 Flash_freq M 40.0 Edge_mem_bit M 40.1 Report_memory FC 20 要求 在OB 1中用不同的参数两次调用FC 20,并测试该程序。 步骤 • 在S7程序“My Program”的OB 1中插入两个程序段 • 按幻灯片所示,两次调用FC 20 • 下装FC20和OB 1 • 调试程序 说明: 在硬件组态时,将MB10定义为时钟存储字节。然后下装硬件组态,使M10.3 闪烁。 I 1.4 Disturb_input I 1.2 Acknowledge Display Q 5.4 第二次调用FC20时 的参数分配 M 10.3 Flash_freq M 40.2 Edge_mem_bit M 40.3 Report_memory
练习 将最近采集的三个数求平均,进行滤波处理。 先采用模块化编程实现此功能,接着采用结构化编程实现,最后引出FB块。
FB块 OB 1 DB 2 FB 2 EN Disturb. input Acknowledge Display Flash freq. ENO FB块的变量声明表 FB块的特点 与FC块不同,FB块 (Function Blocks) 带有一个存储区。也就是说,有一个局部数据块被分配给FB块,这个数据块被称为背景数据块(instance data block )。 当调用FB时,必须指定背景数据块的号码, 该数据块会自动打开。 背景数据块可以保存静态变量,所以静态变量只能用于FB块中,并在其变量声明表中定义。当块退出时,它们仍然保持。 保存参数 当FB块被调用时,实际参数的值被存储在它的背景数据块中。 如果在块调用时,没有实际参数分配给形式参数,在程序执行中将采用上一次存储在背景数据块中的参数值。 每次调用FB时可以指定不同的实际参数。当块退出时,背景数据块中的数据仍然保持。 FB 的优点 • 当编写FC的程序时,用户必须寻找空的标志区或数据区来存储需保持的数据, 并且要自己编写程序来保存它们。而FB的静态变量可由STEP 7的软件来自 动保存。 • 使用静态变量可避免两次分配同一存储区的危险。 • 如果用FB块实现FC20的功能, 并用静态变量“Report memory”和“Edge memory marker”来代替原来的形式参数,将可省略两个形式参数,简化了块 的调用。
用FB实现的故障信息显示 FB的声明表 背景数据块 故障信息显示 在前面的练习中,我们编写了一个分配了参数的块FC 20来显示故障信息。 用FB块实现该功能时,采用静态变量来替代FC 20 中用来保存信息和检测边沿的标志位,这些静态变量存储在该FB的背景数据块中。 背景数据块的结构 当参照一个FB 生成一个数据块时,STEP7将参照该FB的变量声明表生成数据块的结构。 数据块保存之后,将生成一个背景数据块。
生成背景数据块 1. 在FB调用时生成背景数据块 2. 创建一个新的背景数据块 如何生成背景数据块 生成一个新的背景数据块有两种方法: • 在调用FB时,为它指定一个背景数据块后, 如果该数据块并不存在,则弹出以 下提示信息: “Instance data block DB x does not exist. Do you want to generate it?”. 单击“Yes”按钮可自动生成一个新的背景数据块。 • 创建一个新的数据块时,选择其属性为 “Data block referencing a function block”。 注意 一个背景数据块只能归属于一个FB块,而一个FB块在每次调用时可以使用不同的背景数据块。 FB块被修改后 (添加参数或静态变量), 必须重新生成背景数据块。
多重背景模型 多重背景模型 普通背景模型 OB 1 DB10 FB 100 DB100 Call FB100, DB100 OB 1 stat Dist_1 FB20 Dist_2 Call FB20, DB10 Disturb._Input:= Acknowledge:= Flash_Freq:= Display:= FB20 DB11 FB20 Call FB20, DB11 Disturb._Input:= Acknowledge:= Flash_Freq:= Display:= Call Dist_1 Disturb._Input:= Acknowledge:= Flash_Freq:= Display:= Parameters and static variables of the 1st. call of FB20 多重背景模型 到目前为止,每次调用一个FB块时都使用不同的背景数据块。 由于数据块的数量有限,所以在此介绍一种方法,允许多次FB调用都使用同一个背景数据块。多重背景模型允许多次FB调用都使用同一个背景数据块,为此需增加一个FB块用来管理背景数据。 针对每次的FB调用 (FB 20), 要先在上层的FB块 (FB 100) 中定义一个静态变量,用来存储这一次调用时的背景数据。这样用符号名调用该块时(Call Dist_1) ,就不须为其指定背景数据块了。 上层的FB (FB 100) 被调用时(例如,在OB1中调用它),将只生成一个公用的背景数据块 (DB 100) 。 说明 多重背景数据块将在高级编程课中继续讨论。 DB12 FB20 Call FB20, DB12 Disturb._Input:= Acknowledge:= Flash_Freq:= Display:= Call Dist_2 Disturb._Input:= Acknowledge:= Flash_Freq:= Display:= Parameters and static variables of the 2nd. call of FB20
练习4: 编写一个FB块 1. FB 20 的变量声明表 2. FB 20 中的部分程序 步骤 • 在S7程序“My Program”中插入 FB 20 • 在 FB 20 中编写程序 • 保存 FB 20 FB 20 中的部分程序 A #Acknowledge R #Report memory A #Disturb. ... : 2.
练习5: 调用FB并调试 步骤 在S7程序“My Program”中: • 删除所有调用FC20的指令。 • 下装 FB20, DB20, DB21和OB1 • 调试程序 FC -> FB 在本练习中,尽管FB20与前面完成的FC20具有相同的内容,但由于程序比较简单,我们仍然重新编写FB20。 如果一个包含复杂程序的 FC 块要转化为FB块,采取如下方法更为简便: 第一种方法: • 插入一个新的 FB • 将原FC块中的声明表拷入FB中并做修正 • 将程序段从FC拷入FB • 保存FB 第二种方法: • 从FC块生成源程序 • 在源程序中做适当修改 • 从源程序生成FB块(见第二章)
插入/删除块的参数可能遇到的问题 Save 可能遇到的问题 当块已在程序中被调用之后,再增加块的参数,必须更新块的调用指令。 否则,在程序执行中,由于该块新增的参数没有被分配实际参数,则CPU会停机或者块的功能不能实现。 在本例中,新插入的参数为“Check_lights”。 更新块的调用 当块的声明表被修改之后保存时,将弹出警告信息,提示可能出现的问题。
调用被修改过的块时应做的更正 当调用块被打开时: 单击鼠标右键 对调用指令的更正 当打开调用块时,将弹出如下信息:“Time stamp conflict with at least one block call”,且调用语句变为红色。用鼠标右键点击调用方框并选择菜单功能 “Update Call”。之后调用方框被重新显示,在本例中,将包含新增的输入参数“Check_light”。此时可以给这个新参数分配地址,如果是FB块,将重新生成背景数据块。
练习6: 多台设备的风扇监控功能 功能 符号 SIG FC101 ACKN R REPORT A TIMER_NO B =1 A FLT S_ODT C B S Q >=1 C ACKN TIMER_NO 任务要求 在一组设备中,每个设备中都有三个冷却风扇,设它们的运行指示信号为A、B和C(为“1”表示正常运行)。正常情况下,只要设备运行其中两个风扇就转,另一个备用。这些设备对风扇的监控要求相同,如下所示: (1)如果一个风扇坏了,而备用风扇在5秒种内还未接通,在FLT端显示故障信号(FLT=1)。 (2)一旦三个风扇都坏了,故障信号立即显示。 (3)当设备恢复正常运行时,用ACKN端输入的“1”信号清除故障信息(FLT=0) 。 将风扇的监控功能作成一个带参数的“标准功能”,在每个设备的控制程序中分别调用,可提高编程的效率,同时使程序更加简明。 练习步骤 (1)按上图的要求编写带有参数的程序块FC101,使之成为一个可实现风扇监控功能的“标准功能”。 (2)编制程序,对两台设备的风扇进行监控。在OB1中用不同的参数对FC101无条件地调用两次,以实现对两台设备的监控功能。两台设备的实际监控参数如下表所示。 (3)调试程序 A TV B & SIG C FLT 参数 A B C ACKN TIME TV FLT SIG 设备1 I1.6 I1.5 I1.4 I0.0 T10 S5T#5S Q5.5 M20.0 设备2 I1.2 I1.1 I1.0 I0.0 T11 S5T#5S Q5.1 M20.1
练习7: 风扇监控功能的扩展 功能 符号 SIG FC101 ACKN R REPORT A TIMER_NO B =1 A S_ FLT 练习7: 风扇监控功能的扩展 功能 符号 SIG FC101 ACKN R REPORT A TIMER_NO B =1 A S_ ODT FLT C B >=1 S Q C & ENAB ENAB 任务要求 程序块FC101要扩展一个使能输入ENAB(见上图),之后只有当被监视的装置处于工作状态时(ENAB=1),才允许输出故障信号。 注意 在程序块FC的变量声明表中增加参数后,需重新修改调用语句。 练习步骤 (1)在FC101变量声明表中A、B、C三个参数后插入新参数ENAB,然后在FC101及OB1中完成相应的修改,设使能输入ENAB的实际地址为I1.7。 (2)重新调试程序。 ACKN A TIMER_NO B & TV C FLT SIG ENAB
练习8: 识别变量的类型 TYPE OF VARIABLE L #Number_1 T #Max_value T MW 40 Statement L #Number_2 L #Intermediate_result L “Number_1” T #Number_2 TYPE OF VARIABLE Global Local Absolute Symbolic Temporary Static Parameter 目的 掌握各种变量的区别。 步骤 在表中变量的相关数据类型上标上 X号。 回答下列问题: 语句 T#Number_2 有何错误? .................................................................................
总结: 块的调用 ( CALL ) FC FB • CALL FC2 Par1: ... Par2: ... Par3: ... 语言 有参数 • CALL FC2 Par1: ... Par2: ... Par3: ... FC2 EN ENO Par3 Par1 Par2 有参数,有背景数据块 • CALL FB2, DB3 Par1: ... Par2: ... Par3: ... FB2 EN ENO Par3 Par1 Par2 DB3 无参数 无参数,无背景数据块 • CALL FC1 • UC FC1 • CC FC1 • UC FB1 • CC FB1 STL FC1 ( CALL ) FC1 EN ENO LAD 调用 “CALL”指令用于调用程序块(FC, FB, SFC, SFB), 而与RLO或其他条件无关。 如果用“CALL”来调用FB或SFB,则必须指定背景数据块。 可以使用块的绝对或符号名,例如:“CALL FB2, DB2”或“CALL valve, level”。“CALL”操作保存返回地址,解除对MCR的依赖,并生成块调用所需的局部数据区。 UC “UC”为无参数分配的无条件块调用指令(针对FC或FB),其它与“CALL” 一致。 CC “CC”指令在RLO=1.时调用 FC或FB,其它与“CALL”一致。 参数 在声明表中列出的为“形式参数”,在调用时分配给块的地址或数值为“实际参数”。 静态和临时变量不出现在调用指令中。 FC1 CALL FC1 EN ENO FBD
发动机控制系统工程 控制任务描述: 在发动机控制系统工程实例中,被控对象是一个“汽油发动机”和一个对该汽油发动机进行散热的“风扇”,一个“柴油发动机”和一个对该柴油发动机进行散热的“风扇”。对这些被控对象,有相应的起动、停止按钮控制其状态的改变,并要求这两个发动机在起动的同时,对应的风扇要同时起动对其散热,当发动机停止运行时,风扇要延时4秒后再关闭,以保证发动机充分的散热。
发动机控制系统结构化程序的结构示意图 汽油机控制 汽油机风扇控制 柴油机控制 柴油机风扇控制 发动机控制 风扇控制 汽油机数据 柴油机数据 FB1 FC1 OB1 DB1 DB2
1、 创建符号地址表
2、发动机控制功能块(FBl)的程序设计 定义FB1的输入、输出参数。这些定义包括变量名、数据类型和声明类型。 输入:
输出: 静态变量:
FB1功能块的程序设计
汽油机数据块DB1的内容
3、风扇控制功能(FCl)的程序设计 定义FC1的输入、输出参数。这些定义包括变量名、数据类型和声明类型。 输入:
输出:
FBl功能块的程序设计
4、组织块(OB1)的程序设计 发电机控制系统组织块OB1的指令程序
总结 功能和功能块的调用必须用实参代替形参,因为形参是在功能或功能块的变量声明表中定义的。为保证功能或功能块对同一类设备的通用性,在编程中不能使用实际对应的存储区地址参数,而是使用抽象参数,这就是形参。而块在调用时,必须将实际参数(实参)替代形参,从而可以通过功能或功能块实现对具体设备的控制。 这里必须注意:实参的数据类型必须与形参一致。