REGION FB284 //Call SINA_POS #SINA_POS(HWIDSTW := #HWIDSTW, HWIDZSW := #HWIDZSW); //SINA_POS 无错误 #SINA_POS_NotError := NOT #SINA_POS.AxisError AND NOT #SINA_POS.Error; //默认开启硬限位 //正负极限接在驱动器上 #SINA_POS.ConfigEPos.%X3 := TRUE; //原点接在PLC上 #SINA_POS.ConfigEPos.%X6 := #Origin; //回零完成 #Homed := #SINA_POS.AxisRef; //定位完成 #PositionOk := #SINA_POS.AxisPosOk; //电机动作前置条件 #MotionAllow := #SINA_POS.EnableAxis AND #SINA_POS.CancelTraversing AND #SINA_POS.IntermediateStop; END_REGION REGION 一些常量 //齿轮比=分子/分母 #GearRatio := #GearRatioNumerator / #GearRatioDenominator; //电机端LU=负载转一圈对应LU * 齿轮比分母 / 齿轮比分子 #LUServoMotor := #LUSetPoint / #GearRatio; //单位位移LU/单位角度LU #LUPitch := #LUServoMotor / #LoadPitch; END_REGION REGION 使能停止暂停复位 //使能 #SINA_POS.EnableAxis := #EStop AND #SINA_POS_NotError; //已使能 #Enabled := #SINA_POS.AxisEnabled; //停止 #SINA_POS.CancelTraversing := #EStop AND #Stop AND #SINA_POS_NotError; //暂停 #SINA_POS.IntermediateStop := #EStop AND NOT #Pause; //复位 #SINA_POS.AckError := #Reset; END_REGION REGION 加速度 //先把负载加速度mm/s²或°/s²转换成负载LU/s² //再转换成电机LU/s² #SINA_POS.OverAcc := REAL_TO_INT(((#ACCVelocity * #LUPitch) / (#ACCVelocity_EPOS * #AccUnits))* #Percentage_Real); //最后转换成OverAcc(%),相对于P2572=EPOS最大加速度(1000LU/s²)) END_REGION REGION 减速度 //先把负载减速度mm/s²或°/s²转换成负载LU/s² //再转换成电机LU/s² #SINA_POS.OverDec := REAL_TO_INT(((#DECVelocity * #LUPitch) / (#DECVelocity_EPOS * #DecUnits))* #Percentage_Real ); //最后转换成OverDec(%),相对于P2573=EPOS最大减速度(1000LU/s²) END_REGION REGION 点动速度设定 //先把点动速度mm/s或°/s转换成LU/min,再转换成1000LU/min #Velocity_JOG_EPOS := REAL_TO_INT(((#Velocity_JOG * #MinuteToSecond * #LUPitch) / #VelocityUnits) * #Percentage_Real / #Velocity_JOG12); //再转换成OverV倍率(%),相对与Velocity_JOG12(P2585/P2586) END_REGION REGION 定位速度 //先把点动速度mm/s或°/s转换成rpm/min //再由转速rpm/min转换成EPOS速度1000LU/min #SINA_POS.Velocity := REAL_TO_DINT(#Velocity_Move_EPOS * #LUServoMotor / #VelocityUnits); #Velocity_Move_EPOS := REAL_TO_INT(#Velocity_Move * #MinuteToSecond / #LoadPitch ); //速度OverV倍率(%)恒定=100%,相对与Velocity_EPOS(最大转速(rpm/mim)P2571(1000L/min)) END_REGION REGION 目标位置 //把目标位置mm或°转换成LU #Position_EPOS := REAL_TO_DINT(#Position * #LUSetPoint / #LoadPitch); END_REGION REGION 模式赋值 REGION 相对定位 IF NOT #SINA_POS.Jog1 AND NOT #SINA_POS.Jog2 THEN IF NOT #Absolute AND #"Limit+" AND #"Limit-" THEN IF #Relative THEN #SINA_POS.ModePos := 1; END_IF; END_IF; END_IF; END_REGION REGION 绝对定位 IF NOT #SINA_POS.Jog1 AND NOT #SINA_POS.Jog2 THEN IF NOT #Relative AND #"Limit+" AND #"Limit-" THEN IF #Absolute AND #SINA_POS.AxisRef THEN #SINA_POS.ModePos := 2; END_IF; END_IF; END_IF; END_REGION REGION 回零 //绝对值回零通过V-ASSISTANT软件设置 //以下回零只针对增量式编码器 IF #Home THEN CASE #HomeMode OF 1: #SINA_POS.ModePos := 4; #SINA_POS.FlyRef := FALSE; 2: #SINA_POS.ModePos := 4; #SINA_POS.FlyRef := TRUE; 3: #SINA_POS.ModePos := 5; ELSE #SINA_POS.ModePos := 4; #SINA_POS.FlyRef := FALSE; END_CASE; END_IF; END_REGION REGION 点动模式 IF NOT #Absolute AND NOT #Relative THEN IF #"JOG+" OR #"JOG-" THEN IF #JOGMode THEN #SINA_POS.ModePos := 8;//距离点动 ELSE #SINA_POS.ModePos := 7;//速度点动 END_IF; END_IF; END_IF; END_REGION END_REGION REGION 运动模式 IF #MotionAllow THEN CASE #SINA_POS.ActMode OF 0: // 初始化模式 #SINA_POS.ModePos := 7;//默认为速度点动模式 1: // 相对定位 #SINA_POS.OverV := 100; //OverV(%)是对比速度倍率缩放,相对于#SINA_POS.Velocity //P2571=EPOS最大速度(1000LU/min) #SINA_POS.Position := #Position_EPOS; #SINA_POS.ExecuteMode := #Relative; 2: // 绝对定位 #SINA_POS.OverV := 100; //OverV(%)是对比速度倍率缩放,相对于#SINA_POS.Velocity //P2571=EPOS最大速度(1000LU/min) #SINA_POS.Position := #Position_EPOS; #SINA_POS.ExecuteMode := #Absolute; 3: // 连续运行 待开发 #SINA_POS.ModePos := 0; 4..5: // 4=主动/被动回参考点 5=直接设定参考点 #SINA_POS.ExecuteMode := #Home; 6: // 程序步 待开发 #SINA_POS.ModePos := 0; 7: // 速度点动模式 #SINA_POS.Jog1 := #"JOG-"; #SINA_POS.Jog2 := #"JOG+"; IF NOT #Velocity_JOG_EPOS_Error THEN #SINA_POS.OverV := #Velocity_JOG_EPOS; //JOG的速度在V90里修改,OverV(%)是对比速度倍率缩放 //P2585=JOG1速度(1000LU/min) //P2586=JOG2速度(1000LU/min) END_IF; 8: //距离点动模式 待开发 #SINA_POS.ModePos := 0; //点动距离通过V-ASSISTANT软件设置 ELSE //待开发 #SINA_POS.ModePos := 0; END_CASE; END_IF; END_REGION REGION 实际速度 //标准化 40000000h = 100% p2000(参考转速3000rpm/min) #ActVelocity := DINT_TO_REAL(#SINA_POS.ActVelocity) / #ActVelocityPrgMax * #ReferenceVelocity; //此结果为电机实际转速rpm/min #ActVelocity := #ActVelocity * #GearRatio; //此结果为负载实际转速rpm/min #ActVelocity := #ActVelocity * #LoadPitch / #MinuteToSecond; //把rpm/min转成mm/s或°/s END_REGION REGION 实际位置 #ActPosition := DINT_TO_REAL(#SINA_POS.ActPosition) / #LUPitch; //电机实际位置单位LU,算出负载实际位置单位LU //根据V90驱动器里设置的伺服精度,算出实际位置mm或°。 END_REGION REGION 错误和报警 #AxisError := #SINA_POS.AxisError; #AxisErrorCode := #SINA_POS.ActFault; #AxisAlarm := #SINA_POS.AxisWarn; #AxisAlarmCode := #SINA_POS.ActWarn; #Error := #SINA_POS.Error; #Status := #SINA_POS.Status; #OverAccError := #SINA_POS.OverAcc < #Percentage_Zero OR #SINA_POS.OverAcc > #Percentage_Int; #OverDecError := #SINA_POS.OverDec < #Percentage_Zero OR #SINA_POS.OverDec > #Percentage_Int; #Velocity_JOG_EPOS_Error := #Velocity_JOG_EPOS < #Percentage_Zero OR #Velocity_JOG_EPOS > #Percentage_Double; IF #OverAccError OR #OverDecError OR #Velocity_JOG_EPOS_Error THEN #Error := TRUE; #Status := #SetValueErrorCode; END_IF; END_REGION