任 强(沈阳延锋江森座椅有限责任公司,沈阳 110000)
基于C#的VFD闭环位置控制
任强
(沈阳延锋江森座椅有限责任公司,沈阳110000)
在位置控制闭环控制系统中如果采用PLC+VFD的方式,由PLC取得编码器或光栅尺的位置信息并进行处理,处理速度相对较慢,稳定性差。在一些大型的驱动产品设计当中普遍在变频器内部使用位置、速度闭环控制方式,这一方式很好的解决了定位精确与稳定性的问题。本文通过介绍使用C#编写闭环控制程序,使大家了解如何使用这种技术实现精确定位控制。
闭环控制;变频器;精确定位;位置控制
在变频驱动技术中,定位控制是一项比较复杂的技术。简单定位如使用凸轮开关触发,定位精度较差。如果需要精确定位,比较可靠的办法是采用电机旋转编码器、直线光栅尺编码器读取位置信息。编码器通过RS485总线方式与变频器的接口连接。变频器内部拥有中央处理单元(CPU)以及强大的内部程序系统,时刻高速处理接收到的数据,实时进行速度与位置控制。
下面以SEW公司的MOVEDRIVE系列变频器产品为例,介绍如何使用C#编程内部程序以实现驱动器精确定位的。MOVEDRIVE产品支持汇编语言与C#编程,基本指令与语法传统计算机语言基本一致。稍有不同的是,MOVEDRIVE中包含一些特殊指令、函数(如读取编码器指令,位置控制指令等),以及具有固定功能的变量。
在编写闭环程序之前需要了解控制方式。使用外部IO点进行控制时,需要了解相应IO的配置信息。变频器内部程序中某些IO点功能是固定的,比如DI00是设备紧停等。内部变量是以Hxxx的形式定义的,变量范围H000~H1024。每个变量由8个Bit位组成,某些变量的功能也是固定的比如H484.1设备使能。
变频器内部程序可以并行运行两个任务(TASK1、TASK2)。两个任务在编程的时候是写在一个程序当中,需要了解的是这两个任务同时运行,互不干涉。这样可以使用一个任务进行位置控制,另一个任务进行位置监控并控制IO点输出。
本文介绍一台具有正反两个方向,两个停止位设备的闭环程序开发过程。变频器的运行使用IO点控制,包括设备紧停、设备使能、正转、反转、手自动、定位点等。为了便于编程引用,将各个IO点定义为变量名方式。代码如下:
#defineE_ReglersperreDI00//定义变量指向DI00点,紧急停止
#defineE_FreigabeDI03//定义变量指向DI03点,设备使能
#defineE_Positions_BIT_0DI11//位置Bit0
#defineE_AutomatikDI15//手动、自动控制模式
#definePosition_1H1//定义变量Position1为H1,用于设定返回位置
#definePosition_2H2//定义变量Position2为H2,用于设定前进位置
程序中还可以对某些内部标志位的操作定义为子过程,便于编程时随时调用。例如:
#defineSet_Rechtslauf_BitSet(H484,2)//设置内部变量H484的第2个Bit位为1。H484变量为电机顺时针旋转标志位,通过设置该位来使电机正转。
#defineReset_linkslauf_BitClear(H484,2)//将内部变量H484的第2个Bit位清0,使电机正转停止。
对变量声明、定义之后,即可开始主程序编程。主程序开始使用固定的过程名“main()”。
在主程序中首先启动任务2(TASK2),TASK2是实时监控编码器数据,发现当前位置达到设定值即输出IO信号,使设备做出停止动作。TASK1是自动启动的,所以此时两个任务并行运行。接下来对定义的变量赋值。位置、速度设定:
Position_1=1299//对位置1(H1)赋值为位置值1299
Position_2=4322//对位置2(H2)赋值为位置值4322
下面开始编写程序核心部分,位置定位。代码如下:
Positionieren()//定义定位过程
If(PositionAngewaehlt&&E_Positionierfreigebe)//如果位置bit0 至bit中任一位不为0则继续执行。这三个bit位是PLC发过来的位置信息。
Merker_Istposition=Actpos_Abs//将设备当前位置存入变量
Merker_Sollposition=ZielpositionNeu//将目标位置存入变量
Fahrstrecke=(Merker_Sollposition_INKR-Merker_IstPosition)//计算当前位置与目标位置的差值
if(Fahrstrecke>1)//确定电机旋转方向,如果位置差值大于1则赋值给变量正转,否则赋值反转。
Drehrichtung=RECHTS//正转
Else
Drehrichtung=LINKS//反转
if(Drehrichtung==RECHTS)//如果正转则向下执行正转程序。
Reset_Linkslauf//清除H484.3,禁止反转操作
Set_Rechtslauf//设定H484.2,开动电机正转
if(E_Automatik&&(Fahrstrecke>Umschaltpunkt_1))//自动且目标与实际位置差值大于700
_SetSys(SS_N11,Eilgang)//则设定转速为1400转每分钟。
if((!E_Automatik&&(Fahrstrecke>Umschaltpunkt_2))||(E_ Automatik&&((Fahrstrecke<Umschaltpunkt_1)&&(Fahrstrecke>Umschaltpunkt_2))))//手动状态且目标与实际位置大于65,或自动状态目标与实际差值在65至70之间
_SetSys(SS_N11,Speed_Hand)//则转速设定为200转每分钟。
if((Fahrstrecke>Umschaltpunkt_3)&&(Fahrstrecke<Umschaltpunkt_2))//目标与实际差值在1~65之间
SetSys(SS_N11,Schleichgang)//则设定转速为50转每分钟。
上述代码是控制电机正转的过程,反转过程与正转类似。由于在主程序中启动了TASK2,TASK2在实时的监测着设备的位置信息,如果发现实际位置与目标位置在设定误差范围内,则输出相应的IO信息,停止电机运行。
目前在很多高端的变频器产品当中,都具有内部闭环控制功能。通过变频器内部编写的闭环控制程序,很好的解决了PLC+VFD系统的闭环控制定位精度、稳定性问题,同时使PLC控制程序编写更加简单,提高了编程效率。
任强,男,辽宁沈阳人,助理设备工程师,大专,研究方向:电气设备管理方向。