高速计数器
5.3 高速计数器
前面讲的计数器指令的计数速度受扫描周期的影响,对比CPU扫描频率高的脉冲输入,就不能满足控制要求了。高速计数器HSC用来累计比PLC扫描频率高得多的脉冲输入,利用产生的中断事件完成预定的操作。
一、高速计数器介绍
S7-200系列PLC设计了高速计数功能(HSC),其计数自动进行不受扫描周期的影响,最高计数频率取决于CPU的类型,CPU22x系列最高计数频率为30KHz。高速计数器在程序中使用时的地址编号用HC n来表示(在非正式程序中有时用HSC n),HC (HSC)表示编程元件名称为高速计数器,n为编号。
表5-3 高速计数器的数量与编号表
1.高速计数器输入端的连接
每个高速计数器对它所支持的时钟、方向控制、复位和启动都有专用的输入点,通过中断控制完成预定的操作。每个高速计数器专用输入点如表5-4所示。
注意:同一个输入端不能用于两种不同的功能。但是高速计数器当前模式未使用的输入端均可用于其他用途,如作为中断输入端或作为数字量输入端。每个高速计数器的3种中断的优先级由高到低,各个高速计数器引起的中断事件如表5-5所示。
S7-200系列PLC高速计数器HSC0~HSC5可以分别定义为四种工作类型:带有内部方向控制的单相计数器;带有外部方向控制的单相计数器;带有增/减计数脉冲输入的双相计数器;A/B相正交计数器。
根据有无复位输入和启动输入,每种高速计数器类型可以设定为三种工作状态:无复位且无启动输入;有复位但无启动输入;有复位且有启动输入。
HSC0~HSC5可以根据外部输入端的不同配置12种模式(模式0~模式11),高速计数器的工作模式见表6-4。
表6-5 高速计数器的控制字节(位)
号计数,当计数值等于大于50时输出端Q0.0通电,当外部复位时Q0.0断电。
接线图如图6-3所示,系统自动分配I0.0为HSC0的计数脉冲信号输入端,I0.2为HSC0的外部复位端。
82
2. 高速计数器的工作模式
高速计数器有12种工作模式,模式0~模式2采用单路脉冲输入的内部方向控制加/减计数;模式3~模式5采用单路脉冲输入的外部方向控制加/减计数;模式6~模式8采用两路脉冲输入的加/减计数;模式9~模式11采用两路脉冲输入的双相正交计数。
每个高速计数器有多种不同的工作模式。HSC0和HSC4有模式0、1、3、4、6、7、8、9、10;HSC1和HSC2有模式0、1、2、3、4、5、6、7、8、9、10、11;HSC3和HSC5只有模式0。高速计数器的工作模式和输入端子数有关,如表5-6所示。
说明:表中×表示没有
3.高速计数器的控制字和状态字
定义了计数器和工作模式之后,还要设置高速计数器的有关控制字节。每个高速计数器均有一个控制字节,它决定了计数器的计数允许或禁用,方向控制(仅限模式
83
0、1和2)或对所有其他模式的初始化计数方向,装入当前值和预置值。控制字节每个控制位的说明如表5-7所示。
每个高速计数器都有一个状态字节,状态位表示当前计数方向以及当前值是否大于或等于预置值。每个高速计数器状态字节的状态位如表5-8所示。
二、高速计数器指令及应用
1.高速计数器指令
84
高速计数器指令有两条:高速计数器定义指令HDEF和高速计数器指令HSC 。其格式如表5-9所示。
(1)高速计数器定义指令HDEF。指令指定高速计数器(HSC x)的工作模式。工作模式的选择即选择了高速计数器的输入脉冲、计数方向、复位和起动功能。每个高速计数器只能用一条“高速计数器定义”指令。
(2)高速计数器使用指令HSC。根据高速计数器控制位的状态和按照HDEF指令指定的工作模式,控制高速计数器。参数N指定高速计数器的编号。
2. 高速计数器指令的使用
(1)每个高速计数器都有一个32位当前值和一个32位预置值,当前值和预设值均为带符号的整数值。要设置高速计数器的新当前值和新预置值,必须设置控制字节(表5-7),令其第五位和第六位为1,允许更新预置值和当前值,新当前值和新预置值写入特殊内部标志位存储区。然后执行HSC指令,将新数值传输到高速计数器。
(2)执行HDEF指令之前,必须将高速计数器控制字节的位设置成需要的状态,否则将采用默认设置。默认设置为:复位和起动输入高电平有效,正交计数速率选择4×模式。执行HDEF指令后,就不能再改变计数器的设置,除非CPU进入停止模式。
(3)执行HSC指令时,CPU检查控制字节和有关的当前值和预置值。
3. 高速计数器指令的初始化
85
高速计数器指令的初始化的步骤如下:
(1)用首次扫描时接通一个扫描周期的特殊内部存储器SM0.1去调用一个子程序,完成初始化操作。因为采用了子程序,在随后的扫描中,不必再调用这个子程序,以减少扫描时间,使程序结构更好。
(2)在初始化的子程序中,根据希望的控制设置控制字(SMB37、SMB47、SMB57、SMB137、SMB147、SMB157),如设置SMB47=16#F8,则为:允许计数,写入新当前值,写入新预置值,更新计数方向为加计数,若为正交计数设为4×,复位和起动设置为高电平有效。
(3)执行HDEF指令,设置HSC的编号(0-5),设置工作模式(0-11)。如HSC的编号设置为1,工作模式输入设置为11,则为既有复位又有起动的正交计数工作模式。
(4)用新的当前值写入32位当前值寄存器(SMD38,SMD48,SMD58 ,SMD138,SMD148, SMD158)。如写入0,则清除当前值,用指令MOVD 0,SMD48实现。
(5)用新的预置值写入32位预置值寄存器(SMD42 ,SMD52, SMD62, SMD142 ,SMD152, SMD162)。如执行指令MOVD 1000,SMD52,则设置预置值为1000。若写入预置值为16#00,则高速计数器处于不工作状态。
(6)为了捕捉当前值等于预置值的事件,将条件CV=PV中断事件(事件13)与一个中断程序相联系。
(7)为了捕捉计数方向的改变,将方向改变的中断事件(事件14)与一个中断程序相联系。
(8)为了捕捉外部复位,将外部复位中断事件(事件15)与一个中断程序相联系。
(9)执行全局中断允许指令(ENI)允许HSC中断。
(10)执行HSC指令使S7-200对高速计数器进行编程。
(11)结束子程序。
【例5-4】高速计数器的应用举例。
(1)主程序
如图5-14所示,用首次扫描时接通一个扫描周期的特殊内部存储器SM0.1去调用一个子程序,完成初始化操作。
86
(2)初始化的子程序
如图5-15所示,定义HSC1的工作模式为模式11(两路脉冲输入的双相正交计
数,具有复位和起动输入功能),设置SMB47=16#F8(允许计数,更新当前值,更新预置值,更新计数方向为加计数,若为正交计数设为4×,复位和起动设置为高电平有效)。HSC1的当前值SMD48清零,预置值SMD52=50,当前值= 预设值,产生中断(中断事件13),中断事件13连接中断程序INT_0。
西门子PLCS高速计数器指令用法
高速计数器计数器 输入/输出操作数数据类型 N常数(0,1,2,3,4或5)字 内存范围错误S7-200 CPU指令支持SIMATIC/国际助记符 数据范围CPU内存中的指令大小编址内存 高速计数器(HSC)指令根据HSC特殊内存位的状态配置和控制高速计数 器。参数N指定高速计数器的号码。 高速计数器最多可配置为十二种不同的操作模式。 每台计数器在功能受支持的位置有专用时钟、方向控制、复原和起始输入。 对于双相计数器,两个时钟均可按最高速度运行。在正交模式中,您可以 选择一倍\(1x)或四倍(4x)的最高计数速率。所有的计数器按最高速率 运行,而不会相互干扰。 注释: CPU 221和CPU 222支持4台高速计数器 (HSC0、HSC3、HSC4、HSC5) CPU 221和CPU 222不支持HSC1和HSC2 CPU 224、CPU224XP、CPU 226支持6台高速计数器 (HSC0至HSC5) 您可以为每台高速计数器使用一条"高速计数器定义"指令。文档光盘中"提 示与技巧"中的第4条提示和第29条提示提供使用高速计数器的程序。 设置ENO = 0的错误条件: 0001 HSC在HDEF之前 0005 HSC/PLS同步 程序举例 LAD FBD
STL NETWORK 1 // 主程序 // 首次扫描时,调用SBR_0 LD SM0.1 CALL SBR_0 NETWORK 1 // 子程序0开始 // 配置HSC1 LD SM0.1 // 首次扫描时 MOVB 16#F8 SMB47 // 配置HSC1:// - 启用计数器 // - 写入新当前值
0-99手动计数器的设计要点
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ 第1章绪论 1.1 计数器介绍 本设计是根据我们所学习的单片机课程,按照课程要求进行的课程设计。单片机技术是一个不可或缺的技术,尤其是对于我们电气专业来说它是我们必须要掌握的技能之一,使我们未来工作和生活的根本。现在的社会是一个信息科技高速发展的社会,也是一个电子技术和微机计算机迅速发展的时代,单片机的档次和水平在不断的提高,其应用的领域和范围也越来越广,成为现代电子系统中最重要的智能化核心部分。 随着计数器技术的不断发展与进步,计数器的种类越来越多,应用的范围越来越广,随之而来的竞争也越来越激烈。过硬的技术也成为众多生产厂商竞争的焦点之一。厂商为了在竞争中处于不败之地,从而不断地改进技术,增加产品的种类。 现计数器的种类以增加到:电磁计数器、电子计数器、机械计数器(拉动机械计数器、转动机械计数器、按动机械计数器、测长机械计数器)、液晶计数器等。计数器的应用范围也遍布印刷、纺织、印染、针织、电缆、电讯、军工、轻工、机械、开关、断路器、矿山、实行多班制的纺织行业的织布机、织带机、制线、制带、造纸、制革、薄膜、高压开关电器产品、试验设备,印刷设备、短路器、医疗、纺织、机械、仓库和码头的货运、行人及车辆过往的数量计数、冶金、食品、国防、包装、配料、石油、化工、发电、机床、仪表、自动化控制等行业。 1.2 本次设计的要求 1) 上电时,数码管显示为00。 2) 利用单片机来制作一个手动计数器,在单片机的管脚上接一个轻触开关,作为手动计数的按钮,用单片机的I/O口接数码管,作为计数器,进行加计数显示。 3) 计数器计数到99后,再按计数按钮,则数码管从00重新开始计数。 1.3 本次设计的目的 1) 学习基本理论在实践中综合运用的初步经验,掌握电路设计的基本方法、设计步骤,培养综合设计与调试能力。 2) 掌握汇编语言程序设计方法。 3) 培养实践技能,提高分析和解决实际问题的能力。
实验三单片机定时计数器实验
实验三单片机定时/计数器实验 1、实验目的 1、学习计数器的使用方法。 2、学习计数器程序的编写。 3、学习定时器的使用方法。 4、学习定时器程序的编写。 5、熟悉汇编语言 2、实验说明 1、8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。将其数值按二进制数在P1口驱动LED灯上显示出来。 2、用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转 3、实验仪器和条件 计算机 伟福实验箱(lab2000P) 4、实验内容 1、8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。将其数值按二进制数在P1口驱动LED灯上显示出来。 2、外部事件计数脉冲由P3.4引入定时器T0。单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变。这就要求被采样电平至少维持一个完整的机器周期,以保证电平在变化之前即被采样。同时这就决定了输入波形的频率不能超过机器周期频率。 3、用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转 4、定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。TMOD
用于设置定时器/计数器的工作方式0-3,并确定用于定时还是用于计数。TCON 主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。 5、在例程的中断服务程序中,因为中断定时常数的设置对中断程序的运行起到关键作用,所以在置数前要先关对应的中断,置数完之后再打开相应的中断。 五、思考题 1、使用其他方式实现本实验功能; 2、改为门控方式外部启动计数; 3、如果改为定时间隔为200us,如何改动程序; 4、使用其他方式实现本实验功能,例如使用方式1,定时间隔为10ms,如何改动程序。 六、源程序修改原理及其仿真结果 思考题一:使用其他方式实现本实验功能 方法一: movTMOD, #00000100b;方式0,记数器 movTH0, #0 movTL0, #0 setbTR0;开始记数;由于方式0的特点是计数时使用TL0的低五位和八位 TH0,故用加法器a用“与”(ANL)取TL0的低五位,再用yiwei子程序实现TH0的低三位变为高三位与TL0相加,这样赋给P1时就是八位计数的结果。 Loop: mova,TL0 anla,#1fh
计数器工作原理及应用
计数器工作原理及应用 除了计数功能外,计数器产品还有一些附加功能,如异步复位、预置数(注意,有同步预置数和异步预置数两种。前者受时钟脉冲控制,后者不受时钟脉冲控制)、保持(注意,有保持进位和不保持进位两种)。虽然计数器产品一般只有二进制和十进制两种,有了这些附加功能,我们就可以方便地用我们可以得到的计数器来构成任意进制的计数器。下面我们举两个例子。在这两个例子中,我们分别用同步十进制加法计数器74LS160构成一个六进制计数器和一个一百进制计数器。 因为六进制计数器的有效状态有六个,而十进制计数器的有效状态有十个,所以用十进制计数器构成六进制计数器时,我们只需保留十进制计数器的六个状态即可。74LS160的十个有效状态是BCD编码的,即0000、0001、0010、0011、0100、0101、0110、0111、1000、1001[图5-1]。 图5-1 我们保留哪六个状态呢?理论上,我们保留哪六个状态都行。然而,为了使电路最简单,保留哪六个状态还是有一点讲究的。一般情况下,我们总是保留0000和1001两个状态。因为74LS160从100 1变化到0000时,将在进位输出端产生一个进位脉冲,所以我们保留了0000和1001这两个状态后,我们就可以利用74LS160的进位输出端作为六进制计数器的进位输出端了。于是,六进制计数器的状态循环可以是0000、0001、0010、0011、0100和1001,也可以是0000、0101、0110、0111、1000和1001。我们不妨采用0000、0001、0010、0011、0100和1001这六个状态。 如何让74LS160从0100状态跳到1001状态呢?我们用一个混合逻辑与非门构成一个译码器[图5. 3.37b],当74LS160的状态为0100时,与非门输出低电平,这个低电平使74LS160工作在预置数状态,当下一个时钟脉冲到来时,由于等于1001,74LS160就会预置成1001,从而我们实现了状态跳跃。
三菱高速计数器应用
三菱FX系列PLC计数器(C)内部计数器高速计数器 2016-02-03 来源:网络或本站原创 FX2N系列计数器分为内部计数器和高速计数器两类。 1.内部计数器 内部计数器是在执行扫描操作时对内部信号(如X、Y、M、S、T等)进行计数。内部输入信号的接通和断开时间应比PLC的扫描周期稍长。 (1)16位增计数器(C0~C199)??共200点,其中C0~C99为通用型,C100~C199共100点为断电保持型(断电保持型即断电后能保持当前值待通电后继续计数)。这类计数器为递加计数,应用前先对其设置一设定值,当输入信号(上升沿)个数累加到设定值时,计数器动作,其常开触点闭合、常闭触点断开。计数器的设定值为1~32767(16位二进制),设定值除了用常数K设定外,还可间接通过指定数据寄存器设定。 下面举例说明通用型16位增计数器的工作原理。如图1所示,X10为复位信号,当X10为ON时C0复位。X11是计数输入,每当X11接通一次计数器当前值增加1(注意X10断开,计数器不会复位)。当计数器计数当前值为设定值10时,计数器C0的输出触点动作,Y0被接通。此后既使输入X11再接通,计数器的当前值也保持不变。当复位输入X10接通时,执行RST复位指令,计数器复位,输出触点也复位,Y0被断开。 图1??通用型16位增计数器 (2)32位增/减计数器(C200~C234)??共有35点32位加/减计数器,其中C200~C219(共20点)为通用型,C220~C234(共15点)为断电保持型。这类计数器与16位增计数器除位数不同外,还在于它能通过控制实现加/减双向计数。设定值范围均为~(32位)。 C200~C234是增计数还是减计数,分别由特殊辅助继电器M8200~M8234设定。对应的特殊辅助继电器被置为ON时为减计数,置为OFF时为增计数。 计数器的设定值与16位计数器一样,可直接用常数K或间接用数据寄存器D的内容作为设定值。在间接设定时,要用编号紧连在一起的两个数据计数器。 如图2所示,X10用来控制M8200,X10闭合时为减计数方式。X12为计数输入,C200的设定值为5(可正、可负)。设C200置为增计数方式(M8200为OFF),当X12计数输入累加由4→5时,计数器的输出触点动作。当前值大于5时计数器仍为ON状态。只有当前值由5→4时,计数器才变为OFF。只要当前值小于4,则输出则保持为OFF状态。复位输入X11接通时,计数器的当前值为0,输出触点也随之复位。 图2? 32位增/减计数器 2.高速计数器(C235~C255) 高速计数器与内部计数器相比除允许输入频率高之外,应用也更为灵活,高速计数器均有断电保持功能,通过参数设定也可变成非断电保持。FX2N有C235~C255共21点高速计数器。适合用来做为高速计数器输入的PLC输入端口有X0~X7。X0~X7不能重复使用,即某一个输入端已被某个高速计数器占用,它就不能再用于
倒计数计数器程序
#include
计数器原理分析及应用实例
计数器原理分析及应用实例 除了计数功能外,计数器产品还有一些附加功能,如异步复位、预置数(注意,有同步预置数和异步预置数两种。前者受时钟脉冲控制,后者不受时钟脉冲控制)、保持(注意,有保持进位和不保持进位两种)。虽然计数器产品一般只有二进制和十进制两种,有了这些附加功能,我们就可以方便地用我们可以得到的计数器来构成任意进制的计数器。下面我们举两个例子。在这两个例子中,我们分别用同步十进制加法计数器74LS160构成一个六进制计数器和一个一百进制计数器。 因为六进制计数器的有效状态有六个,而十进制计数器的有效状态有十个,所以用十进制计数器构成六进制计数器时,我们只需保留十进制计数器的六个状态即可。74LS160的十个有效状态是BCD编码的,即0000、0001、0010、0011、0100、0101、0110、0111、1000、1001[图5-1]。 图5-1 我们保留哪六个状态呢?理论上,我们保留哪六个状态都行。然而,为了使电路最简单,保留哪六个状态还是有一点讲究的。一般情况下,我们总是保留0000和1001两个状态。因为74LS160从1001变化到0000时,将在进位输出端产生一个进位脉冲,所以我们保留了0000和1001这两个状态后,我们就可以利用74LS160的进位输出端作为六进制计数器的进位输出端了。于是,六进制计数器的状态循环可以是0000、0001、0010、0011、0100和1001,也可以是0000、0101、0110、0111、1000和1001。我们不妨采用0000、0001、0010、0011、0100
和1001这六个状态。 如何让74LS160从0100状态跳到1001状态呢?我们用一个混合逻辑与非门构成一个译码器[图5.3.37b],当74LS160的状态为0100时,与非门输出低电平,这个低电平使74LS160工作在预置数状态,当下一个时钟脉冲到来时,由于等于1001,74LS160就会预置成1001,从而我们实现了状态跳跃。 图5.3.37b用置数法将74160接成六进制计数器(置入1001) 比这个方案稍微繁琐一点的是利用74LS160的异步复位端。下面这个电路中[图5.3.34],也有一个由混合逻辑与非门构成的译码器。 图5.3.34用置零法将74LS160接成六进制计数器
c++计数器的使用方法
C++计数器的使用方法 在可视化编程时,常常会用到计数器,大部分人都会为所在的类添加一个成员变量,这个成员变量在程序中将会是全局变量,所以每次对他的操作,下次还会有记录,所以用它来当计数器。为什么不能在类中的函数里写一个变量来计数呢?因为在函数中的变量生存周期只在当前函数中存活,一旦这个函数运行完,这个变量会释放,下次再用的时候没有保留上次的值,所以当然不能做计数器啦。那么有人会问了,还有别的方法吗,答案是肯定的。请看下面两个简单的实例,观察运行结果 实例一 #include "stdafx.h" #include