HDSController.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. using System;
  2. namespace StageController.HDS
  3. {
  4. public class HDSController : AxisController
  5. {
  6. private AxisImply axisImply;
  7. public string Adrr { set { axisImply.Adrr = value; } } //连接的IP地址
  8. /// <summary>
  9. /// 平台是否正常开启
  10. /// </summary>
  11. public override bool IsOpen
  12. {
  13. get => axisImply.isOpen;
  14. }
  15. public override string Version { get => axisImply.hds_CONTROL; internal set { } }
  16. public override bool IsMoving => StateX > 1 || StateY > 1 || StateZ > 1;
  17. public bool IsMovingXY => StateX > 1 || StateY > 1;
  18. #region AxisShell List 虚拟轴控制
  19. /// <summary>
  20. /// HDS--> 返回 2,代表运动中,返回 1,代表空闲中
  21. /// </summary>
  22. public override int StateX => axisImply.x_State;
  23. /// <summary>
  24. /// HDS--> 返回 2,代表运动中,返回 1,代表空闲中
  25. /// </summary>
  26. public override int StateY => axisImply.y_State;
  27. /// <summary>
  28. /// HDS--> 返回 2,代表运动中,返回 1,代表空闲中
  29. /// </summary>
  30. public override int StateZ => axisImply.z_State;
  31. public override double X => axisImply.x_Actual;
  32. public override double Y => axisImply.y_Actual;
  33. public override double Z => axisImply.z_Actual;
  34. #endregion
  35. public HDSController() : base()
  36. {
  37. axisImply = new AxisImply();
  38. }
  39. public override string Open()
  40. {
  41. axisImply.Open();
  42. base.Open();
  43. return axisImply.isOpen ? "已连接" : "未连接";
  44. }
  45. public override void Close()
  46. {
  47. axisImply.Close();
  48. base.Close();
  49. }
  50. protected override void Process()
  51. {
  52. base.Process();
  53. RefreshPosition();
  54. }
  55. public override void RefreshPosition()
  56. {
  57. try
  58. {
  59. axisImply.RefreshPosition();
  60. }
  61. catch (Exception ex)
  62. {
  63. Console.WriteLine("RefreshPosition Exception:" + ex.Message);
  64. }
  65. }
  66. /// <summary>
  67. /// 等待平台停稳
  68. /// </summary>
  69. public override void WaitMoveDone()
  70. {
  71. do System.Threading.Thread.Sleep(20/*200*/);
  72. while (IsMoving);
  73. //Thread.Sleep(30/*100*/);
  74. }
  75. #region Speed
  76. public override void SetSpeedXY(int speed)
  77. {//......................................................
  78. axisImply.SetSpeed(speed, AxisType.X); axisImply.SetSpeed(speed, AxisType.Y);
  79. //var speed1 = SpeedConvertXY(speed);
  80. //m_AxisX.Speed = speed1;
  81. //m_AxisY.Speed = speed1;
  82. //AxisShellList[AxisType.X].Speed = speed;
  83. //AxisShellList[AxisType.Y].Speed = speed;
  84. }
  85. public override void SetSpeedZ(int speed)
  86. {//............................................................
  87. axisImply.SetSpeed(speed, AxisType.Z);
  88. //m_AxisZ.Speed = SpeedConvertZ(speed);
  89. //AxisShellList[AxisType.Z].Speed = speed;
  90. }
  91. ///// <summary>
  92. ///// XY速度换算
  93. ///// </summary>
  94. ///// <param name="">微米每秒</param>
  95. ///// <returns>速度映射值</returns>
  96. //private int SpeedConvertXY(double umpers)
  97. //{
  98. // var speed = (1000000 * m_AxisX.Stepping / umpers - 33) / 10;
  99. // return (int)speed;
  100. //}
  101. ///// <summary>
  102. ///// Z速度换算
  103. ///// </summary>
  104. ///// <param name="">微米每秒</param>
  105. ///// <returns>速度映射值</returns>
  106. //private int SpeedConvertZ(double umpers)
  107. //{
  108. // var speed = (1000000 * m_AxisZ.Stepping / umpers - 33) / 40;
  109. // return (int)speed;
  110. //}
  111. #endregion
  112. public Int32 Command_Execute(string g_command, out string changps)
  113. {
  114. return axisImply.Command_Execute(g_command, out changps);
  115. }
  116. #region Motion
  117. /// <summary>
  118. /// 平台平移(9、 相对运动 相对运动可以转化为绝对运动来实现,这样接口更简单、可靠。) waitmovedone
  119. /// </summary>
  120. /// <param name="x">X轴移动距离(μm)</param>
  121. /// <param name="y">Y轴移动距离(μm)</param>
  122. public override void Move(double x, double y)
  123. {//待调试确认 自测重点 1
  124. axisImply.Move(x, AxisType.X); axisImply.Move(y, AxisType.Y);
  125. }
  126. /// <summary>
  127. /// 8、 绝对运动
  128. /// </summary>
  129. /// <param name="x"></param>
  130. /// <param name="y"></param>
  131. public override void To(double x, double y)
  132. {//待调试确认 自测重点 1
  133. axisImply.To(x, AxisType.X); axisImply.To(y, AxisType.Y);
  134. }
  135. public override void Up(double z)//6400/3200/1600
  136. {
  137. axisImply.Move(z, AxisType.Z);
  138. }
  139. public override void UpTo(double z)
  140. {
  141. axisImply.To(z, AxisType.Z);
  142. }
  143. public override void Up(int z)
  144. {
  145. axisImply.Move(z, AxisType.Z);
  146. }
  147. /// <summary>
  148. /// Z连续
  149. /// </summary>
  150. /// <param name="isToTop">true:正向.false:反向</param>
  151. public override void GoTop(bool isToTop)
  152. {
  153. axisImply.VMove(AxisType.Z, isToTop);
  154. }
  155. /// <summary>
  156. /// 平台朝一个水平方向连续运动
  157. /// </summary>
  158. /// <param name="direction">0-7 从X周负向逆时针</param>
  159. public override void Split(int direction)
  160. {
  161. switch (direction)
  162. {
  163. case 0:
  164. axisImply.VMove(AxisType.X, true);
  165. break;
  166. case 1:
  167. axisImply.VMove(AxisType.X, true);
  168. axisImply.VMove(AxisType.Y,false);
  169. break;
  170. case 2:
  171. axisImply.VMove(AxisType.Y, false);
  172. break;
  173. case 3:
  174. axisImply.VMove(AxisType.X, false);
  175. axisImply.VMove(AxisType.Y, false);
  176. break;
  177. case 4:
  178. axisImply.VMove(AxisType.X, false);
  179. break;
  180. case 5:
  181. axisImply.VMove(AxisType.X, false);
  182. axisImply.VMove(AxisType.Y, true);
  183. break;
  184. case 6:
  185. axisImply.VMove(AxisType.Y, true);
  186. break;
  187. case 7:
  188. axisImply.VMove(AxisType.X, true);
  189. axisImply.VMove(AxisType.Y, true);
  190. break;
  191. }
  192. if (IsOpen) Console.WriteLine("Split " + direction);
  193. }
  194. protected override void ToAction(AxisType axisType, double start)
  195. {
  196. base.ToAction(axisType, start);
  197. axisImply.To(start, axisType);
  198. }
  199. protected override void MoveAction(AxisType axisType, double steplen)
  200. {
  201. base.MoveAction(axisType, steplen);
  202. axisImply.Move(steplen, axisType);
  203. }
  204. #endregion
  205. #region Stop
  206. public override void FreeStage()
  207. {
  208. axisImply.CancelCommand(AxisType.X); axisImply.CancelCommand(AxisType.Y);
  209. }
  210. public override void LockStage()
  211. {
  212. axisImply.CancelCommand(AxisType.X); axisImply.CancelCommand(AxisType.Y);
  213. }
  214. public override void FreeZ()
  215. {
  216. axisImply.CancelCommand(AxisType.Z);
  217. }
  218. public override void LockZ()
  219. {
  220. axisImply.CancelCommand(AxisType.Z);
  221. }
  222. protected override void Stop(AxisType axis, M3H.HandLock hlock)
  223. {
  224. base.Stop(axis, hlock);
  225. axisImply.CancelCommand(axis);
  226. }
  227. #endregion
  228. #region Moveflow
  229. //复位
  230. public override void ResetStage(Action actDone)
  231. {
  232. var mf = StartMoveflow();
  233. mf.Add(() =>
  234. {
  235. this.Command_Execute("RUNTASK 1,HOMEX", out _); this.Command_Execute("RUNTASK 2,HOMEY", out _);// System.Threading.Thread.Sleep(200);
  236. WaitMoveDone();//int movingCount = 0; do {//等待平台停稳 movingCount = IsMoving ? 0 : (movingCount + 1); System.Threading.Thread.Sleep(200); } while (movingCount < 5);
  237. }, null// () => { return m_AxisX.State == STATE_LOCK && m_AxisY.State == STATE_LOCK; }
  238. );
  239. mf.Start(); mf.OnMoveflowDone += actDone; m_currentMoveflow = mf;
  240. }
  241. //清零
  242. protected override void ClearPosXY()
  243. {
  244. this.Command_Execute("DEFPOS(0) AXIS(0)", out _); this.Command_Execute("DEFPOS(0) AXIS(1)", out _);
  245. base.ClearPosXY();
  246. }
  247. public override void ClearPosZ()
  248. {
  249. this.Command_Execute("DEFPOS(0) AXIS(2)", out _);
  250. base.ClearPosZ();
  251. }
  252. #endregion
  253. #region Speed
  254. int m_workSpeedXY;
  255. int m_workSpeedZ;
  256. public override void SetWorkspeedXY()
  257. {//# 待完善初始化参数和存储参数
  258. m_workSpeedXY = 100;// m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].LSpeed;
  259. m_workSpeedZ = 100;// m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].ZSpeed;
  260. SetSpeedXY(m_workSpeedXY);
  261. SetSpeedZ(m_workSpeedZ);
  262. }
  263. #endregion
  264. /// <summary>
  265. /// 拼图模式
  266. /// </summary>
  267. public override void SetMergeMode(bool isMerge)
  268. {
  269. //if (isMerge)
  270. // AddCommand(new CommandGlobal(M3H.ControlType.P));
  271. //else
  272. // AddCommand(new CommandGlobal(M3H.ControlType.Q));
  273. }
  274. /// <summary>
  275. /// 启用/禁用摇杆
  276. /// </summary>
  277. /// <param name="isAvailable">摇杆可用</param>
  278. public override void SetRockerEnabel(bool isAvailable)
  279. {
  280. }
  281. }
  282. }