private void waitCurrentRunFinish() { Thread.Sleep(2); //读取输入信息 ReadInput(); //int es = GetDi(Define.DiEmergencyStop); //if (es == 1) //{ // EmgStop(); // CancleCommPause(); // source.Cancel(); // source.Token.ThrowIfCancellationRequested(); //} lock (cardActLock) { short rtn; ushort axisSts; rtn = GT400.GT_GetSts(out axisSts); runningError("当前轴状态状态查询", rtn); bool showTmp = true; //判断是否在运动中 while (0 != (axisSts & 0x400)) { rtn = GT400.GT_GetSts(out axisSts); runningError("当前轴状态状态查询", rtn); if (showTmp) { showTmp = false; } Thread.Sleep(10); } } }
public void ImdStop() { lock (cardActLock) { GT400.GT_SmthStp(); } }
public override void SetDo(int ch, int data) { int idx = ch / 16; short rtn = 0; runningError("控制卡复位", rtn); if (idx == 0) { lock (cardActLock) { ushort result; if (data == 1) { result = 0; //因为高低电平是相反的,所以输出相反。 } else { result = 1; } rtn = GT400.GT_ExOptBit((ushort)ch, result); } runningError("单点位输出", rtn); } base.SetDo(ch, data); }
public override void CloseCom() { base.CloseCom(); try { if (getCardInfoThread != null) { if (!getCardInfoThread.Join(1000)) { getCardInfoThread.Abort(); } getCardInfoThread = null; } lock (cardActLock) { short rtn = GT400.GT_Close(); Error("GT_Close", rtn); } isLink = false; } catch { // ignored } }
public void EmgStop() { lock (cardActLock) { GT400.GT_AbptStp(); //GT400.GT_EStpMtn(); } }
/// <summary> /// 等待所有轴运行完成 /// </summary> public void WaitAllRunFinish() { short rtn; lock (cardActLock) { rtn = GT400.GT_Axis(1); waitCurrentRunFinish(); } Thread.Sleep(10); lock (cardActLock) { rtn = GT400.GT_Axis(2); waitCurrentRunFinish(); } }
/// <summary> /// 读取输入信息 /// </summary> private void ReadInput() { ushort ioInput; short rtn; lock (cardActLock) { rtn = GT400.GT_ExInpt(out ioInput); } runningError("io输入读取", rtn); //固高数据为低电平为1,实际要取反 ioInput = (ushort)~ioInput; mutexShMem.WaitOne(); // 共有存储在存储器 int ofst = DMI_OFST + 0 * Marshal.SizeOf(typeof(short)); //将读取到的PLC数据写入到相应的内存区域 Marshal.WriteInt16(mapAddrPtr, ofst, (short)ioInput); // 解除 mutexShMem.ReleaseMutex(); }
public bool InitCard() { try { short rtn; lock (cardActLock) { //连接控制器 rtn = GT400.GT_Open(); Error("打开控制卡", rtn); if (0 != rtn) { isLink = false; return(false); } rtn = GT400.GT_Reset(); runningError("控制卡复位", rtn); if (0 != rtn) { isLink = false; return(false); } ushort sense = 0xffff; rtn = GT400.GT_LmtSns(sense); //设置限位开关触发电平 runningError("设置限位开关电平", rtn); if (0 != rtn) { isLink = false; return(false); } } for (int i = 0; i < axisNum; i++) { lock (cardActLock) { //设置轴参数 rtn = GT400.GT_Axis((ushort)(i + 1)); //切换到测试轴 runningError("设置当前轴", rtn); if (0 != rtn) { isLink = false; return(false); } rtn = GT400.GT_ClrSts(); //清除不正常状态 runningError("GT_ClrSts", rtn); if (0 != rtn) { isLink = false; return(false); } rtn = GT400.GT_StepDir(); //脉冲方式为‘脉冲+方向’,必须与驱动器的设置一致 runningError("GT_StepDir", rtn); if (0 != rtn) { isLink = false; return(false); } //闭环模式下必须设置PID rtn = GT400.GT_AxisOn(); //伺服使能,如果驱动器没有上伺服,请检查:1、测试轴是否是axis 1,2、端子板及驱动器是否上电 runningError("GT_AxisOn", rtn); if (0 != rtn) { isLink = false; return(false); } rtn = GT400.GT_PrflS(); //rtn = GT400.GT_PrflT(); //T曲线 runningError("当前轴设定为S曲线", rtn); if (0 != rtn) { isLink = false; return(false); } } } isLink = true; return(true); } catch (Exception ex) { Util.Notify("控制卡打开失败 错误原因" + ex.Message); //Notify("控制卡打开失败 错误原因" + ex.Message); CloseCom(); isLink = false; return(false); } }
/// <summary> /// 指定轴回原点 /// </summary> /// <param name="axisIndex"></param> public void Homing(int axisIndex, int pos, double acc, double speed) { short rtn; ushort axisSts; int prfPos; if (isLink == false) { Util.Notify("控制卡未连接"); return; } lock (cardActLock) { Util.Notify(axisIndex + "开始回原点"); rtn = GT400.GT_Axis((ushort)axisIndex); //该命令一般不用检测是否正确执行 rtn = GT400.GT_GetSts(out axisSts); runningError("当前轴状态状态查询", rtn); if (0 != (axisSts & 0x400)) { Util.Notify("轴动作中"); return; } rtn = GT400.GT_ClrSts(); //清除当前轴异常状态 runningError("当前轴状态异常状态清除", rtn); if (0 != rtn) { return; } //在当前位置基础上,以S曲线向前运动指定个脉冲 rtn = GT400.GT_SetMAcc(acc); //rtn = GT400.GT_SetAcc(acc); runningError("当前轴加速度设置", rtn); rtn = GT400.GT_SetVel(speed); runningError("当前轴目标速度设置", rtn); rtn = GT400.GT_SetPos(pos); runningError("当前轴目标位置设置", rtn); rtn = GT400.GT_SetJerk(0.087); runningError("当前轴加加速度设置", rtn); rtn = GT400.GT_Update(); runningError("当前轴参数更新", rtn); Thread.Sleep(10); waitCurrentRunFinish(); rtn = GT400.GT_GetPrfPos(out prfPos); runningError("当前轴位置读取", rtn); //通过判断 pos正负来确定返回位置 if (pos >= 0) { prfPos -= 100; } else { prfPos += 100; } rtn = GT400.GT_ClrSts(); //清除不正常状态 runningError("当前轴状态异常状态清除", rtn); rtn = GT400.GT_SetPos(prfPos); runningError("当前轴目标位置设置", rtn); rtn = GT400.GT_Update(); runningError("当前轴参数更新", rtn); //MyNotify.Notify("轴小段后退中"); waitCurrentRunFinish(); //MyNotify.Notify("轴小段后退完成"); Thread.Sleep(10); rtn = GT400.GT_ClrSts(); //清除不正常状态 runningError("当前轴状态异常状态清除", rtn); rtn = GT400.GT_SetVel(speedHomeY / 10.0); runningError("当前轴目标速度设置", rtn); rtn = GT400.GT_SetPos(pos); //继续执行回原点:靠-200000这个值自动判断是不是回原点。 runningError("当前轴目标位置设置", rtn); rtn = GT400.GT_Update(); runningError("当前轴参数更新", rtn); waitCurrentRunFinish(); rtn = GT400.GT_ZeroPos(); runningError("轴位置状态清零", rtn); Util.Notify(axisIndex + "轴原点回归完成"); } }
/// <summary> /// 指定轴运动到指定位置 /// </summary> /// <param name="axisIndex">轴编号</param> /// <param name="pos">位移量</param> /// <param name="isAbsolute">绝对运动</param> public void AxisPosMove(int axisIndex, int pos, bool isAbsolute) { ushort testAxis = (ushort)axisIndex; if (homeFinish == false) { Util.Notify("控制卡未回原点"); return; } lock (cardActLock) { short rtn; int prfPos = 0; rtn = GT400.GT_Axis(testAxis); ushort axisSts; rtn = GT400.GT_GetSts(out axisSts);//如果测试轴正在运动则退出 runningError("当前轴状态状态查询", rtn); if (0 != (axisSts & 0x400)) { Util.Notify("轴动作中"); //return; } rtn = GT400.GT_ClrSts(); //清除不正常状态 runningError("当前轴状态异常状态清除", rtn); if (0 != rtn) { return; } if (isAbsolute) { prfPos = pos; } else { rtn = GT400.GT_GetPrfPos(out prfPos); runningError("当前轴位置读取", rtn); prfPos += pos; } //Thread.Sleep(2); //Thread.Sleep(2); rtn = GT400.GT_SetMAcc(accRun); //rtn = GT400.GT_SetAcc(accRun); runningError("当前轴加速度设置", rtn); //Thread.Sleep(2); rtn = GT400.GT_SetVel(speedRun); runningError("当前轴目标速度设置", rtn); //Thread.Sleep(2); rtn = GT400.GT_SetPos(prfPos); runningError("当前轴目标位置设置", rtn); rtn = GT400.GT_SetJerk(0.087); runningError("当前轴加加速度设置", rtn); //Thread.Sleep(2); rtn = GT400.GT_Update(); //参数更新后,就可以开始运行了。 runningError("当前轴参数更新", rtn); } }
protected override void ProcDataDeal() { while (isLink) { // 状态读取 try { commWaitResetEvent.WaitOne(); #region INT读取 short rtn; int ofst; ReadInput(); #endregion Thread.Sleep(3); #region OUT写入 //// 锁定,从共享存储器获取要写入plc的数据 //mutexShMem.WaitOne(); //short data = new short(); //ofst = DMO_OFST; //data = Marshal.ReadInt16(mapAddrPtr, ofst); //// 解除 //mutexShMem.ReleaseMutex(); ////状态取反后输出 //ushort ioOutput = (ushort)(~data); //lock (cardActLock) //{ // GT400.GT_ExOpt(ioOutput); //} #endregion commWaitResetEvent.WaitOne(); #region 轴状态获取 ushort[] status = new ushort[axisNum]; int[] pos = new int[axisNum]; for (int i = 0; i < axisNum; i++) { lock (cardActLock) { rtn = GT400.GT_Axis((ushort)(i + 1)); runningError("当前轴设置", rtn); rtn = GT400.GT_GetSts(out status[i]); runningError("当前轴状态读取", rtn); rtn = GT400.GT_GetPos(out pos[i]); runningError("当前轴位置信息读取", rtn); } Thread.Sleep(3); } int count = 0; for (int i = 0; i < axisNum; i++) { mutexShMem.WaitOne(); // 共有存储在存储器 ofst = DMI_OFST + (1 + i) * Marshal.SizeOf(typeof(short)); //将读取到的PLC数据写入到相应的内存区域 Marshal.WriteInt16(mapAddrPtr, ofst, (short)status[i]); //位置信息 ofst = DMI_OFST + (DMO_A_START + count) * Marshal.SizeOf(typeof(int)); count++; Marshal.WriteInt32(mapAddrPtr, ofst, pos[i]); ofst = DMI_OFST + (DMO_A_START + count) * Marshal.SizeOf(typeof(int)); count++; // 解除 mutexShMem.ReleaseMutex(); } #endregion Thread.Sleep(3); commWaitResetEvent.WaitOne(); ////Measurement.MeasurementManager measureManger = Measurement.MeasurementManager.Instance; ////int left = GetDi(Define.DiLeftButton); ////int es = GetDi(Define.DiEmergencyStop); //if (left == 1 && leftButtonBefore == 0 && // measureManger.InMeasurement == false&& // es==0) //{ // try // { // source = new CancellationTokenSource(); // Task.Run(() => // { // measureManger.RunMeasurementLeft(); // }, source.Token); // } // catch (AggregateException)//捕获紧急停止按钮 // { // //MessageBox.Show("停止按钮被按下", "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); // } //} //leftButtonBefore = left; //int right = GetDi(Define.DiRightButton); //if (right == 1 && // rightButtonBefore == 0 && // measureManger.InMeasurement == false&& // es==0) //{ // try // { // source = new CancellationTokenSource(); // Task.Run(() => // { // measureManger.RunMeasurementRight(); // }, source.Token); // } // catch (AggregateException)//捕获紧急停止按钮 // { // //MessageBox.Show("停止按钮被按下", "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); // } //} //rightButtonBefore = right; //if (es==1&&esButtonBefore==0) //{ // measureManger.InMeasurement = false; // //MessageBox.Show("停止按钮被按下", "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); //} //esButtonBefore = es; } catch (Exception) { } Thread.Sleep(3); } CloseCom(); }