LoaderSideDevice.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  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. if(result)
  500. {
  501. ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{Name}.{BERNOULLI_N2_SECOND}");
  502. result = IOModuleManager.Instance.WriteIoValue(ioName, true);
  503. }
  504. return result;
  505. }
  506. /// <summary>
  507. /// Bernoulli N2 Off 操作
  508. /// </summary>
  509. public bool BernoulliN2OffAction(string cmd, object[] args)
  510. {
  511. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{Name}.{BERNOULLI_N2}");
  512. bool result = IOModuleManager.Instance.WriteIoValue(ioName, false);
  513. if (result)
  514. {
  515. ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{Name}.{BERNOULLI_N2_SECOND}");
  516. result = IOModuleManager.Instance.WriteIoValue(ioName, false);
  517. }
  518. return result;
  519. }
  520. /// <summary>
  521. /// Load 操作
  522. /// </summary>
  523. public bool LoadAction(string cmd, object[] args)
  524. {
  525. if (!JudgeRunningState(LoaderSideOperation.Load))
  526. {
  527. _currentOperation = LoaderSideOperation.Load;
  528. _status = _loadRoutine.Start();
  529. return true;
  530. }
  531. else
  532. {
  533. return false;
  534. }
  535. }
  536. /// <summary>
  537. /// Unload 操作
  538. /// </summary>
  539. public bool UnloadAction(string cmd, object[] args)
  540. {
  541. if (!JudgeRunningState(LoaderSideOperation.Unload))
  542. {
  543. _currentOperation = LoaderSideOperation.Unload;
  544. _status = _unloadRoutine.Start();
  545. return true;
  546. }
  547. else
  548. {
  549. return false;
  550. }
  551. }
  552. /// <summary>
  553. /// Install CRS 操作
  554. /// </summary>
  555. private bool InstallCRSAction(string cmd, object[] args)
  556. {
  557. if (!JudgeRunningState(LoaderSideOperation.InstallCRS))
  558. {
  559. _currentOperation = LoaderSideOperation.InstallCRS;
  560. _status = _installCRSRoutine.Start();
  561. return true;
  562. }
  563. else
  564. {
  565. return false;
  566. }
  567. }
  568. /// <summary>
  569. /// StartCycle 操作
  570. /// </summary>
  571. private bool StartCycleAction(string cmd, object[] args)
  572. {
  573. if (!JudgeRunningState(LoaderSideOperation.StartCycle))
  574. {
  575. _currentOperation = LoaderSideOperation.StartCycle;
  576. _status = _cycleRoutine.Start(args);
  577. bool result= _status == RState.Running ;
  578. if(result)
  579. {
  580. _currentCycle = _cycleRoutine.CurrentCycle.ToString();
  581. }
  582. else
  583. {
  584. _currentCycle = "";
  585. }
  586. return result;
  587. }
  588. else
  589. {
  590. return false;
  591. }
  592. }
  593. /// <summary>
  594. /// StopCycle 操作
  595. /// </summary>
  596. private bool StopCycleAction(string cmd, object[] args)
  597. {
  598. if (_currentOperation==LoaderSideOperation.StartCycle)
  599. {
  600. AbortRoutine();
  601. return true;
  602. }
  603. else
  604. {
  605. return true;
  606. }
  607. }
  608. /// <summary>
  609. /// 判定运行状态
  610. /// </summary>
  611. /// <returns></returns>
  612. private bool JudgeRunningState(LoaderSideOperation operation)
  613. {
  614. if (_status == RState.Running)
  615. {
  616. EV.PostAlarmLog($"{Module}.{Name}", eEvent.ERR_LOADER, $"{Module}.{Name} current execute {_currentOperation},cannot {operation}");
  617. return true;
  618. }
  619. return false;
  620. }
  621. #endregion
  622. /// 更新变量数值
  623. /// </summary>
  624. /// <param name="variable"></param>
  625. /// <param name="value"></param>
  626. private void UpdateVariableValue(string variable, object value)
  627. {
  628. PropertyInfo property = SideData.GetType().GetProperty(variable);
  629. if (property != null)
  630. {
  631. property.SetValue(SideData, value);
  632. }
  633. }
  634. /// <summary>
  635. /// 定时器
  636. /// </summary>
  637. /// <returns></returns>
  638. public bool OnTimer()
  639. {
  640. if (_status == RState.Running)
  641. {
  642. if (_currentOperation != LoaderSideOperation.None)
  643. {
  644. IRoutine routine = GetCurrentRoutine(_currentOperation);
  645. if (routine != null)
  646. {
  647. CheckRoutineState(routine, _currentOperation);
  648. }
  649. else
  650. {
  651. EndOperation(RState.End);
  652. }
  653. if(_currentOperation==LoaderSideOperation.StartCycle)
  654. {
  655. _currentCycle = _cycleRoutine.CurrentCycle.ToString();
  656. }
  657. }
  658. }
  659. return true;
  660. }
  661. /// <summary>
  662. /// 获取当前操作对应的Routine
  663. /// </summary>
  664. /// <param name="currentOperation"></param>
  665. /// <returns></returns>
  666. private IRoutine GetCurrentRoutine(LoaderSideOperation currentOperation)
  667. {
  668. switch (currentOperation)
  669. {
  670. case LoaderSideOperation.DoorOn:
  671. case LoaderSideOperation.DoorOff:
  672. return _doorlockRoutine;
  673. case LoaderSideOperation.VacuumOn:
  674. case LoaderSideOperation.VacuumOff:
  675. return _vacuumRoutine;
  676. case LoaderSideOperation.WhBladderOn:
  677. case LoaderSideOperation.WhBladderOff:
  678. return _whBladderRoutine;
  679. case LoaderSideOperation.TransBladderOn:
  680. case LoaderSideOperation.TransBladderOff:
  681. return _transBladderRoutine;
  682. case LoaderSideOperation.TransHighOn:
  683. case LoaderSideOperation.TransHighOff:
  684. return _transHighPressureRoutine;
  685. case LoaderSideOperation.BernoulliBladderOn:
  686. case LoaderSideOperation.BernoulliBladderOff:
  687. return _bernoulliBladderRoutine;
  688. case LoaderSideOperation.Load:
  689. return _loadRoutine;
  690. case LoaderSideOperation.Unload:
  691. return _unloadRoutine;
  692. case LoaderSideOperation.InstallCRS:
  693. return _installCRSRoutine;
  694. case LoaderSideOperation.StartCycle:
  695. return _cycleRoutine;
  696. default:
  697. return null;
  698. }
  699. }
  700. /// <summary>
  701. /// 检验Routine状态
  702. /// </summary>
  703. /// <param name="routine"></param>
  704. /// <param name="currentOperation"></param>
  705. private void CheckRoutineState(IRoutine routine, LoaderSideOperation currentOperation)
  706. {
  707. RState state = routine.Monitor();
  708. if (state == RState.End)
  709. {
  710. EndOperation(RState.End);
  711. }
  712. else if (state == RState.Failed || state == RState.Timeout)
  713. {
  714. LOG.WriteLog(eEvent.ERR_LOADER, $"{Module}.{Name}", $"{currentOperation} error");
  715. EndOperation(RState.Failed);
  716. }
  717. }
  718. /// <summary>
  719. /// 结束操作
  720. /// </summary>
  721. private void EndOperation(RState state)
  722. {
  723. _status = state;
  724. _currentOperation = LoaderSideOperation.None;
  725. }
  726. /// <summary>
  727. /// 中止Routine
  728. /// </summary>
  729. public void AbortRoutine()
  730. {
  731. IRoutine routine = GetCurrentRoutine(_currentOperation);
  732. if(routine!=null)
  733. {
  734. routine.Abort();
  735. _currentOperation=LoaderSideOperation.None;
  736. _status = RState.End;
  737. _currentCycle = "";
  738. }
  739. }
  740. #region 设备接口
  741. /// <summary>
  742. /// 监控
  743. /// </summary>
  744. public void Monitor()
  745. {
  746. }
  747. public void Reset()
  748. {
  749. }
  750. public void Terminate()
  751. {
  752. AbortRoutine();
  753. }
  754. #endregion
  755. }
  756. }