EquipmentMonitor.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Event;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.Routine;
  5. using Aitex.Core.RT.SCCore;
  6. using Aitex.Core.Util;
  7. using EFEM.RT.Modules;
  8. using MECF.Framework.Common.Equipment;
  9. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase;
  10. namespace EFEM.RT.Devices
  11. {
  12. public class EquipmentMonitor : BaseDevice, IDevice
  13. {
  14. private readonly RD_TRIG _trigMaintenance = new RD_TRIG();
  15. private readonly RD_TRIG _airForRobotTrig = new RD_TRIG();
  16. private readonly RD_TRIG _airForLoadPortTrig = new RD_TRIG();
  17. private readonly RD_TRIG _vacuumErrorTrig = new RD_TRIG();
  18. private readonly RD_TRIG _ffu1ErrorTrig = new RD_TRIG();
  19. private readonly RD_TRIG _ffu2ErrorTrig = new RD_TRIG();
  20. private readonly RD_TRIG _ionizorErrorTrig = new RD_TRIG();
  21. private readonly RD_TRIG _flowWarningTrig = new RD_TRIG();
  22. private readonly RD_TRIG _leakWarningTrig = new RD_TRIG();
  23. private readonly R_TRIG signalTowerTrig = new R_TRIG();
  24. private readonly RD_TRIG _cassetleChangeLP1Trig = new RD_TRIG();
  25. private readonly RD_TRIG _cassetleChangeLP2Trig = new RD_TRIG();
  26. private readonly RD_TRIG _trigIONAlarmSIGNAL = new RD_TRIG();
  27. private readonly RD_TRIG _trigCassetteDoor = new RD_TRIG();
  28. private readonly RD_TRIG _trigRobotWafer = new RD_TRIG();
  29. private readonly bool _dOLEDLight = DeviceDefineManager.Instance.GetValue<bool>("DOLEDLight") ?? false;
  30. private readonly bool _noMaintenanceSignal = DeviceDefineManager.Instance.GetValue<bool>("NoMaintenanceSignal") ?? false;
  31. private readonly bool _noNoDoorOpenSignal = DeviceDefineManager.Instance.GetValue<bool>("NoDoorOpenSignal") ?? false;
  32. private readonly bool _MaintenanceMode = DeviceDefineManager.Instance.GetValue<bool>("MaintenanceSignal") ?? false;
  33. private readonly bool _EfemDoorOpen = DeviceDefineManager.Instance.GetValue<bool>("EfemDoorOpenSignal") ?? false;
  34. private static readonly bool LoadPort1IsDisable = SC.ContainsItem("LoadPort.LP1.Disable") ? SC.GetValue<bool>("LoadPort.LP1.Disable") : true;
  35. private static readonly bool LoadPort2IsDisable = SC.ContainsItem("LoadPort.LP2.Disable") ? SC.GetValue<bool>("LoadPort.LP2.Disable") : true;
  36. private readonly RD_TRIG _trigWaterLeakNormalTOPM = new RD_TRIG();
  37. private readonly RD_TRIG _trigCDAPressureOKTOPM = new RD_TRIG();
  38. private readonly R_TRIG _trigIONCDAPressureON = new R_TRIG();
  39. private readonly R_TRIG _trigIONAlarmSIGNALON = new R_TRIG();
  40. private readonly R_TRIG _trigWaterFlowSWON = new R_TRIG();
  41. private readonly R_TRIG _trigIONCDAPressureOFF = new R_TRIG();
  42. private readonly R_TRIG _trigIONAlarmSIGNALOFF = new R_TRIG();
  43. private readonly R_TRIG _trigWaterFlowSWOFF = new R_TRIG();
  44. private uint data2;
  45. private int _fFUSettingKnob;
  46. private readonly int[] _speedTable = new[] { 0, 200, 300, 400, 500, 550, 600, 650, 700, 750, 800 };
  47. public int IONCDAPressureSWHandler
  48. {
  49. get
  50. {
  51. return SC.GetValue<int>("System.IONCDAPressureSWHandler");
  52. }
  53. }
  54. public int IONAlarmSIGNALHandler
  55. {
  56. get
  57. {
  58. return SC.GetValue<int>("System.IONAlarmSIGNALHandler");
  59. }
  60. }
  61. public int WaterFlowSWHandler
  62. {
  63. get
  64. {
  65. return SC.GetValue<int>("System.WaterFlowSWHandler");
  66. }
  67. }
  68. public RD_TRIG TrigMaintenance
  69. {
  70. get
  71. {
  72. return _trigMaintenance;
  73. }
  74. }
  75. public RD_TRIG AirForRobotTrig
  76. {
  77. get
  78. {
  79. return _airForRobotTrig;
  80. }
  81. }
  82. public RD_TRIG AirForLoadPortTrig
  83. {
  84. get
  85. {
  86. return _airForLoadPortTrig;
  87. }
  88. }
  89. public RD_TRIG VacuumErrorTrig
  90. {
  91. get
  92. {
  93. return _vacuumErrorTrig;
  94. }
  95. }
  96. public RD_TRIG FfuErrorTrig
  97. {
  98. get
  99. {
  100. return _ffu1ErrorTrig.R || _ffu1ErrorTrig.T ? _ffu1ErrorTrig : _ffu2ErrorTrig;
  101. }
  102. }
  103. public RD_TRIG IonizorErrorTrig
  104. {
  105. get
  106. {
  107. return _ionizorErrorTrig;
  108. }
  109. }
  110. public RD_TRIG SensorFlowWarning
  111. {
  112. get
  113. {
  114. return _flowWarningTrig;
  115. }
  116. }
  117. public RD_TRIG LeakWarningTrig
  118. {
  119. get
  120. {
  121. return _leakWarningTrig;
  122. }
  123. }
  124. public R_TRIG SignalTowerTrig
  125. {
  126. get
  127. {
  128. return signalTowerTrig;
  129. }
  130. }
  131. public enum HandlerState
  132. {
  133. ByPass,
  134. ON,
  135. OFF
  136. }
  137. public EquipmentMonitor() :
  138. base("System", "EquipmentMonitor", "EquipmentMonitor", "EquipmentMonitor")
  139. {
  140. }
  141. public bool Initialize()
  142. {
  143. //if (_dOLEDLight)
  144. //{
  145. // DeviceModel.TrigLEDLight.SetTrigger(true, out _);
  146. //}
  147. Subscriptions();
  148. return true;
  149. }
  150. private bool _StopIonizerWork;
  151. public bool StopIonizerWork
  152. {
  153. get
  154. {
  155. if (SC.ContainsItem("System.StopIonizerWorkingEnable"))
  156. return SC.GetValue<bool>("System.StopIonizerWorkingEnable");
  157. return false;
  158. }
  159. set
  160. {
  161. _StopIonizerWork = value;
  162. }
  163. }
  164. private readonly R_TRIG _trigStopIonizerAtFirst = new R_TRIG();
  165. public void Monitor()
  166. {
  167. if (_flowWarningTrig.T) EV.PostMessage("System", EventEnum.DefaultAlarm, "Flow Warning");
  168. if (_leakWarningTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "Leak Warning");
  169. if (_airForRobotTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "Air supply for Robot pressure error");
  170. if (_airForLoadPortTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "Air supply for Load Port pressure error");
  171. if (_vacuumErrorTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "Vacuum supply for system pressure error");
  172. if (_airForRobotTrig.R || _airForLoadPortTrig.R || _vacuumErrorTrig.R)
  173. Singleton<RouteManager>.Instance.PostMsg(RouteManager.MSG.ERROR);
  174. //if (_ffu1ErrorTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "FFU1 error");
  175. //if (_ffu2ErrorTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "FFU1 error");
  176. //_fFUSettingKnob = SC.ContainsItem("System.FFUSpeedSet") ? SC.GetValue<int>("System.FFUSpeedSet") : 3;
  177. //DeviceModel.TrigRobotAndPreAlignerHold.SetTrigger(!_trigMaintenance.M, out _);
  178. //_trigRobotWafer.CLK = DeviceModel.SensorRobotFork1WaferOn.Value;
  179. #region Seperate Monitor for EFEM Num
  180. string efemNum = SC.GetStringValue("System.EFEMNUM") ?? "";
  181. MonitorByEfemNum(efemNum);
  182. #endregion Seperate Monitor for EFEM Num
  183. #region Common Monitor
  184. //Maintance Mode监控
  185. if (!_noMaintenanceSignal && !_noNoDoorOpenSignal)
  186. {
  187. _trigMaintenance.CLK = (_MaintenanceMode ? DeviceModel.SensorMaintenanceMode.Value : !DeviceModel.SensorMaintenanceMode.Value)
  188. || (_EfemDoorOpen ? DeviceModel.SensorEFEMSideDoorClosed.Value : !DeviceModel.SensorEFEMSideDoorClosed.Value)
  189. /*|| DeviceModel.SensorTeachingPendantInUse.Value*/;
  190. }
  191. if (_trigMaintenance.R) Singleton<RouteManager>.Instance.PostMsg(RouteManager.MSG.SetMaintenanceMode);
  192. if (_trigMaintenance.T) Singleton<RouteManager>.Instance.PostMsg(RouteManager.MSG.SetManualMode);
  193. _trigStopIonizerAtFirst.CLK = true;
  194. if (_trigStopIonizerAtFirst.Q)
  195. {
  196. //if (DeviceModel.TrigIonizerInterrupt!=null&& SC.ContainsItem("System.StopIonizerWorkingEnable"))
  197. //{
  198. // if (DeviceModel.TrigIonizerInterrupt.Value != SC.GetValue<bool>("System.StopIonizerWorkingEnable"))
  199. // SC.SetItemValue("System.StopIonizerWorkingEnable", DeviceModel.TrigIonizerInterrupt.Value);
  200. //}
  201. if (SC.GetValue<int>("LoadPort.LP1.CstType") == 1)
  202. {
  203. if (DeviceModel.SensorCstDoorClosed.Value && !DEVICE.GetDevice<LoadPortBaseDevice>(ModuleName.LP1.ToString()).IsWaferProtrude)
  204. {
  205. DeviceModel.TrigSafetytoSMIF1.SetTrigger(true, out _);
  206. }
  207. }
  208. }
  209. //IonizerInterrupt 监控
  210. if (DeviceModel.TrigIonizerInterrupt != null && !DeviceModel.TrigIonizerInterrupt.Value)
  211. {
  212. //_trigIONAlarmSIGNAL.CLK = DeviceModel.SensorIONAlarmSIGNAL == null ? false : !DeviceModel.SensorIONAlarmSIGNAL.Value;
  213. //if (_trigIONAlarmSIGNAL.R)
  214. //{
  215. // EV.PostMessage("System", EventEnum.DefaultAlarm, "IONAlarmSIGNAL occur error");
  216. //}
  217. switch (IONAlarmSIGNALHandler)
  218. {
  219. case (int)HandlerState.ON:
  220. {
  221. _trigIONAlarmSIGNALON.CLK = DeviceModel.SensorIONAlarmSIGNAL.Value;
  222. if (_trigIONAlarmSIGNALON.Q)
  223. {
  224. EV.PostMessage("System", EventEnum.DefaultAlarm, "IONAlarmSIGNAL occur error");
  225. }
  226. }
  227. break;
  228. case (int)HandlerState.OFF:
  229. {
  230. _trigIONAlarmSIGNALON.CLK = !DeviceModel.SensorIONAlarmSIGNAL.Value;
  231. if (_trigIONAlarmSIGNALON.Q)
  232. {
  233. EV.PostMessage("System", EventEnum.DefaultAlarm, "IONAlarmSIGNAL occur error");
  234. }
  235. }
  236. break;
  237. }
  238. }
  239. if (DeviceModel.TrigIonizerInterrupt != null && DeviceModel.TrigIonizerInterrupt.Value != StopIonizerWork)
  240. {
  241. DeviceModel.TrigIonizerInterrupt.SetTrigger(StopIonizerWork, out _);
  242. }
  243. //Online Mode 监控
  244. if (Singleton<EfemEntity>.Instance.IsOnlineMode)
  245. {
  246. if (_trigMaintenance.R || _trigMaintenance.T ||
  247. _airForLoadPortTrig.R || _airForLoadPortTrig.T ||
  248. _airForRobotTrig.R || _airForRobotTrig.T ||
  249. _vacuumErrorTrig.R || _vacuumErrorTrig.T ||
  250. _ffu1ErrorTrig.R || _ffu1ErrorTrig.T || _ffu2ErrorTrig.R || _ffu2ErrorTrig.T ||
  251. _ionizorErrorTrig.R || _ionizorErrorTrig.T ||
  252. _flowWarningTrig.T || _leakWarningTrig.R ||
  253. _trigCassetteDoor.T ||
  254. _trigRobotWafer.R || _trigRobotWafer.T
  255. )
  256. {
  257. Singleton<EfemEntity>.Instance.SendSigStatEvent(ModuleName.System);
  258. }
  259. }
  260. //IONCDAPressureSW 监控
  261. if (DeviceModel.SensorIONCDAPressureSW != null)
  262. {
  263. switch (IONCDAPressureSWHandler)
  264. {
  265. case (int)HandlerState.ON:
  266. {
  267. _trigIONCDAPressureON.CLK = DeviceModel.SensorIONCDAPressureSW.Value;
  268. if (_trigIONCDAPressureON.Q)
  269. {
  270. EV.PostMessage("System", EventEnum.DefaultAlarm, "IONCDAPressureSW occur error");
  271. }
  272. }
  273. break;
  274. case (int)HandlerState.OFF:
  275. {
  276. _trigIONCDAPressureOFF.CLK = !DeviceModel.SensorIONCDAPressureSW.Value;
  277. if (_trigIONCDAPressureOFF.Q)
  278. {
  279. EV.PostMessage("System", EventEnum.DefaultAlarm, "IONCDAPressureSW occur error");
  280. }
  281. }
  282. break;
  283. }
  284. }
  285. //WaterFlowSW 监控
  286. if (DeviceModel.SensorWaterFlowSW != null)
  287. {
  288. switch (WaterFlowSWHandler)
  289. {
  290. case (int)HandlerState.ON:
  291. {
  292. _trigWaterFlowSWON.CLK = DeviceModel.SensorWaterFlowSW.Value;
  293. if (_trigWaterFlowSWON.Q)
  294. {
  295. EV.PostMessage("System", EventEnum.DefaultAlarm, "WaterFlowSW occur error");
  296. }
  297. }
  298. break;
  299. case (int)HandlerState.OFF:
  300. {
  301. _trigWaterFlowSWOFF.CLK = !DeviceModel.SensorWaterFlowSW.Value;
  302. if (_trigWaterFlowSWOFF.Q)
  303. {
  304. EV.PostMessage("System", EventEnum.DefaultAlarm, "WaterFlowSW occur error");
  305. }
  306. }
  307. break;
  308. }
  309. }
  310. //SignalTower监控
  311. if (signalTowerTrig.Q)
  312. {
  313. data2 = Singleton<EfemEntity>.Instance.GetSigStatData2(ModuleName.System);
  314. signalTowerTrig.RST = true;
  315. if (Singleton<EfemEntity>.Instance.IsOnlineMode)
  316. Singleton<EfemEntity>.Instance.SendSigStatEvent(ModuleName.System);
  317. }
  318. #endregion Common Monitor
  319. }
  320. public void Terminate()
  321. {
  322. //if (_dOLEDLight)
  323. //{
  324. // DeviceModel.TrigLEDLight.SetTrigger(false, out _);
  325. //}
  326. }
  327. public void Reset()
  328. {
  329. _trigWaterFlowSWOFF.RST = true;
  330. _trigWaterFlowSWON.RST = true;
  331. _trigIONCDAPressureOFF.RST = true;
  332. _trigIONCDAPressureON.RST = true;
  333. _trigIONAlarmSIGNALON.RST = true;
  334. _trigIONAlarmSIGNALOFF.RST = true;
  335. }
  336. private void Subscriptions()
  337. {
  338. //DATA.Subscribe("Robot.WaferSize", () =>
  339. // {
  340. // return WaferManager.Instance.GetWaferSize(ModuleName.Robot, 0).ToString();
  341. // });
  342. }
  343. /// <summary>
  344. /// 不同型号的EFEM监控
  345. /// </summary>
  346. private void MonitorByEfemNum(string efemNum)
  347. {
  348. if (efemNum.Equals("005"))
  349. {
  350. _trigWaterLeakNormalTOPM.CLK = DeviceModel.SensorEFEMPowerON.Value && DeviceModel.SensorWaterLeakSW.Value;
  351. if (_trigWaterLeakNormalTOPM.R)
  352. {
  353. DeviceModel.TrigWaterLeakOkToPM.SetTrigger(true, out _);
  354. }
  355. if (_trigWaterLeakNormalTOPM.T)
  356. {
  357. DeviceModel.TrigWaterLeakOkToPM.SetTrigger(false, out _);
  358. }
  359. _trigCDAPressureOKTOPM.CLK = DeviceModel.SensorEFEMPowerON.Value && DeviceModel.SensorCDAPressureSW.Value;
  360. if (_trigCDAPressureOKTOPM.R)
  361. {
  362. DeviceModel.TrigCDAPressureOkToPM.SetTrigger(true, out _);
  363. }
  364. if (_trigCDAPressureOKTOPM.T)
  365. {
  366. DeviceModel.TrigCDAPressureOkToPM.SetTrigger(false, out _);
  367. }
  368. }
  369. else if (efemNum.Equals("006"))
  370. {
  371. //DO_RobotSafetyToLP1触发逻辑
  372. if (!LoadPort1IsDisable && DeviceModel.SensorLP1OperationStatus != null && DeviceModel.SensorLP1FoupOpen != null && DeviceModel.SensorLP1FoupPlacement != null && DeviceModel.SensorLP1Presence != null
  373. && DeviceModel.SensorLP1Ready != null && DeviceModel.SensorRobotEMStoEFEM != null && DeviceModel.SensorGratingSensorIN1 != null && DeviceModel.TrigSafetytoSMIF1 != null)
  374. {
  375. if (DeviceModel.SensorLP1OperationStatus.Value && DeviceModel.SensorLP1FoupOpen.Value && DeviceModel.SensorLP1FoupPlacement.Value
  376. && DeviceModel.SensorLP1Presence.Value && DeviceModel.SensorLP1Ready.Value
  377. && DeviceModel.SensorRobotEMStoEFEM.Value && DeviceModel.SensorGratingSensorIN1.Value)
  378. {
  379. if (!DeviceModel.TrigSafetytoSMIF1.Value)
  380. {
  381. DeviceModel.TrigSafetytoSMIF1.SetTrigger(true, out _);
  382. LOG.Write("Sensor LP1 related signal change,set DO_RobotSafetyToLP1 signal on.");
  383. }
  384. }
  385. else
  386. {
  387. if (DeviceModel.TrigSafetytoSMIF1.Value)
  388. {
  389. DeviceModel.TrigSafetytoSMIF1.SetTrigger(false, out _);
  390. LOG.Write("Sensor LP1 related signal change,set DO_RobotSafetyToLP1 signal off.");
  391. }
  392. }
  393. }
  394. //DO_RobotSafetyToLP2触发逻辑
  395. if (!LoadPort2IsDisable && DeviceModel.SensorLP2OperationStatus != null && DeviceModel.SensorLP2FoupOpen != null && DeviceModel.SensorLP2FoupPlacement != null && DeviceModel.SensorLP2Presence != null
  396. && DeviceModel.SensorLP2Ready != null && DeviceModel.SensorRobotEMStoEFEM != null && DeviceModel.SensorGratingSensorIN1 != null && DeviceModel.TrigSafetytoSMIF2 != null)
  397. {
  398. if (DeviceModel.SensorLP2OperationStatus.Value && DeviceModel.SensorLP2FoupOpen.Value && DeviceModel.SensorLP2FoupPlacement.Value
  399. && DeviceModel.SensorLP2Presence.Value && DeviceModel.SensorLP2Ready.Value
  400. && DeviceModel.SensorRobotEMStoEFEM.Value && DeviceModel.SensorGratingSensorIN1.Value)
  401. {
  402. if (!DeviceModel.TrigSafetytoSMIF2.Value)
  403. {
  404. DeviceModel.TrigSafetytoSMIF2.SetTrigger(true, out _);
  405. LOG.Write("Sensor LP2 related signal change,set DO_RobotSafetyToLP2 signal on.");
  406. }
  407. }
  408. else
  409. {
  410. if (DeviceModel.TrigSafetytoSMIF2.Value)
  411. {
  412. DeviceModel.TrigSafetytoSMIF2.SetTrigger(false, out _);
  413. LOG.Write("Sensor LP2 related signal change,set DO_RobotSafetyToLP2 signal off.");
  414. }
  415. }
  416. }
  417. //DO_EnableToOperateLP1触发逻辑
  418. if (!LoadPort1IsDisable && DeviceModel.TrigEnableToOperateLP1 != null)
  419. {
  420. if ((SC.ContainsItem("LoadPort.LP1.Disable") ? !SC.GetValue<bool>("LoadPort.LP1.Disable") : false)
  421. && Singleton<RouteManager>.Instance.IsRunning)
  422. {
  423. if (!DeviceModel.TrigEnableToOperateLP1.Value)
  424. {
  425. DeviceModel.TrigEnableToOperateLP1.SetTrigger(true, out _);
  426. LOG.Write("Sensor LP1 related signal change,set DO_EnableToOperateLP1 signal on.");
  427. }
  428. }
  429. else
  430. {
  431. if (DeviceModel.TrigEnableToOperateLP1.Value)
  432. {
  433. DeviceModel.TrigEnableToOperateLP1.SetTrigger(false, out _);
  434. LOG.Write("Sensor LP1 related signal change,set DO_EnableToOperateLP1 signal on.");
  435. }
  436. }
  437. }
  438. //DO_EnableToOperateLP2触发逻辑
  439. if (!LoadPort2IsDisable && DeviceModel.TrigEnableToOperateLP2 != null)
  440. {
  441. if ((SC.ContainsItem("LoadPort.LP2.Disable") ? !SC.GetValue<bool>("LoadPort.LP2.Disable") : false)
  442. && Singleton<RouteManager>.Instance.IsRunning)
  443. {
  444. if (!DeviceModel.TrigEnableToOperateLP2.Value)
  445. {
  446. DeviceModel.TrigEnableToOperateLP2.SetTrigger(true, out _);
  447. LOG.Write("Sensor LP2 related signal change,set DO_EnableToOperateLP2 signal on.");
  448. }
  449. }
  450. else
  451. {
  452. if (DeviceModel.TrigEnableToOperateLP2.Value)
  453. {
  454. DeviceModel.TrigEnableToOperateLP2.SetTrigger(false, out _);
  455. LOG.Write("Sensor LP2 related signal change,set DO_EnableToOperateLP2 signal on.");
  456. }
  457. }
  458. }
  459. //Pause / Resume to Robot触发逻辑(----------待完善----------)
  460. //if (DeviceModel.SensorGratingSensorIN1 != null && DeviceModel.SensorRBNotExtendSIMF1 != null && DeviceModel.SensorRBNotExtendSIMF1 != null
  461. // && DeviceModel.SensorPAorFLPDoorClosed != null)
  462. //{
  463. // if (true)
  464. // {
  465. // if (DeviceModel.TrigPauseResumetoRobot.Value)
  466. // {
  467. // DeviceModel.TrigPauseResumetoRobot.SetTrigger(false, out _);
  468. // }
  469. // if (!DeviceModel.TrigPauseResumetoRobot.Value)
  470. // {
  471. // DeviceModel.TrigPauseResumetoRobot.SetTrigger(true, out _);
  472. // }
  473. // }
  474. //}
  475. }
  476. }
  477. }
  478. }