Clamp.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using GSG.NET.Concurrent;
  7. using GSG.NET.LINQ;
  8. using GSG.NET.Logging;
  9. using GSG.NET.Utils;
  10. using OHV.Common.Events;
  11. using OHV.Common.Shareds;
  12. using OHV.SqliteDAL;
  13. using Prism.Events;
  14. using VehicleControlSystem.ControlLayer.Axis;
  15. using VehicleControlSystem.ControlLayer.Lib.EziPlusE;
  16. namespace VehicleControlSystem.ControlLayer
  17. {
  18. public class Clamp
  19. {
  20. SqliteManager sql = null;
  21. List<EzAxis> axes = new List<EzAxis>();
  22. static Logger logger = Logger.GetLogger();
  23. IEventAggregator eventAggregator;
  24. TaskCancel taskCancel = new TaskCancel();
  25. public Clamp(SqliteManager sqliteManager, IEventAggregator ea)
  26. {
  27. this.sql = sqliteManager;
  28. this.eventAggregator = ea;
  29. }
  30. public void Init()
  31. {
  32. this.CreateAxis();
  33. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Unsubscribe(ReceivedMessageEvent);
  34. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Subscribe(ReceivedMessageEvent);
  35. }
  36. void ReceivedMessageEvent(AxisControlEventArgs args)
  37. {
  38. if (args.Dir == AxisControlEventArgs.eEventDir.ToBack)
  39. {
  40. switch (args.Kind)
  41. {
  42. case AxisControlEventArgs.eAxisControlKind.Stop:
  43. break;
  44. case AxisControlEventArgs.eAxisControlKind.EStop:
  45. break;
  46. case AxisControlEventArgs.eAxisControlKind.Move:
  47. break;
  48. case AxisControlEventArgs.eAxisControlKind.Jog:
  49. this.ReqJog(args);
  50. break;
  51. case AxisControlEventArgs.eAxisControlKind.CurrentPosition:
  52. break;
  53. case AxisControlEventArgs.eAxisControlKind.ServoOn:
  54. break;
  55. case AxisControlEventArgs.eAxisControlKind.ServoOff:
  56. break;
  57. case AxisControlEventArgs.eAxisControlKind.ReqCurrentPosition:
  58. this.ReqStartCurrentPosition();
  59. break;
  60. case AxisControlEventArgs.eAxisControlKind.ReqStopCurrentPosition:
  61. this.taskCancel.Cancel();
  62. this.taskCancel.WaitAll();
  63. break;
  64. case AxisControlEventArgs.eAxisControlKind.OriginReturn:
  65. break;
  66. default:
  67. break;
  68. }
  69. }
  70. }
  71. void PublishEvent(AxisControlEventArgs args)
  72. {
  73. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish(args);
  74. }
  75. void ReqStartCurrentPosition()
  76. {
  77. var task = Task.Factory.StartNew(() =>
  78. {
  79. while (!this.taskCancel.Canceled)
  80. {
  81. LockUtils.Wait(500);
  82. this.axes.ForEach(a =>
  83. {
  84. var msg = new AxisControlEventArgs
  85. {
  86. AxisName = a.Config.AxisName,
  87. Dir = AxisControlEventArgs.eEventDir.ToFront,
  88. Kind = AxisControlEventArgs.eAxisControlKind.CurrentPosition,
  89. CurrentPosition = NumUtils.Random(0, 300),
  90. };
  91. this.PublishEvent(msg);
  92. });
  93. }
  94. });
  95. this.taskCancel.Add(task);
  96. }
  97. void ReqJog(AxisControlEventArgs arg)
  98. {
  99. if (arg.JogDir == AxisControlEventArgs.eJogMoveDir.Positive)
  100. this.JogMove(arg.AxisName, E_JogMoveDir.Positive, 0);
  101. else
  102. this.JogMove(arg.AxisName, E_JogMoveDir.Negative, 0);
  103. }
  104. void ReqOriginReturn(AxisControlEventArgs arg)
  105. {
  106. int result = 0;
  107. if (arg.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_LEFT))
  108. result = this.LeftOriginReturn();
  109. else
  110. result = this.RightOriginReturn();
  111. //결과를 UI에 알려 줘야 하는데.
  112. if (result != EziMOTIONPlusELib.FMM_OK) { }
  113. }
  114. void CreateAxis()
  115. {
  116. sql.AxisConfigDAL.All.ForEach(config =>
  117. {
  118. Axis.AxisConfig c = new Axis.AxisConfig
  119. {
  120. AxisName = config.Name,
  121. AxisNo = config.Id,
  122. Scale = config.Scale,
  123. Address = config.Address,
  124. };
  125. axes.Add(new EzAxis(c));
  126. });
  127. this.axes.ForEach(axis =>
  128. {
  129. var data = sql.AxisVelocityDataDAL.GetK(axis.Config.AxisName);
  130. Axis.AxisData axisData = new AxisData
  131. {
  132. AxisNo = data.id,
  133. AxisName = data.AxisName,
  134. AutoRunVelocity = data.AutoRunVelocity,
  135. AutoRunAccelerate = data.AutoRunAccelerate,
  136. AutoRunDecelerate = data.AutoRunDecelerate,
  137. ManualRunVelocity = data.ManualRunVelocity,
  138. JogFast = data.JogFast,
  139. JogSlow = data.JogSlow,
  140. Tolerance = data.Tolerance,
  141. };
  142. axis.Initialize(axisData);
  143. });
  144. }
  145. public int LeftOriginReturn()
  146. {
  147. var servo = this.axes.Where(s => s.Config.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_LEFT)).Single();
  148. return servo.OriginReturn(true);
  149. }
  150. public int RightOriginReturn()
  151. {
  152. var servo = this.axes.Where(s => s.Config.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_RIGHT)).Single();
  153. return servo.OriginReturn(true);
  154. }
  155. public int AllOriginReturn()
  156. {
  157. int result = 0;
  158. result = LeftOriginReturn();
  159. if (result != EziMOTIONPlusELib.FMM_OK)
  160. return 7;
  161. result = RightOriginReturn();
  162. if (result != EziMOTIONPlusELib.FMM_OK)
  163. return 8;
  164. return result;
  165. }
  166. public int IsAllAxisOriginReturn()
  167. {
  168. int result = 0;
  169. this.axes.ForEach(x =>
  170. {
  171. if (!x.IsOriginReturn())
  172. {
  173. if (x.Config.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_LEFT))
  174. result = 5;
  175. else
  176. result = 6;
  177. return;
  178. }
  179. });
  180. return result;
  181. }
  182. #region Data
  183. public void SavePositionData(string pos, double left, double right)
  184. {
  185. var dataList = sql.AxisPositionDataDAL.GetKFromPostion(pos);
  186. var sqlLeft = dataList.Where(x => x.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_LEFT)).Single();
  187. var sqlRight = dataList.Where(x => x.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_RIGHT)).Single();
  188. sqlLeft.Value = left;
  189. sql.AxisPositionDataDAL.Update(sqlLeft);
  190. sqlRight.Value = right;
  191. sql.AxisPositionDataDAL.Update(sqlRight);
  192. }
  193. #endregion
  194. public int JogMove(string axisName, E_JogMoveDir dir, int velocity)
  195. {
  196. logger.D($"JogMove - Axis[{axisName}] / Dir[{dir}] / vel[{velocity}]");
  197. var axis = this.axes.Where(x => x.Config.AxisName.Equals(axisName)).Single();
  198. return axis.JogMove(dir, velocity);
  199. }
  200. public int MoveToLockPosition(string axisName)
  201. {
  202. var servo = this.axes.Where(x => x.Config.AxisName.Equals(axisName)).Single();
  203. var axisPositionDatas = sql.AxisPositionDataDAL.GetKFromName(axisName).ToList();
  204. var data = axisPositionDatas.Where(x => x.Name.Equals(ConstString.TEACH_POSITION_LOCK)).Single();
  205. int result = servo.Move(data.Value);
  206. return result;
  207. }
  208. public int MoveToUnlockPosition(string axisName)
  209. {
  210. var servo = this.axes.Where(x => x.Config.AxisName.Equals(axisName)).Single();
  211. var axisPositionDatas = sql.AxisPositionDataDAL.GetKFromName(axisName).ToList();
  212. var data = axisPositionDatas.Where(x => x.Name.Equals(ConstString.TEACH_POSITION_UNLOCK)).Single();
  213. int result = servo.Move(data.Value);
  214. return result;
  215. }
  216. /// <summary>
  217. /// 두개를 동시에 Lock
  218. /// </summary>
  219. /// <returns></returns>
  220. public int Lock_Sync()
  221. {
  222. int result = 0;
  223. result = this.AllOriginReturn();
  224. if (result != 0)
  225. return result;
  226. var leftPositionDatas = sql.AxisPositionDataDAL.GetKFromName(ConstString.AXIS_CARRIER_LOCK_LEFT).ToList();
  227. var leftData = leftPositionDatas.Where(x => x.Name.Equals(ConstString.TEACH_POSITION_LOCK)).Single();
  228. var left = this.axes.Where(x => x.Config.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_LEFT)).Single();
  229. var rightPositionDatas = sql.AxisPositionDataDAL.GetKFromName(ConstString.AXIS_CARRIER_LOCK_RIGHT).ToList();
  230. var rightData = leftPositionDatas.Where(x => x.Name.Equals(ConstString.TEACH_POSITION_LOCK)).Single();
  231. var right = this.axes.Where(x => x.Config.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_RIGHT)).Single();
  232. result = left.StartMove(leftData.Value, 0);
  233. if (result != EziMOTIONPlusELib.FMM_OK)
  234. return result;
  235. result = right.StartMove(rightData.Value, 0);
  236. if (result != EziMOTIONPlusELib.FMM_OK)
  237. return result;
  238. result = left.Wait4Done();
  239. if (result != EziMOTIONPlusELib.FMM_OK)
  240. return result;
  241. result = right.Wait4Done();
  242. if (result != EziMOTIONPlusELib.FMM_OK)
  243. return result;
  244. return EziMOTIONPlusELib.FMM_OK;
  245. }
  246. /// <summary>
  247. /// 두개의 Axis 를 동시에 Unlock
  248. /// </summary>
  249. /// <returns></returns>
  250. public int Unlock_Sync()
  251. {
  252. int result = 0;
  253. result = this.AllOriginReturn();
  254. if (result != 0)
  255. return result;
  256. var leftPositionDatas = sql.AxisPositionDataDAL.GetKFromName(ConstString.AXIS_CARRIER_LOCK_LEFT).ToList();
  257. var leftData = leftPositionDatas.Where(x => x.Name.Equals(ConstString.TEACH_POSITION_UNLOCK)).Single();
  258. var left = this.axes.Where(x => x.Config.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_LEFT)).Single();
  259. var rightPositionDatas = sql.AxisPositionDataDAL.GetKFromName(ConstString.AXIS_CARRIER_LOCK_RIGHT).ToList();
  260. var rightData = leftPositionDatas.Where(x => x.Name.Equals(ConstString.TEACH_POSITION_UNLOCK)).Single();
  261. var right = this.axes.Where(x => x.Config.AxisName.Equals(ConstString.AXIS_CARRIER_LOCK_RIGHT)).Single();
  262. result = left.StartMove(leftData.Value, 0);
  263. if (result != EziMOTIONPlusELib.FMM_OK)
  264. return result;
  265. result = right.StartMove(rightData.Value, 0);
  266. if (result != EziMOTIONPlusELib.FMM_OK)
  267. return result;
  268. result = left.Wait4Done();
  269. if (result != EziMOTIONPlusELib.FMM_OK)
  270. return result;
  271. result = right.Wait4Done();
  272. if (result != EziMOTIONPlusELib.FMM_OK)
  273. return result;
  274. return EziMOTIONPlusELib.FMM_OK;
  275. }
  276. }
  277. }