Presentation is loading. Please wait.

Presentation is loading. Please wait.

第5章 S7系列程序结构与程序设计 5.1 编程方式与程序块 5.2 数据块与数据结构 5.3 S7系列PLC程序设计 思考与练习题.

Similar presentations


Presentation on theme: "第5章 S7系列程序结构与程序设计 5.1 编程方式与程序块 5.2 数据块与数据结构 5.3 S7系列PLC程序设计 思考与练习题."— Presentation transcript:

1 第5章 S7系列程序结构与程序设计 编程方式与程序块 数据块与数据结构 S7系列PLC程序设计 思考与练习题

2 5.1 编程方式与程序块 S7-300编程方式简介 S7-300系列PLC的编程语言是STEP 7。用文件块的形式管理用户编写的程序及程序运行所需的数据,组成结构化的用户程序。这样,PLC的程序组织明确,结构清晰,易于修改。 为支持结构化程序设计,STEP 7用户程序通常由组织块(OB)、功能块(FB)或功能块(FC)等三种类型的逻辑块和数据块(DB)组成。 OB1是主程序循环块,在任何情况下,它都是需要的。

3 图5.1 STEP 7调用过程示意图

4 功能块(FB、FC)实际上是用户子程序,分为带“记忆”的功能块FB和不带“记忆”的功能块FC。FB带有背景数据块(Instance Data Block),在FB块结束时继续保持,即被“记忆”。功能块FC没有背景数据块。 数据块(DB)是用户定义的用于存取数据的存储区,可以被打开或关闭。DB可以是属于某个FB的情景数据块,也可以是通用的全局数据块,用于FB或FC。 S7 CPU还提供标准系统功能块(SFB、SFC),集成在S7 CPU中的功能程序库。用户可以直接调用它们,由于它们是操作系统的一部分,因此不需将其作为用户程序下载到PLC。

5 5.1.2 功能块编程及调用 功能块由两个主要部分组成:
功能块编程及调用 功能块由两个主要部分组成: 当调用功能块时,需要参数传递。参数传递的方式使得功能块具有通用性,它可被其它的块调用,以完成多个类似的控制任务。 变量声明表:声明此块的局部数据 程序:要用到变量声明表中的局部数据

6 1. 变量声明表(局部数据) 每个逻辑块前部都有一个变量声明表,在变量声明表中定义逻辑块用到的局部数据。表5.1给出了局部数据声明类型。 表5.1 局部数据类型

7 1) 形参 为保证功能块对同一类设备控制的通用性,应使用这类设备的抽象地址参数,这些抽象参数称为形式参数,简称形参。功能块在运行时将该设备的相应实际存储区地址参数(简称实参)替代形参,从而实现功能块的通用性。 形参需在功能块的变量声明表中定义,实参在调用功能块时给出。在功能块的不同调用处,可为形参提供不同的实参,但实参的数据类型必须与形参一致。

8 2) 静态变量 静态变量在PLC运行期间始终被存储。S7将静态变量定义在背景数据块中,因此只能为FB定义静态变量。功能块FC不能有静态变量。 3) 临时变量 临时变量仅在逻辑块运行时有效,逻辑块结束时存储临时变量的内存被操作系统另行分配。S7将临时变量定义在L堆栈中。

9 2. 逻辑块局部数据的数据类型 在变量声明表中,要明确局部数据的数据类型,这样操作系统才能给变量分配确定的存储空间。局部数据可以是基本数据类型或复式数据类型,也可以是专门用于参数传递 的所谓的“参数类型”。参数类型包括定时器、计数器、块的地址或指针等,见表5.2。

10 表5.2 参数类型变量

11 3. 块调用过程及内存分配 CPU提供块堆栈(B堆栈)来存储与处理被中断块的有关信息。当发生块调用或有来自更高优先级的中断时,就有相关的块信息存储在B堆栈里,并影响部分内存和寄存器。图5.2显示了调用块时B堆栈与L堆栈的变化。图5.3提供了关于STEP 7的块调用情况。

12 图5.2 堆栈与L堆栈

13 图5.3 调用指令对CPU内存的影响

14 1) B堆栈与L堆栈 B堆栈存储以下被中断块的数据: (1) 块号、块类型、优先级、被中断块的返回地址; (2) 块寄存器DB、DI被中断前的内容; (3) 临时变量的指针(被中断块的L堆栈地址)。 L堆栈在块调用时被重新分配。L堆栈用来存储逻辑块中定义的临时变量,也分配给临时本地数据使用。梯形图的方块指令与标准功能块也可能使用L堆栈存储运算的中间结果。

15 2) 调用功能块FB 当调用功能块FB时,会有以下事件发生: (1) 调用块的地址和返回位置存储在块堆栈中,调用块的临时变量压入L堆栈; (2) 数据块DB寄存器内容与DI寄存器内容交换; (3) 新的数据块地址装入DI寄存器; (4) 被调用块的实参装入DB和L堆栈上部; (5) 当功能块FB结束时,先前块的现场信息从块堆栈中弹出,临时变量弹出L堆栈; (6) DB和DI寄存器内容交换。

16 3) 调用功能块FC 当调用功能块FC时会有以下事件发生: (1) 功能块FC实参的指针存到调用块的L堆栈; (2) 调用块的地址和返回位置存储在块堆栈,调用块的局部数据压入L堆栈; (3) 功能块存储临时变量的L堆栈区被推入L堆栈上部; (4) 当被调用功能块FC结束时,先前块的信息存储在块堆栈中,临时变量弹出L堆栈。 因为功能块FC不用背景数据块,不能分配初始数值给功能块FC的局部数据,所以必须给功能块FC提供实参。

17 功能块编程与调用举例 对功能块编程分两步进行: 第一步是定义局部变量(填写局部变量表); 第二步是编写要执行的程序,并在编程过程中使用定义了的局部变量(数据)。

18 定义局部变量的工作内容包括: 分别定义形参、静态变量和临时变量(FC块中不包括静态变量); (2) 确定各变量的声明类型(Decl.)、变量名(Name)和数据类型(Data Type),还要为变量设置初始值(Initial Value)(尽管对有些变量初始值不一定有意义)。如果需要还可为变量注释(Comment)。在增量编程模式下,STEP 7将自动产生局部变量地址(Address)。

19 写功能块程序时,可以用以下两种方式使用局部变量:
使用变量名,此时变量名前加前缀“#”,以区别于在符号表中定义的符号地址。增量方式下,前缀会自动产生。 直接使用局部变量的地址,这种方式只对背景数据块和L堆栈有效。 在调用FB块时,要说明其背景数据块。背景数据块应在调用前生成,其顺序格式与变量声明表必须保持一致。在增量方式下,调用FB块时,STEP 7会自动提醒并生成背景数据块。

20 1.二分频器 假设功能块FC10是二分频器产生程序,功能是对不同的输入位进行二分频处理。以下给出了FC10的变量声明表和语句表程序。在程序中使用了跳变沿检测指令。 1) FC10的变量声明表(见表5.3) 表5.3 FC10的变量声明表

21 2) 语句表程序 Network 1 A #INP // 对脉冲输入信号产生RLO FP #ETF // 对前面的RLO进行跳变沿检测 NOT // 取反RLO BEC // 若RLO=1(没有正跳沿),结束块; // 若RLO=0(有正跳沿),继续执行下一条指令 AN #OUTP = #OUTP //输出信号反转 BEU //无条件结束块

22 在功能块FCl0中定义了三个形参,调用时为形参分别赋予实参I0. 0、Q4. 0和M10. 0,以对输入位I0
在功能块FCl0中定义了三个形参,调用时为形参分别赋予实参I0.0、Q4.0和M10.0,以对输入位I0.0进行二分频以产生输出脉冲Q4.0。 调用方式: CALL FC10 INP: = I0.0 OUTP: = Q4.0 ETF: = M10.0

23 2.读模拟输入量程序 一些S7-300的应用系统中,使用8通道模拟量模块采集信号,当模块数量较多时,读模拟输入量就很繁琐。下面给出一个通用程序FC100,利用它可以方便地把模拟量读回并顺序存入数据块,因为模入模块的起始地址、通道数、存储数据块号及数据在数据块中的存储起始位置均是可变的,所以可在调用FC100时灵活确定。

24 1) FC100的变量声明表(见表5.4) 表5.4 FC100的变量声明表

25 2) 语句表程序 Network 1 L #DB_No T LW0 OPN DB[LW 0] //打开存储数据块 L #PIW_Addr
2) 语句表程序 Network 1 L #DB_No T LW0 OPN DB[LW 0] //打开存储数据块 L #PIW_Addr SLD //形成模入模块地址指针 T LD //在临时本地数据双字LD 4中存储模入模块地址指针 L #DBW_Addr SLD //形成数据块存储地址指针 T LD //在临时本地数据双字LD 8中存入数据块存储地址指针 L #CH_LEN //以要读入的通道数为循环次数,装入累加器1

26 L LD4 LARl //将模入模块地址指针装入地址寄存器1 L PIW[ARl,P#0.0] //读模入模块装入累加器1 T LW //将累加器1的内容暂存入缓冲器LW2 L LD8 LARl //将数据块存储地址指针装入地址寄存器1 L LW //将数据缓冲器中的内容装入累加器1 T DBW[ARl,P#0.0] //将累加器的内容存入数据块中 L LD //AR1+P#2.0→AR1 + L# //ACC1+(.._0001_0 000) T LD //调整模入模块地址指针,指向下一通道Acc1+(bb bbbb bxxx) + L#16 T LD //调整数据块存储地址指针,指向下一存储地址 L LW //将循环次数计数器LW0的值装入累加器1 LOOP NEXT //若累加器1的值不为0,将累加器减1继续循环;若累加 //器为0,则结束 NEXT:T LW 0

27 举例说明如何使用FC100。在某应用中,机架0的4号槽位安装了一个8模入模块(地址256开始),若要将前6个模入模块信号读回,存入DB50
举例说明如何使用FC100。在某应用中,机架0的4号槽位安装了一个8模入模块(地址256开始),若要将前6个模入模块信号读回,存入DB50.DBW10开始的6个字单元中,可按下列形式调用FC100: CALL FC100 PIW_Add:= 256 CH_LEN: = 6 DB_No: = 50 DBW_Addr:= 10

28 5.2 数据块与数据结构 数据块 数据块定义在S7 CPU存储器中,用户可在存储器中建立一个或多个数据块。每个数据块可大可小,但CPU对数据块数量及数据总量有限制,如对于CPU314,用作数据块的存储器最多为8 KB(8192 B),用户定义的数据总量不能超出这个限制。对数据块必须遵循先定义后使用的原则,否则,将造成系统错误。

29 1. 定义数据块 在编程阶段和运行程序中都能定义数据块。大多数数据块是在编程阶段用STEP 7开发软件包定义的。 定义内容包括数据块号及块中的变量(包括变量符号名、数据类型以及初始值等),定义完成后,数据块中变量的顺序及类型决定了数据块的数据结构,变量的数量决定了数据块的大小。 数据块在使用前,必须作为用户程序的一部分下载到CPU中。

30 2.访问数据块 访问时需要明确数据块号和数据块中的数据类型与位置。根据明确数据块号的不同方法,可以用多种方法访问数据块中的数据。 直接在访问指令中写明数据块号,如: L DB5.DBW10 T DB10.DBW20 L Motor_1.Speed //符号地址

31 另一种方法是“先打开后访问”。在访问某数据块中的数据前,先“打开”这个数据块,这样,存放在数据块中的数据就可利用数据块起始地址加偏移量的方法来访问。如:
OPN DB5 L DBW10 OPN DB10 T DBW20

32 3. 背景数据块和共享数据块 背景数据块和共享数据块有不同的用途。任何FB、FC或OB均可读写存放在共享数据块中的数据。背景数据块是FB运行时的工作存储区,它存放FB的部分运行变量。调用FB时,必须指定一个相关的背景数据块。作为规则,只有FB块才能访问存放在背景数据块中的数据。

33 数据结构 STEP 7数据块中的数据既可以是基本数据类型,又可以是复式数据类型。STEP 7允许4种复式数据类型,如表5.5所示。 表5.5 复式数据类型

34 5.3 S7系列PLC程序设计 程序结构设计 STEP 7不仅从不同层次充分支持合理的程序结构设计,而 且也简化了结构设计的复杂程度。 一个复杂的自动化过程可以被分解并定义为一个或多个项 目(PROJECT) ,图5.4显示了一个样本过程,它分成4个不同的 项目。项目间或项目中的各CPU程序之间,能以某种方式联网, 实现信息共享。如在S7协议支持下,用MPI网以全局数据通信的 方式可方便地建立起联系,实现一个项目中各CPU共享信息。

35 图 样本过程的项目划分

36 典型的情况是一个过程控制任务只有一个项目,该项目下也仅有一个CPU程序,每一个CPU程序又可依据时间特性或事件触发特性的差异分类编入不同的组织块(OB)中。例如,对程序执行中产生的同步错误的响应处理程序编入组织块OB121或OB122中。 组织块OB1(主程序循环)中的程序是应用程序中主要的也是最复杂的部分,可以根据其复杂程度分别选用线性、分部或结构化等三种形式中的一种程序结构。

37 1. 线性程序结构 用“线性”结构设计的程序连续放置在一个块内(通常为OB1),块中的程序按顺序执行。这一结构是最初的PLC模拟的继电器梯形逻辑的模型。线性程序具有简单、直接的特点。编程时,不必考虑功能块如何编程及如何调用,也不必考虑如何定义局部变量及如何使用背景数据块。由于所有的指令在一个块内,因此它适用于只需一个人编写的、相对简单的控制程序。

38 2. 分部程序结构 这是一种部分模块化的程序结构,也称为部分结构化。程序被分成各部分放在若干功能块中,每个功能块含有用于一种设备的一系列控制逻辑。放置在组织块OB1中的指令决定控制程序的各功能块的执行。 在分部程序中,既无数据交换也没有重复利用的程序代码。功能块不传递也不接收参数,分部程序结构的编程效率比线性程序有所提高,程序测试也较方便,对程序员的要求也不太高。对不太复杂的控制程序可考虑采用这种程序结构。

39 3. 结构化程序结构 完全结构化(模块化)的程序结构是PLC程序设计和编程最有效的结构形式,它可用于复杂程度高、程序规模大的控制应用程序设计。结构化程序可以重复使用某些功能块,只需要在使用功能块时为其提供不同的环境变量(实参),就能完成对不同设备的控制。 结构化程序有最高的编程和程序调试效率,应用程序代码量也最小。结构化程序也支持多个程序员协同编程。

40 程序设计实例 图 工业搅拌过程示意图

41 1. 将过程分割为任务和区域 一个自动化过程包括许多单个的任务,将这个工业搅拌过程构造为四个功能区域:配料A区域、配料B区域、混合罐区域和排料区域。 2. 说明各个功能区域 1) 配料A和配料B区域 (1) 每种配料的管道都配备有一个入口和一个进料阀以及进料泵。 (2) 进料管还有流量传感器。 (3) 当罐的液面传感器指示罐满时,进料泵的接通必须被锁定。

42 (4) 当排料阀打开时,进料泵的启动必须被锁定。
(5) 在启动进料泵后1 s内必须打开入口阀和进料阀。 (6) 在进料泵停止后(来自流量传感器的信号)阀门必须立即被关闭以防止配料从泵中泄露。 (7) 进料泵的启动与一个时间监控功能相结合,换句话说,在泵启动后的7 s之内,流量传感器会报告溢出。 (8) 当进料泵运行时,如果流量传感器没有流量信号,进料泵必须尽可能快地断开。 (9) 必须对进料泵启动的次数进行计数(维护间隔)。

43 2) 混合罐区域 (1) 当罐的液面传感器指示“液面低于最低限”或排料阀打开时,搅拌电机的启动必须被锁定。 (2) 搅拌电机在达到额定速度时要发出一个响应信号。如果在电机启动后10 s内还未接收到该信号,则电机必须被断开。 (3) 必须对搅拌电机的启动次数进行计数(维护间隔)。 (4) 在混合罐中必须安装三个传感器。① 罐装满:一个常闭触点。② 罐中液面高于最低限:一个常开触点。③ 罐非空:一个常开触点。

44 3) 排料区域 (1) 罐内产品的排出由一个螺线管阀门控制。 (2) 这个螺线管阀门由操作员控制,但是最迟在“罐空”信号产生时,该阀必须被关闭。 (3) 当搅拌电机在工作或罐空时打开排料阀必须被锁定。

45 3. 定义逻辑块 通过程序块可以将用户程序分布到不同的块中并建立块调用的分层结构来组织程序。本例中用户程序主要由组织块OB1、功能块FB1、功能FC1及三个数据块DB1~DB3组成。图5.6所示为结构化编程的块的分层调用结构。

46 图 工业搅拌过程的分层调用结构图

47 4. 指定符号名 如果在用户程序中使用了符号,则必须用STEP 7在符号表中对这些符号进行定义。表5.6所示为所用的程序组件的符号名及绝对地址。 表5.6 程序组件的符号名及绝对地址

48

49 续表

50

51 5. 生成电机的FB 电机的FB包括以下逻辑功能: (1) 启动和停止输入。 (2) 允许设备操作的一系列互锁(泵和搅拌电机)。 (3) 来自设备的反馈必须在一个特定的时间内出现。 (4) 时间点和响应时间等时间都必须被指定。 (5) 如果按下启动,设备自动运行直至按下停机按钮。 (6) 当设备接通时,一个定时器启动运行,如果在定时器的时间到达之前未接到来自设备的响应信号,则停机。

52 Start Fault Stop Start_Dsp Response Stop_Dsp Reset_Maint Maint Motor
Timer_No Response_Time Motor 图 电机通用FB的输入和输出示意图

53 在STEP 7中,每一个被不同的块调用的块一定要在调用它的块之前生成,因此在样板程序中必须在OBl之前先生成电机的FB。STL编程语言的FBl程序部分如下:
Network l 启动/停止和锁存 A( O #Start O #Motor ) AN #Stop = #Motor

54 Network 2 启动监控 A #Motor L #Response_Time SD #Timer No AN #Motor R #Timer No L #Timer No T #Timer bin LC #Timer No T #Timer BCD A #Timer No AN #Response S #Fault R #Motor

55 Network 3 启动指示灯和故障复位 A #Response = #Start_Dsp R #Fault Network 4 断开指示灯 AN #Response = #Stop_Dsp

56 Network 5 启动计数 A #Motor FP #Start_Edge JCN lab1 L #Starts + 1 T #Starts lab1:NOP 0 Network 6 维护指示灯 L #Starts L 50 >=I = #Maint

57 Network 7 复位累计启动次数的计数器 A #Reset_Maint A #Maint JCN END L T #Starts END:NOP 0

58 6. 生成阀门FC 入口和进料阀以及排料阀的功能包含以下逻辑功能: (1) 一个用于打开阀门的输入,一个用于关闭阀门的输入。 (2) 互锁允许阀门被打开。互锁状态存储在OB1的临时局域数据(L堆栈)中(“Valve_enable”),并且在阀门的FC被处理时与打开和关闭的输入进行逻辑组合。

59 Open Close Valve Dsp_Open Dsp_Closed 图 阀门的通用FC的输入和输出示意图

60 由于被调用的块必须在调用块之前生成,因此阀门的FCl功能必须在OB1之前生成。STL编程语言的FCl程序部分如下:
Network l 打开/关闭和锁存 A( O #Open O #Valve ) AN #Close = #Valve Network 2 显示“阀门打开” A #Valve = #Dsp_Open Network 3 显示“阀门关闭” AN #Valve = #DSp_Closed

61 7. 生成OB1 OB1决定用户程序的结构,也包含要传送给各个功能的参数。(程序略)例如: (1) 为进料泵和搅拌电机FB提供输入参数。PLC的每一个循环周期都会处理这个电机的FB。 (2) 如果电机的FB被处理,则输入Timer_No和Response_Time所需要的时间。 (3) 程序为处理进料泵和搅拌电机的控制任务,使用电机的FB时分别配备了不同的背景DB。

62 思考与练习题 1.用I0.0控制接在Q4.0~Q4.7上的8个彩灯循环移位,用T37定时,每0.5 s移1位,首次扫描时给Q4.0~Q4.7置初值,用I0.1控制彩灯移位的方向,试设计语句表程序。 2.在按钮I4.0按下后Q4.0变为1状态并自保持,I0.1输入3个脉冲后(用C1计数)T37开始定时,5 s后Q4.0变为0状态,同时C1被复位,在可编程序控制器刚开始执行用户程序时,C1也被复位,试设计梯形图。

63 3. 多个传送带启动和停止示意图如下图所示。按下启动按钮后,电动机M1通电运行,行程开关SQl有效后,电动机M2通电运行,行程开关SQ2有效后,M1断电停止,其他传动带动作类推。整个系统循环工作。按下停止按钮后,系统把目前的工作进行完后停止在初始状态。


Download ppt "第5章 S7系列程序结构与程序设计 5.1 编程方式与程序块 5.2 数据块与数据结构 5.3 S7系列PLC程序设计 思考与练习题."

Similar presentations


Ads by Google