using System; namespace StageController.HDS { public class HDSController : AxisController { private AxisImply axisImply; public string Adrr { set { axisImply.Adrr = value; } } //连接的IP地址 /// /// 平台是否正常开启 /// public override bool IsOpen { get => axisImply.isOpen; } public override string Version { get => axisImply.hds_CONTROL; internal set { } } public override bool IsMoving => StateX > 1 || StateY > 1 || StateZ > 1; public bool IsMovingXY => StateX > 1 || StateY > 1; #region AxisShell List 虚拟轴控制 /// /// HDS--> 返回 2,代表运动中,返回 1,代表空闲中 /// public override int StateX => axisImply.x_State; /// /// HDS--> 返回 2,代表运动中,返回 1,代表空闲中 /// public override int StateY => axisImply.y_State; /// /// HDS--> 返回 2,代表运动中,返回 1,代表空闲中 /// public override int StateZ => axisImply.z_State; public override double X => axisImply.x_Actual; public override double Y => axisImply.y_Actual; public override double Z => axisImply.z_Actual; #endregion public HDSController() : base() { axisImply = new AxisImply(); } public override object LoadingStageModel { set { var m_loadingStageModel = value as PaintDotNet.Base.SettingModel.LoadingStageModel; //m_portName = m_loadingStageModel.BaseSetPort; //m_baudRate = m_loadingStageModel.BaseSetBps; base.LoadingStageModel = value; m_workSpeedXY = m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].LSpeed; m_workSpeedZ = m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].ZSpeed; } } public override bool NeedSaveResetStageStatus { get => false; } public override bool FreeOrLockXYEnabled { get => false; } public override bool FreeOrLockZEnabled { get => true; } public override string Open() { axisImply.Open(); base.Open(); return axisImply.isOpen ? "已连接" : "未连接"; } public override void Close() { axisImply.Close(); base.Close(); m_running = false; } protected override void Process() { base.Process(); RefreshPosition(); } public override void RefreshPosition() { try { axisImply.RefreshPosition(); } catch (Exception ex) { Logs.Write("[HD]Err: Received null or white or space!"); Console.WriteLine("RefreshPosition Exception:" + ex.Message); } } /// /// 等待平台停稳 /// public override void WaitMoveDone() { int waitSum = 0; do { System.Threading.Thread.Sleep(20/*200*/); if (IsMoving) waitSum = 0; else ++waitSum; } while (IsMoving || waitSum < 5); System.Threading.Thread.Sleep(10/*100*/);//# 待测试 } #region Speed public override void SetSpeedXY(int speed) {//...................................................... axisImply.SetSpeed(speed, AxisType.X); axisImply.SetSpeed(speed, AxisType.Y); //var speed1 = SpeedConvertXY(speed); //m_AxisX.Speed = speed1; //m_AxisY.Speed = speed1; //AxisShellList[AxisType.X].Speed = speed; //AxisShellList[AxisType.Y].Speed = speed; } public override void SetSpeedZ(int speed) {//............................................................ axisImply.SetSpeed(speed*10, AxisType.Z); //m_AxisZ.Speed = SpeedConvertZ(speed); //AxisShellList[AxisType.Z].Speed = speed; } ///// ///// XY速度换算 ///// ///// 微米每秒 ///// 速度映射值 //private int SpeedConvertXY(double umpers) //{ // var speed = (1000000 * m_AxisX.Stepping / umpers - 33) / 10; // return (int)speed; //} ///// ///// Z速度换算 ///// ///// 微米每秒 ///// 速度映射值 //private int SpeedConvertZ(double umpers) //{ // var speed = (1000000 * m_AxisZ.Stepping / umpers - 33) / 40; // return (int)speed; //} #endregion public Int32 Command_Execute(string g_command, out string changps, bool ZMC_Execute_Status = false) { return axisImply.Command_Execute(g_command, out changps, ZMC_Execute_Status); } #region Motion /// /// 平台平移(9、 相对运动 相对运动可以转化为绝对运动来实现,这样接口更简单、可靠。) waitmovedone /// /// X轴移动距离(μm) /// Y轴移动距离(μm) public override void Move(double x, double y) {//待调试确认 自测重点 1 if (IsMoving) { Console.WriteLine("XY运动中发送运动指令"); return; } axisImply.Move(x, AxisType.X); axisImply.Move(y, AxisType.Y); } /// /// 8、 绝对运动 /// /// /// public override void To(double x, double y) {//待调试确认 自测重点 1 axisImply.To(x, AxisType.X); axisImply.To(y, AxisType.Y); } public override void Up(double z)//6400/3200/1600 { axisImply.Move(z, AxisType.Z); } public override void UpTo(double z) { axisImply.To(z, AxisType.Z); } public override void Up(int z) { axisImply.Move(z, AxisType.Z); } /// /// Z连续 /// /// true:正向.false:反向 public override void GoTop(bool isToTop) { axisImply.VMove(AxisType.Z, isToTop); } /// /// 平台朝一个水平方向连续运动 /// /// 0-7 从X周负向逆时针 public override void Split(int direction) { switch (direction) { case 0: axisImply.VMove(AxisType.X, true); break; case 1: axisImply.VMove(AxisType.X, true); axisImply.VMove(AxisType.Y,false); break; case 2: axisImply.VMove(AxisType.Y, false); break; case 3: axisImply.VMove(AxisType.X, false); axisImply.VMove(AxisType.Y, false); break; case 4: axisImply.VMove(AxisType.X, false); break; case 5: axisImply.VMove(AxisType.X, false); axisImply.VMove(AxisType.Y, true); break; case 6: axisImply.VMove(AxisType.Y, true); break; case 7: axisImply.VMove(AxisType.X, true); axisImply.VMove(AxisType.Y, true); break; } if (IsOpen) Console.WriteLine("Split " + direction); } protected override void ToAction(AxisType axisType, double start) { base.ToAction(axisType, start); axisImply.To(start, axisType); } protected override void MoveAction(AxisType axisType, double steplen) { base.MoveAction(axisType, steplen); axisImply.Move(steplen, axisType); } #endregion #region Stop public override void FreeStage() { axisImply.CancelCommand(AxisType.X); axisImply.CancelCommand(AxisType.Y); } public override void LockStage() { axisImply.CancelCommand(AxisType.X); axisImply.CancelCommand(AxisType.Y); } public override void FreeZ() { axisImply.CancelCommand(AxisType.Z); } public override void LockZ() { axisImply.CancelCommand(AxisType.Z); } protected override void Stop(AxisType axis, M3H.HandLock hlock) { base.Stop(axis, hlock); axisImply.CancelCommand(axis); } #endregion #region Moveflow //复位 public override void ResetStage(Action actDone) { new System.Threading.Tasks.Task(new Action(() => { //while (m_cmdQueueM.Count > 0) //{ // Thread.Sleep(100); //} StartResetStage(actDone); })).Start(); } private void StartResetStage(Action actDone) { var mf = StartMoveflow(); mf.Add(() => { this.Command_Execute("RUNTASK 1,HOMEX", out _, true); this.Command_Execute("RUNTASK 2,HOMEY", out _, true);// System.Threading.Thread.Sleep(200); System.Threading.Thread.Sleep(1000); WaitMoveDone();//int movingCount = 0; do {//等待平台停稳 movingCount = IsMoving ? 0 : (movingCount + 1); System.Threading.Thread.Sleep(200); } while (movingCount < 5); axisImply.SetSpeed(axisImply.hds_speeds[0], AxisType.X); axisImply.SetSpeed(axisImply.hds_speeds[1], AxisType.Y); }, null// () => { return m_AxisX.State == STATE_LOCK && m_AxisY.State == STATE_LOCK; } ); mf.Start(); mf.OnMoveflowDone += actDone; m_currentMoveflow = mf; } public override void ZScan(double start, double steplen, int times, Action shoot, Action package, Action actDone) { var mf = StartMoveflow(); mf.Add( () => axisImply.CancelCommand(AxisType.Z), null); mf.Add(() => { axisImply.To(start, AxisType.Z); }, () => { WaitMoveDone(); axisImply.RefreshPositionZ();// RefreshPosition(); return Math.Abs(axisImply.z_Actual/*m_AxisZ.Actual*/ - start) < 5/*m_AxisZ.Stepping*/; }); mf.Add(shoot, null); for (int i = 0; i < times - 1; i++) { mf.Add(() => { WaitMoveDone(); start += steplen; axisImply.To(start, AxisType.Z); }, () => { WaitMoveDone(); axisImply.RefreshPositionZ();// RefreshPosition(); return Math.Abs(axisImply.z_Actual/*m_AxisZ.Actual*/ - start) < 5/*m_AxisZ.Stepping*/; }); mf.Add(shoot, null); } mf.Add(package, null); mf.Start(); mf.OnMoveflowDone += actDone; m_currentMoveflow = mf; } /// /// 开始中心移动流程 /// public override void ToCenter() { axisImply.To(_centerX, AxisType.X); axisImply.To(_centerY, AxisType.Y); } //清零 protected override void ClearPosXY() { this.Command_Execute("DEFPOS(0) AXIS(0)", out _); this.Command_Execute("DEFPOS(0) AXIS(1)", out _); } public override void ClearPosZ() { if (this.Command_Execute("Mpos(2)=0", out _, true) == 0)//DEFPOS(0) AXIS(2) axisImply.z_Actual = 0; } #endregion int m_workSpeedXY; int m_workSpeedZ; public override void SetWorkspeedXY() {//# 待完善初始化参数和存储参数 //m_workSpeedXY = 1000;// m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].LSpeed; //m_workSpeedZ = 100;// m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].ZSpeed; SetSpeedXY(m_workSpeedXY); SetSpeedZ(m_workSpeedZ); } } }