VpwCellDevice.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  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.CommonData.Vpw;
  9. using MECF.Framework.Common.IOCore;
  10. using MECF.Framework.Common.Persistent.SRD;
  11. using MECF.Framework.Common.Persistent.Temperature;
  12. using MECF.Framework.Common.Persistent.VpwCell;
  13. using MECF.Framework.Common.Persistent.VpwMain;
  14. using PunkHPX8_RT.Devices.AXIS;
  15. using PunkHPX8_RT.Modules;
  16. using PunkHPX8_RT.Modules.VpwMain;
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Linq;
  20. using System.Reflection;
  21. using System.Text;
  22. using System.Threading.Tasks;
  23. namespace PunkHPX8_RT.Devices.VpwCell
  24. {
  25. public class VpwCellDevice : BaseDevice, IDevice
  26. {
  27. #region 常量
  28. private const string COMMON_DATA = "CommonData";
  29. private const string DIW_FLOW = "DiwFlow";
  30. private const string VACUUM_PRESSURE = "VacuumPressure";
  31. private const string FLOW_DRIP = "FlowDrip";
  32. private const string FLOW_SMALL = "FlowSmall";
  33. private const string FLOW_LARGE = "FlowLarge";
  34. private const string VACUUM_VALVE = "VacuumValve";
  35. private const string VENT_VALVE = "VentValve";
  36. private const string DRAIN_VALVE = "DrainValve";
  37. private const string PERSISTENT_VALUE = "PersistentValue";
  38. #endregion
  39. #region 内部变量
  40. /// <summary>
  41. /// 变量是否初始化字典
  42. /// </summary>
  43. private Dictionary<string, bool> _variableInitializeDic = new Dictionary<string, bool>();
  44. /// <summary>
  45. /// 数据
  46. /// </summary>
  47. private VpwCellCommonData _commonData=new VpwCellCommonData();
  48. /// <summary>
  49. /// 持久性数值
  50. /// </summary>
  51. private VpwCellPersistentValue _vpwCellPersistentValue;
  52. /// <summary>
  53. /// 水平电机
  54. /// </summary>
  55. private JetAxisBase _rotationAxis;
  56. #endregion
  57. #region 属性
  58. /// <summary>
  59. /// 数据
  60. /// </summary>
  61. public VpwCellCommonData CommonData { get { return _commonData; } }
  62. /// <summary>
  63. /// 操作模式
  64. /// </summary>
  65. public string OperationMode { get { return _vpwCellPersistentValue.OperatingMode; } }
  66. /// <summary>
  67. /// 工程模式
  68. /// </summary>
  69. public string EngineerMode { get { return _vpwCellPersistentValue.RecipeOperatingMode; } }
  70. #endregion
  71. /// <summary>
  72. /// 构造函数
  73. /// </summary>
  74. /// <param name="moduleName"></param>
  75. public VpwCellDevice(string moduleName) : base(moduleName, moduleName, moduleName, moduleName)
  76. {
  77. }
  78. #region 初始化
  79. /// <summary>
  80. /// 初始化
  81. /// </summary>
  82. /// <returns></returns>
  83. public bool Initialize()
  84. {
  85. InitializeParameter();
  86. InitializeRoutine();
  87. SubscribeData();
  88. SubscribeValueAction();
  89. InitializeOperation();
  90. return true;
  91. }
  92. /// <summary>
  93. /// 初始化参数
  94. /// </summary>
  95. private void InitializeParameter()
  96. {
  97. _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
  98. _vpwCellPersistentValue = VpwCellPersistentManager.Instance.GetPersistentValue(Module);
  99. }
  100. /// <summary>
  101. /// 初始化Routine
  102. /// </summary>
  103. private void InitializeRoutine()
  104. {
  105. }
  106. /// <summary>
  107. /// 订阅
  108. /// </summary>
  109. private void SubscribeData()
  110. {
  111. DATA.Subscribe($"{Module}.{COMMON_DATA}", () => CommonData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  112. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => _vpwCellPersistentValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  113. }
  114. /// <summary>
  115. /// 订阅数据
  116. /// </summary>
  117. private void SubscribeValueAction()
  118. {
  119. IoSubscribeUpdateVariable(DIW_FLOW);
  120. IoSubscribeUpdateVariable(DRAIN_VALVE);
  121. IoSubscribeUpdateVariable(VACUUM_PRESSURE);
  122. IoSubscribeUpdateVariable(VACUUM_VALVE);
  123. IoSubscribeUpdateVariable(VENT_VALVE);
  124. IoSubscribeUpdateVariable(FLOW_DRIP);
  125. IoSubscribeUpdateVariable(FLOW_LARGE);
  126. IoSubscribeUpdateVariable(FLOW_SMALL);
  127. }
  128. /// <summary>
  129. /// 初始化变量
  130. /// </summary>
  131. /// <param name="variable"></param>
  132. private void IoSubscribeUpdateVariable(string variable)
  133. {
  134. _variableInitializeDic[variable] = false;
  135. IOModuleManager.Instance.SubscribeModuleVariable(Module, variable, UpdateVariableValue);
  136. }
  137. /// <summary>
  138. /// 更新变量数值
  139. /// </summary>
  140. /// <param name="variable"></param>
  141. /// <param name="value"></param>
  142. private void UpdateVariableValue(string variable, object value)
  143. {
  144. PropertyInfo property = _commonData.GetType().GetProperty(variable);
  145. if (property != null)
  146. {
  147. property.SetValue(_commonData, value);
  148. }
  149. if (_variableInitializeDic.ContainsKey(variable) && !_variableInitializeDic[variable])
  150. {
  151. _variableInitializeDic[variable] = true;
  152. }
  153. }
  154. /// <summary>
  155. /// 初始化OP
  156. /// </summary>
  157. private void InitializeOperation()
  158. {
  159. OP.Subscribe($"{Module}.FlowDripOn", (cmd,para)=> { return FlowDripOn(); });
  160. OP.Subscribe($"{Module}.FlowDripOff", (cmd, para) => { return FlowDripOff(); });
  161. OP.Subscribe($"{Module}.FlowSmallOn", (cmd, para) => { return FlowSmallOn(); });
  162. OP.Subscribe($"{Module}.FlowSmallOff", (cmd, para) => { return FlowSmallOff(); });
  163. OP.Subscribe($"{Module}.FlowLargeOn", (cmd, para) => { return FlowLargeOn(); });
  164. OP.Subscribe($"{Module}.FlowLargeOff", (cmd, para) => { return FlowLargeOff(); });
  165. OP.Subscribe($"{Module}.VentValveOn", (cmd, para) => { return VentValveOn(); });
  166. OP.Subscribe($"{Module}.VentValveOff", (cmd, para) => { return VentValveOff(); });
  167. OP.Subscribe($"{Module}.DrainValveOn", (cmd, para) => { return DrainValveOn(); });
  168. OP.Subscribe($"{Module}.DrainValveOff", (cmd, para) => { return DrainValveOff(); });
  169. OP.Subscribe($"{Module}.VacuumValveOn", (cmd, para) => { return VacuumValveOn(); });
  170. OP.Subscribe($"{Module}.VacuumValveOff", (cmd, para) => { return VacuumValveOff(); });
  171. OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
  172. OP.Subscribe($"{Module}.ManualAction", ManualOperation);
  173. OP.Subscribe($"{Module}.AutoAction", AutoOperation);
  174. OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
  175. OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
  176. }
  177. #endregion
  178. #region Action
  179. #region Flow
  180. /// <summary>
  181. /// Flow Drip on
  182. /// </summary>
  183. /// <returns></returns>
  184. public bool FlowDripOn()
  185. {
  186. return WriteVariableValue(FLOW_DRIP, true);
  187. }
  188. /// <summary>
  189. /// Flow Drip Off
  190. /// </summary>
  191. /// <returns></returns>
  192. public bool FlowDripOff()
  193. {
  194. return WriteVariableValue(FLOW_DRIP, false);
  195. }
  196. /// <summary>
  197. /// Flow Small On
  198. /// </summary>
  199. /// <returns></returns>
  200. public bool FlowSmallOn()
  201. {
  202. return WriteVariableValue(FLOW_SMALL, true);
  203. }
  204. /// <summary>
  205. /// Flow Small Off
  206. /// </summary>
  207. /// <returns></returns>
  208. public bool FlowSmallOff()
  209. {
  210. return WriteVariableValue(FLOW_SMALL, false);
  211. }
  212. /// <summary>
  213. /// Flow Large On
  214. /// </summary>
  215. /// <returns></returns>
  216. public bool FlowLargeOn()
  217. {
  218. return WriteVariableValue(FLOW_LARGE, true);
  219. }
  220. /// <summary>
  221. /// Flow Large Off
  222. /// </summary>
  223. /// <returns></returns>
  224. public bool FlowLargeOff()
  225. {
  226. return WriteVariableValue(FLOW_LARGE, false);
  227. }
  228. #endregion
  229. #region Mode Switch
  230. /// <summary>
  231. /// DisabledAction
  232. /// </summary>
  233. /// <param name="cmd"></param>
  234. /// <param name="param"></param>
  235. /// <returns></returns>
  236. private bool DisabledOperation(string cmd, object[] args)
  237. {
  238. string currentOperation = "Disabled";
  239. VpwCellEntity vpwCellEntity = Singleton<RouteManager>.Instance.GetModule<VpwCellEntity>(Module);
  240. if (vpwCellEntity != null && _vpwCellPersistentValue != null && _vpwCellPersistentValue.OperatingMode != currentOperation)
  241. {
  242. string preOperation = _vpwCellPersistentValue.OperatingMode;
  243. if (vpwCellEntity.IsBusy)
  244. {
  245. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Disabled mode");
  246. return false;
  247. }
  248. vpwCellEntity.EnterInit();
  249. _vpwCellPersistentValue.OperatingMode = currentOperation;
  250. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  251. }
  252. VpwCellPersistentManager.Instance.UpdatePersistentValue(Module);
  253. return true;
  254. }
  255. /// <summary>
  256. /// ManualAction
  257. /// </summary>
  258. /// <param name="cmd"></param>
  259. /// <param name="param"></param>
  260. /// <returns></returns>
  261. private bool ManualOperation(string cmd, object[] args)
  262. {
  263. string currentOperation = "Manual";
  264. VpwCellEntity vpwCellEntity = Singleton<RouteManager>.Instance.GetModule<VpwCellEntity>(Module);
  265. if (vpwCellEntity != null && _vpwCellPersistentValue != null && _vpwCellPersistentValue.OperatingMode != currentOperation)
  266. {
  267. string preOperation = _vpwCellPersistentValue.OperatingMode;
  268. if (vpwCellEntity.IsBusy)
  269. {
  270. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Manual mode");
  271. return false;
  272. }
  273. vpwCellEntity.EnterInit();
  274. _vpwCellPersistentValue.OperatingMode = currentOperation;
  275. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  276. }
  277. VpwCellPersistentManager.Instance.UpdatePersistentValue(Module);
  278. return true;
  279. }
  280. /// <summary>
  281. /// AutoAction
  282. /// </summary>
  283. /// <param name="cmd"></param>
  284. /// <param name="param"></param>
  285. /// <returns></returns>
  286. private bool AutoOperation(string cmd, object[] args)
  287. {
  288. string currentOperation = "Auto";
  289. VpwCellEntity vpwCellEntity = Singleton<RouteManager>.Instance.GetModule<VpwCellEntity>(Module);
  290. if (vpwCellEntity != null && _vpwCellPersistentValue != null && _vpwCellPersistentValue.OperatingMode != currentOperation)
  291. {
  292. string preOperation = _vpwCellPersistentValue.OperatingMode;
  293. if (vpwCellEntity.IsBusy)
  294. {
  295. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Auto mode");
  296. return false;
  297. }
  298. vpwCellEntity.EnterInit();
  299. _vpwCellPersistentValue.OperatingMode = currentOperation;
  300. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  301. }
  302. VpwCellPersistentManager.Instance.UpdatePersistentValue(Module);
  303. return true;
  304. }
  305. /// <summary>
  306. /// EngineeringModeAction
  307. /// </summary>
  308. /// <param name="cmd"></param>
  309. /// <param name="param"></param>
  310. /// <returns></returns>
  311. private bool EngineeringModeOperation(string cmd, object[] args)
  312. {
  313. string currentRecipeOperation = "Engineering";
  314. if (_vpwCellPersistentValue != null)
  315. {
  316. _vpwCellPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  317. }
  318. VpwCellPersistentManager.Instance.UpdatePersistentValue(Module);
  319. return true;
  320. }
  321. /// <summary>
  322. /// ProductionAction
  323. /// </summary>
  324. /// <param name="cmd"></param>
  325. /// <param name="param"></param>
  326. /// <returns></returns>
  327. private bool ProductionModeOperation(string cmd, object[] args)
  328. {
  329. string currentRecipeOperation = "Production";
  330. if (_vpwCellPersistentValue != null)
  331. {
  332. _vpwCellPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  333. }
  334. VpwCellPersistentManager.Instance.UpdatePersistentValue(Module);
  335. return true;
  336. }
  337. #endregion
  338. /// <summary>
  339. /// Vent Valve On
  340. /// </summary>
  341. /// <returns></returns>
  342. public bool VentValveOn()
  343. {
  344. return WriteVariableValue(VENT_VALVE, true);
  345. }
  346. /// <summary>
  347. /// Vent Valve Off
  348. /// </summary>
  349. /// <returns></returns>
  350. public bool VentValveOff()
  351. {
  352. return WriteVariableValue(VENT_VALVE, false);
  353. }
  354. /// <summary>
  355. /// Vent Valve On
  356. /// </summary>
  357. /// <returns></returns>
  358. public bool DrainValveOn()
  359. {
  360. return WriteVariableValue(DRAIN_VALVE, true);
  361. }
  362. /// <summary>
  363. /// Vent Valve Off
  364. /// </summary>
  365. /// <returns></returns>
  366. public bool DrainValveOff()
  367. {
  368. return WriteVariableValue(DRAIN_VALVE, false);
  369. }
  370. /// <summary>
  371. /// Vacuum valve on
  372. /// </summary>
  373. /// <returns></returns>
  374. public bool VacuumValveOn()
  375. {
  376. return WriteVariableValue(VACUUM_VALVE, true);
  377. }
  378. /// <summary>
  379. /// Vacuum valve off
  380. /// </summary>
  381. /// <returns></returns>
  382. public bool VacuumValveOff()
  383. {
  384. return WriteVariableValue(VACUUM_VALVE, false);
  385. }
  386. /// <summary>
  387. /// 写变量
  388. /// </summary>
  389. /// <param name="variable"></param>
  390. /// <param name="value"></param>
  391. /// <returns></returns>
  392. private bool WriteVariableValue(string variable, object value)
  393. {
  394. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{variable}");
  395. return IOModuleManager.Instance.WriteIoValue(ioName, value);
  396. }
  397. #endregion
  398. /// <summary>
  399. /// 定时器
  400. /// </summary>
  401. /// <returns></returns>
  402. public bool OnTimer()
  403. {
  404. if (_rotationAxis != null)
  405. {
  406. _rotationAxis.OnTimer();
  407. }
  408. return true;
  409. }
  410. /// <summary>
  411. /// 监控
  412. /// </summary>
  413. public void Monitor()
  414. {
  415. }
  416. public void Reset()
  417. {
  418. }
  419. public void Terminate()
  420. {
  421. }
  422. }
  423. }