SafetyDevice.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.OperationCenter;
  5. using Aitex.Core.Util;
  6. using MECF.Framework.Common.Beckhoff.ModuleIO;
  7. using MECF.Framework.Common.CommonData.Prewet;
  8. using MECF.Framework.Common.Device.Safety;
  9. using MECF.Framework.Common.Equipment;
  10. using MECF.Framework.Common.TwinCat;
  11. using MECF.Framework.Common.Utilities;
  12. using CyberX8_Core;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Reflection;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. using CyberX8_RT.Devices.AXIS;
  20. using Aitex.Core.RT.SCCore;
  21. using MECF.Framework.Common.WaferHolder;
  22. using MECF.Framework.Common.IOCore;
  23. namespace CyberX8_RT.Devices.Safety
  24. {
  25. public class SafetyDevice : BaseDevice, IDevice
  26. {
  27. #region 常量
  28. private const string TWINCAT_STATE = "TwincatState";
  29. private const string MAIN_COMM_ERR = "MainCommErr";
  30. private const string LOADER_PUF_COMM_ERR="LoaderPufCommErr";
  31. private const string SRD_COMM_ERR = "SrdCommErr";
  32. private const string TRANSPORTER_COMM_ERR="TransportCommErr";
  33. private const string MAIN_FUNCTION_BLOCK_ERR= "MainFunctionBlockErr";
  34. private const string LOADER_PUF_FUNCTION_BLOCK_ERR="LoaderPufFunctionBlockErr";
  35. private const string SRD_FUNCTION_BLOCK_ERR = "SrdFunctionBlockErr";
  36. private const string TRANSPORTER_FUNCTION_BLOCK_ERR="TransporterFunctionBlockErr";
  37. private const string IS_INITIALIZED = "IsInitialized";
  38. private const double OP_HOT_CONNECT_STATE = 8;
  39. #region Hot Connect
  40. private const string HOT_CONNECT_STATE = "HotConnectState";
  41. private const string LOADER_HOT_CONNECT_STATE= "LoaderHotConnectState";
  42. private const string PUF_HOT_CONNECT_STATE="PufHotConnectState";
  43. private const string SRD_HOT_CONNECT_STATE="SrdHotConnectState";
  44. private const string TRANSPORTER_HOT_CONNECT_STATE="TransporterHotConnectState";
  45. private const string LDR_HOT_CONNECT_STATE="LdrHotConnectState";
  46. private const string PRC_HOT_CONNECT_STATE="PrcHotConnectState";
  47. private const string RESERVOIR1_HOT_CONNECT_STATE="Reservoir1HotConnectState";
  48. private const string RESERVOIR2_HOT_CONNECT_STATE="Reservoir2HotConnectState";
  49. private const string FFU_HOT_CONNECT_STATE="FFUHotConnectState";
  50. #endregion
  51. #region Restart
  52. private const string RUNSTOP = "RunStop";
  53. private const string ERRACK = "ErrAck";
  54. private const string SLS_RESTART = "SlsRestart";
  55. private const string TX_STO_MON_Restart = "TxStoMonRestart";
  56. private const string TX_STO1_ESTOP_Restart = "TxSto1EstopRestart";
  57. private const string TX_STO2_ESTOP_RESTART = "TxSto2EstopRestart";
  58. private const string LDR_PUF_STO_MON_RESTART = "LdrPufStoMonRestart";
  59. private const string LDR_PUF_STO1_ESTOP_RESTART = "LdrPufSto1EstopRestart";
  60. private const string LDR_PUF_STO2_ESTOP_RESTART = "LdrPufSto2EstopRestart";
  61. private const string SRD_STO_ESTOP_RESTART = "SrdStoEstopRestart";
  62. private const string PUMP_STO_ESTOP_RESTART = "PumpStoEstopRestart";
  63. private const string FLUID_ESTOP_RESTART = "FluidEstopRestart";
  64. #endregion
  65. #region Door Lock
  66. private const string LOADER_DOOR_LOCK= "LoaderDoorLock";
  67. private const string LOADER_DOOR_LOCKED="LoaderDoorLocked";
  68. private const string LOADER_PANEL_REMOVED="LoaderPanelRemoved";
  69. private const string LOWER_LOADER_PANEL_REMOVED = "LowerLoaderPanelRemoved";
  70. private const string BUFFER_DOOR_LOCK="BufferDoorLock";
  71. private const string BUFFER_DOOR_LOCKED="BufferDoorLocked";
  72. private const string BUFFER_PANEL_REMOVED = "BufferPanelRemoved";
  73. private const string PROCESS_DOOR_LOCK="ProcessDoorLock";
  74. private const string PROCESS_DOOR1_LOCKED="ProcessDoor1Locked";
  75. private const string PROCESS_DOOR2_LOCKED="ProcessDoor2Locked";
  76. private const string PROCESS_DOOR3_LOCKED="ProcessDoor3Locked";
  77. private const string PROCESS_DOOR4_LOCKED="ProcessDoor4Locked";
  78. private const string PROCESS_UPPER_PANELS_ON = "ProcessUpperPanelsOn";
  79. #endregion
  80. private const string SRD_TOP_PANEL_REMOVED="SrdTopPanelRemoved";
  81. private const string SRD_LOWER_PANEL_REMOVED="SrdLowerPanelRemoved";
  82. private const string PLUMBING_DOOR_CLOSED = "PlumbingDoorClosed";
  83. private const string PROCESS_HALT_BUTTON1="ProcessHaltButton1";
  84. private const string PROCESS_HALT_BUTTON2="ProcessHaltButton2";
  85. private const string LOADER_HALT_BUTTON= "LoaderHaltButton";
  86. private const string MODE_SELECTOR_SWITCH="ModeSelectorSwitch";
  87. private const string MODE_SIREN="ModeSiren";
  88. #region SLS
  89. private const string LOADER_ROTATION_SLS="LoaderRotationSls";
  90. private const string LOADER_SWINGA_SLS="LoaderSwingASls";
  91. private const string LOADER_SWINGB_SLS="LoaderSwingBSls";
  92. private const string LOADER_TILTA_SLS="LoaderTiltASls";
  93. private const string LOADER_TILTB_SLS="LoaderTiltBSls";
  94. private const string PUF1_VERTICAL_SLS="Puf1VerticalSls";
  95. private const string PUF2_VERTICAL_SLS="Puf2VerticalSls";
  96. private const string LOADER_GANTRY_SLS="LoaderGantrySls";
  97. private const string LOADER_ELEVATOR_SLS="LoaderElevatorSls";
  98. private const string PROCESS_GANTRY_SLS="ProcessGantrySls";
  99. private const string PROCESS_ELEVATOR_SLS="ProcessElevatorSls";
  100. #endregion
  101. #region Disable
  102. private const string PUF_VERTICAL_DISABLE= "PufVerticalDisable";
  103. private const string PUF1_FLIP_ROTATION_DISABLE="Puf1FlipRotationDisable";
  104. private const string PUF2_FLIP_ROTATION_DISABLE="Puf2FlipRotationDisable";
  105. private const string LOADER_DISABLE="LoaderDisable";
  106. private const string TRANSPORTER_DISABLE="TransporterDisable";
  107. private const string SRD_ARM_DISABLE="SrdArmDisable";
  108. private const string SRD_ROTATION_DISABLE="SrdRotationDisable";
  109. #endregion
  110. #region safety
  111. private const string TRANSPORTER_SAFE_SLS="TransporterSafeSls";
  112. private const string LOADER_SAFE_SLS="LoaderSafeSls";
  113. private const string PUF_VERTICAL_SAFE_SLS="PufVerticalSafeSls";
  114. private const string LOADER_SAFE_STO="LoaderSafeSto";
  115. private const string PUF_VERTICAL_SAFE_STO="PufVerticalSafeSto";
  116. private const string PUF1_FLIP_ROTATION_SAFE_STO="Puf1FlipRotationSafeSto";
  117. private const string PUF2_FLIP_ROTATION_SAFE_STO="Puf2FlipRotationSafeSto";
  118. private const string TRANSPORTER_SAFE_STO="TransporterSafeSto";
  119. private const string SRD_ROTATION_SAFE_STO = "SrdRotationSafeSto";
  120. private const string SRD_ARM_SAFE_STO="SrdArmSafeSto";
  121. #endregion
  122. #region Plumbling
  123. private const string PUMP_EDM="PumpEdm";
  124. private const string RESERVIOR_HIGH_LEVEL="ReservoirHighLevel";
  125. private const string FLUID_ENABLE_EDM="FluidEnableEdm";
  126. #endregion
  127. private const string SRD_ARM_RESET="SRDArmReset";
  128. private const string SAFETY_DATA="SafetyData";
  129. #endregion
  130. #region 内部变量
  131. /// <summary>
  132. /// Reset Routine
  133. /// </summary>
  134. private SafetyResetRoutine _resetRoutine;
  135. /// <summary>
  136. /// All Switch On Routine
  137. /// </summary>
  138. private SafetyNewAllOnRoutine _allOnRoutine;
  139. /// <summary>
  140. /// AllOnRoutine状态
  141. /// </summary>
  142. private RState _allOnStatus;
  143. /// <summary>
  144. /// 操作当前状态
  145. /// </summary>
  146. private RState _status;
  147. /// <summary>
  148. /// 变量是否初始化字典
  149. /// </summary>
  150. private Dictionary<string, bool> _variableInitializeDic = new Dictionary<string, bool>();
  151. /// <summary>
  152. /// 定时器Job
  153. /// </summary>
  154. PeriodicJob _periodicJob = null;
  155. #endregion
  156. #region 属性
  157. /// <summary>
  158. /// 数据对象
  159. /// </summary>
  160. public SafetyData SafetyData { get; set; }
  161. /// <summary>
  162. /// 状态
  163. /// </summary>
  164. public RState Status { get; set; }
  165. /// <summary>
  166. /// 所有io变量是否初始化
  167. /// </summary>
  168. public bool IOInitialized { get { return IOVariableDictionaryUtil.AllIoVariableInitialized(eEvent.ERR_SAFETY,Module,_variableInitializeDic); } }
  169. #endregion
  170. /// <summary>
  171. /// 构造函数
  172. /// </summary>
  173. /// <param name="moduleName"></param>
  174. public SafetyDevice() : base("Safety", "Safety", "Safety", "Safety")
  175. {
  176. SafetyData = new SafetyData();
  177. }
  178. /// <summary>
  179. /// 定时器
  180. /// </summary>
  181. /// <returns></returns>
  182. private bool OnTimer()
  183. {
  184. if (_status==RState.Running)
  185. {
  186. _status = _resetRoutine.Monitor();
  187. if(_status==RState.End)
  188. {
  189. LOG.WriteLog(eEvent.INFO_SAFETY, Module, "Reset Complete");
  190. }
  191. else if(_status==RState.Failed)
  192. {
  193. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "Reset Error");
  194. }
  195. }
  196. //AllOnRoutine监控
  197. if (_allOnStatus == RState.Running)
  198. {
  199. _allOnStatus = _allOnRoutine.Monitor();
  200. if (_allOnStatus == RState.End)
  201. {
  202. LOG.WriteLog(eEvent.INFO_SAFETY, Module, "All On Complete");
  203. }
  204. else if (_allOnStatus == RState.Failed)
  205. {
  206. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "All On Error");
  207. }
  208. }
  209. SLSAxisModeSiren();
  210. //WaferShuttleUsageMonitor
  211. WaferHolderManager.Instance.WaferShuttleUsageMonitor();
  212. return true;
  213. }
  214. /// <summary>
  215. /// SLS模块下Axis Mode Siren
  216. /// </summary>
  217. private void SLSAxisModeSiren()
  218. {
  219. int count = 0;
  220. //count += AxisModeSirenOn(SafetyData.Puf1VerticalSls, $"{ModuleName.PUF1}.Vertical");
  221. //count += AxisModeSirenOn(SafetyData.Puf2VerticalSls, $"{ModuleName.PUF2}.Vertical");
  222. //count += AxisModeSirenOn(SafetyData.LoaderTiltASls, $"{ModuleName.Loader1}.TiltA");
  223. //count += AxisModeSirenOn(SafetyData.LoaderTiltBSls, $"{ModuleName.Loader1}.TiltB");
  224. //count += AxisModeSirenOn(SafetyData.LoaderSwingASls, $"{ModuleName.Loader1}.SwingA");
  225. //count += AxisModeSirenOn(SafetyData.LoaderSwingBSls, $"{ModuleName.Loader1}.SwingB");
  226. //count += AxisModeSirenOn(SafetyData.LoaderRotationSls, $"{ModuleName.Loader1}.Rotation");
  227. //count += AxisModeSirenOn(SafetyData.LoaderGantrySls, $"{ModuleName.Transporter2}.Gantry");
  228. //count += AxisModeSirenOn(SafetyData.LoaderElevatorSls, $"{ModuleName.Transporter2}.Elevator");
  229. //count += AxisModeSirenOn(SafetyData.ProcessGantrySls, $"{ModuleName.Transporter1}.Gantry");
  230. //count += AxisModeSirenOn(SafetyData.ProcessElevatorSls, $"{ModuleName.Transporter1}.Elevator");
  231. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.PUF1}.Vertical");
  232. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.PUF2}.Vertical");
  233. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.TiltA");
  234. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.TiltB");
  235. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.ShuttleA");
  236. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.ShuttleB");
  237. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.Rotation");
  238. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Transporter2}.Gantry");
  239. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Transporter2}.Elevator");
  240. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Transporter1}.Gantry");
  241. count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Transporter1}.Elevator");
  242. if (count==0&&SafetyData.ModeSiren)
  243. {
  244. ModeSirenOff();
  245. }
  246. }
  247. /// <summary>
  248. /// Axis运动Mode Siren On
  249. /// </summary>
  250. /// <param name="jetAxisBase"></param>
  251. private int AxisModeSirenOn(bool sls,string axisName)
  252. {
  253. JetAxisBase axis = DEVICE.GetDevice<JetAxisBase>(axisName);
  254. if (axis != null && axis.IsSwitchOn)
  255. {
  256. if (axis.IsRun&&sls)
  257. {
  258. ModeSirenOn();
  259. return 1;
  260. }
  261. }
  262. return 0;
  263. }
  264. /// <summary>
  265. /// 初始化
  266. /// </summary>
  267. /// <returns></returns>
  268. public bool Initialize()
  269. {
  270. InitializeRoutine();
  271. InitializeData();
  272. SubscribeValueAction();
  273. InitializeOperation();
  274. _periodicJob = new PeriodicJob(200, OnTimer, $"{Module}.OnTimer", true);
  275. return true;
  276. }
  277. /// <summary>
  278. /// 初始化Routine
  279. /// </summary>
  280. private void InitializeRoutine()
  281. {
  282. _resetRoutine = new SafetyResetRoutine(Module);
  283. _allOnRoutine = new SafetyNewAllOnRoutine(Module);
  284. }
  285. /// <summary>
  286. /// 初始化DATA
  287. /// </summary>
  288. private void InitializeData()
  289. {
  290. DATA.Subscribe($"{Module}.{SAFETY_DATA}",() => SafetyData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  291. DATA.Subscribe($"{Module}.{IS_INITIALIZED}", () => IOInitialized, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  292. DATA.Subscribe($"{Module}.TwincatState", () => SafetyData.TwincatState, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  293. }
  294. /// <summary>
  295. /// 初始化Operation
  296. /// </summary>
  297. private void InitializeOperation()
  298. {
  299. OP.Subscribe($"{Module}.LockProcessDoors", (cmd,args) => LockProcessDoor());
  300. OP.Subscribe($"{Module}.UnlockProcessDoors", (cmd, args) => UnlockProcessDoor());
  301. OP.Subscribe($"{Module}.LockLoaderDoors", (cmd, args) => LockLoaderDoor());
  302. OP.Subscribe($"{Module}.UnlockLoaderDoors", (cmd, args) => UnlockLoaderDoor());
  303. OP.Subscribe($"{Module}.LockBufferDoors", (cmd, args) => LockBufferDoor());
  304. OP.Subscribe($"{Module}.UnlockBufferDoors", (cmd, args) => UnlockBufferDoor());
  305. OP.Subscribe($"{Module}.ResetOperation",(cmd, args) => ResetOperation());
  306. OP.Subscribe($"{Module}.AllOnOperation", (cmd, args) => AllOnOperation());
  307. }
  308. /// <summary>
  309. /// 订阅变量数值发生变化
  310. /// </summary>
  311. private void SubscribeValueAction()
  312. {
  313. BeckhoffIoSubscribeUpdateVariable( MAIN_COMM_ERR);
  314. BeckhoffIoSubscribeUpdateVariable( LOADER_PUF_COMM_ERR);
  315. BeckhoffIoSubscribeUpdateVariable( SRD_COMM_ERR);
  316. BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_COMM_ERR);
  317. BeckhoffIoSubscribeUpdateVariable( MAIN_FUNCTION_BLOCK_ERR);
  318. BeckhoffIoSubscribeUpdateVariable( LOADER_PUF_FUNCTION_BLOCK_ERR);
  319. BeckhoffIoSubscribeUpdateVariable( SRD_FUNCTION_BLOCK_ERR);
  320. BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_FUNCTION_BLOCK_ERR);
  321. BeckhoffIoSubscribeUpdateVariable( TWINCAT_STATE);
  322. BeckhoffIoSubscribeUpdateVariable( LOADER_HOT_CONNECT_STATE);
  323. BeckhoffIoSubscribeUpdateVariable( FFU_HOT_CONNECT_STATE);
  324. BeckhoffIoSubscribeUpdateVariable( PRC_HOT_CONNECT_STATE);
  325. BeckhoffIoSubscribeUpdateVariable( LDR_HOT_CONNECT_STATE);
  326. BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_HOT_CONNECT_STATE);
  327. BeckhoffIoSubscribeUpdateVariable( SRD_HOT_CONNECT_STATE);
  328. BeckhoffIoSubscribeUpdateVariable( PUF_HOT_CONNECT_STATE);
  329. BeckhoffIoSubscribeUpdateVariable( RESERVOIR2_HOT_CONNECT_STATE);
  330. BeckhoffIoSubscribeUpdateVariable( RESERVOIR1_HOT_CONNECT_STATE);
  331. BeckhoffIoSubscribeUpdateVariable( RUNSTOP);
  332. BeckhoffIoSubscribeUpdateVariable( ERRACK);
  333. BeckhoffIoSubscribeUpdateVariable( SLS_RESTART);
  334. BeckhoffIoSubscribeUpdateVariable( TX_STO1_ESTOP_Restart);
  335. BeckhoffIoSubscribeUpdateVariable( TX_STO_MON_Restart);
  336. BeckhoffIoSubscribeUpdateVariable( TX_STO2_ESTOP_RESTART);
  337. BeckhoffIoSubscribeUpdateVariable( LDR_PUF_STO_MON_RESTART);
  338. BeckhoffIoSubscribeUpdateVariable( LDR_PUF_STO1_ESTOP_RESTART);
  339. BeckhoffIoSubscribeUpdateVariable( LDR_PUF_STO2_ESTOP_RESTART);
  340. BeckhoffIoSubscribeUpdateVariable( SRD_STO_ESTOP_RESTART);
  341. BeckhoffIoSubscribeUpdateVariable( PUMP_STO_ESTOP_RESTART);
  342. BeckhoffIoSubscribeUpdateVariable( FLUID_ESTOP_RESTART);
  343. BeckhoffIoSubscribeUpdateVariable( LOADER_DOOR_LOCK);
  344. BeckhoffIoSubscribeUpdateVariable( LOADER_DOOR_LOCKED);
  345. BeckhoffIoSubscribeUpdateVariable( LOADER_PANEL_REMOVED);
  346. BeckhoffIoSubscribeUpdateVariable( LOWER_LOADER_PANEL_REMOVED);
  347. BeckhoffIoSubscribeUpdateVariable( BUFFER_DOOR_LOCK);
  348. BeckhoffIoSubscribeUpdateVariable( BUFFER_DOOR_LOCKED);
  349. BeckhoffIoSubscribeUpdateVariable( BUFFER_PANEL_REMOVED);
  350. BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR_LOCK);
  351. BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR1_LOCKED);
  352. BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR2_LOCKED);
  353. BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR3_LOCKED);
  354. BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR4_LOCKED);
  355. BeckhoffIoSubscribeUpdateVariable( PROCESS_UPPER_PANELS_ON);
  356. BeckhoffIoSubscribeUpdateVariable( SRD_TOP_PANEL_REMOVED);
  357. BeckhoffIoSubscribeUpdateVariable( SRD_LOWER_PANEL_REMOVED);
  358. BeckhoffIoSubscribeUpdateVariable( PLUMBING_DOOR_CLOSED);
  359. BeckhoffIoSubscribeUpdateVariable( PROCESS_HALT_BUTTON1);
  360. BeckhoffIoSubscribeUpdateVariable( PROCESS_HALT_BUTTON2);
  361. BeckhoffIoSubscribeUpdateVariable( LOADER_HALT_BUTTON);
  362. BeckhoffIoSubscribeUpdateVariable( MODE_SELECTOR_SWITCH);
  363. BeckhoffIoSubscribeUpdateVariable( MODE_SIREN);
  364. BeckhoffIoSubscribeUpdateVariable( LOADER_ROTATION_SLS);
  365. BeckhoffIoSubscribeUpdateVariable( LOADER_SWINGA_SLS);
  366. BeckhoffIoSubscribeUpdateVariable( LOADER_SWINGB_SLS);
  367. BeckhoffIoSubscribeUpdateVariable( LOADER_TILTA_SLS);
  368. BeckhoffIoSubscribeUpdateVariable( LOADER_TILTB_SLS);
  369. BeckhoffIoSubscribeUpdateVariable( PUF1_VERTICAL_SLS);
  370. BeckhoffIoSubscribeUpdateVariable( PUF2_VERTICAL_SLS);
  371. BeckhoffIoSubscribeUpdateVariable( LOADER_GANTRY_SLS);
  372. BeckhoffIoSubscribeUpdateVariable( LOADER_ELEVATOR_SLS);
  373. BeckhoffIoSubscribeUpdateVariable( PROCESS_GANTRY_SLS);
  374. BeckhoffIoSubscribeUpdateVariable( PROCESS_ELEVATOR_SLS);
  375. BeckhoffIoSubscribeUpdateVariable( PUF_VERTICAL_DISABLE);
  376. BeckhoffIoSubscribeUpdateVariable( PUF1_FLIP_ROTATION_DISABLE);
  377. BeckhoffIoSubscribeUpdateVariable( PUF2_FLIP_ROTATION_DISABLE);
  378. BeckhoffIoSubscribeUpdateVariable( LOADER_DISABLE);
  379. BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_DISABLE);
  380. BeckhoffIoSubscribeUpdateVariable( SRD_ARM_DISABLE);
  381. BeckhoffIoSubscribeUpdateVariable( SRD_ROTATION_DISABLE);
  382. BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_SAFE_SLS);
  383. BeckhoffIoSubscribeUpdateVariable( LOADER_SAFE_SLS);
  384. BeckhoffIoSubscribeUpdateVariable( PUF_VERTICAL_SAFE_SLS);
  385. BeckhoffIoSubscribeUpdateVariable( LOADER_SAFE_STO);
  386. BeckhoffIoSubscribeUpdateVariable( PUF_VERTICAL_SAFE_STO);
  387. BeckhoffIoSubscribeUpdateVariable( PUF1_FLIP_ROTATION_SAFE_STO);
  388. BeckhoffIoSubscribeUpdateVariable( PUF2_FLIP_ROTATION_SAFE_STO);
  389. BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_SAFE_STO);
  390. BeckhoffIoSubscribeUpdateVariable( SRD_ARM_SAFE_STO);
  391. BeckhoffIoSubscribeUpdateVariable( SRD_ROTATION_SAFE_STO);
  392. BeckhoffIoSubscribeUpdateVariable( PUMP_EDM);
  393. BeckhoffIoSubscribeUpdateVariable( RESERVIOR_HIGH_LEVEL);
  394. BeckhoffIoSubscribeUpdateVariable(FLUID_ENABLE_EDM);
  395. BeckhoffIoSubscribeUpdateVariable(SRD_ARM_RESET);
  396. }
  397. /// <summary>
  398. /// 订阅IO变量
  399. /// </summary>
  400. /// <param name="variable"></param>
  401. private void BeckhoffIoSubscribeUpdateVariable(string variable)
  402. {
  403. _variableInitializeDic[variable] = false;
  404. IOModuleManager.Instance.SubscribeModuleVariable(Module,variable, UpdateVariableValue);
  405. }
  406. /// <summary>
  407. /// 更新变量数值
  408. /// </summary>
  409. /// <param name="variable"></param>
  410. /// <param name="value"></param>
  411. private void UpdateVariableValue(string variable, object value)
  412. {
  413. if (!SafetyData.IsDataInitialized)
  414. {
  415. SafetyData.IsDataInitialized = true;
  416. }
  417. PropertyInfo property = SafetyData.GetType().GetProperty(variable);
  418. if (property != null)
  419. {
  420. property.SetValue(SafetyData, value);
  421. }
  422. if (_variableInitializeDic.ContainsKey(variable) && !_variableInitializeDic[variable])
  423. {
  424. _variableInitializeDic[variable] = true;
  425. }
  426. if(variable.EndsWith("Sls"))
  427. {
  428. SlsChangedSpeed(variable,(bool)value);
  429. }
  430. CheckIsDataAbonrmal(variable, value);
  431. }
  432. #region 监控指示灯是否异常 方法
  433. /// <summary>
  434. /// 监控指示灯是否异常,是则打印log
  435. /// </summary>
  436. /// <param name="variable"></param>
  437. /// <param name="value"></param>
  438. private void CheckIsDataAbonrmal(string variable,object value)
  439. {
  440. if (variable == "ReservoirHighLevel" && (bool)value == true)
  441. {
  442. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "ReservoirHigh Level Error");
  443. }
  444. else if (variable == "MainCommErr" && (bool)value == true)
  445. {
  446. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "MainCommErr Error");
  447. }
  448. else if (variable == "LoaderPufCommErr" && (bool)value == true)
  449. {
  450. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "LoaderPufCommErr Error");
  451. }
  452. else if (variable == "SrdCommErr" && (bool)value == true)
  453. {
  454. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "SrdCommErr Error");
  455. }
  456. else if (variable == "TransportCommErr" && (bool)value == true)
  457. {
  458. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "TransportCommErr Error");
  459. }
  460. else if (variable == "MainFunctionBlockErr" && (bool)value == true)
  461. {
  462. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "MainFunctionBlockErr Error");
  463. }
  464. else if (variable == "LoaderPufFunctionBlockErr" && (bool)value == true)
  465. {
  466. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "LoaderPufFunctionBlockErr Error");
  467. }
  468. else if (variable == "SrdFunctionBlockErr" && (bool)value == true)
  469. {
  470. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "SrdFunctionBlockErr Error");
  471. }
  472. else if (variable == "TransporterFunctionBlockErr" && (bool)value == true)
  473. {
  474. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "TransporterFunctionBlockErr Error");
  475. }
  476. else if (variable == "ProcessHaltButton1" && (bool)value == true)
  477. {
  478. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "ProcessHaltButton1 Activate");
  479. }
  480. else if (variable == "ProcessHaltButton2" && (bool)value == true)
  481. {
  482. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "ProcessHaltButton2 Activate");
  483. }
  484. else if (variable == "LoaderHaltButton" && (bool)value == true)
  485. {
  486. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "LoaderHaltButton Activate");
  487. }
  488. else if (variable == "LoaderPanelRemoved" && (bool)value == true)
  489. {
  490. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "LoaderPanelRemoved Activate");
  491. }
  492. else if (variable == "BufferPanelRemoved" && (bool)value == true)
  493. {
  494. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "BufferPanelRemoved Activate");
  495. }
  496. else if (variable == "SrdTopPanelRemoved" && (bool)value == true)
  497. {
  498. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "SrdTopPanelRemoved Activate");
  499. }
  500. else if (variable == "SrdLowerPanelRemoved" && (bool)value == true)
  501. {
  502. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "SrdLowerPanelRemoved Activate");
  503. }
  504. else if (variable == "PlumbingDoorClosed" && (bool)value == false) //信号是反的
  505. {
  506. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "PlumbingDoorClosed Activate");
  507. }
  508. else if (variable == "ProcessUpperPanelsOn" && (bool)value == false) //信号是反的
  509. {
  510. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "ProcessUpperPanelsOn Activate");
  511. }
  512. else if (variable == "PumpEdm" && (bool)value == false) //信号是反的
  513. {
  514. LOG.WriteLog(eEvent.ERR_SAFETY, Module, "PumpEdm Activate");
  515. }
  516. }
  517. #endregion
  518. #region SLS
  519. /// <summary>
  520. /// SLS更改速度
  521. /// </summary>
  522. /// <param name="variable"></param>
  523. /// <param name="sls"></param>
  524. private void SlsChangedSpeed(string variable,bool sls)
  525. {
  526. int slsSpeed = SC.GetValue<int>("Twincat.SlsSpeed");
  527. if(sls)
  528. {
  529. ModuleChangeSpeed(variable, slsSpeed);
  530. }
  531. else
  532. {
  533. ModuleChangeSpeed(variable, 100);
  534. }
  535. }
  536. /// <summary>
  537. /// 模块更改速度
  538. /// </summary>
  539. /// <param name="variable"></param>
  540. /// <param name="percent"></param>
  541. private void ModuleChangeSpeed(string variable,int percent)
  542. {
  543. switch(variable)
  544. {
  545. case PUF1_VERTICAL_SLS:
  546. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.PUF1}.Vertical"), percent);
  547. break;
  548. case PUF2_VERTICAL_SLS:
  549. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.PUF2}.Vertical"), percent);
  550. break;
  551. case LOADER_TILTA_SLS:
  552. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.TiltA"), percent);
  553. break;
  554. case LOADER_TILTB_SLS:
  555. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.TiltB"), percent);
  556. break;
  557. case LOADER_SWINGA_SLS:
  558. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.ShuttleA"), percent);
  559. break;
  560. case LOADER_SWINGB_SLS:
  561. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.ShuttleB"), percent);
  562. break;
  563. case LOADER_ROTATION_SLS:
  564. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation"), percent);
  565. break;
  566. case LOADER_GANTRY_SLS:
  567. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Transporter2}.Gantry"), percent);
  568. break;
  569. case LOADER_ELEVATOR_SLS:
  570. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Transporter2}.Elevator"), percent);
  571. break;
  572. case PROCESS_GANTRY_SLS:
  573. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Transporter1}.Gantry"), percent);
  574. break;
  575. case PROCESS_ELEVATOR_SLS:
  576. UpdateAxisSpeed(DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Transporter1}.Elevator"), percent);
  577. break;
  578. }
  579. }
  580. /// <summary>
  581. /// 更改Axis速度百分比
  582. /// </summary>
  583. /// <param name="jetAxisBase"></param>
  584. /// <param name="percent"></param>
  585. private void UpdateAxisSpeed(JetAxisBase jetAxisBase,int percent)
  586. {
  587. jetAxisBase.ChangePercentSpeedAceleration(percent);
  588. }
  589. #endregion
  590. #region Reset
  591. /// <summary>
  592. /// Reset Operation
  593. /// </summary>
  594. /// <returns></returns>
  595. private bool ResetOperation()
  596. {
  597. _status = _resetRoutine.Start();
  598. return _status == RState.Running;
  599. }
  600. #endregion
  601. #region All On
  602. /// <summary>
  603. /// All On Operation
  604. /// </summary>
  605. /// <returns></returns>
  606. private bool AllOnOperation()
  607. {
  608. _allOnStatus = _allOnRoutine.Start();
  609. return _allOnStatus == RState.Running;
  610. }
  611. #endregion
  612. #region Lock Door
  613. /// <summary>
  614. /// Lock Process Door
  615. /// </summary>
  616. /// <returns></returns>
  617. public bool LockProcessDoor()
  618. {
  619. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PROCESS_DOOR_LOCK}");
  620. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  621. }
  622. /// <summary>
  623. /// Unlock Process Door
  624. /// </summary>
  625. /// <returns></returns>
  626. public bool UnlockProcessDoor()
  627. {
  628. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PROCESS_DOOR_LOCK}");
  629. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  630. }
  631. /// <summary>
  632. /// Lock Buffer Door
  633. /// </summary>
  634. /// <returns></returns>
  635. public bool LockBufferDoor()
  636. {
  637. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{BUFFER_DOOR_LOCK}");
  638. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  639. }
  640. /// <summary>
  641. /// Unlock Buffer Door
  642. /// </summary>
  643. /// <returns></returns>
  644. public bool UnlockBufferDoor()
  645. {
  646. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{BUFFER_DOOR_LOCK}");
  647. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  648. }
  649. /// <summary>
  650. /// Lock Loader Door
  651. /// </summary>
  652. /// <returns></returns>
  653. public bool LockLoaderDoor()
  654. {
  655. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{LOADER_DOOR_LOCK}");
  656. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  657. }
  658. /// <summary>
  659. /// Unlock Loader Door
  660. /// </summary>
  661. /// <returns></returns>
  662. public bool UnlockLoaderDoor()
  663. {
  664. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{LOADER_DOOR_LOCK}");
  665. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  666. }
  667. #endregion
  668. #region Mode Siren
  669. /// <summary>
  670. /// Mode Siren On
  671. /// </summary>
  672. /// <returns></returns>
  673. public bool ModeSirenOn()
  674. {
  675. if (!SafetyData.ModeSiren)
  676. {
  677. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{MODE_SIREN}");
  678. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  679. }
  680. return true;
  681. }
  682. /// <summary>
  683. /// Mode Siren Off
  684. /// </summary>
  685. /// <returns></returns>
  686. public bool ModeSirenOff()
  687. {
  688. if (SafetyData.ModeSiren)
  689. {
  690. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{MODE_SIREN}");
  691. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  692. }
  693. return true;
  694. }
  695. #endregion
  696. public void Monitor()
  697. {
  698. }
  699. public void Reset()
  700. {
  701. }
  702. public void Terminate()
  703. {
  704. _periodicJob.Stop(false);
  705. }
  706. }
  707. }