LoaderSideDevice.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  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.Loader;
  11. using MECF.Framework.Common.TwinCat;
  12. using MECF.Framework.Common.Utilities;
  13. using CyberX8_Core;
  14. using CyberX8_RT.Devices.AXIS.CANOpen;
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using System.Reflection;
  19. using System.Text;
  20. using System.Threading.Tasks;
  21. using MECF.Framework.Common.IOCore;
  22. namespace CyberX8_RT.Devices.Loader
  23. {
  24. public class LoaderSideDevice : BaseDevice, IDevice
  25. {
  26. /// <summary>
  27. ///
  28. /// </summary>
  29. private enum LoaderSideOperation
  30. {
  31. None,
  32. DoorOn,
  33. DoorOff,
  34. VacuumOn,
  35. VacuumOff,
  36. WhBladderOn,
  37. WhBladderOff,
  38. TransBladderOn,
  39. TransBladderOff,
  40. TransHighOn,
  41. TransHighOff,
  42. BernoulliBladderOn,
  43. BernoulliBladderOff,
  44. BernoulliN2On,
  45. BernoulliN2Off,
  46. Load,
  47. Unload,
  48. InstallCRS,
  49. StartCycle,
  50. StopCycle
  51. }
  52. #region 常量
  53. private const string WAFER_PRESENT = "WaferPresent";
  54. private const string DOOR_UNLOCK = "DoorUnlock";
  55. private const string DOOR_UPPER_LOCKED = "DoorUpperLocked";
  56. private const string DOOR_UPPER_UNLOCKED = "DoorUpperUnlocked";
  57. private const string DOOR_LOWER_LOCKED = "DoorLowerLocked";
  58. private const string DOOR_LOWER_UNLOCKED = "DoorLowerUnlocked";
  59. private const string CRS_VACUUM="CRSVacuum";
  60. private const string CRS_VACUUM_VALUE = "CRSVacuumValue";
  61. private const string WH_BLADDER = "WHBladder";
  62. private const string WH_BLADDER_PRESSURE="WHBladderPressure";
  63. private const string TRANS_BLADDER="TransBladder";
  64. private const string TRANS_HIGH="TransHigh";
  65. private const string TRANS_RETRACTED="TransRetracted";
  66. private const string TRANS_PRESSURE = "TransPressure";
  67. private const string BERNOULLI_BLADDER= "BernoulliBladder";
  68. private const string BERNOULLI_EXTENDED="BernoulliExtended";
  69. private const string BERNOULLI_N2="BernoulliN2";
  70. private const string BERNOULLI_N2_SECOND = "BernoulliN2Second";
  71. private const string BERNOULLI_PRESSURE="BernoulliPressure";
  72. private const string WAFER_HOLDER_LOCKED = "WaferHolderLocked";
  73. private const string BERNOULLI_BLADDER_PRESSURE="BernoulliBladderPressure";
  74. private const string SIDE_DATA = "SideData";
  75. private const string CURRENT_OPERATION = "CurrentOperation";
  76. #endregion
  77. #region 内部变量
  78. /// <summary>
  79. /// 数据
  80. /// </summary>
  81. private LoaderSideData _siderData=new LoaderSideData();
  82. /// <summary>
  83. /// 状态
  84. /// </summary>
  85. private RState _status;
  86. /// <summary>
  87. /// 当前操作
  88. /// </summary>
  89. private LoaderSideOperation _currentOperation;
  90. /// <summary>
  91. /// 变量是否初始化字典
  92. /// </summary>
  93. private Dictionary<string, bool> _variableInitializeDic = new Dictionary<string, bool>();
  94. /// <summary>
  95. /// 当前次数
  96. /// </summary>
  97. private string _currentCycle = "";
  98. #region routine
  99. /// <summary>
  100. /// door lock routine
  101. /// </summary>
  102. private LoaderSideDoorLockRoutine _doorlockRoutine;
  103. /// <summary>
  104. /// Vacuum Routine
  105. /// </summary>
  106. private LoaderSideVacuumRoutine _vacuumRoutine;
  107. /// <summary>
  108. /// WH Bladder Routine
  109. /// </summary>
  110. private LoaderSideWhBladderRoutine _whBladderRoutine;
  111. /// <summary>
  112. /// Trans Bladder Routine
  113. /// </summary>
  114. private LoaderSideTransBladderRoutine _transBladderRoutine;
  115. /// <summary>
  116. /// Trans High Pressure Routine
  117. /// </summary>
  118. private LoaderSideTransHighRoutine _transHighPressureRoutine;
  119. /// <summary>
  120. /// Bernoulli Bladder Routine
  121. /// </summary>
  122. private LoaderSideBernoulliBladderRoutine _bernoulliBladderRoutine;
  123. /// <summary>
  124. /// Load Routine
  125. /// </summary>
  126. private LoaderLoadRoutine _loadRoutine;
  127. /// <summary>
  128. /// Unload Routine
  129. /// </summary>
  130. private LoaderUnloadRoutine _unloadRoutine;
  131. /// <summary>
  132. /// Install Routine
  133. /// </summary>
  134. private LoaderInstallCRSRoutine _installCRSRoutine;
  135. /// <summary>
  136. /// Cycle Routine
  137. /// </summary>
  138. private LoaderSideCycleRoutine _cycleRoutine;
  139. #endregion
  140. #endregion
  141. #region 属性
  142. /// <summary>
  143. /// 数据
  144. /// </summary>
  145. public LoaderSideData SideData
  146. {
  147. get { return _siderData; }
  148. set { _siderData = value; }
  149. }
  150. /// <summary>
  151. /// 状态
  152. /// </summary>
  153. public RState Status { get { return _status; } }
  154. /// <summary>
  155. /// 当前次数
  156. /// </summary>
  157. public String CurrentCycle { get { return _currentCycle; } }
  158. /// <summary>
  159. /// 所有io变量是否初始化
  160. /// </summary>
  161. public bool IOInitialized { get { return IOVariableDictionaryUtil.AllIoVariableInitialized(eEvent.ERR_LOADER,Module,_variableInitializeDic); } }
  162. #endregion
  163. /// <summary>
  164. /// 构造函数
  165. /// </summary>
  166. /// <param name="moduleName"></param>
  167. /// <param name="name"></param>
  168. public LoaderSideDevice(string moduleName,string name):base(moduleName,name,name,name)
  169. {
  170. }
  171. /// <summary>
  172. /// 初始化
  173. /// </summary>
  174. /// <returns></returns>
  175. public bool Initialize()
  176. {
  177. SubscribeData();
  178. SubscribeValueAction();
  179. InitializeRoutine();
  180. InitializeOperation();
  181. return true;
  182. }
  183. /// <summary>
  184. /// 初始化Routine
  185. /// </summary>
  186. private void InitializeRoutine()
  187. {
  188. _doorlockRoutine = new LoaderSideDoorLockRoutine($"{Module}.{Name}");
  189. _vacuumRoutine = new LoaderSideVacuumRoutine($"{Module}.{Name}");
  190. _whBladderRoutine = new LoaderSideWhBladderRoutine($"{Module}.{Name}");
  191. _transBladderRoutine = new LoaderSideTransBladderRoutine($"{Module}.{Name}");
  192. _transHighPressureRoutine = new LoaderSideTransHighRoutine($"{Module}.{Name}");
  193. _bernoulliBladderRoutine = new LoaderSideBernoulliBladderRoutine($"{Module}.{Name}");
  194. _loadRoutine = new LoaderLoadRoutine(Module,Name);
  195. _unloadRoutine = new LoaderUnloadRoutine(Module,Name);
  196. _installCRSRoutine = new LoaderInstallCRSRoutine(Module,Name);
  197. _cycleRoutine = new LoaderSideCycleRoutine(Module, Name);
  198. }
  199. /// <summary>
  200. /// 订阅数据
  201. /// </summary>
  202. private void SubscribeData()
  203. {
  204. DATA.Subscribe($"{Module}.{Name}.{SIDE_DATA}", () => _siderData,SubscriptionAttribute.FLAG.IgnoreSaveDB);
  205. DATA.Subscribe($"{Module}.{Name}.CurrentCycle", () => _currentCycle, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  206. DATA.Subscribe($"{Module}.{Name}.CurrentCycleStep", () =>
  207. {
  208. if(_currentOperation==LoaderSideOperation.StartCycle)
  209. {
  210. return _cycleRoutine.CurrentStep;
  211. }
  212. else
  213. {
  214. return "";
  215. }
  216. }, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  217. DATA.Subscribe($"{Module}.{Name}.{CURRENT_OPERATION}", () => _currentOperation.ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  218. DATA.Subscribe($"{Module}.{Name}.CRSVacuumValue",()=>_siderData.CRSVacuumValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  219. DATA.Subscribe($"{Module}.{Name}.CRSVacuum", () => _siderData.CRSVacuum, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  220. DATA.Subscribe($"{Module}.{Name}.BernoulliPressure", () => _siderData.BernoulliPressure, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  221. DATA.Subscribe($"{Module}.{Name}.BernoulliBladder", () => _siderData.BernoulliBladder, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  222. DATA.Subscribe($"{Module}.{Name}.BernoulliBladderPressure", () => _siderData.BernoulliBladderPressure, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  223. DATA.Subscribe($"{Module}.{Name}.BernoulliExtended", () => _siderData.BernoulliExtended, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  224. DATA.Subscribe($"{Module}.{Name}.BernoulliN2", () => _siderData.BernoulliN2, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  225. DATA.Subscribe($"{Module}.{Name}.BernoulliN2Second", () => _siderData.BernoulliN2Second, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  226. DATA.Subscribe($"{Module}.{Name}.DoorLowerLocked", () => _siderData.DoorLowerLocked, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  227. DATA.Subscribe($"{Module}.{Name}.DoorLowerUnlocked", () => _siderData.DoorLowerUnlocked, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  228. DATA.Subscribe($"{Module}.{Name}.DoorUpperLocked", () => _siderData.DoorUpperLocked, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  229. DATA.Subscribe($"{Module}.{Name}.DoorUpperUnlocked", () => _siderData.DoorUpperUnlocked, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  230. DATA.Subscribe($"{Module}.{Name}.TransBladder", () => _siderData.TransBladder, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  231. DATA.Subscribe($"{Module}.{Name}.TransHigh", () => _siderData.TransHigh, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  232. DATA.Subscribe($"{Module}.{Name}.TransPressure", () => _siderData.TransPressure, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  233. DATA.Subscribe($"{Module}.{Name}.TransRetracted", () => _siderData.TransRetracted, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  234. DATA.Subscribe($"{Module}.{Name}.WaferPresent", () => _siderData.WaferPresent, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  235. DATA.Subscribe($"{Module}.{Name}.WSBladder", () => _siderData.WHBladder, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  236. DATA.Subscribe($"{Module}.{Name}.WSBladderPressure", () => _siderData.WHBladderPressure, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  237. }
  238. /// <summary>
  239. /// 订阅变量数值发生变化
  240. /// </summary>
  241. private void SubscribeValueAction()
  242. {
  243. BeckhoffIoSubscribeUpdateVariable(WAFER_PRESENT);
  244. BeckhoffIoSubscribeUpdateVariable(DOOR_UNLOCK);
  245. BeckhoffIoSubscribeUpdateVariable(DOOR_UPPER_LOCKED);
  246. BeckhoffIoSubscribeUpdateVariable(DOOR_UPPER_UNLOCKED);
  247. BeckhoffIoSubscribeUpdateVariable(DOOR_LOWER_LOCKED);
  248. BeckhoffIoSubscribeUpdateVariable(DOOR_LOWER_UNLOCKED);
  249. BeckhoffIoSubscribeUpdateVariable(CRS_VACUUM);
  250. BeckhoffIoSubscribeUpdateVariable(CRS_VACUUM_VALUE);
  251. BeckhoffIoSubscribeUpdateVariable(WH_BLADDER);
  252. BeckhoffIoSubscribeUpdateVariable(WH_BLADDER_PRESSURE);
  253. BeckhoffIoSubscribeUpdateVariable(TRANS_BLADDER);
  254. BeckhoffIoSubscribeUpdateVariable(TRANS_HIGH);
  255. BeckhoffIoSubscribeUpdateVariable(TRANS_RETRACTED);
  256. BeckhoffIoSubscribeUpdateVariable(TRANS_PRESSURE);
  257. BeckhoffIoSubscribeUpdateVariable(BERNOULLI_BLADDER);
  258. BeckhoffIoSubscribeUpdateVariable(BERNOULLI_EXTENDED);
  259. BeckhoffIoSubscribeUpdateVariable(BERNOULLI_N2);
  260. BeckhoffIoSubscribeUpdateVariable(BERNOULLI_N2_SECOND);
  261. BeckhoffIoSubscribeUpdateVariable(BERNOULLI_PRESSURE);
  262. BeckhoffIoSubscribeUpdateVariable(WAFER_HOLDER_LOCKED);
  263. BeckhoffIoSubscribeUpdateVariable(BERNOULLI_BLADDER_PRESSURE);
  264. }
  265. /// <summary>
  266. /// 订阅IO变量
  267. /// </summary>
  268. /// <param name="variable"></param>
  269. private void BeckhoffIoSubscribeUpdateVariable(string variable)
  270. {
  271. _variableInitializeDic[variable] = false;
  272. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}.{Name}", variable, UpdateVariableValue);
  273. }
  274. /// <summary>
  275. /// 初始化操作
  276. /// </summary>
  277. private void InitializeOperation()
  278. {
  279. OP.Subscribe($"{Module}.{Name}.DoorLockOn",(cmd,args)=> { return DoorLockOnAction(); });
  280. OP.Subscribe($"{Module}.{Name}.DoorLockOff",(cmd,args)=> { return DoorLockOffAction(); });
  281. OP.Subscribe($"{Module}.{Name}.VacuumOn", VacuumOnAction);
  282. OP.Subscribe($"{Module}.{Name}.VacuumOff", VacuumOffAction);
  283. OP.Subscribe($"{Module}.{Name}.WhBladderOn", WhBladderOnAction);
  284. OP.Subscribe($"{Module}.{Name}.WhBladderOff", WhBladderOffAction);
  285. OP.Subscribe($"{Module}.{Name}.TransBladderOn", TransBladderOnAction);
  286. OP.Subscribe($"{Module}.{Name}.TransBladderOff", TransBladderOffAction);
  287. OP.Subscribe($"{Module}.{Name}.TransHighOn", TransHighPressureOnAction);
  288. OP.Subscribe($"{Module}.{Name}.TransHighOff", TransHighPressureOffAction);
  289. OP.Subscribe($"{Module}.{Name}.BernoulliBladderOn", BernoulliBladderOnAction);
  290. OP.Subscribe($"{Module}.{Name}.BernoulliBladderOff", BernoulliBladderOffAction);
  291. OP.Subscribe($"{Module}.{Name}.BernoulliN2On", BernoulliN2OnAction);
  292. OP.Subscribe($"{Module}.{Name}.BernoulliN2Off", BernoulliN2OffAction);
  293. OP.Subscribe($"{Module}.{Name}.Load", LoadAction);
  294. OP.Subscribe($"{Module}.{Name}.Unload", UnloadAction);
  295. OP.Subscribe($"{Module}.{Name}.InstallCRS", InstallCRSAction);
  296. OP.Subscribe($"{Module}.{Name}.StartCycle", StartCycleAction);
  297. OP.Subscribe($"{Module}.{Name}.StopCycle", StopCycleAction);
  298. }
  299. #region Operation
  300. /// <summary>
  301. /// Door Lock On操作
  302. /// </summary>
  303. public bool DoorLockOnAction()
  304. {
  305. if (!JudgeRunningState(LoaderSideOperation.DoorOn))
  306. {
  307. _currentOperation = LoaderSideOperation.DoorOn;
  308. _status = _doorlockRoutine.Start(true);
  309. return true;
  310. }
  311. else
  312. {
  313. return false;
  314. }
  315. }
  316. /// <summary>
  317. /// Door Lock Off操作
  318. /// </summary>
  319. public bool DoorLockOffAction()
  320. {
  321. if (!JudgeRunningState(LoaderSideOperation.DoorOff))
  322. {
  323. _currentOperation = LoaderSideOperation.DoorOff;
  324. _status = _doorlockRoutine.Start(false);
  325. return true;
  326. }
  327. else
  328. {
  329. return false;
  330. }
  331. }
  332. /// <summary>
  333. /// Vacuum On 操作
  334. /// </summary>
  335. private bool VacuumOnAction(string cmd, object[] args)
  336. {
  337. if (!JudgeRunningState(LoaderSideOperation.VacuumOn))
  338. {
  339. _currentOperation = LoaderSideOperation.VacuumOn;
  340. _status = _vacuumRoutine.Start(true);
  341. return true;
  342. }
  343. else
  344. {
  345. return false;
  346. }
  347. }
  348. /// <summary>
  349. /// Vacuum On 操作
  350. /// </summary>
  351. private bool VacuumOffAction(string cmd, object[] args)
  352. {
  353. if (!JudgeRunningState(LoaderSideOperation.VacuumOff))
  354. {
  355. _currentOperation = LoaderSideOperation.VacuumOff;
  356. _status = _vacuumRoutine.Start(false);
  357. return true;
  358. }
  359. else
  360. {
  361. return false;
  362. }
  363. }
  364. /// <summary>
  365. /// WH Bladder On 操作
  366. /// </summary>
  367. private bool WhBladderOnAction(string cmd, object[] args)
  368. {
  369. if (!JudgeRunningState(LoaderSideOperation.WhBladderOn))
  370. {
  371. _currentOperation = LoaderSideOperation.WhBladderOn;
  372. _status = _whBladderRoutine.Start(true);
  373. return true;
  374. }
  375. else
  376. {
  377. return false;
  378. }
  379. }
  380. /// <summary>
  381. /// WH Bladder Off 操作
  382. /// </summary>
  383. private bool WhBladderOffAction(string cmd, object[] args)
  384. {
  385. if (!JudgeRunningState(LoaderSideOperation.WhBladderOff))
  386. {
  387. _currentOperation = LoaderSideOperation.WhBladderOff;
  388. _status = _whBladderRoutine.Start(false);
  389. return true;
  390. }
  391. else
  392. {
  393. return false;
  394. }
  395. }
  396. /// <summary>
  397. /// Trans Bladder On 操作
  398. /// </summary>
  399. private bool TransBladderOnAction(string cmd, object[] args)
  400. {
  401. if (!JudgeRunningState(LoaderSideOperation.TransBladderOn))
  402. {
  403. _currentOperation = LoaderSideOperation.TransBladderOn;
  404. _status = _transBladderRoutine.Start(true);
  405. return true;
  406. }
  407. else
  408. {
  409. return false;
  410. }
  411. }
  412. /// <summary>
  413. /// Trans Bladder Off 操作
  414. /// </summary>
  415. private bool TransBladderOffAction(string cmd, object[] args)
  416. {
  417. if (!JudgeRunningState(LoaderSideOperation.TransBladderOff))
  418. {
  419. _currentOperation = LoaderSideOperation.TransBladderOff;
  420. _status = _transBladderRoutine.Start(false);
  421. return true;
  422. }
  423. else
  424. {
  425. return false;
  426. }
  427. }
  428. /// <summary>
  429. /// Trans High Pressure On 操作
  430. /// </summary>
  431. private bool TransHighPressureOnAction(string cmd, object[] args)
  432. {
  433. if (!JudgeRunningState(LoaderSideOperation.TransHighOn))
  434. {
  435. _currentOperation = LoaderSideOperation.TransHighOn;
  436. _status = _transHighPressureRoutine.Start(true);
  437. return true;
  438. }
  439. else
  440. {
  441. return false;
  442. }
  443. }
  444. /// <summary>
  445. /// Trans High Pressure Off 操作
  446. /// </summary>
  447. private bool TransHighPressureOffAction(string cmd, object[] args)
  448. {
  449. if (!JudgeRunningState(LoaderSideOperation.TransHighOff))
  450. {
  451. _currentOperation = LoaderSideOperation.TransHighOff;
  452. _status = _transHighPressureRoutine.Start(false);
  453. return true;
  454. }
  455. else
  456. {
  457. return false;
  458. }
  459. }
  460. /// <summary>
  461. /// Bernoulli Bladder On 操作
  462. /// </summary>
  463. private bool BernoulliBladderOnAction(string cmd, object[] args)
  464. {
  465. if (!JudgeRunningState(LoaderSideOperation.BernoulliBladderOn))
  466. {
  467. _currentOperation = LoaderSideOperation.BernoulliBladderOn;
  468. _status = _bernoulliBladderRoutine.Start(true);
  469. return true;
  470. }
  471. else
  472. {
  473. return false;
  474. }
  475. }
  476. /// <summary>
  477. /// Bernoulli Bladder Off 操作
  478. /// </summary>
  479. private bool BernoulliBladderOffAction(string cmd, object[] args)
  480. {
  481. if (!JudgeRunningState(LoaderSideOperation.BernoulliBladderOff))
  482. {
  483. _currentOperation = LoaderSideOperation.BernoulliBladderOff;
  484. _status = _bernoulliBladderRoutine.Start(false);
  485. return true;
  486. }
  487. else
  488. {
  489. return false;
  490. }
  491. }
  492. /// <summary>
  493. /// Bernoulli N2 On 操作
  494. /// </summary>
  495. public bool BernoulliN2OnAction(string cmd, object[] args)
  496. {
  497. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{Name}.{BERNOULLI_N2}");
  498. bool result = IOModuleManager.Instance.WriteIoValue(ioName, true);
  499. return result;
  500. }
  501. /// <summary>
  502. /// Bernoulli N2 Off 操作
  503. /// </summary>
  504. public bool BernoulliN2OffAction(string cmd, object[] args)
  505. {
  506. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{Name}.{BERNOULLI_N2}");
  507. bool result = IOModuleManager.Instance.WriteIoValue(ioName, false);
  508. return result;
  509. }
  510. /// <summary>
  511. /// Load 操作
  512. /// </summary>
  513. public bool LoadAction(string cmd, object[] args)
  514. {
  515. if (!JudgeRunningState(LoaderSideOperation.Load))
  516. {
  517. _currentOperation = LoaderSideOperation.Load;
  518. _status = _loadRoutine.Start();
  519. return true;
  520. }
  521. else
  522. {
  523. return false;
  524. }
  525. }
  526. /// <summary>
  527. /// Unload 操作
  528. /// </summary>
  529. public bool UnloadAction(string cmd, object[] args)
  530. {
  531. if (!JudgeRunningState(LoaderSideOperation.Unload))
  532. {
  533. _currentOperation = LoaderSideOperation.Unload;
  534. _status = _unloadRoutine.Start();
  535. return true;
  536. }
  537. else
  538. {
  539. return false;
  540. }
  541. }
  542. /// <summary>
  543. /// Install CRS 操作
  544. /// </summary>
  545. private bool InstallCRSAction(string cmd, object[] args)
  546. {
  547. if (!JudgeRunningState(LoaderSideOperation.InstallCRS))
  548. {
  549. _currentOperation = LoaderSideOperation.InstallCRS;
  550. _status = _installCRSRoutine.Start();
  551. return true;
  552. }
  553. else
  554. {
  555. return false;
  556. }
  557. }
  558. /// <summary>
  559. /// StartCycle 操作
  560. /// </summary>
  561. private bool StartCycleAction(string cmd, object[] args)
  562. {
  563. if (!JudgeRunningState(LoaderSideOperation.StartCycle))
  564. {
  565. _currentOperation = LoaderSideOperation.StartCycle;
  566. _status = _cycleRoutine.Start(args);
  567. bool result= _status == RState.Running ;
  568. if(result)
  569. {
  570. _currentCycle = _cycleRoutine.CurrentCycle.ToString();
  571. }
  572. else
  573. {
  574. _currentCycle = "";
  575. }
  576. return result;
  577. }
  578. else
  579. {
  580. return false;
  581. }
  582. }
  583. /// <summary>
  584. /// StopCycle 操作
  585. /// </summary>
  586. private bool StopCycleAction(string cmd, object[] args)
  587. {
  588. if (_currentOperation==LoaderSideOperation.StartCycle)
  589. {
  590. AbortRoutine();
  591. return true;
  592. }
  593. else
  594. {
  595. return true;
  596. }
  597. }
  598. /// <summary>
  599. /// 判定运行状态
  600. /// </summary>
  601. /// <returns></returns>
  602. private bool JudgeRunningState(LoaderSideOperation operation)
  603. {
  604. if (_status == RState.Running)
  605. {
  606. EV.PostAlarmLog($"{Module}.{Name}", eEvent.ERR_LOADER, $"{Module}.{Name} current execute {_currentOperation},cannot {operation}");
  607. return true;
  608. }
  609. return false;
  610. }
  611. #endregion
  612. /// 更新变量数值
  613. /// </summary>
  614. /// <param name="variable"></param>
  615. /// <param name="value"></param>
  616. private void UpdateVariableValue(string variable, object value)
  617. {
  618. PropertyInfo property = SideData.GetType().GetProperty(variable);
  619. if (property != null)
  620. {
  621. property.SetValue(SideData, value);
  622. }
  623. }
  624. /// <summary>
  625. /// 定时器
  626. /// </summary>
  627. /// <returns></returns>
  628. public bool OnTimer()
  629. {
  630. if (_status == RState.Running)
  631. {
  632. if (_currentOperation != LoaderSideOperation.None)
  633. {
  634. IRoutine routine = GetCurrentRoutine(_currentOperation);
  635. if (routine != null)
  636. {
  637. CheckRoutineState(routine, _currentOperation);
  638. }
  639. else
  640. {
  641. EndOperation(RState.End);
  642. }
  643. if(_currentOperation==LoaderSideOperation.StartCycle)
  644. {
  645. _currentCycle = _cycleRoutine.CurrentCycle.ToString();
  646. }
  647. }
  648. }
  649. return true;
  650. }
  651. /// <summary>
  652. /// 获取当前操作对应的Routine
  653. /// </summary>
  654. /// <param name="currentOperation"></param>
  655. /// <returns></returns>
  656. private IRoutine GetCurrentRoutine(LoaderSideOperation currentOperation)
  657. {
  658. switch (currentOperation)
  659. {
  660. case LoaderSideOperation.DoorOn:
  661. case LoaderSideOperation.DoorOff:
  662. return _doorlockRoutine;
  663. case LoaderSideOperation.VacuumOn:
  664. case LoaderSideOperation.VacuumOff:
  665. return _vacuumRoutine;
  666. case LoaderSideOperation.WhBladderOn:
  667. case LoaderSideOperation.WhBladderOff:
  668. return _whBladderRoutine;
  669. case LoaderSideOperation.TransBladderOn:
  670. case LoaderSideOperation.TransBladderOff:
  671. return _transBladderRoutine;
  672. case LoaderSideOperation.TransHighOn:
  673. case LoaderSideOperation.TransHighOff:
  674. return _transHighPressureRoutine;
  675. case LoaderSideOperation.BernoulliBladderOn:
  676. case LoaderSideOperation.BernoulliBladderOff:
  677. return _bernoulliBladderRoutine;
  678. case LoaderSideOperation.Load:
  679. return _loadRoutine;
  680. case LoaderSideOperation.Unload:
  681. return _unloadRoutine;
  682. case LoaderSideOperation.InstallCRS:
  683. return _installCRSRoutine;
  684. case LoaderSideOperation.StartCycle:
  685. return _cycleRoutine;
  686. default:
  687. return null;
  688. }
  689. }
  690. /// <summary>
  691. /// 检验Routine状态
  692. /// </summary>
  693. /// <param name="routine"></param>
  694. /// <param name="currentOperation"></param>
  695. private void CheckRoutineState(IRoutine routine, LoaderSideOperation currentOperation)
  696. {
  697. RState state = routine.Monitor();
  698. if (state == RState.End)
  699. {
  700. EndOperation(RState.End);
  701. }
  702. else if (state == RState.Failed || state == RState.Timeout)
  703. {
  704. LOG.WriteLog(eEvent.ERR_LOADER, $"{Module}.{Name}", $"{currentOperation} error");
  705. EndOperation(RState.Failed);
  706. }
  707. }
  708. /// <summary>
  709. /// 结束操作
  710. /// </summary>
  711. private void EndOperation(RState state)
  712. {
  713. _status = state;
  714. _currentOperation = LoaderSideOperation.None;
  715. }
  716. /// <summary>
  717. /// 中止Routine
  718. /// </summary>
  719. public void AbortRoutine()
  720. {
  721. IRoutine routine = GetCurrentRoutine(_currentOperation);
  722. if(routine!=null)
  723. {
  724. routine.Abort();
  725. _currentOperation=LoaderSideOperation.None;
  726. _status = RState.End;
  727. _currentCycle = "";
  728. }
  729. }
  730. #region 设备接口
  731. /// <summary>
  732. /// 监控
  733. /// </summary>
  734. public void Monitor()
  735. {
  736. }
  737. public void Reset()
  738. {
  739. }
  740. public void Terminate()
  741. {
  742. AbortRoutine();
  743. }
  744. #endregion
  745. }
  746. }