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 string Open() { axisImply.Open(); base.Open(); return axisImply.isOpen ? "已连接" : "未连接"; } public override void Close() { axisImply.Close(); base.Close(); } protected override void Process() { base.Process(); RefreshPosition(); } public override void RefreshPosition() { try { axisImply.RefreshPosition(); } catch (Exception ex) { Console.WriteLine("RefreshPosition Exception:" + ex.Message); } } /// /// 等待平台停稳 /// public override void WaitMoveDone() { do System.Threading.Thread.Sleep(20/*200*/); while (IsMoving); //Thread.Sleep(30/*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, 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) { return axisImply.Command_Execute(g_command, out changps); } #region Motion /// /// 平台平移(9、 相对运动 相对运动可以转化为绝对运动来实现,这样接口更简单、可靠。) waitmovedone /// /// X轴移动距离(μm) /// Y轴移动距离(μm) public override void Move(double x, double y) {//待调试确认 自测重点 1 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) { var mf = StartMoveflow(); mf.Add(() => { this.Command_Execute("RUNTASK 1,HOMEX", out _); this.Command_Execute("RUNTASK 2,HOMEY", out _);// System.Threading.Thread.Sleep(200); WaitMoveDone();//int movingCount = 0; do {//等待平台停稳 movingCount = IsMoving ? 0 : (movingCount + 1); System.Threading.Thread.Sleep(200); } while (movingCount < 5); }, null// () => { return m_AxisX.State == STATE_LOCK && m_AxisY.State == STATE_LOCK; } ); mf.Start(); mf.OnMoveflowDone += actDone; m_currentMoveflow = mf; } //清零 protected override void ClearPosXY() { this.Command_Execute("DEFPOS(0) AXIS(0)", out _); this.Command_Execute("DEFPOS(0) AXIS(1)", out _); base.ClearPosXY(); } public override void ClearPosZ() { this.Command_Execute("DEFPOS(0) AXIS(2)", out _); base.ClearPosZ(); } #endregion #region Speed int m_workSpeedXY; int m_workSpeedZ; public override void SetWorkspeedXY() {//# 待完善初始化参数和存储参数 m_workSpeedXY = 100;// m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].LSpeed; m_workSpeedZ = 100;// m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].ZSpeed; SetSpeedXY(m_workSpeedXY); SetSpeedZ(m_workSpeedZ); } #endregion /// /// 拼图模式 /// public override void SetMergeMode(bool isMerge) { //if (isMerge) // AddCommand(new CommandGlobal(M3H.ControlType.P)); //else // AddCommand(new CommandGlobal(M3H.ControlType.Q)); } /// /// 启用/禁用摇杆 /// /// 摇杆可用 public override void SetRockerEnabel(bool isAvailable) { } } }