TransporterCommon.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.Log;
  5. using Aitex.Core.RT.OperationCenter;
  6. using Aitex.Core.RT.Routine;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Core.Util;
  9. using MECF.Framework.Common.Beckhoff.ModuleIO;
  10. using MECF.Framework.Common.CommonData.Transporter;
  11. using MECF.Framework.Common.Equipment;
  12. using MECF.Framework.Common.ToolLayout;
  13. using MECF.Framework.Common.TwinCat;
  14. using CyberX8_Core;
  15. using CyberX8_RT.Devices.AXIS;
  16. using CyberX8_RT.Devices.AXIS.CANOpen;
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Linq;
  20. using System.Net.NetworkInformation;
  21. using System.Reflection;
  22. using System.Text;
  23. using System.Threading.Tasks;
  24. using CyberX8_RT.Devices.BarcodeReader;
  25. using MECF.Framework.Common.IOCore;
  26. namespace CyberX8_RT.Devices.TransPorter
  27. {
  28. public class TransporterCommon : BaseDevice, IDevice
  29. {
  30. private enum TransporterCommonOperation
  31. {
  32. None=0,
  33. Lock=1,
  34. Unlock=2,
  35. Retract=3,
  36. Extend=4
  37. }
  38. #region 常量
  39. private const string UNLOCK = "Unlock";
  40. private const string LOCKED1 = "Locked1";
  41. private const string LOCKED2 = "Locked2";
  42. private const string UNLOCKED1 = "Unlocked1";
  43. private const string UNLOCKED2 = "Unlocked2";
  44. private const string IMMOBILIZE_ACTIVE = "ImmobilizeActive";
  45. private const string IMMOBILIZE_ACTIVE2 = "ImmobilizeActive2";
  46. private const string IMMOBILIZE_RETRACTED1 = "ImmobilizeRetracted1";
  47. private const string IMMOBILIZE_RETRACTED2 = "ImmobilizeRetracted2";
  48. private const string IMMOBILIZE_EXTEND1 = "ImmobilizeExtended1";
  49. private const string IMMOBILIZE_EXTEND2= "ImmobilizeExtended2";
  50. private const string READY_TO_LOCK1 = "ReadyToLock1";
  51. private const string READY_TO_LOCK2 = "ReadyToLock2";
  52. private const string WH_PRESENT1 = "WhPresent1";
  53. private const string WH_PRESENT2 = "WhPresent2";
  54. private const string TRANSPORTER_DATA = "TransporterData";
  55. #endregion
  56. #region 内部变量
  57. private TransporterData _transporterData = new TransporterData();
  58. /// <summary>
  59. /// 状态
  60. /// </summary>
  61. private RState _status;
  62. /// <summary>
  63. /// 当前操作
  64. /// </summary>
  65. private TransporterCommonOperation _currentOperation;
  66. /// <summary>
  67. /// unlock后自动lock时长
  68. /// </summary>
  69. private int _unlockTimerLockInterval = 20;
  70. /// <summary>
  71. /// unlock时间
  72. /// </summary>
  73. private DateTime _unlockDateTime = DateTime.Now;
  74. #region Routine
  75. /// <summary>
  76. /// lock routine
  77. /// </summary>
  78. private TransporterLockRoutine _lockRoutine;
  79. /// <summary>
  80. /// Unlock Routine
  81. /// </summary>
  82. private TransporterUnlockRoutine _unlockRoutine;
  83. /// <summary>
  84. /// Retract Routine
  85. /// </summary>
  86. private TransporterRetractRoutine _retractRoutine;
  87. /// <summary>
  88. /// Extend Routine
  89. /// </summary>
  90. private TransporterExtendRoutine _extendRoutine;
  91. /// <summary>
  92. /// barcodeReaderName
  93. /// </summary>
  94. private string _barcodeReaderName;
  95. /// <summary>
  96. /// 条码读取器
  97. /// </summary>
  98. private BarcodeReaderController _barcodeReader;
  99. #endregion
  100. #endregion
  101. #region 属性
  102. /// <summary>
  103. /// 数据
  104. /// </summary>
  105. public TransporterData TransporterData { get { return _transporterData; } }
  106. #endregion
  107. /// <summary>
  108. /// 构造函数
  109. /// </summary>
  110. /// <param name="moduleName"></param>
  111. public TransporterCommon(string moduleName) : base(moduleName, "Common", "Common", "Common")
  112. {
  113. TransporterItem transporterItem = TransporterItemManager.Instance.GetTransporterItem(moduleName);
  114. if(transporterItem != null)
  115. {
  116. _barcodeReaderName =transporterItem.BarcodeReader;
  117. }
  118. }
  119. /// <summary>
  120. /// 初始化
  121. /// </summary>
  122. /// <returns></returns>
  123. public bool Initialize()
  124. {
  125. InitializeData();
  126. SubscribeValueAction();
  127. InitializeRoutine();
  128. InitializeOperation();
  129. return true;
  130. }
  131. /// <summary>
  132. /// 初始化数据
  133. /// </summary>
  134. private void InitializeData()
  135. {
  136. DATA.Subscribe($"{Module}.{TRANSPORTER_DATA}", () => _transporterData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  137. DATA.Subscribe($"{Module}.BarcodeReader", () => _barcodeReaderName, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  138. DATA.Subscribe($"{Module}.WSPresent1", ()=>_transporterData.WhPresent1, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  139. DATA.Subscribe($"{Module}.WSPresent2", () => _transporterData.WhPresent2, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  140. DATA.Subscribe($"{Module}.ImmobilizeActive1", () => _transporterData.ImmobilizeActive, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  141. DATA.Subscribe($"{Module}.ImmobilizeActive2", () => _transporterData.ImmobilizeActive2, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  142. DATA.Subscribe($"{Module}.ImmobilizeRetracted1", () => _transporterData.ImmobilizeRetracted1, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  143. DATA.Subscribe($"{Module}.ImmobilizeRetracted2", () => _transporterData.ImmobilizeRetracted2, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  144. DATA.Subscribe($"{Module}.ImmobilizeExtended1", () => _transporterData.ImmobilizeExtended1, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  145. DATA.Subscribe($"{Module}.ImmobilizeExtended2", () => _transporterData.ImmobilizeExtended2, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  146. DATA.Subscribe($"{Module}.Locked1", () => _transporterData.Locked1, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  147. DATA.Subscribe($"{Module}.Locked2", () => _transporterData.Locked2, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  148. DATA.Subscribe($"{Module}.ReadyToLock1", () => _transporterData.ReadyToLock1, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  149. DATA.Subscribe($"{Module}.ReadyToLock2", () => _transporterData.ReadyToLock2, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  150. DATA.Subscribe($"{Module}.Unlocked1", () => _transporterData.Unlocked1, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  151. DATA.Subscribe($"{Module}.Unlocked2", () => _transporterData.Unlocked2, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  152. }
  153. /// <summary>
  154. /// 订阅变量数值发生变化
  155. /// </summary>
  156. private void SubscribeValueAction()
  157. {
  158. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", UNLOCK, UpdateVariableValue);
  159. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", LOCKED1, UpdateVariableValue);
  160. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", LOCKED2, UpdateVariableValue);
  161. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", UNLOCKED1, UpdateVariableValue);
  162. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", UNLOCKED2, UpdateVariableValue);
  163. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_ACTIVE, UpdateVariableValue);
  164. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_ACTIVE2, UpdateVariableValue);
  165. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_RETRACTED1, UpdateVariableValue);
  166. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_RETRACTED2, UpdateVariableValue);
  167. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_EXTEND1, UpdateVariableValue);
  168. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", IMMOBILIZE_EXTEND2, UpdateVariableValue);
  169. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", READY_TO_LOCK1, UpdateVariableValue);
  170. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", READY_TO_LOCK2, UpdateVariableValue);
  171. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", WH_PRESENT1, UpdateVariableValue);
  172. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", WH_PRESENT2, UpdateVariableValue);
  173. }
  174. /// <summary>
  175. /// 初始化操作
  176. /// </summary>
  177. private void InitializeOperation()
  178. {
  179. OP.Subscribe($"{Module}.Lock", LockOperation);
  180. OP.Subscribe($"{Module}.Unlock", UnlockOperation);
  181. OP.Subscribe($"{Module}.Retract", RetractOperation);
  182. OP.Subscribe($"{Module}.Extend", ExtendOperation);
  183. }
  184. /// <summary>
  185. /// 更新变量数值
  186. /// </summary>
  187. /// <param name="variable"></param>
  188. /// <param name="value"></param>
  189. private void UpdateVariableValue(string variable, object value)
  190. {
  191. PropertyInfo property = TransporterData.GetType().GetProperty(variable);
  192. if (property != null)
  193. {
  194. property.SetValue(TransporterData, value);
  195. }
  196. if(TransporterData.Unlock)
  197. {
  198. _unlockDateTime = DateTime.Now;
  199. }
  200. }
  201. /// <summary>
  202. /// 初始化Routine
  203. /// </summary>
  204. private void InitializeRoutine()
  205. {
  206. _lockRoutine = new TransporterLockRoutine(Module);
  207. _unlockRoutine= new TransporterUnlockRoutine(Module);
  208. _retractRoutine= new TransporterRetractRoutine(Module);
  209. _extendRoutine=new TransporterExtendRoutine(Module);
  210. }
  211. #region 指令
  212. /// <summary>
  213. /// Lock 操作
  214. /// </summary>
  215. /// <param name="cmd"></param>
  216. /// <param name="args"></param>
  217. /// <returns></returns>
  218. private bool LockOperation(string cmd, object[] args)
  219. {
  220. return StartRoutine(TransporterCommonOperation.Lock,_lockRoutine,null);
  221. }
  222. /// <summary>
  223. /// Unlock 操作
  224. /// </summary>
  225. /// <param name="cmd"></param>
  226. /// <param name="args"></param>
  227. /// <returns></returns>
  228. private bool UnlockOperation(string cmd, object[] args)
  229. {
  230. return StartRoutine(TransporterCommonOperation.Unlock, _unlockRoutine, null);
  231. }
  232. /// <summary>
  233. /// Retract 操作
  234. /// </summary>
  235. /// <param name="cmd"></param>
  236. /// <param name="args"></param>
  237. /// <returns></returns>
  238. private bool RetractOperation(string cmd , object[] args)
  239. {
  240. JetAxisBase elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");
  241. if (elevatorAxis!=null && !elevatorAxis.CurrentStation.Contains("UP"))
  242. {
  243. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{Module}.Elevator is not in 'UP' Postion,Can not do Retract Action");
  244. return false;
  245. }
  246. return StartRoutine(TransporterCommonOperation.Retract, _retractRoutine, null);
  247. }
  248. /// <summary>
  249. /// Extend 操作
  250. /// </summary>
  251. /// <param name="cmd"></param>
  252. /// <param name="args"></param>
  253. /// <returns></returns>
  254. private bool ExtendOperation(string cmd , object[] args)
  255. {
  256. JetAxisBase elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");
  257. if (elevatorAxis != null && !elevatorAxis.CurrentStation.Contains("UP"))
  258. {
  259. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{Module}.Elevator is not in 'UP' Postion,Can not do Extend Action");
  260. return false;
  261. }
  262. return StartRoutine(TransporterCommonOperation.Extend, _extendRoutine, null);
  263. }
  264. /// <summary>
  265. /// 启动Routine
  266. /// </summary>
  267. /// <param name="operation"></param>
  268. /// <param name="obj"></param>
  269. /// <returns></returns>
  270. private bool StartRoutine(TransporterCommonOperation operation,IRoutine routine,object obj)
  271. {
  272. if (!JudgeRunningState(operation))
  273. {
  274. _currentOperation = operation;
  275. _status = routine.Start(obj);
  276. return true;
  277. }
  278. else
  279. {
  280. return false;
  281. }
  282. }
  283. /// <summary>
  284. /// 判定运行状态
  285. /// </summary>
  286. /// <returns></returns>
  287. private bool JudgeRunningState(TransporterCommonOperation operation)
  288. {
  289. if (_status == RState.Running)
  290. {
  291. LOG.WriteLog(eEvent.ERR_TRANSPORTER,Module, $"{Module} current execute {_currentOperation},cannot {operation}");
  292. return true;
  293. }
  294. return false;
  295. }
  296. #endregion
  297. /// <summary>
  298. /// 读取条码
  299. /// </summary>
  300. /// <returns></returns>
  301. public string ReaderBarcode()
  302. {
  303. _barcodeReader = DEVICE.GetDevice<BarcodeReaderController>(_barcodeReaderName);
  304. if (_barcodeReader != null)
  305. {
  306. return _barcodeReader.ReadBarcode();
  307. }
  308. return "";
  309. }
  310. /// <summary>
  311. /// 定时器
  312. /// </summary>
  313. /// <returns></returns>
  314. public bool OnTimer()
  315. {
  316. if (_status == RState.Running)
  317. {
  318. if (_currentOperation != TransporterCommonOperation.None)
  319. {
  320. IRoutine routine = GetCurrentRoutine(_currentOperation);
  321. if (routine != null)
  322. {
  323. CheckRoutineState(routine, _currentOperation);
  324. }
  325. else
  326. {
  327. EndOperation();
  328. }
  329. }
  330. }
  331. if (SC.ContainsItem($"Transporter.{Module}.UnlockTimerLock"))
  332. {
  333. _unlockTimerLockInterval = SC.GetValue<int>($"Transporter.{Module}.UnlockTimerLock") * 1000;
  334. }
  335. if(TransporterData.Unlock)
  336. {
  337. if(DateTime.Now.Subtract(_unlockDateTime).TotalMilliseconds>=_unlockTimerLockInterval)
  338. {
  339. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{UNLOCK}");
  340. if (!string.IsNullOrEmpty(ioName))
  341. {
  342. IOModuleManager.Instance.WriteIoValue(ioName, false);
  343. }
  344. }
  345. }
  346. return true;
  347. }
  348. /// <summary>
  349. /// 获取当前操作对应的Routine
  350. /// </summary>
  351. /// <param name="currentOperation"></param>
  352. /// <returns></returns>
  353. private IRoutine GetCurrentRoutine(TransporterCommonOperation currentOperation)
  354. {
  355. switch (currentOperation)
  356. {
  357. case TransporterCommonOperation.Lock:
  358. return _lockRoutine;
  359. case TransporterCommonOperation.Unlock:
  360. return _unlockRoutine;
  361. case TransporterCommonOperation.Retract:
  362. return _retractRoutine;
  363. case TransporterCommonOperation.Extend:
  364. return _extendRoutine;
  365. default:
  366. return null;
  367. }
  368. }
  369. /// <summary>
  370. /// 检验Routine状态
  371. /// </summary>
  372. /// <param name="routine"></param>
  373. /// <param name="currentOperation"></param>
  374. private void CheckRoutineState(IRoutine routine, TransporterCommonOperation currentOperation)
  375. {
  376. RState state = routine.Monitor();
  377. if (state == RState.End)
  378. {
  379. EndOperation();
  380. }
  381. else if (state == RState.Failed || state == RState.Timeout)
  382. {
  383. LOG.WriteLog(eEvent.ERR_TRANSPORTER, $"{Module}.{Name}", $"{currentOperation} error");
  384. EndOperation();
  385. }
  386. }
  387. /// <summary>
  388. /// 结束操作
  389. /// </summary>
  390. private void EndOperation()
  391. {
  392. _status = RState.End;
  393. _currentOperation = TransporterCommonOperation.None;
  394. }
  395. #region 设备接口
  396. public void Monitor()
  397. {
  398. }
  399. public void Reset()
  400. {
  401. }
  402. public void Terminate()
  403. {
  404. }
  405. #endregion
  406. }
  407. }