VpwCellDevice.cs 16 KB

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