Clamp.cs 14 KB

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