Fdc.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Xml;
  8. using Aitex.Core.RT.DataCenter;
  9. using Aitex.Core.RT.Log;
  10. using Aitex.Core.RT.SCCore;
  11. using Aitex.Core.Util;
  12. using MECF.Framework.Common.CommonData;
  13. using MECF.Framework.Common.SCCore;
  14. namespace VirgoRT.Modules.PMs
  15. {
  16. public class Fdc
  17. {
  18. public List<FdcDataItem> DataList
  19. {
  20. get
  21. {
  22. var result = new List<FdcDataItem>();
  23. foreach (var fdcDataItem in _lstItems)
  24. {
  25. result.Add(fdcDataItem.Clone());
  26. }
  27. return result;
  28. }
  29. }
  30. private List<FdcDataItem> _lstItems = new List<FdcDataItem>();
  31. private PeriodicJob _monitorThread;
  32. private string _module;
  33. private Stopwatch _delaytimer = new Stopwatch();
  34. private int _delayTime;
  35. private Dictionary<string, string> _setpointDataMap = new Dictionary<string, string>();
  36. public Fdc(string module)
  37. {
  38. _monitorThread = new PeriodicJob(300, OnMonitor, "fdc thread");
  39. _module = module;
  40. }
  41. public void Reset()
  42. {
  43. _lstItems.Clear();
  44. _setpointDataMap.Clear();
  45. string groupName = SC.GetStringValue("System.FDC.DataGroupName");
  46. if (string.IsNullOrEmpty(groupName))
  47. groupName = "Process";
  48. int interval = SC.GetValue<int>("System.FDC.SampleInterval");
  49. if (interval < 50)
  50. interval = 50;
  51. _delayTime = SC.GetValue<int>("System.FDC.DelayTime");
  52. if (_delayTime < 0)
  53. _delayTime = 10;
  54. var content = TypedConfigManager.Instance.GetTypedConfigContent("DataGroup", "");
  55. XmlDocument xmlContent = new XmlDocument();
  56. xmlContent.LoadXml(content);
  57. var items = xmlContent.SelectNodes($"DataGroupConfig/DataGroup[@name='{groupName}']/DataItem");
  58. foreach (var item in items)
  59. {
  60. var node = item as XmlElement;
  61. string name = node.GetAttribute("name");
  62. if (!string.IsNullOrEmpty(name) && name.StartsWith($"{_module}.") && (_lstItems.FirstOrDefault(x => x.Name == name) == null))
  63. {
  64. var dataType = Singleton<DataManager>.Instance.GetDataType(name);
  65. if (dataType == typeof(double) || dataType == typeof(float) ||
  66. dataType == typeof(int) || dataType == typeof(ushort) || dataType == typeof(short))
  67. {
  68. _lstItems.Add(new FdcDataItem()
  69. {
  70. Name = name,
  71. });
  72. }
  73. }
  74. }
  75. var fdcMap = xmlContent.SelectNodes($"DataGroupConfig/DataGroup[@name='Fdc']/DataItem");
  76. foreach (var item in fdcMap)
  77. {
  78. var node = item as XmlElement;
  79. string name = node.GetAttribute("name");
  80. if (!string.IsNullOrEmpty(name) && name.StartsWith($"{_module}.") && (_lstItems.FirstOrDefault(x => x.Name == name) != null))
  81. {
  82. string controlName = node.GetAttribute("control_name");
  83. if (!string.IsNullOrEmpty(controlName))
  84. _setpointDataMap[name] = controlName;
  85. }
  86. }
  87. _monitorThread.ChangeInterval(interval);
  88. }
  89. //pair: controlname - setpoint value
  90. public void Start(Dictionary<string, string> setpointControlData)
  91. {
  92. ClearPreviousData();
  93. foreach (var fdcDataItem in _lstItems)
  94. {
  95. if (!_setpointDataMap.ContainsKey(fdcDataItem.Name))
  96. continue;
  97. if (!setpointControlData.ContainsKey(_setpointDataMap[fdcDataItem.Name]))
  98. continue;
  99. if (!float.TryParse(setpointControlData[_setpointDataMap[fdcDataItem.Name]], out float floatValue))
  100. continue;
  101. fdcDataItem.SetPoint = floatValue;
  102. }
  103. _delaytimer.Restart();
  104. _monitorThread.Start();
  105. }
  106. public void Stop()
  107. {
  108. _monitorThread.Pause();
  109. ClearPreviousData();
  110. }
  111. public void ClearPreviousData()
  112. {
  113. foreach (var fdcDataItem in _lstItems)
  114. {
  115. fdcDataItem.Clear();
  116. }
  117. }
  118. private bool OnMonitor()
  119. {
  120. try
  121. {
  122. if (_delaytimer.IsRunning)
  123. {
  124. if (_delaytimer.ElapsedMilliseconds < _delayTime)
  125. return true;
  126. else
  127. {
  128. _delaytimer.Stop();
  129. }
  130. }
  131. foreach (var fdcDataItem in _lstItems)
  132. {
  133. var objValue = DATA.Poll(fdcDataItem.Name);
  134. float floatValue = 0f;
  135. if (objValue != null)
  136. {
  137. float.TryParse(objValue.ToString(), out floatValue);
  138. }
  139. fdcDataItem.Update(floatValue);
  140. }
  141. }
  142. catch (Exception ex)
  143. {
  144. LOG.Write(ex);
  145. }
  146. return true;
  147. }
  148. }
  149. }