REGION FB284 #SINA_POS(HWIDSTW := #HWIDSTW, HWIDZSW := #HWIDZSW); END_REGION REGION 初始化模式 IF #SINA_POS.ActMode = 0 THEN #SINA_POS.ModePos := 7; END_IF; //默认为点动模式 REGION 硬限位 #SINA_POS.ConfigEPos.%X3 := TRUE; //默认开启硬限位模式 END_REGION END_REGION REGION 使能 #SINA_POS.EnableAxis := #EStop AND NOT #SINA_POS.AxisError AND NOT #SINA_POS.Error; REGION 已使能 #Enabled := #SINA_POS.AxisEnabled; END_REGION END_REGION REGION 停止 #SINA_POS.CancelTraversing := #EStop AND #Stop AND NOT #SINA_POS.AxisError AND NOT #SINA_POS.Error; END_REGION REGION 暂停 #SINA_POS.IntermediateStop := #EStop AND NOT #Pause; END_REGION REGION 复位 #SINA_POS.AckError := #Reset; END_REGION REGION 加速度 //先把负载加速度mm/s²或°/s²转换成负载LU/s² //再转换成电机LU/s² #SINA_POS.OverAcc := REAL_TO_INT(((#ACCVelocity * (#LUSetPoint / (#GearRatioNumerator / #GearRatioDenominator)) / #LoadSetPoint) / (#ACCVelocity_EPOS * 1000.0))* 100.0); //最后转换成OverAcc(%),相对于P2572=EPOS最大加速度(1000LU/s²)) END_REGION REGION 减速度 //先把负载减速度mm/s²或°/s²转换成负载LU/s² //再转换成电机LU/s² #SINA_POS.OverDec := REAL_TO_INT(((#DECVelocity * (#LUSetPoint / (#GearRatioNumerator / #GearRatioDenominator)) / #LoadSetPoint) / (#DECVelocity_EPOS * 1000.0))* 100.0 ); //最后转换成OverDec(%),相对于P2573=EPOS最大减速度(1000LU/s²) END_REGION REGION 点动速度设定 //先把点动速度mm/s或°/s转换成LU/min,再转换成1000LU/min #Velocity_JOG_EPOS := REAL_TO_INT((#Velocity_JOG * 60.0 * (#LUSetPoint / (#GearRatioNumerator / #GearRatioDenominator) / #LoadSetPoint) / 1000.0) * 100.0 / #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 * (#LUSetPoint / (#GearRatioNumerator / #GearRatioDenominator)) / 1000.0); #Velocity_Move_EPOS := REAL_TO_INT(#Velocity_Move * 60.0 / #LoadSetPoint ); //速度OverV倍率(%)恒定=100%,相对与Velocity_EPOS(最大转速(rpm/mim)P2571(1000L/min)) END_REGION REGION 目标位置 //把目标位置mm或°转换成LU #Position_EPOS := REAL_TO_DINT(#Position * #LUSetPoint / #LoadSetPoint); END_REGION REGION 运动模式 IF #SINA_POS.EnableAxis AND #SINA_POS.CancelTraversing AND #SINA_POS.IntermediateStop THEN REGION 点动 IF #SINA_POS.ActMode = 7 THEN #SINA_POS.Jog1 := #"JOG-"; #SINA_POS.Jog2 := #"JOG+"; IF #Velocity_JOG_EPOS >= 0 AND #Velocity_JOG_EPOS <= 199 THEN #SINA_POS.OverV := #Velocity_JOG_EPOS; //JOG的速度在V90里修改,OverV(%)是对比速度倍率缩放 //P2585=JOG1速度(1000LU/min) //P2586=JOG2速度(1000LU/min) END_IF; END_IF; IF #"JOG+" OR #"JOG-" THEN #SINA_POS.ModePos := 7; END_IF; END_REGION REGION 回零 IF #SINA_POS.ActMode = 4 OR #SINA_POS.ActMode = 5 THEN #SINA_POS.ExecuteMode := #Home; #SINA_POS.ConfigEPos.%X6 := #Origin; END_IF; IF #Home THEN IF #HomeMode THEN #SINA_POS.ModePos := 5; ELSE #SINA_POS.ModePos := 4; #SINA_POS.FlyRef := TRUE; END_IF; END_IF; REGION 回零完成 #Homed := #SINA_POS.AxisRef; END_REGION END_REGION REGION 绝对定位 IF #SINA_POS.ActMode = 2 THEN #SINA_POS.ExecuteMode := #Absolute; END_IF; 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; #SINA_POS.OverV := 100; //OverV(%)是对比速度倍率缩放,相对于#SINA_POS.Velocity //P2571=EPOS最大速度(1000LU/min) #SINA_POS.Position := #Position_EPOS; END_IF; END_IF; END_IF; END_REGION REGION 相对定位 IF #SINA_POS.ActMode = 1 THEN #SINA_POS.ExecuteMode := #Relative; END_IF; 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; #SINA_POS.OverV := 100; //OverV(%)是对比速度倍率缩放,相对于#SINA_POS.Velocity //P2571=EPOS最大速度(1000LU/min) #SINA_POS.Position := #Position_EPOS; END_IF; END_IF; END_IF; END_REGION REGION 定位完成 #PositionOk := #SINA_POS.AxisPosOk; END_REGION END_IF; END_REGION REGION 实际速度 //标准化 40000000h = 100% p2000(参考转速3000rpm/min) #ActVelocity := DINT_TO_REAL(#SINA_POS.ActVelocity) / LREAL_TO_REAL(1073741824.0) * 3000.0; //此结果为电机实际转速 #ActVelocity := #ActVelocity * (#GearRatioNumerator / #GearRatioDenominator); //此结果为负载实际转速 #ActVelocity := #ActVelocity * #LoadSetPoint / 60.0; //把rpm/min转成mm/s或°/s END_REGION REGION 实际位置 #ActPosition := DINT_TO_REAL(#SINA_POS.ActPosition) * (#GearRatioNumerator / #GearRatioDenominator); //电机实际位置单位LU,算出负载实际位置单位LU #ActPosition := #ActPosition * (#LoadSetPoint / #LUSetPoint); //根据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; IF #SINA_POS.OverAcc<0 OR #SINA_POS.OverAcc>100 OR #SINA_POS.OverDec<0 OR #SINA_POS.OverDec>100 OR #Velocity_JOG_EPOS <0 OR #Velocity_JOG_EPOS>199 THEN #Error := TRUE; #Status := 16#8203; END_IF; END_REGION