using CSZTM;
using GTN;
using Rs.Framework;
using Rs.Motion.Base;
using Rs.Motion.Base.Config;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static System.Runtime.CompilerServices.RuntimeHelpers;
namespace Rs.Motion.GugaoEcat
{
public class ZtmAxis:IAxis
{
public ZtmAxis(AxisConfig config)
{
Config = config;
}
private ZtmCardManager cardManager = ZtmCardManager.Instance;
private short m_apiResult = 0;
private double m_dfCommandPosition = 0.0;
private object m_objLocker = new object();
private bool m_bIsEncoderSetted = false;
private short core = 1;
///
/// 轴初始化,设置轴参数
///
///
public override ErrorCode Init()
{
LogHelper.Debug($"axis {Config.AxisName} init");
if (!cardManager.IsInitialized)
{
LogHelper.Debug($"axis {Config.AxisName}'s card IsInitialized");
return ErrorCode.CardNotInit;
}
HomeStatus = EHomeStatus.NotStart;
m_apiResult = ZTM.ZT_SetPOTOn(Config.CardMc, (short)Config.AxisId, (short)((Config.EnableEL&0x01)));
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetPOTOn ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetNOTOn(Config.CardMc, (short)Config.AxisId, (short)((Config.EnableEL>>1)&0x01));
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetNOTOn ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetPOTPol(Config.CardMc, (short)Config.AxisId, (short)Config.ElLogic);
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetPOTPol ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetNOTPol(Config.CardMc, (short)Config.AxisId, (short)Config.ElLogic);
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetNOTPol ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetAlarmOn(Config.CardMc, (short)Config.AxisId, (short)(Config.EnableAlarm));
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetAlarmOn ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetAlarmPol(Config.CardMc, (short)Config.AxisId, (short)Config.AlarmLogic);
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetAlarmPol ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetHomePol(Config.CardMc, (short)Config.AxisId, (short)Config.HomeOrgLogic);
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetHomePol ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetPulseRatio(Config.CardMc, (short)Config.AxisId, 1U, 1U);
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetPulseRatio ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetGearRatio(Config.CardMc, (short)Config.AxisId, 1U, 1U);
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetGearRatio ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetEncoderOn(Config.CardMc, (short)Config.AxisId, (short)(Config.EnableEncoder));
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetEncoderOn ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetPulseMode(Config.CardMc, (short)Config.AxisId, (short)Config.PulseOutMode, 0, 0);
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetPulseMode ret={m_apiResult}");
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetEncoderPol(Config.CardMc, (short)Config.AxisId, Config.PulseOutDir);
if (m_apiResult != 0)
{
LogHelper.Debug($"axis {Config.AxisName} ZT_SetEncoderPol ret={m_apiResult}");
return ErrorCode.Fail;
}
//m_LastErrorCode = ZTM.ZT_SetEncoderIndexPol(m_axis_config.CardMc, m_axis_config.AxisNum, m_axis_config.encoder_config.pulse_outindexdirection);
//if (m_LastErrorCode != 0)
//{
// return Err.FAIL;
//}
if(Config.EnableEncoder==0)
{
m_apiResult = ZTM.ZT_SetDCIAParam(Config.CardMc, (short)Config.AxisId, (short)(Config.PulseOneRound/200), Config.Current, 10, 0, 400, 10);
LogHelper.Debug($"axis {Config.AxisName} set current {Config.Current} ret={m_apiResult},xifen={(short)(Config.PulseOneRound / 200)}");
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
}
else
{
ZTM.ZT_SetEncoderIndexPol(Config.CardMc, (short)Config.AxisId, 0);
}
if(Config.NeedGoHome==0)
{
HomeStatus = EHomeStatus.Finished;
}
IsInitialized = true;
LogHelper.Debug($"axis {Config.AxisName} init ok");
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
{
m_apiResult = ZTM.ZT_SetServoOn(Config.CardMc, (short)Config.AxisId, 1);
if (m_apiResult != 0)
return ErrorCode.Fail;
return ErrorCode.Ok;
}
}
///
/// 去使能
///
///
public override ErrorCode Disable()
{
if (!cardManager.IsInitialized)
{
return ErrorCode.CardNotInit;
}
m_apiResult = ZTM.ZT_SetServoOn(Config.CardMc, (short)Config.AxisId, 0);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
return ErrorCode.Ok;
}
///
/// 停止运动
///
///
public override ErrorCode Stop()
{
if (!cardManager.IsInitialized)
{
return ErrorCode.CardNotInit;
}
m_apiResult = ZTM.ZT_Stop(Config.CardMc, (uint)(1<
/// 点位运动
///
///
///
///
///
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 / Config.AccTime / 1000000.0);
//float fDec = (float)(maxSpeedPulse / Config.DecTime / 1000000.0);
//float fAcc = (float)(fMaxVel / (accTime==0?Config.AccTime:accTime * 1000));
//float fDec = (float)(fMaxVel / (decTime==0?Config.DecTime:decTime * 1000));
float fAcc = (float)(fMaxVel / Config.AccTime / 1000.0);//pulse/ms2
float fDec = (float)(fMaxVel / Config.DecTime / 1000.0);//pulse/ms2
float fStart = (float)(minSpeedPulse / 1000.0);
float fStop = (float)(stopSpeedPulse / 1000.0);
m_apiResult = ZTM.ZT_MoveA(Config.CardMc, (short)Config.AxisId, (int)dfPos, fStart, fMaxVel, fAcc, fDec, fStop, (ushort)(Config.STime * 1000.0));
string msg = $"ZTM.ZT_MoveA({Config.CardMc}, {(short)Config.AxisId}, {(int)dfPos}, {fStart}, {fMaxVel}, {fAcc}, {fDec}, {fStop}, {(ushort)(Config.STime * 1000.0)})";
LogHelper.MoveLog($"{msg} ret={m_apiResult}");
//File.AppendAllText("move.txt", msg + "\r\n");
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
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 = GetPrfPosition(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(dfDistVal, 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
m_apiResult = ZTM.ZT_MoveR(Config.CardMc,
(short)Config.AxisId,
(int)dfPos,
fStart, //起跳速度
fMaxVel,
fAcc,
fDec,
fStop,
(ushort)(Config.STime * 1000.0));
if (m_apiResult != 0)
{
return ErrorCode.AxisMoveFail;
}
else
{
m_dfCommandPosition = 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);//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
if(dir==0)
{
m_apiResult = ZTM.ZT_JogM(Config.CardMc,
(short)Config.AxisId,
fStart, //起跳速度
fMaxVel,
fAcc,
fDec,
fStop,
(ushort)(Config.STime * 1000.0));
LogHelper.MoveLog($"ZT_JogM ret={m_apiResult}");
}
else
{
m_apiResult = ZTM.ZT_JogP(Config.CardMc,
(short)Config.AxisId,
fStart, //起跳速度
fMaxVel,
fAcc,
fDec,
fStop,
(ushort)(Config.STime * 1000.0));
LogHelper.MoveLog($"ZT_JogP ret={m_apiResult}");
}
return ErrorCode.Ok;
}
}
public override ErrorCode UpdateTargetPosition(double dfNewPosVal)
{
//if (!m_motion_card.IsInitialized)
//{
// return ErrorCode.CARD_NOT_INIT;
//}
//if (!m_bIsInitialized)
//{
// return ErrorCode.AXIS_NOT_INIT;
//}
//if (_eHomeStatus != EHomeStatus.FINISH)
//{
// return ErrorCode.NOT_GO_HOME;
//}
//bool isNotSafe = (dfNewPosVal > 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)
{
uint uiAllStatus = 0;
bIsEable = false;
if (!cardManager.IsInitialized)
{
return ErrorCode.CardNotInit;
}
m_apiResult = ZTM.ZT_GetServoStatus(Config.CardMc, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
else
{
bIsEable = ((uiAllStatus >> Config.AxisId) & 0x01) == 1;
return ErrorCode.Ok;
}
}
///
/// 判断轴是否回零
///
///
///
public override ErrorCode IsHomed(out bool bIsHomed)
{
uint uiAllStatus = 0;
bIsHomed = false;
if (!cardManager.IsInitialized)
{
return ErrorCode.CardNotInit;
}
m_apiResult = ZTM.ZT_GetHomed(Config.CardMc, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
bool bStatus = ((uiAllStatus >> Config.AxisId) & 0x01) == 1;
if (HomeStatus == EHomeStatus.Finished && bStatus)
{
bIsHomed = true;
}
return ErrorCode.Ok;
}
///
/// 判断轴是否已停止
///
///
///
public override ErrorCode IsStop(out bool bIsStop)
{
uint uiAllStatus = 0;
bIsStop = false;
if (!cardManager.IsInitialized)
{
return ErrorCode.CardNotInit;
}
ErrorCode errCode = IsEnable(out bool bEnable);
if (errCode > ErrorCode.Ok)
return errCode;
m_apiResult = ZTM.ZT_GetRunning(Config.CardMc, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
bIsStop = ((uiAllStatus >> Config.AxisId) & 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)
{
int pValue = 0;
m_apiResult = ZTM.ZT_GetPosPulse(Config.CardMc, (short)Config.AxisId, ref pValue);
if (m_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)
{
int pValue = 0;
m_apiResult = ZTM.ZT_GetPosEncoder(Config.CardMc, (short)Config.AxisId, ref pValue);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
err = PulseToMm(pValue, out dfEncPos);
}
}
catch
{
}
return err;
}
///
/// 获取编码器位置
///
///
///
public override ErrorCode GetDriverPosition(out double dfDriverPos)
{
dfDriverPos = 0.0;
return ErrorCode.Ok;
}
///
/// 获取轴允许的公差值
///
///
///
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 - m_dfCommandPosition;
if (Math.Abs(dfTolerance) < Math.Abs(dfTolerance2))
{
dfTolerance = dfTolerance2;
}
return ErrorCode.Ok;
}
///
/// 获取正限位状态
///
///
///
public override ErrorCode GetPelStatus(out bool bIsOn)
{
uint uiAllStatus = 0;
bIsOn = false;
m_apiResult = ZTM.ZT_GetPOT(Config.CardMc, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
bIsOn = ((uiAllStatus >> Config.AxisId) & 0x01) == 1;
return ErrorCode.Ok;
}
///
/// 获取负限位状态
///
///
///
public override ErrorCode GetNelStatus(out bool bIsOn)
{
uint uiAllStatus = 0;
bIsOn = false;
m_apiResult = ZTM.ZT_GetNOT(Config.CardMc, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
bIsOn = ((uiAllStatus >> Config.AxisId) & 0x01) == 1;
return ErrorCode.Ok;
}
///
/// 获取原点的状态
///
///
///
public override ErrorCode GetOrgStatus(out bool bIsOn)
{
uint uiAllStatus = 0;
bIsOn = false;
m_apiResult = ZTM.ZT_GetHome(Config.CardMc, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
bIsOn = ((uiAllStatus >> Config.AxisId) & 0x01) == 1;
return ErrorCode.Ok;
}
///
/// 获取报警状态
///
///
///
public override ErrorCode GetAlarmStatus(out bool bIsOn)
{
uint uiAllStatus = 0;
bIsOn = false;
m_apiResult = ZTM.ZT_GetAlarm(Config.CardMc, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
bIsOn = ((uiAllStatus >> Config.AxisId) & 0x01) == 1;
if (bIsOn)
{
HomeStatus = EHomeStatus.NotStart;
}
return ErrorCode.Ok;
}
///
/// 获取EMG状态
///
///
///
public override ErrorCode GetEmgStatus(out bool bIsOn)
{
short uiAllStatus = 0;
short uiAllLevel = 0;
bIsOn = false;
m_apiResult = ZTM.ZT_GetEMG(Config.CardMc, ref uiAllLevel, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
bIsOn = ((uiAllStatus >> Config.AxisId) & 0x01) == 1;
return ErrorCode.Ok;
}
///
/// 获取到位信号
///
///
///
public override ErrorCode GetInpStatus(out bool bIsOn)
{
uint uiAllStatus = 0;
bIsOn = false;
if (!cardManager.IsInitialized)
{
return ErrorCode.CardNotInit;
}
m_apiResult = ZTM.ZT_GetReached(Config.CardMc, ref uiAllStatus);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
bIsOn = ((uiAllStatus >> Config.AxisId) & 0x01) == 1;
return ErrorCode.Ok;
}
///
/// 获取EZ状态
///
///
///
public override ErrorCode GetEzStatus(out bool bIsOn)
{
bIsOn = false;
return ErrorCode.Ok;
}
///
/// 运动控制卡回零
///
///
public void DefaultHome(object obj)
{
HomeStatus = EHomeStatus.Start;
//MessageQueue.Instance.Insert(Config.AxisName + " Start home");
MmToPulse(Config.HomeOffset, out double dfHome_offset);
MmToPulse(Config.HomeSpeed, out double homeSpeedPulse);
m_apiResult = ZTM.ZT_SetHomeParam(Config.CardMc,
(short)Config.AxisId,
(short)Config.HomeDir,//回零方向
(short)Config.HomeMode,//回零模式
(float)((double)(homeSpeedPulse / 10) / 1000.0),//回零低速
(float)((double)homeSpeedPulse / 1000.0),//回零高速
(float)((homeSpeedPulse / 1000.0) / (Config.AccTime * 1000.0)),//回零加速度
(int)dfHome_offset, //回原后偏移
0);
//LogHelper.Debug($"axis {Config.AxisName} start home ,homedir={Config.HomeDir},homemode={Config.HomeMode}");
if (m_apiResult != 0)
{
HomeStatus = EHomeStatus.Fail;
}
m_apiResult = ZTM.ZT_Home(Config.CardMc, (uint)(1 << Config.AxisId));
if (m_apiResult != 0)
{
HomeStatus = EHomeStatus.Fail;
}
uint homed = 0;
Stopwatch timer = new Stopwatch();
timer.Restart();
uint homing = 0;
while (HomeStatus!= EHomeStatus.Finished && HomeStatus != EHomeStatus.Abort && timer.ElapsedMilliseconds < 2 * 60 * 1000)
{
//等待回原完成
ZTM.ZT_GetHoming(Config.CardMc, ref homing);
if(((homing>>Config.AxisId)&1)==0)
{
m_apiResult = ZTM.ZT_GetHomed(Config.CardMc, ref homed);
if (((homed >> Config.AxisId) & 1) == 1)
{
HomeStatus = EHomeStatus.Finished;
break;
}
}
}
}
///
/// 轴回原
///
///
///
public override ErrorCode Home()
{
if (!IsInitialized)
{
return ErrorCode.AxisNotInit;
}
if (HomeStatus == EHomeStatus.Homing || HomeStatus == EHomeStatus.Start)
{
//return ErrorCode.Ok;
}
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;
}
Thread t = t = new Thread(new ParameterizedThreadStart(DefaultHome));
t.Name = Config.AxisName + " homing thread";
t.Start(this);
return ErrorCode.Ok;
}
///
/// 回原完成
///
///
///
public override ErrorCode Zero(int iOrig)
{
if (!IsInitialized)
{
return ErrorCode.AxisNotInit;
}
m_apiResult = ZTM.ZT_SetPosPulse(Config.CardMc, (short)Config.AxisId, iOrig);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
m_apiResult = ZTM.ZT_SetPosEncoder(Config.CardMc, (short)Config.AxisId, iOrig);
if (m_apiResult != 0)
{
return ErrorCode.Fail;
}
else
{
return ErrorCode.Ok;
}
}
public void SetHomeFinished()
{
Zero(0);
//base.Set_Home_Finished();
}
///
/// 获取运动的目标位置
///
///
///
public override ErrorCode Get_Target_Position(out double dfTargetPos)
{
dfTargetPos = m_dfCommandPosition;
return ErrorCode.Ok;
}
public override ErrorCode SetPosCompare(ushort channel, double[] postions)
{
m_apiResult = ZTM.ZT_SetCompareParam(Config.CardMc, 0, 1, (short)Config.AxisId, (short)channel, 0, 1, (uint)Config.HcmpPulseWidth);
double[] poses = new double[postions.Length];
for (int i = 0; i < poses.Length; i++)
{
MmToPulse(postions[i], out poses[i]);
}
m_apiResult += ZTM.ZT_SetComparePos(Config.CardMc, 0, poses.Select(pos => (int)pos).ToArray(), (short)poses.Length);
short ret = -1;
do
{
ret = ZTM.ZT_GetHugeDataBusy(Config.CardMc);
}
while (ret != 0);
m_apiResult += ZTM.ZT_CompareBegin(Config.CardMc, 1 << 0);/*00000002,000004,000008*/
if (m_apiResult == 0)
return ErrorCode.Ok;
return ErrorCode.Fail;
}
public override ErrorCode ClearCompare(ushort uChannel)
{
short a = 0;
ZTM.ZT_GetCompareNum(Config.CardMc, 0, ref a);
m_apiResult = ZTM.ZT_CompareEnd(Config.CardMc, 1 << 0);
if (m_apiResult == 0)
return ErrorCode.Ok;
return ErrorCode.Fail;
}
}
}