SafetyDevice.cs 33 KB

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