using GTN; using gts; using Newtonsoft.Json; using Rs.Framework; using Rs.Motion.Base; using Rs.Motion.Base.Config; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Rs.Motion.GugaoEcat { public class GugaoAxis:IAxis { public GugaoAxis(AxisConfig config) { Config = config; } private GugaoCardManager cardManager = GugaoCardManager.Instance; //private Logger logger = new Logger(); private short apiResult = 0; private object m_objLocker = new object(); private bool m_bIsEncoderSetted = false; private short core = 1; /// /// 轴初始化,设置轴参数 /// /// public override ErrorCode Init() { if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } HomeStatus = EHomeStatus.NotStart; if (Config.EnableEncoder == 1) { //同步EtherCat的位置信息到编码器和规划器 apiResult = mc_ecat.GTN_GetEcatEncPos(core, (short)Config.AxisId, out int pEncPos); if (apiResult != 0) { return ErrorCode.AxisInitFail; } apiResult = mc_ecat.GTN_SetPrfPos(core, (short)Config.AxisId, pEncPos); if (apiResult != 0) { return ErrorCode.AxisInitFail; } apiResult = mc_ecat.GTN_SetEncPos(core, (short)Config.AxisId, pEncPos); if (apiResult != 0) { return ErrorCode.AxisInitFail; } double auEncPos = (double)pEncPos; if(Config.AssistEncoder>0) { apiResult = mc_ecat.GTN_WriteAuEncPos(core, (short)Config.AssistEncoder, ref auEncPos, 1); if (apiResult != 0) { return ErrorCode.AxisInitFail; } } //同步 apiResult = mc_ecat.GTN_SynchAxisPos(core, 1 << Config.AxisId - 1); if (apiResult != 0) { return ErrorCode.AxisInitFail; } HomeStatus = EHomeStatus.Finished; } IsInitialized = true; return ErrorCode.Ok; } /// /// 反初始化轴,停止轴 /// /// public override ErrorCode Deinit() { IsInitialized = false; m_bIsEncoderSetted = false; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } else { Stop(); Disable(); return ErrorCode.Ok; } } /// /// 毫米转脉冲 /// 总长度/电机转一圈走的长度*电机转一圈的脉冲数 /// /// /// /// public override ErrorCode MmToPulse(double mm, out double pulse) { pulse = 0; if (Config.DistOneRound == 0.0) { return ErrorCode.UndefineDistanceOneRound; } else { pulse = mm / Config.DistOneRound * (double)Config.PulseOneRound; return ErrorCode.Ok; } } /// /// 脉冲转毫米 /// 总脉冲数/电机转一圈的脉冲数*电机转一圈走的长度 /// /// /// /// public override ErrorCode PulseToMm(double pulse, out double mm) { mm = 0; if (Config.PulseOneRound == 0) { return ErrorCode.UndefinePulseOneRound; } else { mm = pulse / (double)Config.PulseOneRound * Config.DistOneRound; return ErrorCode.Ok; } } /// /// 使能电机 /// /// public override ErrorCode Enable() { if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } else { apiResult = mc_ecat.GTN_ClrSts(core, (short)Config.AxisId, 1); if (apiResult != 0) return ErrorCode.Fail; apiResult = mc_ecat.GTN_AxisOn(core, (short)Config.AxisId); if (apiResult != 0) return ErrorCode.Fail; else return ErrorCode.Ok; } } /// /// 去使能 /// /// public override ErrorCode Disable() { if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } apiResult = mc_ecat.GTN_AxisOff(core, (short)Config.AxisId); if (apiResult != 0) { return ErrorCode.Fail; } return ErrorCode.Ok; } /// /// 停止运动 /// /// public override ErrorCode Stop() { bool smoothStop = true; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } //int axes = 1 << m_axis_config.AxisId; //int option = 1 << m_axis_config.AxisId; if(smoothStop) { apiResult = mc_ecat.GTN_Stop(core, 1 << Config.AxisId - 1, 0 << Config.AxisId - 1);//option 对应位1表示紧急停止 0 为平滑停止 } else { apiResult = mc_ecat.GTN_Stop(core, 1 << Config.AxisId - 1, 1 << Config.AxisId - 1);//option 对应位1表示紧急停止 0 为平滑停止 } if (apiResult != 0) return ErrorCode.Fail; else return ErrorCode.Ok; } /// /// 运动控制卡回零 /// /// public override ErrorCode Default_Home_Move() { //if (!m_motion_card.IsInitialized) //{ // return ErrorCode.CARD_NOT_INIT; //} //if (!m_bIsInitialized) //{ // return ErrorCode.AXIS_NOT_INIT; //} //ErrorCode err = MmToPulse(m_axis_config.HomeOffset, out double dfHome_offset); //if (err > ErrorCode.OK) //{ // return err; //} //err = MmToPulse(1.0, out double dfPulseRaio); //m_LastErrorCode = ZTM.ZT_SetHomePol(m_axis_config.CardMc, (short)m_axis_config.AxisId, (short)m_axis_config.HomeOrgLogic); //if (m_LastErrorCode != 0) //{ // return ErrorCode.FAIL; //} //MmToPulse(m_axis_config.HomeSpeed, out double homeSpeedPulse); ////acc vel/s mm/s pulse/s pulse/ms mm //MmToPulse(m_axis_config.MaxSpeed, out double maxSpeedPulse); //m_LastErrorCode = ZTM.ZT_SetHomeParam(m_axis_config.CardMc, // (short)m_axis_config.AxisId, // (short)m_axis_config.HomeDir, // (short)m_axis_config.HomeMode, // (float)((double)(homeSpeedPulse / 4) / 1000.0), // (float)((double)homeSpeedPulse / 1000.0), // (float)((maxSpeedPulse / 1000.0) / (m_axis_config.AccTime * 1000.0)), // (int)dfHome_offset, 0); //if (m_LastErrorCode != 0) //{ // return ErrorCode.FAIL; //} ////int axes = SetBit(0, (int)m_axis_config.AxisId, 1); ////m_LastErrorCode = ZTM.ZT_Home(m_axis_config.CardMc, (uint)axes); //if (m_LastErrorCode != 0) //{ // return ErrorCode.MOVE_FAIL; //} //else //{ // return ErrorCode.OK; //} return ErrorCode.Ok; } /// /// 绝对位置运动 /// /// /// /// /// public override ErrorCode MovePos(double dfPosVal, int nSpeedPercent = 100) { if (!cardManager.IsInitialized) return ErrorCode.CardNotInit; if (!IsInitialized) return ErrorCode.AxisNotInit; if (!SafeCheck()) return ErrorCode.Unsafe; nSpeedPercent = nSpeedPercent <= 0 ? 10 : nSpeedPercent; nSpeedPercent = nSpeedPercent > 100 ? 100 : nSpeedPercent; if (HomeStatus != EHomeStatus.Finished) return ErrorCode.AxisNotHome; if (Config.EnableSoftwareEL == 1 && (dfPosVal > Config.PelSoftwarePosition || dfPosVal < Config.NelSoftwarePosition))//启用软限位 { return ErrorCode.OutOfLimit; } ErrorCode err = GetEmgStatus(out bool bEmg); if (err > ErrorCode.Ok) return err; if (bEmg) return ErrorCode.Emergency; err = GetAlarmStatus(out bool bAlarm); if (err > ErrorCode.Ok) return err; if (bAlarm) return ErrorCode.Alarm; err = IsEnable(out bool bEnable); if (err > ErrorCode.Ok) return err; if (!bEnable) return ErrorCode.ServoOff; err = IsStop(out bool bStop); if (err > ErrorCode.Ok) return err; if (!bStop) return ErrorCode.Moving; err = MmToPulse(dfPosVal, out double dfPos); if (err > ErrorCode.Ok) return err; double dfPercent = (double)nSpeedPercent / 100.0; MmToPulse(Config.MaxSpeed, out double maxSpeedPulse); MmToPulse(Config.MinSpeed, out double minSpeedPulse); MmToPulse(Config.StopSpeed, out double stopSpeedPulse); float fMaxVel = (float)(maxSpeedPulse * dfPercent / 1000.0);//pulse/ms //float fAcc = (float)(maxSpeedPulse / (accTime == 0 ? Config.AccTime : accTime) / 1000000.0); //float fDec = (float)(maxSpeedPulse / (decTime == 0 ? Config.DecTime : decTime) / 1000000.0); float fAcc = (float)(maxSpeedPulse / Config.AccTime / 1000000.0); float fDec = (float)(maxSpeedPulse / Config.DecTime / 1000000.0); float fStart = (float)(minSpeedPulse / 1000.0); float fStop = (float)(stopSpeedPulse / 1000.0); apiResult = mc_ecat.GTN_PrfTrap(core, (short)Config.AxisId);//设置运动模式为点位运动 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_GetTrapPrm(core, (short)Config.AxisId, out mc_ecat.TTrapPrm trapPrm);//获取点位运动参数 if (apiResult != 0) { return ErrorCode.Fail; } trapPrm.acc = fAcc; trapPrm.dec = fDec; trapPrm.velStart = fStart; apiResult = mc_ecat.GTN_SetTrapPrm(core, (short)Config.AxisId, ref trapPrm);//设置点位运动参数 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_SetPos(core, (short)Config.AxisId, (int)dfPos);//设置目标位置 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_SetVel(core, (short)Config.AxisId, fMaxVel);//设置目标速度 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_Update(core, (1 << Config.AxisId - 1)); if (apiResult != 0) { return ErrorCode.Fail; } TargetPosition = dfPosVal; return ErrorCode.Ok; } /// /// 相对当前位置运动 /// /// /// /// /// public override ErrorCode MoveOffset(double dfDistVal, int nSpeedPercent = 100) { if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } if (!IsInitialized) { return ErrorCode.AxisNotInit; } if (!SafeCheck()) return ErrorCode.Unsafe; nSpeedPercent = nSpeedPercent <= 0 ? 10 : nSpeedPercent; nSpeedPercent = nSpeedPercent > 100 ? 100 : nSpeedPercent; double curPos = 0.0; ErrorCode err; if (Config.EnableEncoder == 1) { err = GetEncoderPosition(out curPos); if (err > ErrorCode.Ok) { return err; } } else { err = GetPrfPosition(out curPos); if (err > ErrorCode.Ok) { return err; } } double dstPos = curPos + dfDistVal; return MovePos(dstPos, nSpeedPercent); //bool isNotSafe = !bypassEL && (dstPos > Config.PelSoftwarePosition || dstPos < Config.NelSoftwarePosition) // && Config.PelSoftwarePosition != Config.NelSoftwarePosition; //if (isNotSafe) //{ // return ErrorCode.POSITION_OUT_OF_RANGE; //} err = GetEmgStatus(out bool bEmg); if (err > ErrorCode.Ok) { return err; } if (bEmg) { return ErrorCode.Emergency; } err = GetAlarmStatus(out bool bAlarm); if (err > ErrorCode.Ok) { return err; } if (bAlarm) { return ErrorCode.Alarm; } err = IsEnable(out bool bEnable); if (err > ErrorCode.Ok) { return err; } if (!bEnable) { return ErrorCode.ServoOff; } err = IsStop(out bool bStop); if (err > ErrorCode.Ok) { return err; } if (!bStop) { return ErrorCode.Moving; } //return MovePos(dstPos, nSpeedPercent, bypassEL); err = MmToPulse(dstPos, out double dfPos); if (err > ErrorCode.Ok) { return err; } double dfPercent = (double)nSpeedPercent / 100.0; MmToPulse(Config.MaxSpeed, out double maxSpeedPulse); MmToPulse(Config.MinSpeed, out double minSpeedPulse); MmToPulse(Config.StopSpeed, out double stopSpeedPulse); float fMaxVel = (float)(maxSpeedPulse * dfPercent / 1000.0);//pulse/ms float fAcc = (float)(maxSpeedPulse / Config.AccTime / 1000000.0);//pulse/ms2 float fDec = (float)(maxSpeedPulse / Config.DecTime / 1000000.0);//pulse/ms2 float fStart = (float)(minSpeedPulse / 1000.0);//pulse/ms float fStop = (float)(stopSpeedPulse / 1000.0);//pulse/ms apiResult = mc_ecat.GTN_PrfTrap(core, (short)Config.AxisId);//设置运动模式为点位运动 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_GetTrapPrm(core, (short)Config.AxisId, out mc_ecat.TTrapPrm trapPrm);//获取点位运动参数 if (apiResult != 0) { return ErrorCode.Fail; } trapPrm.acc = fAcc; trapPrm.dec = fDec; trapPrm.velStart = fStart; apiResult = mc_ecat.GTN_SetTrapPrm(core, (short)Config.AxisId, ref trapPrm);//设置点位运动参数 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_SetPos(core, (short)Config.AxisId, (int)dfPos);//设置目标位置 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_SetVel(core, (short)Config.AxisId, fMaxVel);//设置目标速度 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_Update(core, (1 << Config.AxisId - 1)); if (apiResult != 0) { return ErrorCode.Fail; } TargetPosition = dstPos; return ErrorCode.Ok; } public override ErrorCode MoveJog(short dir, int nSpeedPercent = 10) { if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } if (!IsInitialized) { return ErrorCode.AxisNotInit; } if (!SafeCheck()) return ErrorCode.Unsafe; nSpeedPercent = nSpeedPercent <= 0 ? 10 : nSpeedPercent; nSpeedPercent = nSpeedPercent > 100 ? 100 : nSpeedPercent; ErrorCode err = IsEnable(out bool bEnable); if (err > ErrorCode.Ok) { return err; } if (!bEnable) { return ErrorCode.ServoOff; } err = IsStop(out bool bStop); if (err > ErrorCode.Ok) { return err; } if (!bStop) { return ErrorCode.Moving; } err = GetEmgStatus(out bool bEmg); if (err > ErrorCode.Ok) { return err; } if (bEmg) { return ErrorCode.Emergency; } err = GetAlarmStatus(out bool bAlarm); if (err > ErrorCode.Ok) { return err; } if (bAlarm) { return ErrorCode.Alarm; } else { double dfPercent = (double)nSpeedPercent / 100.0; MmToPulse(Config.MaxSpeed, out double maxSpeedPulse); MmToPulse(Config.MinSpeed, out double minSpeedPulse); MmToPulse(Config.StopSpeed, out double stopSpeedPulse); float fMaxVel = (float)(maxSpeedPulse * dfPercent / 1000.0);//pulse/ms float fAcc = (float)(maxSpeedPulse / Config.AccTime / 1000000.0); float fDec = (float)(maxSpeedPulse / Config.DecTime / 1000000.0); float fStart = (float)(minSpeedPulse / 1000.0); float fStop = (float)(stopSpeedPulse / 1000.0); apiResult = mc_ecat.GTN_PrfJog(core, (short)Config.AxisId);//设置运动模式为JOG运动模式 if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_GetJogPrm(core, (short)Config.AxisId, out mc_ecat.TJogPrm jogPrm); if (apiResult != 0) { return ErrorCode.Fail; } jogPrm.acc = fAcc; jogPrm.dec = fDec; apiResult = mc_ecat.GTN_SetJogPrm(core, (short)Config.AxisId, ref jogPrm); if (apiResult != 0) { return ErrorCode.Fail; } if (dir == 0) { fMaxVel = -1 * fMaxVel; } apiResult = mc_ecat.GTN_SetVel(core, (short)Config.AxisId, fMaxVel); if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_Update(core, 1< m_axis_config.PelSoftwarePosition || dfNewPosVal < m_axis_config.NelSoftwarePosition) // && m_axis_config.PelSoftwarePosition != m_axis_config.NelSoftwarePosition; //if (isNotSafe) //{ // return ErrorCode.POSITION_OUT_OF_RANGE; //} //ErrorCode err = GetEmgStatus(out bool bEmg); //if (err > ErrorCode.OK) //{ // return err; //} //if (bEmg) //{ // return ErrorCode.EMERGENCY; //} //err = GetAlarmStatus(out bool bAlarm); //if (err > ErrorCode.OK) //{ // return err; //} //if (bAlarm) //{ // return ErrorCode.ALARM; //} //err = IsEnable(out bool bEnable); //if (err > ErrorCode.OK) //{ // return err; //} //if (bEnable) //{ // return ErrorCode.SERVO_OFF; //} //err = MmToPulse(dfNewPosVal, out double dfPos); //if (err > ErrorCode.OK) //{ // return err; //} //else //{ // m_dfCommandPosition = dfNewPosVal; // bool flag19 = m_LastErrorCode != 0; // if (flag19) // { // return ErrorCode.FAIL; // } // else // { // return ErrorCode.OK; // } //} return ErrorCode.Ok; } // Token: 0x06000256 RID: 598 RVA: 0x0000373C File Offset: 0x0000193C public override ErrorCode ChangeSpeed(double dfNewSpeed) { //if (!m_motion_card.IsInitialized) //{ // return ErrorCode.CARD_NOT_INIT; //} //if (!m_bIsInitialized) //{ // return ErrorCode.AXIS_NOT_INIT; //} //if (dfNewSpeed <= m_axis_config.MinSpeed) //{ // dfNewSpeed = m_axis_config.MinSpeed; //} //if (dfNewSpeed >= m_axis_config.MaxSpeed) //{ // dfNewSpeed = m_axis_config.MaxSpeed; //} return ErrorCode.Ok; } /// /// 判断轴是否使能 /// /// /// public override ErrorCode IsEnable(out bool bIsEable) { bIsEable = false; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } apiResult = mc_ecat.GTN_GetSts(core, (short)Config.AxisId, out int pSts, 1, out uint pClock); if (apiResult != 0) { return ErrorCode.Fail; } else { bIsEable = ((pSts >> 9) & 0x01) == 1; return ErrorCode.Ok; } } /// /// 判断轴是否回零 /// /// /// public override ErrorCode IsHomed(out bool bIsHomed) { bIsHomed = false; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } apiResult = mc_ecat.GTN_GetEcatHomingStatus(core, 1, out ushort homingStatus); if (apiResult != 0) { return ErrorCode.Fail; } bool bStatus = homingStatus == 3; if (HomeStatus == EHomeStatus.Finished && bStatus) { bIsHomed = true; } return ErrorCode.Ok; } /// /// 判断轴是否已停止 /// /// /// public override ErrorCode IsStop(out bool bIsStop) { bIsStop = false; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } apiResult = mc_ecat.GTN_GetSts(core, (short)Config.AxisId, out int pSts, 1, out uint pClock); if (apiResult != 0) { return ErrorCode.Fail; } bIsStop = ((pSts >> 10) & 0x01) == 0; return ErrorCode.Ok; } /// /// 判断运动是否到位 /// /// /// public override ErrorCode IsInPosition(out bool bIsInPosition) { bIsInPosition = false; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } if (0 == Config.EnableEncoder)//步进 { return IsStop(out bIsInPosition); } bool bIsStop = false; ErrorCode err = IsStop(out bIsStop); if (err > ErrorCode.Ok) { return err; } if (!bIsStop) { return ErrorCode.Ok; } bool bINP = false; err = GetInpStatus(out bINP); if (err > ErrorCode.Ok) { return err; } if (!bINP) { return ErrorCode.Ok; } double dfCurrentTorlance = 0.0; double dfTorlance = Math.Abs(Config.Tolerance); err = GetTolerance(out dfCurrentTorlance); if (Math.Abs(dfCurrentTorlance) <= dfTorlance) { bIsInPosition = true; } return err; } /// /// 获取规划位置 /// /// /// public override ErrorCode GetPrfPosition(out double dfCmdPos) { dfCmdPos = 0.0; ErrorCode err = ErrorCode.Fail; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } try { lock (m_objLocker) { apiResult = mc_ecat.GTN_GetPrfPos(core, (short)Config.AxisId, out double pValue, 1, out uint pClock); //apiResult = mc_ecat.GTN_ReadAuEncPos(core, (short)Config.AxisId, out double pValue, 1); if (apiResult != 0) { return ErrorCode.Fail; } err = PulseToMm(pValue, out dfCmdPos); } } catch { } return err; } /// /// 获取编码器位置 /// /// /// public override ErrorCode GetEncoderPosition(out double dfEncPos) { dfEncPos = 0.0; ErrorCode err = ErrorCode.Fail; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } if (0 == Config.EnableEncoder) { return GetPrfPosition(out dfEncPos); } try { lock (m_objLocker) { apiResult = mc_ecat.GTN_GetEncPos(core, (short)Config.AxisId, out double pValue, 1, out uint pClock);// ZTM.ZT_GetPosEncoder(m_axis_config.CardMc, (short)m_axis_config.AxisId, ref iPos); if (apiResult != 0) { return ErrorCode.Fail; } err = PulseToMm(pValue, out dfEncPos); } } catch { } return err; } public override ErrorCode GetAuEncoderPosition(out double dfCmdPos) { dfCmdPos = 0.0; ErrorCode err = ErrorCode.Fail; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } try { lock (m_objLocker) { apiResult = mc_ecat.GTN_ReadAuEncPos(core, (short)Config.AssistEncoder, out double pValue, 1); if (apiResult != 0) { return ErrorCode.Fail; } err = PulseToMm(pValue, out dfCmdPos); } } catch { } return err; } /// /// 获取编码器位置 /// /// /// public override ErrorCode GetDriverPosition(out double dfDriverPos) { dfDriverPos = 0.0; ErrorCode err = ErrorCode.Fail; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } try { lock (m_objLocker) { apiResult = mc_ecat.GTN_GetEcatEncPos(core, (short)Config.AxisId, out int pValue);// ZTM.ZT_GetPosEncoder(m_axis_config.CardMc, (short)m_axis_config.AxisId, ref iPos); if (apiResult != 0) { return ErrorCode.Fail; } err = PulseToMm(pValue, out dfDriverPos); } } catch { } return err; } /// /// 获取轴允许的公差值 /// /// /// public override ErrorCode GetTolerance(out double dfTolerance) { dfTolerance = 0.0; ErrorCode err; if (0 == Config.EnableEncoder) { return ErrorCode.Ok; } if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } err = GetPrfPosition(out double dfTargetPos); if (err > ErrorCode.Ok) { return err; } err = GetEncoderPosition(out double dfCurrentPos); if (err > ErrorCode.Ok) { return err; } dfTolerance = dfCurrentPos - dfTargetPos; double dfTolerance2 = dfCurrentPos - TargetPosition; if (Math.Abs(dfTolerance) < Math.Abs(dfTolerance2)) { dfTolerance = dfTolerance2; } return ErrorCode.Ok; } /// /// 获取正限位状态 /// /// /// public override ErrorCode GetPelStatus(out bool bIsOn) { bIsOn = false; apiResult = mc_ecat.GTN_GetSts(core, (short)Config.AxisId, out int pSts, 1, out uint pClock); if (apiResult != 0) { return ErrorCode.Fail; } bIsOn = ((pSts >> 5) & 0x01) == 1; return ErrorCode.Ok; } /// /// 获取负限位状态 /// /// /// public override ErrorCode GetNelStatus(out bool bIsOn) { bIsOn = false; apiResult = mc_ecat.GTN_GetSts(core, (short)Config.AxisId, out int pSts, 1, out uint pClock); if (apiResult != 0) { return ErrorCode.Fail; } bIsOn = ((pSts >> 6) & 0x01) == 1; return ErrorCode.Ok; } /// /// 获取原点的状态 /// /// /// public override ErrorCode GetOrgStatus(out bool bIsOn) { bIsOn = false; apiResult = mc_ecat.GTN_GetDi(core, mc_ecat.MC_HOME, out int pValue); if (apiResult != 0) { return ErrorCode.Fail; } bIsOn = (pValue >> Config.AxisId-1 & 0x01) == 1; return ErrorCode.Ok; } /// /// 获取报警状态 /// /// /// public override ErrorCode GetAlarmStatus(out bool bIsOn) { bIsOn = false; apiResult = mc_ecat.GTN_GetDi(core, mc_ecat.MC_ALARM, out int pValue); if (apiResult != 0) { return ErrorCode.Fail; } bIsOn = ((pValue >> Config.AxisId - 1) & 0x01) == 1; if (bIsOn) { HomeStatus = EHomeStatus.NotStart; } return ErrorCode.Ok; } /// /// 获取EMG状态 /// /// /// public override ErrorCode GetEmgStatus(out bool bIsOn) { bIsOn = false; apiResult = mc_ecat.GTN_GetSts(core, (short)Config.AxisId, out int pSts, 1, out uint pClock); if (apiResult != 0) { return ErrorCode.Fail; } bIsOn = ((pSts >> 8) & 0x01) == 1; return ErrorCode.Ok; } /// /// 获取到位信号 /// /// /// public override ErrorCode GetInpStatus(out bool bIsOn) { bIsOn = false; if (!cardManager.IsInitialized) { return ErrorCode.CardNotInit; } apiResult = mc_ecat.GTN_GetSts(core, (short)Config.AxisId, out int pSts, 1, out uint pClock); if (apiResult != 0) { return ErrorCode.Fail; } bIsOn = ((pSts >> 11) & 0x01) == 1; return ErrorCode.Ok; } /// /// 获取EZ状态 /// /// /// public override ErrorCode GetEzStatus(out bool bIsOn) { bIsOn = false; return ErrorCode.Ok; } /// /// 轴回原 /// /// /// public override ErrorCode Home() { //if (_eHomeStatus == EHomeStatus.HOMING || _eHomeStatus == EHomeStatus.START_TO_GO_HOME) //{ // return ErrorCode.OK; //} //if (!m_bIsInitialized) //{ // return ErrorCode.AXIS_NOT_INIT; //} //ErrorCode err = GetEmgStatus(out bool bEmg); //if (err > ErrorCode.OK) //{ // return err; //} //if (bEmg) //{ // return ErrorCode.EMERGENCY; //} //err = GetAlarmStatus(out bool bAlarm); //if (err > ErrorCode.OK) //{ // return err; //} //if (bAlarm) //{ // return ErrorCode.ALARM; //} //err = IsEnable(out bool bEnable); //if (err > ErrorCode.OK) //{ // return err; //} //if (!bEnable) //{ // return ErrorCode.SERVO_OFF; //} //err = IsStop(out bool bStop); //if (err > ErrorCode.OK) //{ // return err; //} //if (!bStop) //{ // return ErrorCode.NOT_STOP; //} //Thread t = t = new Thread(new ParameterizedThreadStart(DealHome)); //_eHomeStatus = EHomeStatus.START_TO_GO_HOME; //t.Name = base.AxisConfig.AxisName + " homing thread"; //t.Start(this); return ErrorCode.Ok; } /// /// XY轴回原 /// /// protected override void DealHome(object obj) { //try //{ // int step = 0; // ErrorCode err; // TimeoutUtil timer = new TimeoutUtil(); // _eHomeStatus = EHomeStatus.HOMING; // bool bGoHomePositive = m_axis_config.HomeDir == 1; // while (_eHomeStatus != EHomeStatus.ABORT) // { // Thread.Sleep(50); // switch (step) // { // case 0: // { // if (IsStop(out bool bStop) > ErrorCode.OK) // { // Abort_Go_Home(); // _eHomeStatus = EHomeStatus.FAIL; // return; // } // if (!bStop) // { // Abort_Go_Home(); // _eHomeStatus = EHomeStatus.FAIL; // return; // } // step++; // timer.Restart(); // break; // } // case 1: // { // bool bELSensorOn = false; // err = GetOrgStatus(out bool bHomeSensorOn); // if (err > ErrorCode.OK) // { // Abort_Go_Home(); // _eHomeStatus = EHomeStatus.FAIL; // return; // } // if (bGoHomePositive) // { // err = GetPelStatus(out bELSensorOn); // } // else // { // err = GetNelStatus(out bELSensorOn); // } // if (err > ErrorCode.OK) // { // Abort_Go_Home(); // _eHomeStatus = EHomeStatus.FAIL; // return; // } // if (Default_Home_Move() > ErrorCode.OK) // { // Abort_Go_Home(); // _eHomeStatus = EHomeStatus.FAIL; // return; // } // step = 2; // timer.Restart(); // break; // } // case 2: // { // err = IsStop(out bool bStop3); // if (err > ErrorCode.OK) // { // Abort_Go_Home(); // _eHomeStatus = EHomeStatus.FAIL; // return; // } // if (bStop3) // { // step++; // timer.Restart(); // } // else // { // if (timer.IsTimeout(50000L)) // { // Abort_Go_Home(); // _eHomeStatus = EHomeStatus.FAIL; // return; // } // } // break; // } // case 3: // { // Thread.Sleep(50); // if (Zero(0) > ErrorCode.OK) // { // _eHomeStatus = EHomeStatus.FAIL; // return; // } // double speedRatio = 0.2; // if (MoveOffset(m_axis_config.HomeOffset, (int)(speedRatio * 100.0), true) > ErrorCode.OK) // { // _eHomeStatus = EHomeStatus.FAIL; // return; // } // step++; // timer.Restart(); // break; // } // case 4: // { // err = IsStop(out bool bStop4); // if (err > ErrorCode.OK) // { // _eHomeStatus = EHomeStatus.FAIL; // return; // } // err = GetPelStatus(out bool bELSensorOn3); // if (err > ErrorCode.OK) // { // _eHomeStatus = EHomeStatus.FAIL; // return; // } // err = GetPelStatus(out bELSensorOn3); // if (err > ErrorCode.OK) // { // _eHomeStatus = EHomeStatus.FAIL; // return; // } // if (bELSensorOn3) // { // _eHomeStatus = EHomeStatus.FAIL; // return; // } // if (bStop4) // { // Thread.Sleep(50); // if (Zero(0) > ErrorCode.OK) // { // _eHomeStatus = EHomeStatus.FAIL; // return; // } // m_dfCommandPosition = 0.0; // _eHomeStatus = EHomeStatus.FINISH; // return; // } // else // { // if (timer.IsTimeout(50000L)) // { // _eHomeStatus = EHomeStatus.FAIL; // return; // } // } // break; // } // default: // _eHomeStatus = EHomeStatus.FAIL; // return; // } // } //} //catch (Exception ex) //{ // Debug.WriteLine("IAxis::fn_go_home " + ex.Message); //} //_eHomeStatus = EHomeStatus.FAIL; } /// /// 回原完成 /// /// /// public override ErrorCode Zero(int iOrig) { //if (!IsInitialized) //{ // return ErrorCode.AxisNotInit; //} //m_dfCommandPosition = 0.0; //m_LastErrorCode = ZTM.ZT_SetPosPulse(Config.CardMc, (short)Config.AxisId, iOrig); //if (m_LastErrorCode != 0) //{ // return ErrorCode.FAIL; //} //m_LastErrorCode = ZTM.ZT_SetPosEncoder(Config.CardMc, (short)Config.AxisId, iOrig); //if (m_LastErrorCode != 0) //{ // return ErrorCode.FAIL; //} //else //{ // return ErrorCode.OK; //} return ErrorCode.Ok; } public void SetHomeFinished() { Zero(0); //base.Set_Home_Finished(); } /// /// 获取运动的目标位置 /// /// /// public override ErrorCode Get_Target_Position(out double dfTargetPos) { dfTargetPos = TargetPosition; return ErrorCode.Ok; } public override ErrorCode SetPosCompare(ushort channel, double[] postions) { //apiResult = mc_ecat.GTN_PosCompareStatus(core, (short)channel, out mc_ecat.TPosCompareStatus pstatus); ClearCompare(channel); //apiResult = mc_ecat.GTN_PosCompareClear(core, (short)channel); //if(apiResult!=0) //return ErrorCode.Fail; //short permit = (short)(1 << channel); short[] permit = new short[2]; permit[0] = 0x02;//第一路位置比较 permit[1] = 0x04;//第二路位置比较 apiResult = mc_ecat.GTN_SetTerminalPermitEx(core,0, mc_ecat.MC_HSO, ref permit[0],1, 2); LogHelper.Debug($"mc_ecat.GTN_SetTerminalPermitEx({core},0, {mc_ecat.MC_HSO}, {permit},{(short)channel},0x01) ret={apiResult}"); //if (apiResult != 0) //return ErrorCode.Fail; //apiResult = mc_ecat.GTN_SetTerminalPermit(core, 0, mc_ecat.MC_HSO, (ushort)(1 << channel)); //if (apiResult != 0) // return ErrorCode.Fail; mc_ecat.TPosCompareMode cmpMode; apiResult = mc_ecat.GTN_GetPosCompareMode(core, (short)channel, out cmpMode); if (apiResult != 0) return ErrorCode.Fail; cmpMode.dimension = 1; cmpMode.mode = 0; cmpMode.outputMode = 0; cmpMode.outputPulseWidth =(ushort)Config.HcmpPulseWidth; cmpMode.sourceMode = 2; cmpMode.sourceX =(short) Config.AssistEncoder; string json=JsonConvert.SerializeObject(cmpMode); apiResult = mc_ecat.GTN_SetPosCompareMode(core, (short)channel, ref cmpMode); LogHelper.Debug($"mc_ecat.GTN_SetPosCompareMode({core}, 1 ,ref cmpMode); json={json} ret={apiResult}"); if (apiResult != 0) return ErrorCode.Fail; List posPulse = new List(); foreach (var data in postions) { GetAuEncoderPosition(out double curPos); //GetEncoderPosition(out double curPos); //double targetPos = curPos + data; double offset = data - curPos; MmToPulse(offset, out double pulse); posPulse.Add(pulse); } uint seg = 0; foreach (double data in posPulse) { mc_ecat.TPosCompareData cmpData = new mc_ecat.TPosCompareData(); cmpData.hso = 0x03; cmpData.gpo = 0x03; cmpData.pos = (int)data; cmpData.segmentNumber = seg++; mc_ecat.GTN_PosCompareData(1, (short)channel, ref cmpData); } apiResult = mc_ecat.GTN_PosCompareStart(core, (short)channel); if(apiResult!=0) return ErrorCode.Fail; mc_ecat.GTN_PosCompareSpace(core, (short)channel, out short space); return ErrorCode.Ok; } public override ErrorCode CompareStatus(out short _pStatus, out int _pCount) { _pStatus = 0; _pCount = 0; apiResult = mc_ecat.GTN_PosCompareStatus(core, 2, out mc_ecat.TPosCompareStatus status); string json = JsonConvert.SerializeObject(status); LogHelper.Debug($"mc_ecat.GTN_PosCompareStatus({core}, 2, out mc_ecat.TPosCompareStatus status);status_json{json}"); //apiResult = mc_pulse.GT_CompareStatus((short)Config.CardId, out _pStatus, out _pCount); if (apiResult != 0) { return ErrorCode.Fail; } return ErrorCode.Ok; } public override ErrorCode ComparePulse(ushort channel, bool dp = true) { short value = (short)channel; if (value != 0) { value = (short)(1 << channel); } apiResult = mc_ecat.GTN_PosComparePulse(core, 1, 1, 1, 0); LogHelper.Debug($"mc_ecat.GTN_PosComparePulse({core}, 1, 1, 1, 0) ret={apiResult}"); if (apiResult != 0) { return ErrorCode.Fail; } return ErrorCode.Ok; } public override ErrorCode ClearCompare(ushort uChannel) { apiResult = mc_ecat.GTN_PosCompareStop(core, (short)uChannel); if (apiResult != 0) { return ErrorCode.Fail; } apiResult = mc_ecat.GTN_PosCompareClear(core, (short)uChannel); if(apiResult!=0) { return ErrorCode.Fail; } return ErrorCode.Ok; } public override ErrorCode ClearAlarm() { apiResult = mc_ecat.GTN_ClrSts(core, (short)Config.AxisId, 1);//清除轴状态 if(apiResult != 0) { return ErrorCode.Fail; } return ErrorCode.Ok; } } }