发表于:2011-01-06 17:06:07
1楼
S7-200的高速计数器(HSC)的使用概述本例叙述SIMATICS7-200的高速计数器(HSC)的一种组态功能。对来自传感性(如编码器)信号的处理,高速计数器可采用多种不同的组态功能。本例用脉冲输出(PLS)来为HSC产生高速计数信号,PLS可以产生脉冲串和脉宽调制信号,例如用来控制伺服电机。既然利用脉冲输出,必须选用CPU224DC/DC/DC。下面这个例子,展示了用HSC和脉冲输出构成一个简单的反馈回路,怎样编制一个程序来实现反馈功能。例图程序和注释本例描述了S7-200DC/DC/DC的高速计数器(HSC)的功能。HSC计数速度比PLC扫描时间快得多,采用集成在CPU224中的20K硬件计数器进行计数。总的来说,每个高速计数器需要10个字节内存用来存控制位、当前值、设定值、状态位。本程序长度为91个字。//主程序://在主程序中,首先将输出Q0.0置,0,因为这是脉冲输出功能的需要。再初始化高速计//数器HSC0,然后调用子程序0和1。//HSC0起动后具有下列特性:可更新CV和PV值,正向计数。//当脉冲输出数达到SMD72中规定的个数后,程序就终止。//主程序LDSM0.1//首次扫描标志(SM0.1=1)。RQ0.0,1//脉冲输出Q0.0复位(Q0.0=0)。MOVB16#F8,SMB37//装载HSC0的控制位://激活HSC0,可更新CV,可更新PV,//可改变方向,正向计数。//HSC指令用这些控制位来组态HSC。MOVD0,SMD38//HSC0当前值(CV)为0。MOVD1000,SMD42//HSC0的第一次设定值(PV)为1000。HDEF0,0//HSC0定为模式0。CALL0//调用子程序0。CALL1//调用子程序1。MEND//主程序结束。//********************//子程序0://子程序0初始化,并激活脉冲输出(PLS)。//在特殊存储字节SMB67中定义脉冲输出特性:脉冲串(PT0),时基,可更新数值,激活PLS。//SMW68定义脉冲周期,其值为时基的倍数。//最后,在SMD72中指定需要产生的脉冲数。(SMD72)为内存双字,即4个字节)。//子程序0SBR0//子程序0MOVB16#8D,SMB67//装载脉冲输出(PLS0)的控制位:PT0,时基1ms,可更新,激活。MOVW1,SMW68//脉冲周期1ms。MOVD30000,SMD72//产生30000个脉冲。PLS0//起动脉冲输出(PLS0),从输出端Q0.0输出脉冲。RET//子程序0结束。//********************//子程序1://子程序1起动HSC0,并把中断程序0分配给中断事件12(HSC0的当前值CV等于设定值PV)。//只要脉冲计数值(当前值CV)达到设定值(PV),该事件就会发生。//最后,允许中断。//子程序1SBR0//子程序1。ATCH0,12//把中断程序0分配给中断事件12(HSC0的CV=PV)。ENI//允许中断。HSC0//按主程序中对HSC0的初始组态特性,起动HSC0。RET//子程序1结束。//********************//中断程序0://当HSC0的计数脉冲达到第一,设定值1000时,调用中断程序0。//输出端Q0.1置位(Q0.1=1)。//为HSC0设置新的设定值1500(第二设定值)//用中断程序1取代中断程序0,分配给中断事件12(HSC0的CV=PV)。//中断程序0INT0//中断程序0。SQ0.1,1//输出端Q0.1置位(Q0.1=1)。MOVB16#A0,SMB37//重置HSC0的控制位,仅更新设定值(PV)。MOVD1500,SMD42//HSC0的下一个设定值为1500(第二设定值)。ATCH1,12//用中断程序1取代中断程序0,分配给中断事件12。HSC0//起动HSC0,,为其装载新的设定值。RETI//中断程序0结束。//********************//中断程序1://当HSC0的计数脉冲达到第二设定值1500时,调用中断程序1。//输出端Q0.2置位(Q0.2=1)。//HSC0改成减计数,并置新的设定值1000(第三设定值)。//用中断程序2取代中断程序1,分配给中断事件12(HSC0的CV=PV)。//中断程序1:INT1//中断程序1。SQ0.2,1//输出端Q0.2置位(Q0.2=1)。MOVB16#B0,SMB37//重置HSC0的控制位,更新设定值,并改成减计数(反向计数)。MOVD1000,SMD42//HSC0的下一个设定值为1000(第三设定值)。ATCH2,12//用中断程序2取代中断程序1,分配给中断事件12。HSC0//起动HSC0,,为其装载新的设定值和方向。RETI//中断程序1结束。//********************//中断程序2://当HSC0的计数脉冲达到第三设定值1000时,调用中断程序2。//输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。//HSC0的计数方向重新改为正向(增计数),并将当前计数值置为0,而设定值PV保持不变(1000)。//重新把中断程序0分配给中断事件12,程序再次起动HSC0运行。//当脉冲数达到SMD72中规定的个数后,程序就终止。//中断程序2:INT2//中断程序2。RQ0.1,2//输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。MOVB16#D8,SMB37//重置HSC0的控制位,更新CV,改为正向计数(增计数)。MOVD0,SMD38//HSC0的当前值复位(CV=0)。ATCH0,12//把中断程序0分配给中断事件12。HSC0//重新起动HSC0。RETI//中断程序2结束。