刘振青,侯文利,姚仲坤
中海石油中国有限公司蓬勃作业公司 天津 300459
德国西门子公司生产的S7-300 可编程序控制器(Programmable Logic Controller,PLC)因具有可靠性高、编程容易、组态灵活、输入/输出功能模块齐全、运行速度快、安装维护方便、总价格低等特点,已成为工业控制领域常用的一种可编程逻辑控制器。
七段数码管是S7-300 PLC可直接驱动的硬件,因价格便宜、编程简单而被广泛应用,可通过对不同管脚输入相对应的电流,使数码管发亮,显示出数字和相关参数。数码管指令还可以非常便捷地与定时器指令、计数器指令、加减法指令配合使用,从而显示倒计时,用于提醒监控人员完成急停、启动、切换等重要流程转换[1]。
本文将重点探讨基于S7-300 的七段数码管倒计时的3种实现方案。
七段数码管装配7 个发光二极管,用来显示十进制0~9 的数字外加小数点,也可以显示英文字母,包括十六进制中的英文A至F,见图1(a)。根据二级管的控制方式,将七段数码管分为共阳极、共阴极两类,见图1(b),共阳极为8 个发光二极管的共有正极,其他接点为独立发光二极管的负极,使用者只需把正极接电、不同的负极接地就能控制七段数码管显示不同的数字。共阴极的七段数码管与共阳极接法相反。无论是共阴极还是共阳极,只要数码管所在的回路导通,对应的数码管就会被点亮,如在a端加上24 VDC时,a连接的二极管得电,对应的七段数码管上的a段就会点亮。
图1 七段数码管示意图Fig.1 Schematic diagram of seven-segment digital tube
七段数码管与S7-300 配合使用时,7 个输入端分别接在DO卡的输出通道上,如a、b、c…g 7 个端子分别对应接在Q0.0、Q0.1、Q0.2…Q0.6 上。
当Q0.1、Q0.2 回路导通时,七段数码管b、c 段点亮,数码管显示数字“1”;当Q0.1、Q0.2、Q0.3 回路导通时,七段数码管a、b、c段点亮,数码管显示数字“7”。因此,我们通过控制Q0.0、Q0.1、Q0.2…Q0.6,实现数码管不同数字的显示。七段数码管显示0 至F字符对应的7 个数码段,a、b、c…g的回路导通对应关系见图2,1 为导通,0 为断开,右侧数据为对应的十六进制表示。
图2 七段数码管显示字符与输入对应关系Fig.2 Corresponding relationship between display characters and input of seven-segment digital tube
分别控制Q0.0、Q0.1……Q0.6 这7 个布尔型变量的输出,用于显示不同数字或字符,这一思路过程清晰简单,但在实际编程过程中分别控制7 个“位”并不容易实现,且出错的概率非常高,我们需要从S7-300 PLC的存储单元入手,寻找简单且高效的解决方案;根据S7-300 PLC的输出过程映像寄存器规则,逻辑编程可直接控制整个QB0 的字节(1 个字节,8 位),Q0.0 是最低位,Q0.7 是最高位。因此,只需将数值2#00000110(16#06)整体赋值给QB0 字节,对应的七段数码管即可显示数字“1”;同理,将数值2#01101111(16#6F)整体赋值给QB0 字节,七段数码管即可显示数字“9”。这表明,0 至F字段共16 个显示字符,对应16种组合,通过控制QB0 字节中的数值,实现控制数码管的显示。但图2 中字符与数值组合并无特定规律,编程的可记忆性和可读性较差,相关的编程及逻辑识读均需查看图2 的表格,极大地降低工作效率,为消除此弊端,我们使用七段数码管指令FC93 来提升人机交互性[2]。
通过识读图2,我们发现16 个显示字符对应的数值组合无规律可循,为提高程序的可读性,S7-300 PLC的标准库中内置了FC93 函数,该函数为七段解码器函数,输入为WORD型,输出为DWORD型。只需要在该函数IN参数内输入需要显示的字符,该函数OUT 参数即可输出七段数码管所需的二进制组合,对应的数码管就会正确显示该字符。如在FC93函数的IN 参数输入数字“2”,FC93 的OUT 参数即可对应输出2#00000110(16#06),相应的字符串显示“2”,此时数码管也会显示数字“2”。必须强调的是,A至F字段的显示不能简单输入该字符,而应输入该字符对应的16 进制数,但本研究为倒计设置,不涉及字符的显示,因此不对此部分进行讲解。
将输入字符与显示字符统一成人员可直接读取并理解的数字和字符能够极大地提高程序可读性。因此,FC93 七段解码器函数在工业实际中应用十分广泛,特别是用于倒计时的显示。
单个数码管可以直观地展示9~0 的倒计时;2 个数码管配合逻辑编程可以展示99~0 的倒计时。本论文实现的倒计时均以单个数码管倒计时10 s为例。
七段数码管显示均从“9”开始,每间隔1 s显示的数字减1,直到显示字符“0”为止。实现上述功能除了使用FC93 七段解码器函数外,还必须使用计时功能。S7-300 中可以使用定时器指令或CPU时钟存储器,2种方式的编程均十分便捷,定时器指令可直接在指令集中选择使用;使用CPU时钟存储器时,需在配置CPU硬件时激活该功能并定义地址。该地址按字节存取,系统默认的地址为0,即MB0 中存储,MB0 字节中每个位都对应不同的占空比,如M0.3 周期为0.5 s(其中0.25 s输出为1,剩余0.25 s输出为0)、M0.7周期为2 s(其中1 s输出为1,剩余1 s输出为0)、M0.5 周期为1 s(其中0.5 s输出为1,剩余0.5 s输出为0)。
在本论文讲解的七段数码管倒计时实现方法中,计数器和减法指令这2种倒计时显示方法均需要利用M0.5 的1 s周期特性。
利用减法指令实现七段数码管倒计时显示的S7-300 程序见图3,仅需4 个程序段即可完成全部逻辑,十分简单便捷。程序段一中,点击I0.0 触点后,逻辑(点动输入)“开始”执行,程序首次扫描到上升沿时,通过MOVE 指令,为MW10 赋值10,通过置位指令,将M9.0“开始标志”置位为1。程序段二中,当M9.0“开始标志”位闭合后,CPU 时钟存储器M0.5 每次出现上升沿时都会触发减法指令,将MW10 的值减去1,相当于每1 s减1,从而实现关键的倒计时功能,MW10 中的数值从10 开始递减。程序段三中,FC93 函数将MW10 中对应的数据翻译成对应的二进制组合,该函数的OUT1 对应的数据类型为DWORD,因此,这里填写的地址为MD16。MD16 包含MB16、MB17、MB18、MB19 4 个字节,MB16 位于高位,MB19 位于低位,将双字MD16 的低位字节MB19 输出给QB0 即可实现七段数码管倒计时显示。程序段四中,MW10 为0 时,说明计时结束,将M9.0 复位,倒计时逻辑停止。综上,减法指令和时钟脉冲触发器的配合十分简单地实现了10 s倒计时功能。
图3 利用减法指令实现倒计时程序Fig.3 Countdown program using subtraction instruction
利用计数器指令实现数码管倒计时显示的程序见图4,该方法与利用减法指令实现过程类似,也需4 个程序段完成全部逻辑。程序段一中,点击I0.0 触点,M9.0 置位1,程序开始执行。程序段二中,M9.0位连接计数器C1 的S 参数,C#10 连接C1 的PV 参数,MW10 连接C1 的CV参数,当M9.0 位出现上升沿时,计数器预设置为10,CPU时钟存储器M0.5 每次上升沿时都会触发计数指令减1,MW10 中的值即为倒计时值,当MW10 不为0 时,M2.2 线圈得电,当MW10 为0 时,M2.2 失电。程序段三与利用减法指令实现过程完全相同。程序段四中,当M2.2 出现下降沿,即MW10 为0 时,将M9.0 复位,倒计时逻辑停止。该方法中的计数指令也是S7-300 的基本指令,用该指令和时钟脉冲触发器配合,实现10 s倒计时也非常简单。
图4 利用计数器指令实现倒计时程序Fig.4 Countdown program using counter instruction
利用定时器指令实现数码管倒计时需要用到定时器的时间基准。S7-300 的定时器有4种时间基准,时间基准定义时间值以一个单位递减的间隔实现,包括0.01、0.1、1、10 s 4种,可以通过编程选择需要的时基,也可系统自动选择。本论文中的定时器时基均按照系统自动选择,定时时间小于9.99 s时,默认时基为0.01 s;定时在10~99.9 s 区间时,默认时基为0.1 s;定时在100~999 s区间时,默认时基为1 s;定时在1 000~9 990 s时,默认时基为10 s。我们需要实现10 s的倒计时,因此,系统默认的时基为0.01 s。
S7-200 指令集中有多种定时器指令,且每个定时器指令均有BI和BCD 2种输出,输出值为计时剩余时间,BI输出提供二进制格式的时间值,该输出值与时基的乘积即为剩余时间;BCD输出提供BCD格式的时间值,该字后十二位中,每4 位表示一个“十进制的数”,假设高位到低位依次为B、C、D,则上述3 个数组合成的数值BCD与时基的乘积也为剩余时间。用定时器实现数码管10 s倒计时显示的关键就是将定时器剩余时间中秒的整数值送给数码管显示。
3.3.1 利用定时器BI参数实现倒计时显示
直接用定时器指令BI参数数值除以时基数值的倒数,然后将运算结果送给FC93 函数指令,以实现10 s倒计时的显示,具体实现的逻辑程序见图5。在程序段二中,当M9.0 位闭合后,延时导通定时器指令开始计时,该定时器预设的定时时长为10 s,因此,系统默认的时基自动对应0.1 s;MW10 字用于存储定时器T1 的BI参数的数值;在程序段三中,MW10字存储的数值除以时基数值的倒数,即MW10 除以10;在程序段四中,当T1 计时10 s完成后,把整个倒计时显示的逻辑“开始标志”复位。需要注意的是,计时周期不同,时基也会不同,如果实现小于10 s的倒计时,则时间继电器的时基为0.01 s,此时MW10应除以100。时基的问题不是本论文讲解的重点,不再赘述。
图5 利用定时器BI参数实现倒计时程序Fig.5 Countdown program using timer BI parameters
3.3.2 利用定时器BI参数实现倒计时显示
用定时器BCD参数实现的七段数码管倒计时显示的程序见图6。在程序段二中,MW10 字存储定时器T1 的BCD参数的数值;在程序段三中,MB18 字节的数值输出给QB0。如果实现小于10 s的倒计时,则时间继电器的时基为0.01 s,此时根据BCD码的特点,应将MB19 输出给QB0。关于BCD码存储问题,可详细阅读S7-300 的帮助手册。
图6 利用定时器BCD参数实现倒计时程序Fig.6 Countdown program using timer BCD parameters
利用加减法指令和计数器指令的实现原理类似,编程语句与人的逻辑思维十分相似,直观易懂,方便后期维护。但由于开始指令的上升沿无法精准地与CPU时钟存储器M0.5 的上升沿重合,用上述2种方法实现倒计时第1 s的时间往往小于1 s,具体时长受开始指令发出瞬间M0.5 的状态影响。
计时器指令可以实现精确的10 s倒计时显示,且程序编程相对简单,但程序可读性较差,后期维护困难;定时周期选取不同,S7-300 默认的时基不同,倒计时显示逻辑需要做对应参数的修改,程序的通用性不如前两种方法。
本文阐述了基于S7-300 3种七段数码管倒计时显示思路,模块化地提出了3种倒计时解决方案,可非常方便地用于各种倒计时显示;同时,在倒计时显示逻辑的编程过程中,同步对S7-300 PLC的减法指令、计数指令、定时指令、数码管指令等常用逻辑指令的使用进行分析,也对S7-300 定时器的时基和数据存储格式的应用进行了演示,极大地拓宽了该系列PLC的编程思路[3]。
在实际工厂应用或模拟教学中,该论文展示的逻辑功能可十分便捷地为应用者提供模块化的编程逻辑,可为S7-300 PLC和七段数码管的使用提供系统、全面的编程思路。