VehicleBaseDevice.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Event;
  3. using Aitex.Core.RT.Fsm;
  4. using MECF.Framework.Common.Event;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Vehicle
  11. {
  12. public class VehicleBaseDevice : Entity, IEntity, IDevice, IVehicle
  13. {
  14. public VehicleBaseDevice(string module, string name) : base()
  15. {
  16. Module = module;
  17. Name = name;
  18. VehicleName = name;
  19. InitializeVehicleBase();
  20. }
  21. private void InitializeVehicleBase()
  22. {
  23. BuildTransitionTable();
  24. }
  25. private void BuildTransitionTable()
  26. {
  27. fsm = new StateMachine<VehicleBaseDevice>(Module + Name + ".StateMachine", (int)VehicleStateEnum.Init, 10);
  28. AnyStateTransition(VehicleMsg.Error, fError, VehicleStateEnum.Error);
  29. AnyStateTransition((int)FSM_MSG.ALARM, fError, (int)VehicleStateEnum.Error);
  30. AnyStateTransition(VehicleMsg.Abort, fAbrot, VehicleStateEnum.Init);
  31. Transition(VehicleStateEnum.Idle, VehicleMsg.Reset, fStartReset, VehicleStateEnum.Resetting);
  32. Transition(VehicleStateEnum.Init, VehicleMsg.Reset, fStartReset, VehicleStateEnum.Resetting);
  33. Transition(VehicleStateEnum.Error, VehicleMsg.Reset, fStartReset, VehicleStateEnum.Resetting);
  34. Transition(VehicleStateEnum.Resetting, FSM_MSG.TIMER, fMonitorReset, VehicleStateEnum.Idle);
  35. Transition(VehicleStateEnum.Idle, VehicleMsg.Init, fStartInit, VehicleStateEnum.Initializing);
  36. Transition(VehicleStateEnum.Init, VehicleMsg.Init, fStartInit, VehicleStateEnum.Initializing);
  37. Transition(VehicleStateEnum.Error, VehicleMsg.Init, fStartInit, VehicleStateEnum.Initializing);
  38. Transition(VehicleStateEnum.Initializing, FSM_MSG.TIMER, fMonitorInit, VehicleStateEnum.Idle);
  39. Transition(VehicleStateEnum.Idle, FSM_MSG.TIMER, fMonitorIdle, VehicleStateEnum.Idle);
  40. Transition(VehicleStateEnum.Idle, VehicleMsg.Move, fStartMove, VehicleStateEnum.Moving);
  41. Transition(VehicleStateEnum.Idle, VehicleMsg.Pick, fStartPick, VehicleStateEnum.Picking);
  42. Transition(VehicleStateEnum.Idle, VehicleMsg.Place, fStartPlace, VehicleStateEnum.Placing);
  43. Transition(VehicleStateEnum.Moving, FSM_MSG.TIMER, fMonitorMoving, VehicleStateEnum.Idle);
  44. Transition(VehicleStateEnum.Picking, FSM_MSG.TIMER, fMonitorPicking, VehicleStateEnum.Idle);
  45. Transition(VehicleStateEnum.Placing, FSM_MSG.TIMER, fMonitorPlacing, VehicleStateEnum.Idle);
  46. Transition(VehicleStateEnum.Moving, VehicleMsg.Pause, fStartPause, VehicleStateEnum.Pausing);
  47. Transition(VehicleStateEnum.Picking, VehicleMsg.Pause, fStartPause, VehicleStateEnum.Pausing);
  48. Transition(VehicleStateEnum.Placing, VehicleMsg.Pause, fStartPause, VehicleStateEnum.Pausing);
  49. Transition(VehicleStateEnum.Pausing, FSM_MSG.TIMER, fMonitorPausing, VehicleStateEnum.Paused);
  50. Transition(VehicleStateEnum.Paused, VehicleMsg.ResumeToMove, fResumeToMove, VehicleStateEnum.Moving);
  51. Transition(VehicleStateEnum.Paused, VehicleMsg.ResumeToPick, fResumeToPick, VehicleStateEnum.Picking);
  52. Transition(VehicleStateEnum.Paused, VehicleMsg.ResumeToPlace, fResumeToPlace, VehicleStateEnum.Placing);
  53. Transition(VehicleStateEnum.Idle, VehicleMsg.SetMaitenance, fStartMaitenance, VehicleStateEnum.Maintenance);
  54. Transition(VehicleStateEnum.Maintenance, VehicleMsg.SetMaitenance, fStartIdle, VehicleStateEnum.Idle);
  55. }
  56. public bool IsBusy { get; protected set; }
  57. public bool ExecuteReset()
  58. {
  59. if(CheckToPostMessage( VehicleMsg.Reset,null))
  60. {
  61. IsBusy = true;
  62. return true;
  63. }
  64. return false;
  65. }
  66. public bool ExecuteInit()
  67. {
  68. if (CheckToPostMessage(VehicleMsg.Init, null))
  69. {
  70. IsBusy = true;
  71. return true;
  72. }
  73. return false;
  74. }
  75. public bool ExecuteMoveToPosition(uint targetPosition,uint[] viaPositions)
  76. {
  77. if (CheckToPostMessage(VehicleMsg.Move, new object[] {targetPosition,viaPositions }))
  78. {
  79. IsBusy = true;
  80. return true;
  81. }
  82. return false;
  83. }
  84. public bool ExecutePickFromPosition(uint targetPosition, uint[] viaPositions)
  85. {
  86. if (CheckToPostMessage(VehicleMsg.Pick, new object[] { targetPosition, viaPositions }))
  87. {
  88. IsBusy = true;
  89. return true;
  90. }
  91. return false;
  92. }
  93. public bool ExecutePlaceToPosition(uint targetPosition, uint[] viaPositions)
  94. {
  95. if (CheckToPostMessage(VehicleMsg.Place, new object[] { targetPosition, viaPositions }))
  96. {
  97. IsBusy = true;
  98. return true;
  99. }
  100. return false;
  101. }
  102. public bool ExecutePause()
  103. {
  104. if (CheckToPostMessage(VehicleMsg.Pause, null))
  105. {
  106. IsBusy = true;
  107. return true;
  108. }
  109. return false;
  110. }
  111. public virtual bool ExecuteClearCommand()
  112. {
  113. return true;
  114. }
  115. public virtual bool ExecuteChangeRoute(uint targetPosition,uint[] viaPositions)
  116. {
  117. return true;
  118. }
  119. public virtual bool ExecuteReadCarrierID()
  120. {
  121. return true;
  122. }
  123. protected virtual bool fStartPause(object[] param)
  124. {
  125. return true;
  126. }
  127. protected virtual bool fMonitorPausing(object[] param)
  128. {
  129. return true;
  130. }
  131. protected virtual bool fStartInit(object[] param)
  132. {
  133. return true;
  134. }
  135. protected virtual bool fMonitorInit(object[] param)
  136. {
  137. return true;
  138. }
  139. protected virtual bool fAbrot(object[] param)
  140. {
  141. return true;
  142. }
  143. protected virtual bool fStartReset(object[] param)
  144. {
  145. return true;
  146. }
  147. protected virtual bool fMonitorReset(object[] param)
  148. {
  149. return true;
  150. }
  151. protected virtual bool fMonitorIdle(object[] param)
  152. {
  153. return true;
  154. }
  155. protected virtual bool fStartMove(object[] param)
  156. {
  157. return true;
  158. }
  159. protected virtual bool fStartPick(object[] param)
  160. {
  161. return true;
  162. }
  163. protected virtual bool fStartPlace(object[] param)
  164. {
  165. return true;
  166. }
  167. protected virtual bool fMonitorMoving(object[] param)
  168. {
  169. return true;
  170. }
  171. protected virtual bool fMonitorPicking(object[] param)
  172. {
  173. return true;
  174. }
  175. protected virtual bool fMonitorPlacing(object[] param)
  176. {
  177. return true;
  178. }
  179. protected virtual bool fPauseMoving(object[] param)
  180. {
  181. return true;
  182. }
  183. protected virtual bool fPausePicking(object[] param)
  184. {
  185. return true;
  186. }
  187. protected virtual bool fPausePlacing(object[] param)
  188. {
  189. return true;
  190. }
  191. protected virtual bool fResumeToMove(object[] param)
  192. {
  193. return true;
  194. }
  195. protected virtual bool fResumeToPick(object[] param)
  196. {
  197. return true;
  198. }
  199. protected virtual bool fResumeToPlace(object[] param)
  200. {
  201. return true;
  202. }
  203. protected virtual bool fStartMaitenance(object[] param)
  204. {
  205. return true;
  206. }
  207. protected virtual bool fStartIdle(object[] param)
  208. {
  209. return true;
  210. }
  211. protected virtual bool fError(object[] param)
  212. {
  213. return true;
  214. }
  215. public virtual void OnError(string error = "")
  216. {
  217. EV.PostAlarmLog($"Vehicle {Name}", error);
  218. IsBusy = false;
  219. CheckToPostMessage(VehicleMsg.Error, null);
  220. }
  221. public string VehicleName { get; set; }
  222. public string Module { get; set; }
  223. public UInt32 CurrentPosition { get; set; }
  224. public string Name { get ; set; }
  225. public bool HasAlarm => throw new NotImplementedException();
  226. public event Action<string, AlarmEventItem> OnDeviceAlarmStateChanged;
  227. public bool Check(int msg, out string reason, params object[] args)
  228. {
  229. reason = "";
  230. return true;
  231. }
  232. public bool CheckToPostMessage(int msg, params object[] args)
  233. {
  234. if (!fsm.FindTransition(fsm.State, msg))
  235. {
  236. EV.PostWarningLog(Name, $"{Name} is in { (VehicleStateEnum)fsm.State} state,can not do {(VehicleMsg)msg}");
  237. return false;
  238. }
  239. fsm.PostMsg(msg, args);
  240. return true;
  241. }
  242. public bool CheckToPostMessage(VehicleMsg msg, params object[] args)
  243. {
  244. if (!fsm.FindTransition(fsm.State, (int)msg))
  245. {
  246. EV.PostWarningLog(Name, $"{Name} is in { (VehicleStateEnum)fsm.State} state,can not do {msg}");
  247. return false;
  248. }
  249. CurrentParameters = args;
  250. fsm.PostMsg((int)msg, args);
  251. return true;
  252. }
  253. public object[] CurrentParameters { get; private set; }
  254. public void Monitor()
  255. {
  256. }
  257. public void Reset()
  258. {
  259. }
  260. }
  261. }