TemperatureController.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Fsm;
  4. using Aitex.Core.RT.Log;
  5. using Aitex.Core.RT.OperationCenter;
  6. using Aitex.Core.RT.SCCore;
  7. using Aitex.Core.Util;
  8. using PunkHPX8_RT.Devices.Facilities;
  9. using PunkHPX8_RT.Devices.Reservoir;
  10. using PunkHPX8_RT.Modules;
  11. using PunkHPX8_RT.Modules.Reservoir;
  12. using MECF.Framework.Common.CommonData.TemperatureControl;
  13. using MECF.Framework.Common.Device.TemperatureController;
  14. using MECF.Framework.Common.Persistent.Temperature;
  15. using MECF.Framework.Common.ToolLayout;
  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. using PunkHPX8_Core;
  23. namespace PunkHPX8_RT.Devices.Temperature
  24. {
  25. public class TemperatureController : BaseDevice, IDevice
  26. {
  27. #region 常量
  28. private const string STRATUS = "Stratus";
  29. private const string TARGET_TEMPERATURE = "TargetTemperature";
  30. private const string RESERVIOR_TEMPERATURE = "ReserviorTemperature";
  31. private const string HEAT_EXCHANGER_TEMPERATURE = "HeatExchangerTemperature";
  32. private const string ALARM = "Alarm";
  33. private const string OFFSET = "Offset";
  34. private const string CONTROL_OPERATION_MODEL="ControlOperationModel";
  35. private const string PB_RANGE = "PBRange";
  36. private const string ARW_RANGE = "ARWRange";
  37. private const string I_CONSTANT = "IConstant";
  38. private const string D_CONSTANT = "DConstant";
  39. private const string HEATING_POWER_UPPER_LIMIT = "HeatingPowerUpperLimit";
  40. private const string COOLING_POWER_UPPER_LIMIT="CoolingPowerUpperLimit";
  41. private const string OUT_PUT_RATIO="OutputRatio";
  42. private const string TEMPERATURE_DATA = "TemperatureData";
  43. private const string IS_CONNECTED = "IsConnected";
  44. private const string PERSISTENT_VALUE = "PersistentValue";
  45. #endregion
  46. #region 内部变量
  47. private byte _address;
  48. private TemperatureControllerData _temperatureData = new TemperatureControllerData();
  49. private PeriodicJob _periodicJob = null;
  50. private bool _startMonitorData = false;
  51. private bool _readAlarm = false;
  52. private double _temeratureDeltaLimit = SC.GetValue<double>("System.TemeratureDelatLimit");
  53. private bool _isApplying = false; //用于判断是否在apply中
  54. private bool _isAlarmErrorLoged = false; //用于判断是否打印过alarm触发
  55. private bool _isAlarmWarningLoged = false; //用于判断是否打印过alarm warning触发
  56. private bool _isTCConnect = false;
  57. /// <summary>
  58. /// TC 持久性数值对象
  59. /// </summary>
  60. private TCPersistentValue _tCPersistentValue;
  61. private Dictionary<int,string> _errorMessage = new Dictionary<int, string>
  62. { { 3, " HighTempCutoff Property" },
  63. { 2, " LowTempCutoff Property" },
  64. { 1, " Fan Property" },
  65. { 0, " OutputFailure Property" },
  66. { 7, " TempLimitWarn Property" },
  67. { 6, " RemoteOff Property" },
  68. { 5, " Thermostat Property" },
  69. { 4, " PowerFailure Property" },
  70. { 11, " ExtSensorFailure Property" },
  71. { 10, " IntSensorFailure Property" },
  72. { 9, " AutoTuning Property" },
  73. { 8, " Leak Property" }};
  74. #endregion
  75. #region 属性
  76. /// <summary>
  77. /// 连接状态
  78. /// </summary>
  79. public bool IsConnected { get { return TemperatureConfigManager.Instance.GetDeviceConnect(Module); } }
  80. /// <summary>
  81. /// 数据
  82. /// </summary>
  83. public TemperatureControllerData TemperatureData
  84. {
  85. get { return _temperatureData; }
  86. }
  87. #endregion
  88. /// <summary>
  89. /// 构造函数
  90. /// </summary>;
  91. /// <param name="moduleName"></param>
  92. public TemperatureController(string moduleName) : base(moduleName, moduleName, moduleName, moduleName)
  93. {
  94. SubscribeValueAction();
  95. InitializeData();
  96. InitializeOperation();
  97. _periodicJob = new PeriodicJob(5000, OnTimer, $"{moduleName}_reader");
  98. _temperatureData.Name = $"{moduleName}";
  99. _isAlarmErrorLoged = false;
  100. _isAlarmWarningLoged = false;
  101. }
  102. /// <summary>
  103. /// 初始化
  104. /// </summary>
  105. /// <returns></returns>
  106. public bool Initialize()
  107. {
  108. TemperatureConfigManager.Instance.InitialDevice(Module);
  109. _periodicJob.Start();
  110. return true;
  111. }
  112. /// <summary>
  113. /// 初始化操作
  114. /// </summary>
  115. private void InitializeOperation()
  116. {
  117. OP.Subscribe($"{Module}.Apply", SetTargetTemperatureOperation);
  118. OP.Subscribe($"{Module}.Enable", EnableOperation);
  119. OP.Subscribe($"{Module}.Disable", DisableOperation);
  120. }
  121. /// <summary>
  122. /// 监控TC电源
  123. /// </summary>
  124. /// <returns></returns>
  125. private bool CheckTCIsConnect()
  126. {
  127. return TemperatureConfigManager.Instance.GetDevicePowerConnect(Module);
  128. }
  129. /// <summary>
  130. /// 应用
  131. /// </summary>
  132. /// <param name="cmd"></param>
  133. /// <param name="param"></param>
  134. /// <returns></returns>
  135. public bool SetTargetTemperatureOperation(string cmd,object[] param)
  136. {
  137. _isApplying = true; //表示正在调温
  138. _temperatureData.HeatExchangerSeries = new List<double>();
  139. _temperatureData.ReserviorSeries = new List<double>();
  140. if (param.Length == 3 && double.TryParse(param[0].ToString(), out double targetTemperature) && double.TryParse(param[1].ToString(), out double targetTemperatureLowLimit) && double.TryParse(param[2].ToString(), out double targetTemperatureHighLimit))
  141. {
  142. TemperatureConfigManager.Instance.SetTargetTemperature(Module, _address, targetTemperature);
  143. if (TemperatureData.ControlOperationModel == (int)TemperatureEnumData.ENABLE)
  144. {
  145. _startMonitorData = true;
  146. }
  147. //将前端输入的数据存入持久化文件
  148. TCPersistentManager.Instance.UpdateTemperatureValue(Module, targetTemperature, targetTemperatureLowLimit, targetTemperatureHighLimit);
  149. return true;
  150. }
  151. if (param.Length == 1 && double.TryParse(param[0].ToString(), out double targetTemperature1))
  152. {
  153. TemperatureConfigManager.Instance.SetTargetTemperature(Module, _address, targetTemperature1);
  154. if (TemperatureData.ControlOperationModel == (int)TemperatureEnumData.ENABLE)
  155. {
  156. _startMonitorData = true;
  157. }
  158. //将前端输入的数据存入持久化文件
  159. TCPersistentManager.Instance.UpdateTemperatureValue(Module, targetTemperature1, 0, 0); // 0 0是上下限
  160. return true;
  161. }
  162. else
  163. {
  164. LOG.WriteLog(eEvent.INFO_TEMPERATURE, Module, $"{param[0]} is invalid");
  165. return false;
  166. }
  167. }
  168. /// <summary>
  169. /// 启用
  170. /// </summary>
  171. /// <param name="cmd"></param>
  172. /// <param name="param"></param>
  173. /// <returns></returns>
  174. public bool EnableOperation(string cmd, object[] param)
  175. {
  176. if (!JudgeReservoirCondition())
  177. {
  178. return false;
  179. }
  180. if (!CheckTCIsConnect())
  181. {
  182. LOG.WriteLog(eEvent.ERR_TEMPERATURE, Module, $"TC is not connect");
  183. return false ;
  184. }
  185. //校验TC状态
  186. if (TemperatureData.Alarm != null && TemperatureData.Alarm.Contains("1"))
  187. {
  188. string errorItemString = TemperatureData.Alarm.Substring(0, 11) + TemperatureData.Alarm.Substring(13, 1) + TemperatureData.Alarm.Substring(15);
  189. if (errorItemString.Contains("1"))
  190. {
  191. LOG.WriteLog(eEvent.ERR_TEMPERATURE, Module, $"TC is in error state");
  192. return false;
  193. }
  194. }
  195. TemperatureData.ControlOperationModel = (int)TemperatureEnumData.ENABLE;
  196. bool result= TemperatureConfigManager.Instance.EnableControl(Module, _address, (int)TemperatureEnumData.ENABLE);
  197. if (result)
  198. {
  199. LOG.WriteLog(eEvent.INFO_TEMPERATURE, Module, "control operation set enable");
  200. _startMonitorData = true;
  201. }
  202. return result;
  203. }
  204. /// <summary>
  205. /// 禁用
  206. /// </summary>
  207. /// <param name="cmd"></param>
  208. /// <param name="param"></param>
  209. /// <returns></returns>
  210. public bool DisableOperation(string cmd, object[] param)
  211. {
  212. _isApplying = false;
  213. TemperatureData.ControlOperationModel = (int)TemperatureEnumData.DISABLE;
  214. bool result= TemperatureConfigManager.Instance.DisableController(Module, _address, (int)TemperatureEnumData.DISABLE);
  215. if(result)
  216. {
  217. if (result)
  218. {
  219. ReservoirPostError();
  220. LOG.WriteLog(eEvent.INFO_TEMPERATURE, Module, "control operation set disable");
  221. }
  222. _startMonitorData = false;
  223. if(TemperatureData.ReserviorSeries != null && TemperatureData.HeatExchangerSeries != null)
  224. {
  225. _temperatureData.HeatExchangerSeries.Clear();
  226. _temperatureData.ReserviorSeries.Clear();
  227. }
  228. }
  229. return result;
  230. }
  231. /// <summary>
  232. /// Reservoir通知进入错误状态
  233. /// </summary>
  234. private void ReservoirPostError()
  235. {
  236. }
  237. /// <summary>
  238. /// 访问数据变更
  239. /// </summary>
  240. private void SubscribeValueAction()
  241. {
  242. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, TARGET_TEMPERATURE, UpdateVariableValue);
  243. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, RESERVIOR_TEMPERATURE, UpdateVariableValue);
  244. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, HEAT_EXCHANGER_TEMPERATURE, UpdateVariableValue);
  245. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, ALARM, UpdateVariableValue);
  246. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, OFFSET, UpdateVariableValue);
  247. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, CONTROL_OPERATION_MODEL, UpdateVariableValue);
  248. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, PB_RANGE, UpdateVariableValue);
  249. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, ARW_RANGE, UpdateVariableValue);
  250. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, I_CONSTANT, UpdateVariableValue);
  251. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, D_CONSTANT, UpdateVariableValue);
  252. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, OUT_PUT_RATIO, UpdateVariableValue);
  253. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, HEATING_POWER_UPPER_LIMIT, UpdateVariableValue);
  254. TemperatureConfigManager.Instance.SubscribeModuleVariable(Module, COOLING_POWER_UPPER_LIMIT, UpdateVariableValue);
  255. }
  256. /// <summary>
  257. /// 初始化数据
  258. /// </summary>
  259. private void InitializeData()
  260. {
  261. _address= TemperatureConfigManager.Instance.GetAddress(Module);
  262. _tCPersistentValue = TCPersistentManager.Instance.GetTCPersistentValue(Module);
  263. DATA.Subscribe($"{Module}.{TEMPERATURE_DATA}", () => _temperatureData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  264. DATA.Subscribe($"{Module}.{IS_CONNECTED}", () => _isTCConnect, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  265. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => _tCPersistentValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  266. DATA.Subscribe($"{Module}.TargetTemperature", () => _temperatureData.TargetTemperature, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  267. DATA.Subscribe($"{Module}.Status", () => _temperatureData.Status, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  268. DATA.Subscribe($"{Module}.Alarm", () => _temperatureData.Alarm, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  269. DATA.Subscribe($"{Module}.ReserviorTemperature", () => _temperatureData.ReserviorTemperature, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  270. DATA.Subscribe($"{Module}.HeatExchangerTemperature", () => _temperatureData.HeatExchangerTemperature, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  271. }
  272. /// <summary>
  273. /// 更新变量数值
  274. /// </summary>
  275. /// <param name="variable"></param>
  276. /// <param name="value"></param>
  277. private void UpdateVariableValue(string variable, object value)
  278. {
  279. if(!TemperatureData.IsInitialized)
  280. {
  281. TemperatureData.IsInitialized = true;
  282. TemperatureConfigManager.Instance.ReadControlOperationModel(Module, _address);
  283. TemperatureConfigManager.Instance.ReadTargetTemperature(Module, _address);
  284. }
  285. PropertyInfo property = TemperatureData.GetType().GetProperty(variable);
  286. if (property != null)
  287. {
  288. property.SetValue(TemperatureData, value);
  289. }
  290. //判断temperatureReached AtTemperatureRange
  291. double atTemperatureRange = SC.GetValue<double>("System.AtTemperatureRange");
  292. atTemperatureRange = atTemperatureRange == 0 ? 0.1 : atTemperatureRange;
  293. if (Math.Abs(TemperatureData.ReserviorTemperature - TemperatureData.TargetTemperature) < atTemperatureRange)
  294. {
  295. TemperatureData.TemperatureReached = true;
  296. //_startMonitorData = false;
  297. }
  298. else
  299. {
  300. TemperatureData.TemperatureReached = false;
  301. }
  302. //判断deltaexceed
  303. if (Math.Abs(TemperatureData.ReserviorTemperature - TemperatureData.ReserviorTemperature) > _temeratureDeltaLimit)
  304. {
  305. TemperatureData.DeltaExceed = true;
  306. }
  307. else
  308. {
  309. TemperatureData.DeltaExceed = false;
  310. }
  311. if (_startMonitorData && TemperatureData.ReserviorSeries!=null && TemperatureData.HeatExchangerSeries!=null)
  312. {
  313. if (TemperatureData.ReserviorSeries.Count == 20)
  314. {
  315. TemperatureData.ReserviorSeries.RemoveAt(0);
  316. for (int i = 1; i < TemperatureData.ReserviorSeries.Count; i++)
  317. {
  318. TemperatureData.ReserviorSeries[i - 1] = TemperatureData.ReserviorSeries[i];
  319. }
  320. TemperatureData.ReserviorSeries.Add(TemperatureData.ReserviorTemperature);
  321. }
  322. else
  323. {
  324. TemperatureData.ReserviorSeries.Add(TemperatureData.ReserviorTemperature);
  325. }
  326. if (TemperatureData.HeatExchangerSeries.Count == 20)
  327. {
  328. TemperatureData.HeatExchangerSeries.RemoveAt(0);
  329. for (int i = 1; i < TemperatureData.HeatExchangerSeries.Count; i++)
  330. {
  331. TemperatureData.HeatExchangerSeries[i - 1] = TemperatureData.HeatExchangerSeries[i];
  332. }
  333. TemperatureData.HeatExchangerSeries.Add(TemperatureData.HeatExchangerTemperature);
  334. }
  335. else
  336. {
  337. TemperatureData.HeatExchangerSeries.Add(TemperatureData.HeatExchangerTemperature);
  338. }
  339. }
  340. }
  341. /// <summary>
  342. /// 定时器
  343. /// </summary>
  344. /// <returns></returns>
  345. private bool OnTimer()
  346. {
  347. _isTCConnect = CheckTCIsConnect();
  348. if (!_isTCConnect)
  349. {
  350. }
  351. TemperatureConfigManager.Instance.ReadReserviorExtendSensorTemperature(Module, _address);
  352. TemperatureConfigManager.Instance.ReadHeatExchangerInternelSensorTemperature(Module, _address);
  353. if (_readAlarm)
  354. {
  355. TemperatureConfigManager.Instance.ReadAlarmStatus(Module, _address);
  356. _readAlarm= false;
  357. }
  358. else
  359. {
  360. _readAlarm = true;
  361. }
  362. double rampStepSize = SC.GetValue<double>("System.RampStepSize");
  363. rampStepSize = rampStepSize == 0 ? 0.11 : rampStepSize;
  364. if (TemperatureData.TargetTemperature - TemperatureData.ReserviorTemperature > rampStepSize + 0.1 && _isApplying == true)
  365. {
  366. TemperatureData.Status = "RampingUp";
  367. }
  368. else if(TemperatureData.TargetTemperature - TemperatureData.ReserviorTemperature < -rampStepSize - 0.1 && _isApplying == true)
  369. {
  370. TemperatureData.Status = "RampingDown";
  371. }
  372. else if (TemperatureData.TargetTemperature - TemperatureData.ReserviorTemperature <= rampStepSize + 0.1 && TemperatureData.TargetTemperature - TemperatureData.ReserviorTemperature >= - rampStepSize - 0.1 && _isApplying == true)
  373. {
  374. TemperatureData.Status = "Maintaining";
  375. }
  376. else if(TemperatureData.Alarm!=null&&TemperatureData.Alarm.Contains("1"))
  377. {
  378. string errorItemString = TemperatureData.Alarm.Substring(0, 11) + TemperatureData.Alarm.Substring(13, 1) + TemperatureData.Alarm.Substring(15);
  379. if (TemperatureData.Alarm.Substring(12,1) == "1" || TemperatureData.Alarm.Substring(14, 1)== "1")
  380. {
  381. TemperatureData.Status = "Warning";
  382. if (!_isAlarmWarningLoged)
  383. {
  384. LOG.WriteLog(eEvent.WARN_TEMPERATURE, Module, $"{Module} Warning is activate");
  385. _isAlarmWarningLoged = true;
  386. }
  387. }
  388. if(errorItemString.Contains("1"))
  389. {
  390. if (!_isAlarmErrorLoged)
  391. {
  392. string errormessage = "";
  393. string[] strAry = TemperatureData.Alarm.ToString().Split('-');
  394. if (strAry.Length > 0)
  395. {
  396. for (int i = 0; i < strAry.Length; i++)
  397. {
  398. if (strAry[i] == "1")
  399. {
  400. errormessage += _errorMessage[i];
  401. }
  402. }
  403. }
  404. LOG.WriteLog(eEvent.ERR_TEMPERATURE, Module, $"{Module} {errormessage} is activate");
  405. ReservoirPostError();//将对应的reservoir切成error
  406. _isAlarmErrorLoged = true;
  407. }
  408. }
  409. }
  410. else
  411. {
  412. TemperatureData.Status = "Normal";
  413. _isAlarmErrorLoged = false; //用于控制触发alarm要不要打印error日志
  414. _isAlarmWarningLoged = false; //用于控制触发alarm要不要打印error日志
  415. }
  416. if (TemperatureData.ControlOperationModel != 0)
  417. {
  418. if (!JudgeReservoirCondition())
  419. {
  420. DisableOperation("", null);
  421. }
  422. }
  423. if (TemperatureData.Alarm!=null && TemperatureData.Alarm.Contains("1") && _isApplying == true)
  424. {
  425. string errorItemString = TemperatureData.Alarm.Substring(0, 11) + TemperatureData.Alarm.Substring(13, 1) + TemperatureData.Alarm.Substring(15);
  426. if (errorItemString.Contains("1"))
  427. {
  428. DisableOperation("", null);
  429. string errormessage = "";
  430. string[] strAry = errorItemString.ToString().Split('-');
  431. if (strAry.Length > 0)
  432. {
  433. for (int i = 0; i < strAry.Length; i++)
  434. {
  435. if (strAry[i] == "1")
  436. {
  437. errormessage += _errorMessage[i];
  438. }
  439. }
  440. }
  441. ReservoirPostError();//将对应的reservoir切成error
  442. LOG.WriteLog(eEvent.ERR_TEMPERATURE, Module, $"{Module} {errormessage} is activate");
  443. _isApplying = false;
  444. }
  445. }
  446. return true;
  447. }
  448. /// <summary>
  449. /// 检验Reservoir条件
  450. /// </summary>
  451. private bool JudgeReservoirCondition()
  452. {
  453. SystemFacilities systemFacilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
  454. if (systemFacilities == null)
  455. {
  456. return false;
  457. }
  458. //冷却水没开
  459. if (!systemFacilities.HouseChilledWaterEnable)
  460. {
  461. LOG.WriteLog(eEvent.ERR_TEMPERATURE, Module, "Facilities HouseChilledWaterEnable is off");
  462. return false;
  463. }
  464. var houseChilledResult = systemFacilities.CheckHouseChilledWaterResult();
  465. if (!houseChilledResult.result)
  466. {
  467. LOG.WriteLog(eEvent.ERR_TEMPERATURE, Module, houseChilledResult.reason);
  468. return false;
  469. }
  470. string reservoir = ReservoirItemManager.Instance.GetReservoirByTC(Module);
  471. if (string.IsNullOrEmpty(reservoir))
  472. {
  473. LOG.WriteLog(eEvent.ERR_TEMPERATURE, Module, $"{Module} reservoir is empty");
  474. return false;
  475. }
  476. ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(reservoir);
  477. if (reservoirItem.SubType == STRATUS)
  478. {
  479. }
  480. return true;
  481. }
  482. /// <summary>
  483. /// 设置Enable并设置温度
  484. /// </summary>
  485. /// <param name="targetTemperature"></param>
  486. /// <returns></returns>
  487. public bool SetEnableTargetTemperature(double targetTemperature)
  488. {
  489. TemperatureConfigManager.Instance.SetTargetTemperature(Module, _address, targetTemperature);
  490. if (_temperatureData.ControlOperationModel == (int)TemperatureEnumData.DISABLE)
  491. {
  492. EnableOperation("", null);
  493. }
  494. return true;
  495. }
  496. /// <summary>
  497. /// 监控
  498. /// </summary>
  499. public void Monitor()
  500. {
  501. }
  502. public void Reset()
  503. {
  504. }
  505. public void Terminate()
  506. {
  507. }
  508. }
  509. }