AlarmHelper.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. namespace MinicsConsole.Helper.RawDataFilter;
  2. public class AlarmHelperLayer(byte mini8Index, ILog log, BasicInfo basicInfo, Mini8DataDispatcher dataDispatcher) : IMini8DataFilter
  3. {
  4. public IDataSender? NextSender { get; set; }
  5. public ChannelDataBaseHelper? DataBaseHelper { get; set; }
  6. private readonly ConcurrentDictionary<byte, DateTime> _ErrorRecord = [];
  7. private bool AlarmDelayCheck(Mini8Output mini8Output, ChannelData channelData)
  8. {
  9. if (channelData.Caps <= channelData.Floor)
  10. return false;
  11. if (mini8Output.PV.InRange(channelData.Floor, channelData.Caps))
  12. {
  13. _ErrorRecord.Remove(mini8Output.ChannelIndex, out _);
  14. return false;
  15. }
  16. if (_ErrorRecord.TryAdd(mini8Output.ChannelIndex, mini8Output.CollectTime))
  17. return false;
  18. TimeSpan alarmInverval = mini8Output.CollectTime - _ErrorRecord[mini8Output.ChannelIndex];
  19. if (alarmInverval > TimeSpan.FromSeconds(basicInfo.AlarmDelaySeconds))
  20. return true;
  21. return false;
  22. }
  23. bool IDataSender.Send(Mini8Output mini8Output, ChannelData channelData, object? s)
  24. {
  25. switch (channelData.ChannelMode)
  26. {
  27. case ChannelMode.Control:
  28. break;
  29. case ChannelMode.Monitor:
  30. case ChannelMode.UnUsed:
  31. return true;
  32. default:
  33. //log.Warning($"Mini8 - {mini8Index} - Channel {mini8Output.ChannelIndex} Unknow Channel Mode: {(byte)channelData.ChannelMode}");
  34. return true;
  35. }
  36. switch (mini8Output.SensorBreakAlarm)
  37. {
  38. case TcBorken.Normal:
  39. break;
  40. case TcBorken.Error:
  41. dataDispatcher.AlarmTcBrockenNotify(mini8Index, mini8Output.ChannelIndex);
  42. DataBaseHelper?.InsertDB_TcAlarm(channelData, mini8Output);
  43. return true;
  44. default:
  45. log.Warning($"Mini8 - {mini8Index} - Channel {mini8Output.ChannelIndex} Unknow TC status: {(byte)mini8Output.SensorBreakAlarm}");
  46. return true;
  47. }
  48. if (this.AlarmDelayCheck(mini8Output, channelData))
  49. {
  50. dataDispatcher.AlarmNotify(mini8Index, mini8Output.ChannelIndex, mini8Output.PV);
  51. DataBaseHelper?.InsertDB_TempAlarm(channelData, mini8Output);
  52. }
  53. return true;
  54. }
  55. }