理论教育 高速计数器指令及其应用

高速计数器指令及其应用

时间:2023-06-27 理论教育 版权反馈
【摘要】:高速计数器还采用专用指令编程,进一步扩大了其应用的功能。PLC所能构成的高速计数器的数量、最高工作频率和高速计数器的工作方式等也是衡量可编程控制器性能的重要标准之一。每个高速计数器只能用一条HDEF指令。高速计数器指令如表4-2所示。高速计数器指令在 HSC特殊存储器位状态的基础上,配置和控制高速计数器,参数N指定高速计数器的标号。使用高速计数器定义指令来定义计数器的模式和输入。

高速计数器指令及其应用

相对普通计数器,高速计数器是对较高频率的信号计数的计数器,由于信号源来自机外,且需以短于扫描周期的时间响应,高速计数器都工作在中断方式,并配有多个专用的输入口用作计数信号输入及外启动、外复位及计数方向的控制。高速计数器一般都是可编程的,通过程序指定及设置控制字,同一高速计数器可工作在不同的工作模式上,为应用带来极大的灵活性。高速计数器还采用专用指令编程,进一步扩大了其应用的功能。在现代技术条件下,许多物理量可以方便地转变为脉冲列,脉冲的数量或频率可对应于转速、位移、温度等而用于控制,因此,高速计数成了工业控制中的重要手段。PLC所能构成的高速计数器的数量、最高工作频率和高速计数器的工作方式等也是衡量可编程控制器性能的重要标准之一。

可编程序控制器的普通计数器的计数过程与扫描工作方式有关,CPU通过每一扫描周期读取一次被测信号的方法来捕捉被测信号的上升沿,被测信号的频率较高时,会丢失计数脉冲。因此,普通计数器的工作频率很低,一般仅有几十赫兹。高速计数器可以对普通计数器无能为力的事件进行计数,CPU221和CPU222有4个高速计数器,其余的CPU有6个高速计数器,最高计数频率为30 kHz,可设置多达12种不同的操作模式。

1.高速计数器定义指令与高速计数器指令

高速计数器定义指令(HDEF)是为指定的高速计数器(HSC)设置一种工作模式(MODE)。每个高速计数器只能用一条HDEF指令。可以用每次扫描存储器位SM0.1,在第一个扫描周期调用包含HDEF指令的子程序来定义高速计数器。高速计数器指令(HSC)中的参数N用来设置高速计数器的编号。HSC与MODE为字节型常数,N为字型常数。高速计数器指令如表4-2所示。

表4-2 高速计数器指令

使HDEF指令出错(ENO=0)的条件:SM4.3(运行时间),0003(输入点冲突),0004(中断中的非法指令),000 A(HSC重新定义)。

使HSC指令出错(ENO=0)的条件:SM4.3(运行时间),0001(在HDEF之前使用HSC指令),0005(同时操作HSC和PLS)。

高速计数器指令(HSC)在 HSC特殊存储器位状态的基础上,配置和控制高速计数器,参数N指定高速计数器的标号。

高速计数器可以被配置为12种模式中的任意一种,如表4-3所示,每一个计数器都有时钟、方向控制,复位、启动的特定输入,对于双相计数器,两个时钟都可以运行在最高频率,在正交模式下,可以选择一倍速(1×)或者四倍速(4x)计数速率,所有计数器都可以运行在最高频率下而互不影响。

表4-3 高速计数器指令的有效操作数

高速计数器用于对 S7-200扫描速率无法控制的高速事件进行计数,高速计数器的最高计数频率取决于 CPU类型。

注意:CPU221和 CPU222支持 HSC0、HSC3、HSC4和 HSC5,不支持 HSC1和 HSC2;CPU224、CPU224XP和CPU226全部支持6个高速计数器,HSC0~HSC5。

一般来说,高速计数器被用作驱动鼓式计时器,该设备有一个安装了增量轴式编码器的轴,以恒定的速度转动,轴式编码器每圈提供一个确定的计数值和一个复位脉冲,用来自轴式编码器的时钟和复位脉冲作为高速计数器的输入。

高速计数器装入一组预置值中的第一个值,当前计数值小于当前预置值时,希望输出有效,计数器设置成在当前值等于预置值和有复位时产生中断。

随着每次当前计数值等于预置值的中断事件的出现,一个新的预置值被装入,并重新设置下一个输出状态;当出现复位中断事件时,设置第一个预置值和第一个输出状态,这个循环又重新开始。

由于中断事件产生的速率远低于高速计数器的计数速率,用高速计数器可实现精确控制,而与 PLC整个扫描周期的关系不大,采用中断的方法允许在简单的状态控制中用独立的中断程序装入一个新的预置值(同样的,也可以在一个中断服务程序中处理所有的中断事件)。

2.理解不同的高速计数器

对于操作模式相同的计数器,其计数功能是相同的。计数器共有4种基本类型:带有内部方向控制的单相计数器,带有外部方向控制的单相计数器,带有两个时钟输入的双相计数器和A/B相正交计数器。

注意:并不是所有计数器都能使用每一种模式,可以使用以下类型:无复位或启动输入、复位无启动输入或既有启动又有复位输入。

① 当激活复位输入端时,计数器清除当前值并一直保持到复位端失效。

② 当激活启动输入端时,它允许计数器计数;当启动端失效时,计数器的当前值保持为常数,并且忽略时钟事件。

③ 如果在启动输入端无效的同时,复位信号被激活,则忽略复位信号,当前值保持不变;如果在复位信号被激活的同时,启动输入端被激活,当前值被清除。

在使用高速计数器之前,应该用HDEF(高速计数器定义指令)为计数器选择一种计数模式,使用初次扫描存储器位SM0.1(该位仅在第一次扫描周期接通,之后断开)来调用一个包含HDEF指令的子程序。

3.高速计数器编程

可以使用指令向导来配置计数器,向导程序使用下列信息:计数器的类型和模式,计数器的预置值、计数器的初始值和计数器的初始方向,要启动HSC指令向导,可以在命令菜单窗口中选择“Tools > Instruction Wizard”,然后在向导窗口中选择HSC命令。

对高速计数器编程,必须完成下列的基本操作:定义计数器和模式,设置控制字节,设置初始值,设置预置值,指定并使能中断服务程序,激活高速计数器。

(1)定义计数器的模式和输入。

使用高速计数器定义指令来定义计数器的模式和输入。

表4-4中给出了与高速计数器相关的时钟、方向控制、复位和启动输入点,同一个输入点不能用于两个不同的功能,但是任何一个没有被高速计数器的当前模式使用的输入点,都可以被用作其他用途。例如,如果HSC0正被用于模式1,占用I0.0和I0.2,则I0.1可以被边缘中断或者HSC0占用。

注意:HSC0的所有模式(模式12除外)总是使用I0.0,HSCA的所有模式总是使用I0.3。因此,在使用这些计数器时,相应的输入点不能用于其他功能。

表4-4 高速计数器的输入点

续表

① HSC模式举例。

图4-28至图4-32给出了每种模式下计数器功能的时序图。

当使用模式6、7或者8时,如果增时钟输入的上升沿与减时钟输入的上升沿之间的时间间隔小于0.3 ms,高速计数器会把这些事件看作是同时发生的;如果这种情况发生,当前值不变,计数方向指示不变,只要增时钟输入的上升沿与减时钟输入的上升沿的时间间隔大于0.3 ms,高速计数器分别捕捉每个事件。在以上两种情况下,都不会有错误产生,计数器保持正确的当前值。

图4-28 模式0、1或2操作实例

图4-29 模式3、4或5操作实例

图4-30 模式6、7或8操作实例

图4-31 模式9、10或11操作实例(一倍正交模式)

图4-32 模式9、10或11操作实例(4倍正交模式)

② 复位和启动操作。

如图 4-33所示的复位和启动操作适用于使用复位和启动输入的多有模式,在复位和启动输入图中,复位输入和启动输入都被编程为电平有效。

图4-33 带有或者不带有启动输入的复位操作举例

对于高速计数器,有3个控制位用于配置复位和启动信号的有效状态,以及选择1倍速或者4倍速计数模式(仅用于正交计数器),这些位于各个计数器的控制字节中并且只有在HDEF指令执行时使用,在表4-5中给出了这些位的定义,图4-34给出了一个高速计数器定义指令的示例。

注意:在执行HDEF指令前,必须把这些控制位设定到希望的状态;否则,计数器对计数模式的选择取默认设置,一旦HDEF指令被执行,就不能再更改计数器的设置,除非是先进入“STOP”模式。

表4-5 位和启动输入的有效电平及1x/4x控制位

注:默认设置为复位输入和启动输入高电平有效,正交计数率为4倍速(4位输入时钟频率)。

图4-34 高速计数器定义指令

(2)设置控制字节。

只有定义了计数器和计数器模式,才能对计数器的动态参数进行编程,每个高速计数器都有一个控制字节,包括以下内容:

① 使能或者禁止计数器。

② 控制计数方向(只对模式0、1和2有效)或者对所有其他模式定义初始化计数方向。

③ 装载初始值。

④ 装载预置值。

在执行HSC指令时,要检验控制字节和相关的初始值和预置值,表4-6中对这些控制位逐一做了说明。

表4-6 HSC0~HSC5的控制位

(3)设置初始值和预设值。

每个高速计数器都有一个32位的初始值和一个32位的预置值,初始值和预置值都是符号整数,为了向高速计数器装入新的初始值和预置值,必须先设置控制字节,并且把初始值和预置值存入特殊存储器中,然后执行HSC指令,从而将新的值传送到高速计数器,表4-7对保存新的初始值和预置值的特殊存储器做了说明。

表4-7 HSC0、HSC1、HSC2、HSC3、HSC4和HSC5的新初始值和新预设值

除去控制字节和新的初始值与预置值保存字节外,每个高速计数器的当前值只能使用数据类型HC(高速计数器当前值)加上计数器号(0、1、2、3、4或5)的格式进行读取,见表4-8。可用读操作直接访问当前值,但是写操作只能用HSC指令来实现。

表4-8 HSC0、HSC1、HSC2、HSC3、HSC4和HSC5当前值

如果要指定高速计数器的地址,访问高速计数器的计数值,要使用存储器类型HC和计数器号(如HCO),高速计数器的当前值是只读值,只能以双字(32位)分配地址,如图4-35所示。

图4-35 访问高速计数器的当前值

(4)指定中断。

所有计数器模式都支持在 HSC的当前值等于预设值时产生一个中断事件,使用外部复位端的计数模式支持外部复位中断,除去模式0、1和2之外,所有计数器模式支持计数方向改变中断,每种中断条件都可以分别使能或者禁止。

注意:当使用外部复位中断时,不要写入初始值或者是在该中断服务程序中禁止再允许高速计数器,否则会产生一个致命错误。

每个高速计数器都有个状态字节,其中的状态存储位指出了当前计数方向,当前值是否大于或者等于预置值。表4-9给出了每个高速计数器状态位的定义。

只有在执行中断服务程序时,状态位才有效,监视高速计数器状态的目的是使其他事件能够产生中断以完成更重要的操作。

表4-9 HSC0~HSC5的状态位

(5)高速计数器的初始化步骤。

以HSC1为例,对初始化和操作步骤进行描述。在初始化描述中,假设S7-200已经置成“RUN”模式。因此,首次扫描标志位为真,如果不是这种情况,请记住在进入“RUN”模式后,对每一个高速计数器的HDEF指令只能执行一次。对一个高速计数器第二次执行HDEF指令时会引起运行错误,而且不能改变第一次执行HDEF指令时对计数器的设置。

注意:虽然下列步骤描述了如何分别改变计数方向、初始值和预置值,但完全可以在同一操作步骤中对全部或者任意参数组合进行设置,只要设置正确的 SMB47然后执行HSC指令即可。

① 初始化模式0、1或2。

HSC1为内部方向控制的单相增/减计数器(模式0、l或2),初始化步骤如下:

a.用初次扫描存储器位(SM0.1=1)调用执行初始化操作的子程序,由于采用了这样的子程序调用,后续扫描不会再调用这个子程序,从而减少了扫描时间,也提供了一个结构优化的程序。

b.初始化子程序中,根据所希望的控制操作对SMB47置数,即

SMB47=16#F8

产生如下结果:

◆ 允许计数。

◆ 写入新的初始值。

◆ 写入新的预置值。

◆ 置计数方向为增。

◆ 置启动和复位输入为高电平有效。

c.执行HDEF指令时,HSC输入置“1”,MODE输入置“0”(无外部复位或启动)或置“1”(有外部复位和无启动)或置“2”(有外部复位和启动)。

d.向SMD48(双字)写入所希望的初始值(若写入0,则清除)。

e.向SMD52(双字)写入所希望的预置值。

f.为了捕获当前值(CV)等于预置值(PV)中断事件,编写中断子程序,并指定“CV=PV”中断事件(事件号13)调用该中断子程序。

g.为了捕获外部复位事件,编写中断子程序,并指定外部复位中断事件(事件号15)调用该中断子程序。

h.执行全局中断允许指令(ENI)来允许HSC1中断。

i.执行HSC指令,使S7-200对HSC1编程。

j.退出子程序。

② 初始化模式3、4或5。

HSC1为外部方向控制的单相增/减计数器(模式3、4或5),初始化步骤如下:

a.用初次扫描存储器位(SM0.1=1)调用执行初始化操作的子程序,由于采用了这样的子程序调用,后续扫描不会再调用这个子程序,从而减少了扫描时间,也提供了一个结构优化的程序。

b.初始化子程序中,根据所希望的控制操作对SMB47置数,即

SMB47=16#F8

产生如下的结果:

◆ 允许计数。

◆ 写入新的初始值。

◆ 写入新的预置值。

◆ 置HSC的初始计数方向为增。(www.daowen.com)

◆ 置启动和复位输入为高电平有效。

c.执行HDEF指令时,HSC输入置“1”,MODE输入置“3”(无外部复位或启动)、置“4”(有外部复位和无启动)或置“5”(有外部复位和启动)。

d.向SMD48(双字)写入所希望的初始值(若写入“0”,则清除)。

e.向SMD52(双字)写入所希望的预置值。

f.为了捕获当前值(CV)等于预置值(PV)中断事件,编写中断子程序,并指定“CV=PV”中断事件(事件号13)调用该中断子程序。

g.为了捕获计数方向改变中断事件,编写中断子程序,并指定计数方向改变中断事件(事件号14)调用该中断子程序。

h.为了捕获外部复位事件,编写中断子程序,并指定外部复位中断事件(事件号15)调用该中断子程序。

i.执行全局中断允许指令(ENI)来允许HSCI中断。

j.执行HSC指令,使S7-200对HSC1编程。

k.退出子程序。

③ 初始化模式6、7或8。

HSC1为具有增/减两种始终的双向增/减计数器(模式6、7或8),初始化步骤如下:

a.用初次扫描存储器位(SM0.1=1)调用执行初始化操作的子程序,由于采用了这样的子程序调用,后续扫描不会再调用这个子程序,从而减少了扫描时间,也提供了一个结构优化的程序。

b.初始化子程序中,根据所希望的控制操作对SMB47置数,即

SMB47=16#F8

产生如下的结果:

◆ 允许计数。

◆ 写入新的初始值。

◆ 写入新的预置值。

◆ 置HSC的初始计数方向为增。

◆ 置启动和复位输入为高电平有效。

c.执行HDEF指令时,HSC 输入置“1”,MODE输入置“6”(无外部复位或启动)、置“7”(有外部复位和无启动)或置“8”(有外部复位和启动)。

d.向SMD48(双字)写入所希望的初始值(若写入“0”,则清除)。

e.向SMD52(双字)写入所希望的预置值。

f.为了捕获当前值(CV)等于预置值(PV)中断事件,编写中断子程序,并指定CV=PV中断事件(事件号13)调用该中断子程序。

g.为了捕获计数方向改变中断事件,编写中断子程序,并指定计数方向改变中断事件(事件号14)调用该中断子程序。

h.为了捕获外部复位事件,编写中断子程序,并指定外部复位中断事件(事件号15)调用该中断子程序。

i.执行全局中断允许指令(ENI)来允许HSC1中断。

j.执行HSC指令,使S7-200对HSC1编程。

k.退出子程序。

④ 初始化模式9、10或11。

HSC1为A/B相正交计数器(模式9、10或11),初始化步骤如下:

a.用初次扫描存储器位(SM0.1=1)调用执行初始化操作的子程序,由于采用了这样的子程序调用,后续扫描不会再调用这个子程序,从而减少了扫描时间,也提供了一个结构优化的程序。

b.初始化子程序中,根据所希望的控制操作对SMB47置数,如l×计数方式,即

SMB47=16#FC

产生如下的结果:

◆ 允许计数。

◆ 写入新的初始值。

◆ 写入新的预置值。

◆ 置HSC的初始计数方向为增。

◆ 置启动和复位输入为高电平有效。

又如4×计数方式,即

SMB47=16#F8

产生如下的结果:

◆ 允许计数。

◆ 写入新的初始值。

◆ 写入新的预置值。

◆ 置HSC的初始计数方向为增。

◆ 置启动和复位输入为高电平有效。

c.执行HDEF指令时,HSC输入置“1”,MODE输入置“9”(无外部复位或启动)、置“10”(有外部复位和无启动)或置“11”(有外部复位和启动)。

d.向SMD46(双字)写入所希望的初始值(若写入“0”,则清除)。

e.向SMD52(双字)写入所希望的预置值。

f.为了捕获当前值(CV)等于预置值(PV)中断事件,编写中断子程序,并指定“CV=PV”中断事件(事件号13)调用该中断子程序。

g.为了捕获计数方向改变中断事件,编写中断子程序,并指定计数方向改变中断事件(事件号14)调用该中断子程序。

h.为了捕获外部复位事件,编写中断子程序,并指定外部复位中断事件(事件号15)调用该中断子程序。

i.执行全局中断允许指令(ENI)来允许HSC1中断。

j.执行HSC指令,使S7-200对HSC1编程。

k.退出子程序。

⑤ 初始化模式12。

HSC0为PTO0产生的脉冲计数(模式12),初始化步骤如下:

a.用初次扫描存储器位(SM0.1=1)调用执行初始化操作的子程序,由于采用了这样的子程序调用,后续扫描不会再调用这个于程序,从而减少了扫描时间,也提供了一个结构优化的程序。

b.初始化子程序中,根据所希望的控制操作对SMB47置数,即

SMB47=16#F8

产生如下结果:

◆ 允许计数。

◆ 写入新的初始值。

◆ 写入新的预置值。

◆ 置计数方向为增。

◆ 置启动和复位输入为高电平有效。

c.执行HDEF指令时,HSC 输入置“1”,MODE输入置“12”。

d.向SMD38(双字)写入所希望的初始值(若写入“0”,则清除)。

e.向SMD42(双字)写入所希望的预置值。

f.为了捕获当前值(CV)等于预置值(PV)中断事件,编写中断子程序,并指定“CV=PV”中断事件(事件号13)调用该中断子程序。

g.执行全局中断允许指令(ENI)来允许HSC1中断。

h.执行HSC指令,使S7-200对HSC0编程。

i.退出子程序。

⑥ 改变模式0、1、2或者12的计数方向。

对具有内部方向(控制模式0、1、2或者12)的单相计数器HSC1,改变其计数方向的步骤如下:

a.向SMB47写入所需的计数方向,即

SMB47=16#90

产生如下结果:

◆ 允许计数。

◆ 置HSC计数方向为减。

SMB47=16#98

产生如下结果:

◆ 允许计数。

◆ 置HSC计数方向为增。

b.执行HSC指令,使S7-200对HSC1编程。

写入新的初始值(任何模式下):

在改变初始值时,迫使计数器处于非工作状态;当计数器被禁止时,它既不计数也不

产生中断,以下步骤描述了如何改变HSC1的初始值(任何模式下)。

i.向SMB47写入新的初始值的控制位,即

SMB47=16#C0

产生如下结果:

◆ 允许计数。

◆ 写入新的初始值。

ii.向SMD48(双字)写入所希望的初始值(若写入“0”,则清除)。

iii.执行HSC指令,使S7-200对HSC1编程。

(6)写入新的预置值(任何模式下)。

以下步骤描述了如何改变HSC1的预设值(任何模式)。

① 向SMB47写入允许写入新的预置值的控制位,即

SMB47=16#A0

产生如下结果:

◆ 允许计数。

◆ 写入新的预置值。

② 向SMD52(双字)写入所希望的预置值。

③ 执行HSC指令,使S7-200对HSC1编程。

(7)禁止HSC(任何模式下)。

以下步骤描述了如何禁止HSC1高速计数器(任何模式)。

① 写入SMB47以禁止计数,即

SMB47=16#00产生如下结果:禁止计数。

② 执行HSC指令,以禁止计数。

4.高速计数器应用举例

高速计数器应用如图4-36所示。

图4-36 高速计数器应用

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈