HDSController.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  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 object LoadingStageModel
  40. {
  41. set
  42. {
  43. var m_loadingStageModel = value as PaintDotNet.Base.SettingModel.LoadingStageModel;
  44. //m_portName = m_loadingStageModel.BaseSetPort;
  45. //m_baudRate = m_loadingStageModel.BaseSetBps;
  46. base.LoadingStageModel = value;
  47. m_workSpeedXY = m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].LSpeed;
  48. m_workSpeedZ = m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].ZSpeed;
  49. }
  50. }
  51. public override bool NeedSaveResetStageStatus { get => false; }
  52. public override bool FreeOrLockXYEnabled { get => false; }
  53. public override bool FreeOrLockZEnabled { get => true; }
  54. public override string Open()
  55. {
  56. axisImply.Open();
  57. base.Open();
  58. return axisImply.isOpen ? "已连接" : "未连接";
  59. }
  60. public override void Close()
  61. {
  62. axisImply.Close();
  63. base.Close();
  64. m_running = false;
  65. }
  66. protected override void Process()
  67. {
  68. base.Process();
  69. RefreshPosition();
  70. }
  71. public override void RefreshPosition()
  72. {
  73. try
  74. {
  75. axisImply.RefreshPosition();
  76. }
  77. catch (Exception ex)
  78. {
  79. Logs.Write("[HD]Err: Received null or white or space!");
  80. Console.WriteLine("RefreshPosition Exception:" + ex.Message);
  81. }
  82. }
  83. /// <summary>
  84. /// 等待平台停稳
  85. /// </summary>
  86. public override void WaitMoveDone()
  87. {
  88. int waitSum = 0;
  89. do { System.Threading.Thread.Sleep(20/*200*/);
  90. if (IsMoving) waitSum = 0;
  91. else ++waitSum;
  92. }
  93. while (IsMoving || waitSum < 5);
  94. System.Threading.Thread.Sleep(10/*100*/);//# 待测试
  95. }
  96. #region Speed
  97. public override void SetSpeedXY(int speed)
  98. {//......................................................
  99. axisImply.SetSpeed(speed, AxisType.X); axisImply.SetSpeed(speed, AxisType.Y);
  100. //var speed1 = SpeedConvertXY(speed);
  101. //m_AxisX.Speed = speed1;
  102. //m_AxisY.Speed = speed1;
  103. //AxisShellList[AxisType.X].Speed = speed;
  104. //AxisShellList[AxisType.Y].Speed = speed;
  105. }
  106. public override void SetSpeedZ(int speed)
  107. {//............................................................
  108. axisImply.SetSpeed(speed*10, AxisType.Z);
  109. //m_AxisZ.Speed = SpeedConvertZ(speed);
  110. //AxisShellList[AxisType.Z].Speed = speed;
  111. }
  112. ///// <summary>
  113. ///// XY速度换算
  114. ///// </summary>
  115. ///// <param name="">微米每秒</param>
  116. ///// <returns>速度映射值</returns>
  117. //private int SpeedConvertXY(double umpers)
  118. //{
  119. // var speed = (1000000 * m_AxisX.Stepping / umpers - 33) / 10;
  120. // return (int)speed;
  121. //}
  122. ///// <summary>
  123. ///// Z速度换算
  124. ///// </summary>
  125. ///// <param name="">微米每秒</param>
  126. ///// <returns>速度映射值</returns>
  127. //private int SpeedConvertZ(double umpers)
  128. //{
  129. // var speed = (1000000 * m_AxisZ.Stepping / umpers - 33) / 40;
  130. // return (int)speed;
  131. //}
  132. #endregion
  133. public Int32 Command_Execute(string g_command, out string changps, bool ZMC_Execute_Status = false)
  134. {
  135. return axisImply.Command_Execute(g_command, out changps, ZMC_Execute_Status);
  136. }
  137. #region Motion
  138. /// <summary>
  139. /// 平台平移(9、 相对运动 相对运动可以转化为绝对运动来实现,这样接口更简单、可靠。) waitmovedone
  140. /// </summary>
  141. /// <param name="x">X轴移动距离(μm)</param>
  142. /// <param name="y">Y轴移动距离(μm)</param>
  143. public override void Move(double x, double y)
  144. {//待调试确认 自测重点 1
  145. if (IsMoving)
  146. {
  147. Console.WriteLine("XY运动中发送运动指令");
  148. return;
  149. }
  150. axisImply.Move(x, AxisType.X); axisImply.Move(y, AxisType.Y);
  151. }
  152. /// <summary>
  153. /// 8、 绝对运动
  154. /// </summary>
  155. /// <param name="x"></param>
  156. /// <param name="y"></param>
  157. public override void To(double x, double y)
  158. {//待调试确认 自测重点 1
  159. axisImply.To(x, AxisType.X); axisImply.To(y, AxisType.Y);
  160. }
  161. public override void Up(double z)//6400/3200/1600
  162. {
  163. axisImply.Move(z, AxisType.Z);
  164. }
  165. public override void UpTo(double z)
  166. {
  167. axisImply.To(z, AxisType.Z);
  168. }
  169. public override void Up(int z)
  170. {
  171. axisImply.Move(z, AxisType.Z);
  172. }
  173. /// <summary>
  174. /// Z连续
  175. /// </summary>
  176. /// <param name="isToTop">true:正向.false:反向</param>
  177. public override void GoTop(bool isToTop)
  178. {
  179. axisImply.VMove(AxisType.Z, isToTop);
  180. }
  181. /// <summary>
  182. /// 平台朝一个水平方向连续运动
  183. /// </summary>
  184. /// <param name="direction">0-7 从X周负向逆时针</param>
  185. public override void Split(int direction)
  186. {
  187. switch (direction)
  188. {
  189. case 0:
  190. axisImply.VMove(AxisType.X, true);
  191. break;
  192. case 1:
  193. axisImply.VMove(AxisType.X, true);
  194. axisImply.VMove(AxisType.Y,false);
  195. break;
  196. case 2:
  197. axisImply.VMove(AxisType.Y, false);
  198. break;
  199. case 3:
  200. axisImply.VMove(AxisType.X, false);
  201. axisImply.VMove(AxisType.Y, false);
  202. break;
  203. case 4:
  204. axisImply.VMove(AxisType.X, false);
  205. break;
  206. case 5:
  207. axisImply.VMove(AxisType.X, false);
  208. axisImply.VMove(AxisType.Y, true);
  209. break;
  210. case 6:
  211. axisImply.VMove(AxisType.Y, true);
  212. break;
  213. case 7:
  214. axisImply.VMove(AxisType.X, true);
  215. axisImply.VMove(AxisType.Y, true);
  216. break;
  217. }
  218. if (IsOpen) Console.WriteLine("Split " + direction);
  219. }
  220. protected override void ToAction(AxisType axisType, double start)
  221. {
  222. base.ToAction(axisType, start);
  223. axisImply.To(start, axisType);
  224. }
  225. protected override void MoveAction(AxisType axisType, double steplen)
  226. {
  227. base.MoveAction(axisType, steplen);
  228. axisImply.Move(steplen, axisType);
  229. }
  230. #endregion
  231. #region Stop
  232. public override void FreeStage()
  233. {
  234. axisImply.CancelCommand(AxisType.X); axisImply.CancelCommand(AxisType.Y);
  235. }
  236. public override void LockStage()
  237. {
  238. axisImply.CancelCommand(AxisType.X); axisImply.CancelCommand(AxisType.Y);
  239. }
  240. public override void FreeZ()
  241. {
  242. axisImply.CancelCommand(AxisType.Z);
  243. }
  244. public override void LockZ()
  245. {
  246. axisImply.CancelCommand(AxisType.Z);
  247. }
  248. protected override void Stop(AxisType axis, M3H.HandLock hlock)
  249. {
  250. base.Stop(axis, hlock);
  251. axisImply.CancelCommand(axis);
  252. }
  253. #endregion
  254. #region Moveflow
  255. //复位
  256. public override void ResetStage(Action actDone)
  257. {
  258. new System.Threading.Tasks.Task(new Action(() =>
  259. {
  260. //while (m_cmdQueueM.Count > 0)
  261. //{
  262. // Thread.Sleep(100);
  263. //}
  264. StartResetStage(actDone);
  265. })).Start();
  266. }
  267. private void StartResetStage(Action actDone)
  268. {
  269. var mf = StartMoveflow();
  270. mf.Add(() =>
  271. {
  272. this.Command_Execute("RUNTASK 1,HOMEX", out _, true); this.Command_Execute("RUNTASK 2,HOMEY", out _, true);// System.Threading.Thread.Sleep(200);
  273. System.Threading.Thread.Sleep(1000);
  274. WaitMoveDone();//int movingCount = 0; do {//等待平台停稳 movingCount = IsMoving ? 0 : (movingCount + 1); System.Threading.Thread.Sleep(200); } while (movingCount < 5);
  275. axisImply.SetSpeed(axisImply.hds_speeds[0], AxisType.X); axisImply.SetSpeed(axisImply.hds_speeds[1], AxisType.Y);
  276. }, null// () => { return m_AxisX.State == STATE_LOCK && m_AxisY.State == STATE_LOCK; }
  277. );
  278. mf.Start(); mf.OnMoveflowDone += actDone; m_currentMoveflow = mf;
  279. }
  280. public override void ZScan(double start, double steplen, int times, Action shoot, Action package, Action actDone)
  281. {
  282. var mf = StartMoveflow();
  283. mf.Add(
  284. () => axisImply.CancelCommand(AxisType.Z),
  285. null);
  286. mf.Add(() =>
  287. {
  288. axisImply.To(start, AxisType.Z);
  289. },
  290. () =>
  291. {
  292. WaitMoveDone();
  293. axisImply.RefreshPositionZ();// RefreshPosition();
  294. return Math.Abs(axisImply.z_Actual/*m_AxisZ.Actual*/ - start) < 5/*m_AxisZ.Stepping*/;
  295. });
  296. mf.Add(shoot, null);
  297. for (int i = 0; i < times - 1; i++)
  298. {
  299. mf.Add(() =>
  300. {
  301. WaitMoveDone();
  302. start += steplen;
  303. axisImply.To(start, AxisType.Z);
  304. },
  305. () =>
  306. {
  307. WaitMoveDone();
  308. axisImply.RefreshPositionZ();// RefreshPosition();
  309. return Math.Abs(axisImply.z_Actual/*m_AxisZ.Actual*/ - start) < 5/*m_AxisZ.Stepping*/;
  310. });
  311. mf.Add(shoot, null);
  312. }
  313. mf.Add(package, null);
  314. mf.Start();
  315. mf.OnMoveflowDone += actDone;
  316. m_currentMoveflow = mf;
  317. }
  318. /// <summary>
  319. /// 开始中心移动流程
  320. /// </summary>
  321. public override void ToCenter()
  322. {
  323. axisImply.To(_centerX, AxisType.X); axisImply.To(_centerY, AxisType.Y);
  324. }
  325. //清零
  326. protected override void ClearPosXY()
  327. {
  328. this.Command_Execute("DEFPOS(0) AXIS(0)", out _); this.Command_Execute("DEFPOS(0) AXIS(1)", out _);
  329. }
  330. public override void ClearPosZ()
  331. {
  332. if (this.Command_Execute("Mpos(2)=0", out _, true) == 0)//DEFPOS(0) AXIS(2)
  333. axisImply.z_Actual = 0;
  334. }
  335. #endregion
  336. int m_workSpeedXY; int m_workSpeedZ;
  337. public override void SetWorkspeedXY()
  338. {//# 待完善初始化参数和存储参数
  339. //m_workSpeedXY = 1000;// m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].LSpeed;
  340. //m_workSpeedZ = 100;// m_loadingStageModel.items[m_loadingStageModel.WorkSpeedSelect].ZSpeed;
  341. SetSpeedXY(m_workSpeedXY);
  342. SetSpeedZ(m_workSpeedZ);
  343. }
  344. }
  345. }