/// <summary> /// 相对定位 /// </summary> /// <param name="Axis"></param> /// <param name="acc"></param> /// <param name="dcc"></param> /// <param name="smoothTime"></param> /// <param name="pos"></param> /// <param name="vel"></param> public void Inc(short Axis, decimal acc, decimal dcc, short smoothTime, decimal pos, decimal vel) { //定义点位运动参数变量 MC.TTrapPrm trapPrm = new MC.TTrapPrm(); //定义当前位置变量 double prfpos; //定义时钟 uint pclock; //定义轴状态 int sts; //将轴设置为点位运动模式 Gts_Return = MC.GT_PrfTrap(Axis); LogErr?.Invoke("Motion--将轴设置为点位运动模式", Gts_Return); //读取点位运动运动参数 Gts_Return = MC.GT_GetTrapPrm(Axis, out trapPrm); LogErr?.Invoke("Motion--读取轴点位运动运动参数", Gts_Return); //设置要修改的参数 trapPrm.acc = Convert.ToDouble(acc / Program.SystemContainer.SysPara.Gts_Acc_reference); trapPrm.dec = Convert.ToDouble(dcc / Program.SystemContainer.SysPara.Gts_Acc_reference); trapPrm.smoothTime = smoothTime; //设置点位运动参数 Gts_Return = MC.GT_SetTrapPrm(Axis, ref trapPrm); LogErr?.Invoke("Motion--读取轴设置点位运动参数", Gts_Return); //读取当前规划位置 Gts_Return = MC.GT_GetPrfPos(Axis, out prfpos, 1, out pclock); LogErr?.Invoke("Motion--读取轴当前规划位置", Gts_Return); //设置目标位置 Gts_Return = MC.GT_SetPos(Axis, Convert.ToInt32(Convert.ToDouble(pos * Program.SystemContainer.SysPara.Gts_Pos_reference) + prfpos)); LogErr?.Invoke("Motion--设置目标位置", Gts_Return); //设置目标速度 Gts_Return = MC.GT_SetVel(Axis, Convert.ToDouble(vel / Program.SystemContainer.SysPara.Gts_Vel_reference)); LogErr?.Invoke("Motion--设置目标速度", Gts_Return); //启动轴运动 Gts_Return = MC.GT_Update(1 << (Axis - 1)); LogErr?.Invoke("Motion--启动轴运动", Gts_Return); do { //读取轴状态 Gts_Return = MC.GT_GetSts(Axis, out sts, 1, out pclock); LogErr?.Invoke("Motion--读取轴状态", Gts_Return); } while ((sts & 0x400) != 0);//等待Axis规划停止 }
/// <summary> /// Gts工控卡 上位机Axes回零 /// </summary> /// <param name="Axis"></param> /// <returns></returns> public int Home_Upper_Monitor(short Axis) { //命令返回值 short Gts_Return; short Capture;//捕获状态值 MC.TTrapPrm Home_TrapPrm = new MC.TTrapPrm(); int Axis_Sta; //轴状态 uint Axis_Pclock; //轴时钟 Int32 Axis_Pos; //回零是触发Home开关时的轴位置 double prfPos; //回零运动过程中规划位置 //定义时钟 uint pclock; //停止轴运动 Gts_Return = MC.GT_Stop(1 << (Axis - 1), 0); //平滑停止轴运动 LogErr?.Invoke("Motion--停止轴运动", Gts_Return); //清除指定轴报警和限位 Gts_Return = MC.GT_ClrSts(Axis, 1); LogErr?.Invoke("Axis_Home----GT_ClrSts", Gts_Return); //回零准备,向正方向前进20mm,后触发回零 //切换到点动模式 Gts_Return = MC.GT_PrfTrap(Axis); LogErr?.Invoke("Axis_Home----GT_PrfTrap", Gts_Return); //读取点动模式运动参数 Gts_Return = MC.GT_GetTrapPrm(Axis, out Home_TrapPrm); LogErr?.Invoke("Axis_Home----GT_GetTrapPrm", Gts_Return); //设置点动模式运动参数 Home_TrapPrm.acc = Convert.ToDouble(Program.SystemContainer.SysPara.Home_acc / Program.SystemContainer.SysPara.Gts_Acc_reference); Home_TrapPrm.dec = Convert.ToDouble(Program.SystemContainer.SysPara.Home_dcc / Program.SystemContainer.SysPara.Gts_Acc_reference); Home_TrapPrm.smoothTime = Program.SystemContainer.SysPara.Home_smoothTime; //设置点动模式运动参数 Gts_Return = MC.GT_SetTrapPrm(Axis, ref Home_TrapPrm); LogErr?.Invoke("Axis_Home----GT_SetTrapPrm", Gts_Return); //设置点动模式目标速度,即回原点速度 Gts_Return = MC.GT_SetVel(Axis, Convert.ToDouble(Program.SystemContainer.SysPara.Home_High_Speed / Program.SystemContainer.SysPara.Gts_Vel_reference)); LogErr?.Invoke("Axis_Home----GT_SetVel", Gts_Return); //读取当前规划位置 Gts_Return = MC.GT_GetPrfPos(Axis, out prfPos, 1, out pclock); LogErr?.Invoke("Motion--读取轴当前规划位置", Gts_Return); //设置点动模式目标位置,即原点准备距离 20mm Gts_Return = MC.GT_SetPos(Axis, Convert.ToInt32(Convert.ToDouble(20 * Program.SystemContainer.SysPara.Gts_Pos_reference) + prfPos)); LogErr?.Invoke("Motion--设置目标位置", Gts_Return); //启动运动 Gts_Return = MC.GT_Update(1 << (Axis - 1)); LogErr?.Invoke("Axis_Home----GT_Update", Gts_Return); do { //读取轴状态 Gts_Return = MC.GT_GetSts(Axis, out Axis_Sta, 1, out Axis_Pclock); } while ((Axis_Sta & 0x400) != 0); //停止轴运动 Gts_Return = MC.GT_Stop(1 << (Axis - 1), 0); //平滑停止轴运动 LogErr?.Invoke("Motion--停止轴运动", Gts_Return); //延时一段时间,等待电机稳定 Thread.Sleep(200);//200ms //触发回零 //启动Home捕捉 Gts_Return = MC.GT_SetCaptureMode(Axis, MC.CAPTURE_HOME); LogErr?.Invoke("Axis_Home----GT_SetCaptureMode", Gts_Return); //切换到点动模式 Gts_Return = MC.GT_PrfTrap(Axis); LogErr?.Invoke("Axis_Home----GT_PrfTrap", Gts_Return); //读取点动模式运动参数 Gts_Return = MC.GT_GetTrapPrm(Axis, out Home_TrapPrm); LogErr?.Invoke("Axis_Home----GT_GetTrapPrm", Gts_Return); //设置点动模式运动参数 Home_TrapPrm.acc = Convert.ToDouble(Program.SystemContainer.SysPara.Home_acc / Program.SystemContainer.SysPara.Gts_Acc_reference); Home_TrapPrm.dec = Convert.ToDouble(Program.SystemContainer.SysPara.Home_dcc / Program.SystemContainer.SysPara.Gts_Acc_reference); Home_TrapPrm.smoothTime = Program.SystemContainer.SysPara.Home_smoothTime; //设置点动模式运动参数 Gts_Return = MC.GT_SetTrapPrm(Axis, ref Home_TrapPrm); LogErr?.Invoke("Axis_Home----GT_SetTrapPrm", Gts_Return); //设置点动模式目标速度,即回原点速度 Gts_Return = MC.GT_SetVel(Axis, Convert.ToDouble(Program.SystemContainer.SysPara.Home_High_Speed / Program.SystemContainer.SysPara.Gts_Vel_reference)); LogErr?.Invoke("Axis_Home----GT_SetVel", Gts_Return); //设置点动模式目标位置,即原点搜索距离 Gts_Return = MC.GT_SetPos(Axis, Convert.ToInt32(Program.SystemContainer.SysPara.Search_Home * Program.SystemContainer.SysPara.Gts_Pos_reference)); LogErr?.Invoke("Axis_Home----GT_SetPos", Gts_Return); //启动运动 Gts_Return = MC.GT_Update(1 << (Axis - 1)); LogErr?.Invoke("Axis_Home----GT_Update", Gts_Return); do { //读取轴状态 Gts_Return = MC.GT_GetSts(Axis, out Axis_Sta, 1, out Axis_Pclock); //读取捕获状态 Gts_Return = MC.GT_GetCaptureStatus(Axis, out Capture, out Axis_Pos, 1, out Axis_Pclock); //读取编码器位置 //Gts_Return = MC.GT_GetEncPos(Axis, out encPos, 1, out Axis_Pclock); //如果运动停止,返回出错信息 if (0 == (Axis_Sta & 0x400)) { LogErr?.Invoke("Axis_Home----No Home found!!", 1); return(1);//整个过程Home信号一直没有触发,返回值为1 } } while (Capture == 0); /********************************待评估***********************************/ /* * //清除捕捉状态 * //Gts_Return = MC.GT_ClearCaptureStatus(Axis); * //LogErr?.Invoke("Axis_Home----清除捕捉状态", Gts_Return); * * //设置捕捉Home 下降沿 * //Gts_Return = MC.GT_SetCaptureSense(Axis, MC.CAPTURE_HOME, 0); * //LogErr?.Invoke("Axis_Home----设置捕捉Home 下降沿", Gts_Return); * * //设定目标位置为捕获位置+偏移量 * Gts_Return = MC.GT_SetPos(Axis, Axis_Pos + Home_OffSet); * LogErr?.Invoke("Axis_Home----GT_SetPos", Gts_Return); * * //在运动状态下更新目标位置 * Gts_Return = MC.GT_Update(1 << (Axis - 1)); * LogErr?.Invoke("Axis_Home----GT_Update", Gts_Return); * * do * { * //读取轴状态 * Gts_Return = MC.GT_GetSts(Axis, out Axis_Sta, 1, out Axis_Pclock); * //读取捕获状态 * Gts_Return = MC.GT_GetCaptureStatus(Axis, out Capture, out Axis_Pos, 1, out Axis_Pclock); * //读取编码器位置 * //Gts_Return = MC.GT_GetEncPos(Axis, out encPos, 1, out Axis_Pclock); * //如果运动停止,返回出错信息 * if (0 == (Axis_Sta & 0x400)) * { * LogErr?.Invoke("Axis_Home----No Home found!!", 1); * //反转回零标志 * Homing_Flag = !Homing_Flag; * return 1;//整个过程Home信号一直没有触发,返回值为1 * } * } while (Capture ==0); */ /********************************待评估***********************************/ //停止轴运动 Gts_Return = MC.GT_Stop(1 << (Axis - 1), 0); //平滑停止轴运动 LogErr?.Invoke("Motion--停止轴运动", Gts_Return); //延时一段时间,等待电机稳定 Thread.Sleep(500);//200ms //位置清零 Gts_Return = MC.GT_ZeroPos(Axis, 1); LogErr?.Invoke("Axis_Home----GT_ZeroPos", Gts_Return); /***************************Home_Offset偏置距离 开始********************************************/ if (Program.SystemContainer.SysPara.Home_OffSet != 0) { //切换到点动模式 Gts_Return = MC.GT_PrfTrap(Axis); LogErr?.Invoke("Axis_Home----GT_PrfTrap", Gts_Return); //读取点动模式运动参数 Gts_Return = MC.GT_GetTrapPrm(Axis, out Home_TrapPrm); LogErr?.Invoke("Axis_Home----GT_GetTrapPrm", Gts_Return); //设置点动模式运动参数 Home_TrapPrm.acc = Convert.ToDouble(Program.SystemContainer.SysPara.Home_acc / Program.SystemContainer.SysPara.Gts_Acc_reference); Home_TrapPrm.dec = Convert.ToDouble(Program.SystemContainer.SysPara.Home_dcc / Program.SystemContainer.SysPara.Gts_Acc_reference); Home_TrapPrm.smoothTime = Program.SystemContainer.SysPara.Home_smoothTime; //设置点动模式运动参数 Gts_Return = MC.GT_SetTrapPrm(Axis, ref Home_TrapPrm); LogErr?.Invoke("Axis_Home----GT_SetTrapPrm", Gts_Return); //设置点动模式目标速度,即回原点速度 Gts_Return = MC.GT_SetVel(Axis, Convert.ToDouble(Program.SystemContainer.SysPara.Home_High_Speed / Program.SystemContainer.SysPara.Gts_Vel_reference)); LogErr?.Invoke("Axis_Home----GT_SetVel", Gts_Return); //设置点动模式目标位置,即原点搜索距离 Gts_Return = MC.GT_SetPos(Axis, Convert.ToInt32(Program.SystemContainer.SysPara.Home_OffSet * Program.SystemContainer.SysPara.Gts_Pos_reference)); LogErr?.Invoke("Axis_Home----GT_SetPos", Gts_Return); //启动运动 Gts_Return = MC.GT_Update(1 << (Axis - 1)); LogErr?.Invoke("Axis_Home----GT_Update", Gts_Return); do { //读取轴状态 Gts_Return = MC.GT_GetSts(Axis, out Axis_Sta, 1, out Axis_Pclock); //读取规划位置 Gts_Return = MC.GT_GetPrfPos(Axis, out prfPos, 1, out Axis_Pclock); //读取编码器位置 //Gts_Return = MC.GT_GetEncPos(Axis, out encPos, 1, out Axis_Pclock); } while ((Axis_Sta & 0x400) != 0); //检查是否到达 Home_OffSet if (prfPos != Convert.ToInt32(Program.SystemContainer.SysPara.Home_OffSet * Program.SystemContainer.SysPara.Gts_Pos_reference)) { LogErr?.Invoke("Axis_Home----Move to Home_OffSet err!!", 1); return(2); } /***************************Home_Offset偏置距离 结束********************************************/ } //延时一段时间,等待电机稳定 Thread.Sleep(500);//200ms //位置清零 Gts_Return = MC.GT_ZeroPos(Axis, 1); LogErr?.Invoke("Axis_Home----GT_ZeroPos", Gts_Return); return(0); }