Mini8Communicator_Simulator.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using GeneralData;
  2. using HardwareData;
  3. using Mini8Communicator;
  4. using Mini8CommunicatorData;
  5. namespace Mini8CommunicatorSim;
  6. internal class InputExtern(Mini8Input output)
  7. {
  8. public Mini8Input Mini8Output { get; set; } = output;
  9. public AutoTuneStatus AutoTuneStatus { get; set; }
  10. public ActiveTuneSet ActiveTuneSet { get; set; }
  11. public Inhibit Inhibit { get; set; }
  12. public float AutoTune_P { get; set; }
  13. public float AutoTune_I { get; set; }
  14. public float AutoTune_D { get; set; }
  15. }
  16. public class Mini8Communicator_Simulator : IMini8Communicator
  17. {
  18. private IMini8Provider? _provider;
  19. private string _ip = string.Empty;
  20. private int _port = 0;
  21. private readonly ManualResetEvent _pauseEvent = new(true);
  22. private readonly Mini8Output _inputData = new();
  23. private readonly Dictionary<byte, InputExtern> _outputs = [];
  24. private IDictionary<byte, ChannelAddress>? _addresses;
  25. bool IMini8Communicator.Initialize(IMini8Provider provider, object mini8, object address)
  26. {
  27. if (address is not IDictionary<byte, ChannelAddress> addresses)
  28. return false;
  29. this._addresses = addresses;
  30. this._provider = provider;
  31. return true;
  32. }
  33. bool IMini8Communicator.Open()
  34. {
  35. if (this._provider is null)
  36. return false;
  37. //this._ip = IP;
  38. //this._port = port;
  39. //this._provider.OnConnected(IP, port);
  40. //this._addresses = this._provider.GetUpdateList<ushort>();
  41. Task.Factory.StartNew(UpdateRealtimeData);
  42. return true;
  43. }
  44. private void UpdateRealtimeData()
  45. {
  46. if (this._provider is null || this._addresses is null)
  47. return;
  48. Random r = new();
  49. while (true)
  50. {
  51. foreach (ChannelAddress item in _addresses.Values)
  52. {
  53. if (!this._outputs.TryGetValue(item.ChannelIndex, out InputExtern? mini8Output) || mini8Output is null)
  54. continue;
  55. _inputData.CollectTime = DateTime.Now;
  56. _inputData.PV = (float)(mini8Output.Mini8Output.SetPoint + r.NextDouble() - r.NextDouble());
  57. _inputData.WorkingOutput = 10;
  58. _inputData.AutoTuneStatus = mini8Output.AutoTuneStatus;
  59. _inputData.Running_P = mini8Output.Mini8Output.Running_P;
  60. _inputData.Running_I = mini8Output.Mini8Output.Running_I;
  61. _inputData.Running_D = mini8Output.Mini8Output.Running_D;
  62. _inputData.SetPoint = mini8Output.Mini8Output.SetPoint;
  63. _inputData.ActiveTuneSet = ActiveTuneSet.Running;
  64. _inputData.AutoTune_P = mini8Output.AutoTune_P;
  65. _inputData.AutoTune_I = mini8Output.AutoTune_I;
  66. _inputData.AutoTune_D = mini8Output.AutoTune_D;
  67. _inputData.Inhibit = mini8Output.Inhibit;
  68. _inputData.SetpointUpRate = mini8Output.Mini8Output.SetpointUpRate;
  69. _inputData.SetpointDownRate = mini8Output.Mini8Output.SetpointDownRate;
  70. _inputData.SensorBreakAlarm = TcBorken.Normal;
  71. _inputData.ActiveTuneSet = mini8Output.ActiveTuneSet;
  72. this._provider?.ChannelInfoNotify(item.ChannelIndex, _inputData);
  73. }
  74. Thread.Sleep(1000);
  75. }
  76. }
  77. bool IMini8Communicator.SendMini8Data(byte c, Mini8Input output)
  78. {
  79. if (!this._outputs.TryGetValue(c, out InputExtern? mini8Output) || mini8Output is null)
  80. mini8Output = new(output) { AutoTuneStatus = AutoTuneStatus.Ready, ActiveTuneSet = ActiveTuneSet.Running };
  81. else
  82. mini8Output.Mini8Output = output;
  83. this._outputs[c] = mini8Output;
  84. return true;
  85. }
  86. bool IMini8Communicator.EnableChannel(byte channelIndex, Inhibit inhibit)
  87. {
  88. if (!this._outputs.TryGetValue(channelIndex, out InputExtern? mini8Output) || mini8Output is null)
  89. return false;
  90. mini8Output.Inhibit = inhibit;
  91. return true;
  92. }
  93. bool IMini8Communicator.SelectPID(byte channelIndex, ActiveTuneSet activeTuneSet)
  94. {
  95. if (!this._outputs.TryGetValue(channelIndex, out InputExtern? mini8Output) || mini8Output is null)
  96. return false;
  97. mini8Output.ActiveTuneSet = activeTuneSet;
  98. return true;
  99. }
  100. bool IMini8Communicator.EnableChannelAutoTune(byte channelIndex, bool isEnable)
  101. {
  102. if (!this._outputs.TryGetValue(channelIndex, out InputExtern? mini8Output) || mini8Output is null)
  103. return false;
  104. mini8Output.AutoTuneStatus = isEnable switch
  105. {
  106. true => AutoTuneStatus.Triggered,
  107. false => AutoTuneStatus.Ready,
  108. };
  109. mini8Output.ActiveTuneSet = isEnable switch
  110. {
  111. true => ActiveTuneSet.AutoTune,
  112. false => ActiveTuneSet.Running,
  113. };
  114. if (!isEnable)
  115. return true;
  116. Task.Factory.StartNew(() =>
  117. {
  118. InputExtern timerMini8 = mini8Output;
  119. Random r = new();
  120. Thread.Sleep(2000);
  121. mini8Output.AutoTuneStatus = AutoTuneStatus.Tuning;
  122. for (int i = 0; i < 10; i++)
  123. {
  124. Thread.Sleep(1000);
  125. timerMini8.AutoTune_P = r.Next(0, 20) + r.NextSingle();
  126. timerMini8.AutoTune_I = r.Next(0, 20) + r.NextSingle();
  127. timerMini8.AutoTune_D = r.Next(0, 20) + r.NextSingle();
  128. }
  129. timerMini8.AutoTuneStatus = AutoTuneStatus.Complete;
  130. });
  131. return true;
  132. }
  133. bool IMini8Communicator.Close()
  134. {
  135. this._provider?.OnConnected(_ip, _port);
  136. return true;
  137. }
  138. bool IMini8Communicator.Pause()
  139. {
  140. _pauseEvent.Reset();
  141. return true;
  142. }
  143. bool IMini8Communicator.StartDataCollector()
  144. {
  145. _pauseEvent.Set();
  146. return true;
  147. }
  148. bool IMini8Communicator.GetRealtimeDataFromDevice(out Dictionary<byte, Mini8Output>? data)
  149. {
  150. data = null;
  151. return true;
  152. }
  153. bool IMini8Communicator.GetRealtimeLimit(out Dictionary<byte, Mini8Limit>? data)
  154. {
  155. data = null;
  156. return true;
  157. }
  158. }