CIDReaderBaseDevice.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.Fsm;
  5. using Aitex.Core.RT.Log;
  6. using Aitex.Core.RT.SCCore;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.Event;
  9. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
  10. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.CarrierIdReaders.CarrierIDReaderBase
  17. {
  18. public abstract class CIDReaderBaseDevice : Entity, IDevice, ICarrierIDReader, IEntity
  19. {
  20. public event Action<ModuleName, string,string> OnCarrierIDReadEvent;
  21. public event Action<ModuleName, string,string> OnCarrierIDReadFailedEvent;
  22. public event Action<ModuleName, string,string> OnCarrierIDWriteEvent;
  23. public event Action<ModuleName,string> OnCarrierIDWriteFailedEvent;
  24. public event Action<string, AlarmEventItem> OnDeviceAlarmStateChanged;
  25. public LoadPortBaseDevice ReaderOnLP { get; private set; }
  26. public ModuleName ReaderOnModule { get; private set; }
  27. public int CarrierIDIndex { get; protected set; }
  28. public int CarrierIDStartPage { get; protected set; }
  29. public int CarrierIDPageLength { get; protected set; }
  30. public bool IsUpdateLPCarrierID { get; set; }
  31. public string Module { get; set; }
  32. public string Name { get; set; }
  33. public string CarrierIDBeRead { get; set; }
  34. public string CarrierIDToBeWriten { get; set; }
  35. public bool HasAlarm { get; set; }
  36. public bool IsBusy { get; set; }
  37. public virtual bool IsNeedTrimSpace
  38. {
  39. get
  40. {
  41. if (SC.ContainsItem($"CarrierID.{Name}.CarrierIdNeedTrimSpace"))
  42. return SC.GetValue<bool>($"CarrierID.{Name}.CarrierIdNeedTrimSpace");
  43. return true;
  44. }
  45. }
  46. public virtual int RetryTime
  47. {
  48. get
  49. {
  50. if (SC.ContainsItem($"CarrierID.{Name}.RetryTime"))
  51. return SC.GetValue<int>($"CarrierID.{Name}.RetryTime");
  52. return 1;
  53. }
  54. }
  55. public virtual int ActionTimeLimit
  56. {
  57. get
  58. {
  59. if (SC.ContainsItem($"CarrierID.{Name}.ActionTimeLimit"))
  60. return SC.GetValue<int>($"CarrierID.{Name}.ActionTimeLimit");
  61. return 10;
  62. }
  63. }
  64. public virtual bool IsReady => DeviceState == CIDReaderStateEnum.Idle && !IsBusy;
  65. public CIDReaderStateEnum DeviceState => (CIDReaderStateEnum)(int)fsm.State;
  66. public CIDReaderBaseDevice(string module,string name,LoadPortBaseDevice lp =null,int readerIndex=1,bool updateLpCarrierID = true):base()
  67. {
  68. Module = module;
  69. Name = name;
  70. ReaderOnLP = lp;
  71. if (ReaderOnLP != null)
  72. {
  73. ReaderOnModule = lp.LPModuleName;
  74. }
  75. else
  76. ReaderOnModule = ModuleName.System;
  77. CarrierIDIndex = readerIndex;
  78. IsUpdateLPCarrierID = updateLpCarrierID;
  79. InitializeCIDReader();
  80. }
  81. private void InitializeCIDReader()
  82. {
  83. BuildTransitionTable();
  84. SubscribeDataVariable();
  85. SubscribeOperation();
  86. SubscribeDeviceOperation();
  87. Running = true;
  88. }
  89. protected override bool Init()
  90. {
  91. return base.Init();
  92. }
  93. private void SubscribeDeviceOperation()
  94. {
  95. ;
  96. }
  97. private void SubscribeOperation()
  98. {
  99. }
  100. private void SubscribeDataVariable()
  101. {
  102. DATA.Subscribe(Name, "CurrentCarrierID", () => CarrierIDBeRead);
  103. DATA.Subscribe(Name, "CurrentState", () => DeviceState.ToString());
  104. }
  105. private void BuildTransitionTable()
  106. {
  107. fsm = new StateMachine<CIDReaderBaseDevice>(Module + Name + ".CIDReaderStateMachine", (int)CIDReaderStateEnum.Init, 50);
  108. AnyStateTransition(CIDMsg.Error, fError, CIDReaderStateEnum.Error);
  109. //AnyStateTransition(CIDMsg.Reset, fStartReset, CIDReaderStateEnum.Resetting);
  110. Transition(CIDReaderStateEnum.Init, CIDMsg.Reset, fStartReset, CIDReaderStateEnum.Resetting);
  111. Transition(CIDReaderStateEnum.Error, CIDMsg.Reset, fStartReset, CIDReaderStateEnum.Resetting);
  112. Transition(CIDReaderStateEnum.Resetting, CIDMsg.ActionDone, fResetComplete, CIDReaderStateEnum.Idle);
  113. Transition(CIDReaderStateEnum.Resetting, CIDMsg.ResetComplete, fResetComplete, CIDReaderStateEnum.Idle);
  114. Transition(CIDReaderStateEnum.Resetting, FSM_MSG.TIMER, fMonitorReset, CIDReaderStateEnum.Idle);
  115. Transition(CIDReaderStateEnum.Init, CIDMsg.StartInit, fStartInit, CIDReaderStateEnum.Initializing);
  116. Transition(CIDReaderStateEnum.Initializing, CIDMsg.InitComplete, fInitComplete, CIDReaderStateEnum.Initializing);
  117. Transition(CIDReaderStateEnum.Initializing, CIDMsg.ActionDone, fInitComplete, CIDReaderStateEnum.Idle);
  118. Transition(CIDReaderStateEnum.Initializing, FSM_MSG.TIMER, fMonitorInit, CIDReaderStateEnum.Idle);
  119. Transition(CIDReaderStateEnum.Error, CIDMsg.Clear, fStartClear, CIDReaderStateEnum.Idle);
  120. Transition(CIDReaderStateEnum.Idle, CIDMsg.SetParameter, fStartSetParameter, CIDReaderStateEnum.SetParameter);
  121. Transition(CIDReaderStateEnum.SetParameter, CIDMsg.SetComplete, fSetParameterComplete, CIDReaderStateEnum.SetParameter);
  122. Transition(CIDReaderStateEnum.SetParameter, CIDMsg.ActionDone, fSetParameterComplete, CIDReaderStateEnum.SetParameter);
  123. Transition(CIDReaderStateEnum.Idle, CIDMsg.ReadParameter, fStartReadParameter, CIDReaderStateEnum.ReadParameter);
  124. Transition(CIDReaderStateEnum.ReadParameter, CIDMsg.ReadParaComplete, fReadParameterComplete, CIDReaderStateEnum.Idle);
  125. Transition(CIDReaderStateEnum.ReadParameter, CIDMsg.ActionDone, fReadParameterComplete, CIDReaderStateEnum.Idle);
  126. Transition(CIDReaderStateEnum.Idle, CIDMsg.ReadCarrierID, fStartReadCarrierID, CIDReaderStateEnum.ReadCarrierID);
  127. Transition(CIDReaderStateEnum.ReadCarrierID, CIDMsg.ReadCarrierIDComplete, fReadCarrierIDComplete, CIDReaderStateEnum.Idle);
  128. Transition(CIDReaderStateEnum.ReadCarrierID, CIDMsg.ActionDone, fReadCarrierIDComplete, CIDReaderStateEnum.Idle);
  129. Transition(CIDReaderStateEnum.ReadCarrierID, FSM_MSG.TIMER, fMonitorReadCarrierID, CIDReaderStateEnum.Idle);
  130. Transition(CIDReaderStateEnum.Idle, CIDMsg.WriteCarrierID, fStartWriteCarrierID, CIDReaderStateEnum.WriteCarrierID);
  131. Transition(CIDReaderStateEnum.WriteCarrierID, CIDMsg.WriteCarrierIDComplete, fWriteCarrierIDComplete, CIDReaderStateEnum.Idle);
  132. Transition(CIDReaderStateEnum.WriteCarrierID, CIDMsg.ActionDone, fWriteCarrierIDComplete, CIDReaderStateEnum.Idle);
  133. Transition(CIDReaderStateEnum.WriteCarrierID, FSM_MSG.TIMER, fMonitorWriteCarrierID, CIDReaderStateEnum.Idle);
  134. }
  135. protected virtual bool fMonitorWriteCarrierID(object[] param)
  136. {
  137. return false;
  138. }
  139. protected virtual bool fMonitorReadCarrierID(object[] param)
  140. {
  141. return false;
  142. }
  143. protected virtual bool fWriteCarrierIDComplete(object[] param)
  144. {
  145. return true; ;
  146. }
  147. protected virtual bool fStartWriteCarrierID(object[] param)
  148. {
  149. return true;
  150. }
  151. protected virtual bool fReadCarrierIDComplete(object[] param)
  152. {
  153. return true;
  154. }
  155. protected virtual bool fReadParameterComplete(object[] param)
  156. {
  157. return true;
  158. }
  159. protected virtual bool fSetParameterComplete(object[] param)
  160. {
  161. return true;
  162. }
  163. protected virtual bool fStartReadCarrierID(object[] param)
  164. {
  165. return true;
  166. }
  167. protected virtual bool fStartReadParameter(object[] param)
  168. {
  169. return true;
  170. }
  171. protected virtual bool fStartSetParameter(object[] param)
  172. {
  173. return true;
  174. }
  175. protected virtual bool fStartClear(object[] param)
  176. {
  177. return true;
  178. }
  179. protected virtual bool fMonitorInit(object[] param)
  180. {
  181. return true;
  182. }
  183. protected virtual bool fInitComplete(object[] param)
  184. {
  185. return true;
  186. }
  187. protected virtual bool fStartInit(object[] param)
  188. {
  189. return true;
  190. }
  191. protected virtual bool fMonitorReset(object[] param)
  192. {
  193. return true;
  194. }
  195. protected virtual bool fError(object[] param)
  196. {
  197. return true;
  198. }
  199. protected virtual bool fStartReset(object[] param)
  200. {
  201. return true;
  202. }
  203. protected virtual bool fResetComplete(object[] param)
  204. {
  205. return true;
  206. }
  207. public void OnCarrierIDRead(string carrierID)
  208. {
  209. if (OnCarrierIDReadEvent != null)
  210. OnCarrierIDReadEvent(ReaderOnModule, Name, carrierID);
  211. if (ReaderOnLP != null)
  212. ReaderOnLP.OnCarrierIdRead(ReaderOnModule, carrierID,CarrierIDIndex,CarrierIDStartPage,CarrierIDPageLength, IsUpdateLPCarrierID);
  213. OnActionDone();
  214. }
  215. public void OnCarrierIDReadFailed(string errorcode)
  216. {
  217. if (OnCarrierIDReadFailedEvent != null)
  218. OnCarrierIDReadFailedEvent(ReaderOnModule,Name,errorcode);
  219. if (ReaderOnLP != null)
  220. ReaderOnLP.OnCarrierIdReadFailed(ReaderOnModule,CarrierIDIndex);
  221. OnActionDone();
  222. }
  223. public void OnCarrierIDWrite()
  224. {
  225. if (OnCarrierIDWriteEvent != null)
  226. OnCarrierIDWriteEvent(ReaderOnModule, Name, CarrierIDToBeWriten);
  227. if (ReaderOnLP != null)
  228. ReaderOnLP.OnCarrierIdWrite(ReaderOnModule, CarrierIDToBeWriten,CarrierIDIndex, CarrierIDStartPage, CarrierIDPageLength, IsUpdateLPCarrierID);
  229. OnActionDone();
  230. }
  231. public void OnCarrierIDWriteFailed(string errorcode)
  232. {
  233. if (OnCarrierIDWriteFailedEvent != null)
  234. OnCarrierIDWriteFailedEvent(ReaderOnModule, Name);
  235. if (ReaderOnLP != null)
  236. ReaderOnLP.OnCarrierIdWriteFailed(ReaderOnModule, CarrierIDIndex);
  237. OnActionDone();
  238. }
  239. public void Monitor()
  240. {
  241. }
  242. public virtual void Reset()
  243. {
  244. CheckToPostMessage((int)CIDMsg.Reset,null);
  245. }
  246. public bool ReadCarrierID()
  247. {
  248. return CheckToPostMessage((int)CIDMsg.ReadCarrierID, null);
  249. }
  250. public bool WriteCarrierID(string carrierID)
  251. {
  252. return CheckToPostMessage((int)CIDMsg.WriteCarrierID, new object[] { carrierID});
  253. }
  254. public bool ReadParameter(string parameter)
  255. {
  256. return CheckToPostMessage((int)CIDMsg.ReadParameter, new object[] { parameter });
  257. }
  258. public bool SetParameter(string parameter, string value)
  259. {
  260. return CheckToPostMessage((int)CIDMsg.SetParameter, new object[] { parameter ,value});
  261. }
  262. public bool ReadCarrierID(int offset, int length)
  263. {
  264. return CheckToPostMessage((int)CIDMsg.ReadCarrierID, new object[] { offset, length });
  265. }
  266. public bool WriteCarrierID(int offset, int length, string carrierID)
  267. {
  268. return CheckToPostMessage((int)CIDMsg.WriteCarrierID, new object[] { carrierID, offset, length });
  269. }
  270. public void OnError()
  271. {
  272. CheckToPostMessage((int)CIDMsg.Error, null);
  273. }
  274. public void OnActionDone()
  275. {
  276. CheckToPostMessage((int)CIDMsg.ActionDone, null);
  277. }
  278. public bool CheckToPostMessage(int msg, params object[] args)
  279. {
  280. if (!fsm.FindTransition(fsm.State, msg))
  281. {
  282. LOG.Write($"{Name} is in { (CIDReaderStateEnum)fsm.State} state,can not do {(CIDMsg)msg}");
  283. return false;
  284. }
  285. switch((CIDMsg)msg)
  286. {
  287. case CIDMsg.ReadCarrierID:
  288. IsBusy = true;
  289. break;
  290. case CIDMsg.WriteCarrierID:
  291. IsBusy = true;
  292. break;
  293. }
  294. fsm.PostMsg(msg, args);
  295. return true;
  296. }
  297. public bool Check(int msg, out string reason, params object[] args)
  298. {
  299. if (!fsm.FindTransition(fsm.State, msg))
  300. {
  301. reason = String.Format("{0} is in {1} state,can not do {2}", Name, (CIDReaderStateEnum)fsm.State, (CIDMsg)msg);
  302. return false;
  303. }
  304. reason = "";
  305. return true;
  306. }
  307. }
  308. public enum CIDReaderStateEnum
  309. {
  310. Undefined = 0,
  311. Init,
  312. Initializing,
  313. Idle,
  314. SetParameter,
  315. ReadParameter,
  316. ReadCarrierID,
  317. WriteCarrierID,
  318. Error,
  319. Resetting,
  320. }
  321. public enum CIDMsg
  322. {
  323. Reset,
  324. ResetComplete,
  325. Clear,
  326. StartInit,
  327. InitComplete,
  328. SetParameter,
  329. SetComplete,
  330. ReadParameter,
  331. ReadParaComplete,
  332. ReadCarrierID,
  333. ReadCarrierIDComplete,
  334. WriteCarrierID,
  335. WriteCarrierIDComplete,
  336. ActionDone,
  337. Error,
  338. }
  339. }