在利用PLC进行运动控制或者需要统计编码器等输入的高速脉冲信号的时候,我们常常会用到高速计数器来进行计数,高速计数器能准确的统计输入的高频脉冲信号,它是不受PLC扫描周期影响的。小编给大家介绍一下西门子S7-200PLC高速计数器的介绍和使用。
高速计数器一共有四种类型,包括带有内部方向控制的单相计数器、带有外部方向控制的单相计数器、带有增减计数时钟的双相计数器、A/B相正交计数器;工作模式有12种,分别是模式0~模式11,高速计数器一共有6个,分别是HSC0~HSC5,不同的高速计数器都有其对应的输入点,并且对应不同的输入功能,如下图所示。
我们在使用的使用可以查表,比如说HSC1高速计数器,选择11模式的话,那么时钟A是I0.6,时钟B是I0.7,复位是I1.0,启动是I1.1。
S7-200高速计数器有两种方法实现:HSC指令和高速计数器向导,使用HSC指令编程,就要知道HSC指令和高速计数器相关的系统存储器。对于高速计数器的使用,在使用的时候首先要对高速计数器进行初始化,在程序编写的时候我们一般会用到几个指令。
HDEF:定义高速计数器,定义高速计数器的编号,以及这个高速计数器所使用的模式;
HSC:高速计数器指令,启动高速计数器。高速计数器相关的系统存储器如下图所示:
程序编写的时候在利用HDEF指令定义了计数器和模式后,还要定义高速计数器的控制字节,对上图的每个位进行排列组合就可以写出不同的控制字节。
一般来说常用的四种控制字节有:
16#F8(更新当前值,加计数);
16#F0(更新当前值,减计数);
16#B8(不更新当前值,加计数);
16#B0(不更新当前值,减计数)。
当我们想要向高速计数器载入新的当前值和预设值,要设置包含当前值和预设值的控制字节和特殊内存字节,然后要执行HSC指令,才能将新值传输至高速计数器。我们还可以使用HC0~HC5读取高速计数器的当前值,注意读取操作可以直接读取,但写入操作只能用HSC指令。比如使用的高速计数器是HSC0,那么当前值的存储器是SMD38,预置值的存储器是SMD42,读取HSC0的当前计数值时要用HC0进行读取。
对于高速计数器的使用,有时还会用到高速计数器的中断,高速计数器的中断事件有如下几种,我们可以根据使用的高速计数器进行选择使用。比如当HSC1的当前值等于预置值时进入中断程序执行,这时我们就要将HSC1和模式13通过中断连接指令ATCH定义好,并利用ENI指令使能该中断事件,当该事件触发的时候,才能进入中断程序进行执行。
总结一下以上所说的,高速计数器指令使用时,必须在扫描先对其进行初始化,初始化主要有以下几个步骤:
1、定义高速计数器的控制字节;
2、写入初始值和预置值;
3、使用HDEF指令定义高速计数器模式和选择高速计数器;
4、连接相应的中断并编写中断程序,如计数器当前值等于预设值中断,计数器方向改变中断,计数器外部复位中断等;
5、允许全局中断(ENI);
6、执行HSC指令。
这就是高速计数器的使用,你学会了吗?下一段就介绍一下高速计数器的编程案例,包括高速计数器的模拟控制、高速计数器的测速控制!
西门子PLC高速计数器的模拟和测速控制
在上一段给大家介绍了西门子S7-200PLC的高速计数器的基本使用方法,而一般来说高速计数器常用于模拟控制和测速控制,下面就分别讲一下这两个控制例子的程序设计和编程思路。
高速计数器的模拟控制是用S7-200PLC的高速计数器来累计来自模拟量/频率转换器(A/F)的脉冲来模拟电压值的。假设频率转换器将输入电压(0-10V)转换为矩形脉冲信号(0-2000Hz),再将此信号送入CPU高速记数器的输入端并累计脉冲数。当预置的间隔时间到后,通过累计脉冲数,计算出被测模拟电压值。
主程序:
主程序中在个扫描周期调用初始化程序SBR0,仅在个扫描周期标志位SM0.1=ON时由子程序实现初始化。
子程序:
在子程序中,首先把高速计数器HSC1的控制字节SMB47置为16#FC,其含义是:加计数,可更新预置值(PV),可更新当前值(CV),用指令HDEF把高速计数器HSC1置成工作模式0,即没有复位或起始输入,也没有外部的方向选择。当前值SMD48复位为0,预置值SMD52置为FFFF(十六进制),定时中断0间隔时间SMB34置为100ms,用ATCH指令将中断程序0分配给中断事件10,即定时中断0,并用ENI指令允许中断,用指令HSC启动高速计数器HSC1。
中断程序:
因为定时中断0间隔时间SMB34置为100ms,所以每100ms调用一次中断程序0,读出高速计数器的数值存到VD100,后将其置零。案例是通过频率转换器将输入电压(0-10V)转换为矩形脉冲信号(0-2000Hz),通过HSC1的计数值及变换关系(0-2000kHz对应于0-10V)来求被测的模拟电压值。SHR-DW为右移指令,将VD100的二进制位右移一位,相当于是除于2,也就是将VD100的脉冲数除以2,然后将低位的VB103输出到QB0,以便通过Q0.0~Q0.7的LED来显示被测的电压值,显示值与10倍真实电压值相对应。
关于计算部分,我们举例计算一下,假如计数值为200,200除以2是100,那么被测的模拟电压值就是10.0V。因为计数器100ms内共有200个计数脉冲,这正好与2000Hz-10V相对应,假设计数值为104,则实际电压值应为5.2V。注意:定时中断间隔时间可在5-255ms的范围内变化,我们可以通过设立一个标志,可根据需要来延长高速计数器的求值和复位时间,这样就有更长的扫描间隔,以便提高jingque度,同时也会带来更长的更新时间。
高速计数器的测速控制是利用高速计数器来实现测量转速,比如说测电机的转速。其中会利用到脉冲数和电机转速的计算。设计思路是主程序中调用子程序进行初始化,子程序中做高速计数器及中断的定义,中断程序中做转化计算部分,下面我们详细看一下程序。
主程序:
在PLC上电运行的个扫描周期执行一次子程序,用于程序运行的初始化设置。
子程序:
在子程序中,首先对VB0和VD0进行清零,VB0用于记录累加数据的次数,VD0累加数据的中间变量。接着设置高速计数器HSC0的控制字节为16#F8,即更新当前值,加计数,用指令HDEF把高速计数器HSC0置成工作模式0,为单相计数输入,没有外部控制功能。当前值SMD38复位为0,定时中断0间隔时间SMB34置为50ms,用ATCH指令将中断程序0分配给中断事件10,即定时中断0,并用ENI指令允许中断,用指令HSC启动高速计数器HSC0。
中断程序:
中断程序是每隔50ms扫描刷新一次,采用加法指令将高速计数器HC0的当前计数值和累加数据变量VD0相加一次,用于数据的累加,同时用递增指令对VB9进行加1,即记录累加的次数,这里再执行一次HSC指令是为了将初始值寄存器SMD38再次写入高速计数器HC0,使当前值为0,以便于下一次的定时采样。
当累加数据的次数等于32次时,执行运算指令,除法指令除以32是计算出累计脉冲数的平均值,乘以100是将平均值转化成以转/分单位的数据,并存到VD4中,用DI_I指令是将双整数转换成整数,存储到VW10中,VW10就是电机的转速,后面的传送指令是对VB0和VD0进行清零,用于下一次重新开始累加。