当前位置:文档之家› 基于PLC的高速计数器

基于PLC的高速计数器

高速计数器
概述
本例叙述SIMATIC S7-200的高速计数器(HSC)的一种组态功能。

对来自传感性(如编码器)
信号的处理,高速计数器可采用多种不同的组态功能。

本例用脉冲输出(PLS)来为HSC产生高速计数信号,PLS可以产生脉冲串和脉宽调制信号,
例如用来控制伺服电机。

既然利用脉冲输出,必须选用CPU 224DC/DC/DC。

下面这个例子,展示了用HSC和脉冲输出构成一个简单的反馈回路,怎样编制一个程序来实
现反馈功能。

例图
224
高速计数器输入
程序和注释
本例描述了S7-200 DC/DC/DC 的高速计数器(HSC)的功能。

HSC 计数速度比PLC 扫描时间快得多,采用集成在CPU 224中的20K 硬件计数器进行计数。

总的来说,每个高速计数器需要10个字节内存用来存控制位、当前值、设定值、状态位。

本程序长度为91个字。

// 主程序:
// 在主程序中,首先将输出Q0.0置,0,因为这是脉冲输出功能的需要。

再初始化高速计
// 数器HSC0,然后调用子程序0和1。

// HSC0起动后具有下列特性:可更新CV 和PV 值,正向计数。

// 当脉冲输出数达到SMD72中规定的个数后,程序就终止。

// 主程序
LD SM0.1 // 首次扫描标志(SM0.1=1)。

R Q0.0,1 // 脉冲输出Q0.0复位(Q0.0=0)。

MOVB 16#F8,SMB37 // 装载HSC0的控制位:
// 激活HSC0,可更新CV ,可更新PV ,
// 可改变方向,正向计数。

// HSC 指令用这些控制位来组态HSC 。

MOVD 0,SMD38 // HSC0当前值(CV )为0。

MOVD 1000,SMD42 // HSC0的第一次设定值(PV )为1000。

HDEF 0,0 // HSC0定为模式0。

CALL 0 // 调用子程序0。

CALL 1 // 调用子程序1。

MEND // 主程序结束。

// * * * * * * * * * * * * * * * * * * * *
// 子程序0: …………. INT1 INT0 INT2 …………. …………. 1000 1500 1000
// 子程序0初始化,并激活脉冲输出(PLS)。

// 在特殊存储字节SMB67中定义脉冲输出特性:脉冲串(PT0),时基,可更新数值,激活PLS。

// SMW68定义脉冲周期,其值为时基的倍数。

// 最后,在SMD72中指定需要产生的脉冲数。

(SMD72)为内存双字,即4个字节)。

// 子程序0
SBR 0 // 子程序0
MOVB 16#8D,SMB67 // 装载脉冲输出(PLS0)的控制位:PT0,时基1ms,可更新,激活。

MOVW 1,SMW68 // 脉冲周期1ms。

MOVD 30000,SMD72 // 产生30000个脉冲。

PLS 0 // 起动脉冲输出(PLS 0),从输出端Q0.0输出脉冲。

RET // 子程序0结束。

// * * * * * * * * * * * * * * * * * * * *
// 子程序1:
// 子程序1起动HSC0,并把中断程序0分配给中断事件12(HSC 0的当前值CV等于设定值PV)。

// 只要脉冲计数值(当前值CV)达到设定值(PV),该事件就会发生。

// 最后,允许中断。

// 子程序1
SBR 0 // 子程序1。

ATCH 0,12 // 把中断程序0分配给中断事件12(HSC 0的CV=PV)。

ENI // 允许中断。

HSC 0 // 按主程序中对HSC 0的初始组态特性,起动HSC0。

RET // 子程序1结束。

// * * * * * * * * * * * * * * * * * * * *
// 中断程序0:
// 当HSC 0的计数脉冲达到第一,设定值1000时,调用中断程序0。

// 输出端Q0.1置位(Q0.1=1)。

// 为HSC 0设置新的设定值1500(第二设定值)
// 用中断程序1取代中断程序0,分配给中断事件12(HSC 0的CV=PV)。

// 中断程序0
INT 0 // 中断程序0。

S Q0. 1,1 // 输出端Q0.1置位(Q0.1=1)。

MOVB 16#A0,SMB37 // 重置HSC 0的控制位,仅更新设定值(PV)。

MOVD 1500,SMD42 // HSC 0的下一个设定值为1500(第二设定值)。

ATCH 1,12 // 用中断程序1取代中断程序0,分配给中断事件12。

HSC 0 // 起动HSC 0,,为其装载新的设定值。

RETI // 中断程序0结束。

// * * * * * * * * * * * * * * * * * * * *
// 中断程序1:
// 当HSC 0的计数脉冲达到第二设定值1500时,调用中断程序1。

// 输出端Q0.2置位(Q0.2=1)。

// HSC 0改成减计数,并置新的设定值1000(第三设定值)。

// 用中断程序2取代中断程序1,分配给中断事件12(HSC 0的CV=PV)。

// 中断程序1:
INT 1 // 中断程序1。

S Q0. 2,1 // 输出端Q0.2置位(Q0.2=1)。

MOVB 16#B0,SMB37 // 重置HSC 0的控制位,更新设定值,并改成减计数(反向计数)。

MOVD 1000,SMD42 // HSC 0的下一个设定值为1000(第三设定值)。

ATCH 2,12 // 用中断程序2取代中断程序1,分配给中断事件12。

HSC 0 // 起动HSC 0,,为其装载新的设定值和方向。

RETI // 中断程序1结束。

// * * * * * * * * * * * * * * * * * * * *
// 中断程序2:
// 当HSC 0的计数脉冲达到第三设定值1000时,调用中断程序2。

// 输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。

// HSC 0的计数方向重新改为正向(增计数),并将当前计数值置为0,而设定值PV保持不变(1000)。

// 重新把中断程序0分配给中断事件12,程序再次起动HSC 0运行。

// 当脉冲数达到SMD72中规定的个数后,程序就终止。

// 中断程序2:
INT 2 // 中断程序2。

R Q0. 1,2 // 输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。

MOVB 16#D8,SMB37 // 重置HSC 0的控制位,更新CV,改为正向计数(增计数)。

MOVD 0,SMD38 // HSC 0的当前值复位(CV=0)。

ATCH 0,12 // 把中断程序0分配给中断事件12。

HSC 0 // 重新起动HSC 0。

RETI // 中断程序2结束。

相关主题