Alarm.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Model
  7. {
  8. public enum AlarmType
  9. {
  10. Cleared=-1,
  11. Warning=1,
  12. Error,
  13. FatalError,
  14. }
  15. public class Alarm
  16. {
  17. public string AlarmMessage { get; set; }
  18. public AlarmType AlarmType { get; set; }
  19. public DateTime Timestamp { get; set; }
  20. public static List<(string AlarmNode, string AlarmMessage, bool DesiredValue)> AlarmNodeWithMessage = new List<(string, string,bool)>
  21. {
  22. ("Application.A00_Turntable_Manual.b转盘轴error" , "A00转盘轴Error" , true),
  23. ("Application.A01_FeedInStation_Auto.b下压轴Error" , "A01入料站下压轴Error" , true),
  24. ("Application.A01_FeedInStation_Auto.b分离轴Error" , "A01入料站分离轴Error" , true),
  25. ("Application.InOutPut.A01入料站.b离子风扇报警" , "A01入料站离子风扇报警" , true),
  26. ("Application.A02_TestStation_Auto.b下压轴Error" , "A02电极性测试下压轴Error" , true),
  27. ("Application.A03_DirectionTrun_Auto.b下压轴Error" , "A03转向站1下压轴Error" , true),
  28. ("Application.A03_DirectionTrun_Auto.b旋转轴Error" , "A03转向站旋转轴Error" , true),
  29. ("Application.A04_TestStation_Auto.b下压轴Error" , "A04常温测试站1下压轴Error" , true),
  30. ("Application.A05_TestStation_Auto.b下压轴Error" , "A05常温测试站2下压轴Error" , true),
  31. ("Application.A06_TestStation_Auto.b下压轴Error" , "A06常温测试站3下压轴Error" , true),
  32. ("Application.A07_TestStation_Auto.b下压轴Error" , "A07常温测试站4下压轴Error" , true),
  33. ("Application.A08_TestNGContainer_Auto.b料盒轴Error" , "A08四料盒1料盒轴Error" , true),
  34. ("Application.A09_TestNGContainer_Auto.b料盒轴Error" , "A09四料盒2料盒轴Error" , true),
  35. ("Application.A10_LocateStation_Auto.b下压轴Error" , "A10定位站1下压轴Error" , true),
  36. ("Application.A14_ThermalTest_Auto.b下压轴Error" , "A14热测盘下压轴Error" , true),
  37. ("Application.A14_ThermalTest_Auto.b热测升降轴Error" , "A14热测盘热测升降轴Error" , true),
  38. ("Application.A14_ThermalTest_Auto.b热测盘Error" , "A14热测盘Error" , true),
  39. ("Application.A14_ThermalTest_Auto.b翻转升降轴Error" , "A热测盘翻转升降轴Error" , true),
  40. ("Application.A14_ThermalTest_Auto.b翻转轴Error" , "A热测盘翻转轴Error" , true),
  41. ("Application.A18_CoolingStation_Auto.b下压轴Error" , "A18降温站1下压轴Error" , true),
  42. ("Application.A19_CoolingStation_Auto.b下压轴Error" , "A19降温站2下压轴Error" , true),
  43. ("Application.A20_TestNGContainer_Auto.b料盒轴Error" , "A20四料盒3料盒轴Error" , true),
  44. ("Application.A21_LocateStation_Auto.b下压轴Error" , "A21定位站2下压轴Error" , true),
  45. ("Application.A23_LaserMarking_Auto.bOutputError" , "A23镭射站Error" , true),
  46. ("Application.A23_LaserMarking_Auto.b下压轴Error" , "A23镭射站下压轴Error" , true),
  47. ("Application.A25_TestStation_Auto.b下压轴Error" , "A25常温测试站5下压轴Error" , true),
  48. ("Application.A26_DirectionTurn_Auto.b下压轴Error" , "A26转向站2下压轴Error" , true),
  49. ("Application.A26_DirectionTurn_Auto.b旋转轴Error" , "A26转向站2旋转轴Error" , true),
  50. ("Application.A27_3DTestStation_Auto.b下压轴Error" , "A273D监测站下压轴Error" , true),
  51. ("Application.A28_TestNGContainer_Auto.b料盒轴Error" , "A28四料盒4料盒轴Error" , true),
  52. ("Application.A29_TestNGContainer_Auto.b料盒轴Error" , "A29四料盒5料盒轴Error" , true),
  53. ("Application.A30_LocateStation_Auto.b下压轴Error" , "A30封装前定位站下压轴Error" , true),
  54. ("Application.A33_Encapsulation1_Manual.b下压轴error" , "A33封装站下压轴Error" , true),
  55. ("Application.A33_Encapsulation1_Manual.b封合轴error" , "A33封装站封合轴Error" , true),
  56. ("Application.A33_Encapsulation1_Manual.b走带轴error" , "A33封装站走带轴Error" , true),
  57. ("Application.A33_Encapsulation1_Auto.b走带无法复原报警" , "A33封装站走带无法复原报警" , true),
  58. ("Application.InOutPut.A33封装站.b温控高温报警" , "A33封装站温控高温报警" , true),
  59. ("Application.InOutPut.A33封装站.b温控低温报警" , "A33封装站温控低温报警" , true),
  60. ("Application.InOutPut.A33封装站.b封合罩报警" , "A33封装站封合罩报警" , true),
  61. //("Application.GVL_A04_Auto.b旋转轴Error" , "A04转向站1旋转轴Error" , true),
  62. //("Application.GVL_A05_Auto.b下压轴Error" , "A05测试站1下压轴Error" , true),
  63. //("Application.GVL_A06_Auto.b下压轴Error" , "A06测试站2下压轴Error" , true),
  64. //("Application.GVL_A07_Auto.b下压轴Error" , "A07测试站3下压轴Error" , true),
  65. //("Application.GVL_A08_Auto.b下压轴Error" , "A08测试站4下压轴Error" , true),
  66. //("Application.GVL_A09_Auto.b料盒轴Error" , "A09四排料盒1料盒轴Error" , true),
  67. //("Application.GVL_A10_Auto.b料盒轴Error" , "A10四排料盒2料盒轴Error" , true),
  68. //("Application.GVL_A11_Auto.b下压轴Error" , "A11定位站1下压轴Error" , true),
  69. //("Application.GVL_A15_Auto.b下压轴Error" , "A15加热盘下压轴Error" , true),
  70. //("Application.GVL_A15_Auto.b热测升降轴Error" , "A15加热盘热测升降轴Error" , true),
  71. //("Application.GVL_A15_Auto.b热测盘Error" , "A15热测盘Error" , true),
  72. //("Application.GVL_A15_Auto.b翻转升降轴Error" , "A15加热盘翻转升降轴Error" , true),
  73. //("Application.GVL_A15_Auto.b翻转轴Error" , "A15加热盘翻转轴Error" , true),
  74. //("Application.GVL_A20_Auto.b下压轴Error" , "A20降温站1下压轴Error" , true),
  75. //("Application.GVL_A21_Auto.b下压轴Error" , "A21降温站2下压轴Error" , true),
  76. //("Application.GVL_A22_Auto.b料盒轴Error" , "A22热测NG四排料料盒轴Error" , true),
  77. //("Application.GVL_A23_Auto.b下压轴Error" , "A23降温站3下压轴Error" , true),
  78. //("Application.GVL_A24_Auto.b下压轴Error" , "A24镭射打标下压轴Error" , true),
  79. //("Application.GVL_A24_Auto.b镭射盘Error" , "A24镭射盘Error" , true),
  80. //("Application.GVL_A26_Auto.b下压轴Error" , "A26定位站2下压轴Error" , true),
  81. //("Application.GVL_A27_Auto.b下压轴Error" , "A27测试站5下压轴Error" , true),
  82. //("Application.GVL_A28_Auto.b下压轴Error" , "A28转向站2下压轴Error" , true),
  83. //("Application.GVL_A28_Auto.b旋转轴Error" , "A28转向站2旋转轴Error" , true),
  84. //("Application.GVL_A29_Auto.b下压轴Error" , "A29 3D检测下压轴Error" , true),
  85. //("Application.GVL_A30_Auto.b料盒轴Error" , "A30 3D检测NG排料料盒轴Error" , true),
  86. //("Application.GVL_A31_Auto.b下压轴Error" , "A31封装1前定位站下压轴Error" , true),
  87. //("Application.Var_Hand_A33_Encapsulation1.b下压轴Error" , "A33封装1站下压轴Error" , true),
  88. //("Application.Var_Hand_A33_Encapsulation1.b封合轴Error" , "A33封装1站封合轴Error" , true),
  89. //("Application.Var_Hand_A33_Encapsulation1.b走带轴Error" , "A33封装1站走带轴Error" , true),
  90. //("Application.GVL_A35_Auto.b下压轴Error" , "A35封装2前定位站下压轴Error" , true),
  91. //("Application.Var_Hand_A37_Encapsulation2.b下压轴Error" , "A37封装2站下压轴Error" , true),
  92. //("Application.Var_Hand_A37_Encapsulation2.b封合轴Error" , "A37封装2站封合轴Error" , true),
  93. //("Application.Var_Hand_A37_Encapsulation2.b走带轴Error" , "A37封装2站走带轴Error" , true),
  94. //("Application.Var_Auto_Turntable.b_Error[1]" , "A00主转盘下压轴不在位,无法移动" , true),
  95. //("Application.GVL_A01_Auto.b入料站异常[1]" , "A01入料站门闸感应超时报警" , true),
  96. //("Application.GVL_A02_Auto.bError[10]" , "A02正反检CCD返回EOT超时报警" , true),
  97. //("Application.GVL_A03_Auto.bError[1]" , "A03 NG抛料材料未清除,需要手动清除材料" , true),
  98. //("Application.GVL_A04_Auto.bError[1]" , "A04正反检转向站1材料未取走报警" , true),
  99. //("Application.GVL_A04_Auto.bError[2]" , "A04正反检转向站1材料缺失报警" , true),
  100. //("Application.GVL_A05_Auto.bError[1]" , "A05测试站1材料未取走报警" , true),
  101. //("Application.GVL_A05_Auto.bError[2]" , "A05测试站1材料缺失报警" , true),
  102. //("Application.GVL_A05_Auto.bError[10]" , "A05测试站1测试机返回EOT超时" , true),
  103. //("Application.GVL_A05_Auto.bError[11]" , "A05测试站1返回Bin结果异常" , true),
  104. //("Application.GVL_A06_Auto.bError[1]" , "A06测试站2材料未取走报警" , true),
  105. //("Application.GVL_A06_Auto.bError[2]" , "A06测试站2材料缺失报警" , true),
  106. //("Application.GVL_A06_Auto.bError[10]" , "A06测试站2测试机返回EOT超时" , true),
  107. //("Application.GVL_A06_Auto.bError[11]" , "A06测试站2返回Bin结果异常" , true),
  108. //("Application.GVL_A07_Auto.bError[1]" , "A07测试站3材料未取走报警" , true),
  109. //("Application.GVL_A07_Auto.bError[2]" , "A07测试站3材料缺失报警" , true),
  110. //("Application.GVL_A07_Auto.bError[10]" , "A07测试站3测试机返回EOT超时" , true),
  111. //("Application.GVL_A07_Auto.bError[11]" , "A07测试站3返回Bin结果异常" , true),
  112. //("Application.GVL_A08_Auto.bError[1]" , "A08测试站4材料未取走报警" , true),
  113. //("Application.GVL_A08_Auto.bError[2]" , "A08测试站4材料缺失报警" , true),
  114. //("Application.GVL_A08_Auto.bError[10]" , "A08测试站4测试机返回EOT超时" , true),
  115. //("Application.GVL_A08_Auto.bError[11]" , "A08测试站4返回Bin结果异常" , true),
  116. //("Application.GVL_A09_Auto.bError[1]" , "A09测试NG抛料站NG抛料失败,需要手动清除材料" , true),
  117. //("Application.GVL_A09_Auto.bError[2]" , "A09测试NG抛料站NG抛料站材料缺失报警" , true),
  118. //("Application.GVL_A09_Auto.bError[25]" , "A09测试NG抛料站NG料盒1满料" , true),
  119. //("Application.GVL_A09_Auto.bError[26]" , "A09测试NG抛料站NG料盒2满料" , true),
  120. //("Application.GVL_A09_Auto.bError[27]" , "A09测试NG抛料站NG料盒3满料" , true),
  121. //("Application.GVL_A09_Auto.bError[28]" , "A09测试NG抛料站NG料盒4满料" , true),
  122. //("Application.GVL_A09_Auto.bError[31]" , "A09测试NG抛料站NG料盒1缺失" , true),
  123. //("Application.GVL_A09_Auto.bError[32]" , "A09测试NG抛料站NG料盒2缺失" , true),
  124. //("Application.GVL_A09_Auto.bError[33]" , "A09测试NG抛料站NG料盒3缺失" , true),
  125. //("Application.GVL_A09_Auto.bError[34]" , "A09测试NG抛料站NG料盒4缺失" , true),
  126. //("Application.GVL_A10_Auto.bError[1]" , "A10测试NG抛料站NG抛料失败,需要手动清除材料" , true),
  127. //("Application.GVL_A10_Auto.bError[2]" , "A10测试NG抛料站NG抛料站材料缺失报警" , true),
  128. //("Application.GVL_A10_Auto.bError[25]" , "A10测试NG抛料站NG料盒1满料" , true),
  129. //("Application.GVL_A10_Auto.bError[26]" , "A10测试NG抛料站NG料盒2满料" , true),
  130. //("Application.GVL_A10_Auto.bError[27]" , "A10测试NG抛料站NG料盒3满料" , true),
  131. //("Application.GVL_A10_Auto.bError[28]" , "A10测试NG抛料站NG料盒4满料" , true),
  132. //("Application.GVL_A10_Auto.bError[31]" , "A10测试NG抛料站NG料盒1缺失" , true),
  133. //("Application.GVL_A10_Auto.bError[32]" , "A10测试NG抛料站NG料盒2缺失" , true),
  134. //("Application.GVL_A10_Auto.bError[33]" , "A10测试NG抛料站NG料盒3缺失" , true),
  135. //("Application.GVL_A10_Auto.bError[34]" , "A10测试NG抛料站NG料盒4缺失" , true),
  136. //("Application.GVL_A11_Auto.bError[1]" , "A11定位站1材料未取走报警" , true),
  137. //("Application.GVL_A11_Auto.bError[2]" , "A11定位站1材料缺失报警" , true),
  138. //("Application.GVL_A15_Auto.b热测站异常[1]" , "A15热测机返回EOT超时报警" , true),
  139. //("Application.GVL_A15_Auto.b热测站异常[11]" , "A15热测站测试机返回Bin结果异常" , true),
  140. //("Application.GVL_A15_Auto.b热测站异常[100]" , "A15热测盘卡料,使能断开" , true),
  141. //("Application.GVL_A15_Auto.b热测盘可以运行" , "热测盘异常,检查热测盘是否卡料,复位报警后点击“热测盘定位”按键解除异常" , false),
  142. //("Application.GVL_A15_Auto.b温度异常[1]" , "热测盘温控器1温度异常" , true),
  143. //("Application.GVL_A15_Auto.b温度异常[2]" , "热测盘温控器2温度异常" , true),
  144. //("Application.GVL_A15_Auto.b温度异常[3]" , "热测盘温控器3温度异常" , true),
  145. //("Application.GVL_A15_Auto.b温度异常[4]" , "热测盘温控器4温度异常" , true),
  146. //("Application.GVL_A20_Auto.bError[1]" , "A20降温站材料未取走报警" , true),
  147. //("Application.GVL_A20_Auto.bError[2]" , "A20降温站材料缺失报警" , true),
  148. //("Application.GVL_A21_Auto.bError[1]" , "A21降温站材料未取走报警" , true),
  149. //("Application.GVL_A21_Auto.bError[2]" , "A21降温站材料缺失报警" , true),
  150. //("Application.GVL_A22_Auto.bError[1]" , "A22热测NG抛料站NG抛料失败,需要手动清除材料" , true),
  151. //("Application.GVL_A22_Auto.bError[2]" , "A22热测NG抛料站NG抛料站材料缺失报警" , true),
  152. //("Application.GVL_A22_Auto.bError[25]" , "A22热测NG抛料站NG料盒1满料" , true),
  153. //("Application.GVL_A22_Auto.bError[26]" , "A22热测NG抛料站NG料盒2满料" , true),
  154. //("Application.GVL_A22_Auto.bError[27]" , "A22热测NG抛料站NG料盒3满料" , true),
  155. //("Application.GVL_A22_Auto.bError[28]" , "A22热测NG抛料站NG料盒4满料" , true),
  156. //("Application.GVL_A22_Auto.bError[31]" , "A22热测NG抛料站NG料盒1缺失" , true),
  157. //("Application.GVL_A22_Auto.bError[32]" , "A22热测NG抛料站NG料盒2缺失" , true),
  158. //("Application.GVL_A22_Auto.bError[33]" , "A22热测NG抛料站NG料盒3缺失" , true),
  159. //("Application.GVL_A22_Auto.bError[34]" , "A22热测NG抛料站NG料盒4缺失" , true),
  160. //("Application.GVL_A23_Auto.bError[1]" , "A23降温站材料未取走报警" , true),
  161. //("Application.GVL_A23_Auto.bError[2]" , "A23降温站材料缺失报警" , true),
  162. //("Application.GVL_A24_Auto.b镭射打标站异常[1]" , "A24镭射盘材料缺失报警" , true),
  163. //("Application.GVL_A24_Auto.b镭射打标站异常[2]" , "A24镭射盘材料未取走报警" , true),
  164. //("Application.GVL_A24_Auto.b镭射打标站异常[3]" , "A24镭射盘下料材料丢失报警,解除报警后按运行启动" , true),
  165. //("Application.GVL_A24_Auto.b镭射打标站异常[10]" , "A24镭射盘CCD返回EOT结果超时" , true),
  166. //("Application.GVL_A24_Auto.b镭射打标站异常[20]" , "A24镭射盘打标机返回EOT结果超时" , true),
  167. //("Application.GVL_A26_Auto.bError[1]" , "A26定位站2材料未取走报警" , true),
  168. //("Application.GVL_A26_Auto.bError[2]" , "A26定位站2材料缺失报警" , true),
  169. //("Application.GVL_A27_Auto.bError[1]" , "A27测试站5材料未取走报警" , true),
  170. //("Application.GVL_A27_Auto.bError[2]" , "A27测试站5材料缺失报警" , true),
  171. //("Application.GVL_A27_Auto.bError[10]" , "A27测试站5测试机返回EOT超时" , true),
  172. //("Application.GVL_A27_Auto.bError[11]" , "A27测试站5返回Bin结果异常" , true),
  173. //("Application.GVL_A28_Auto.bError[1]" , "A28转向站2材料未取走报警" , true),
  174. //("Application.GVL_A28_Auto.bError[2]" , "A28转向站2材料缺失报警" , true),
  175. //("Application.GVL_A29_Auto.bError[10]" , "A29 3D检测站CCD返回EOT超时报警" , true),
  176. //("Application.GVL_A30_Auto.bError[1]" , "A30 3D检测NG抛料站NG抛料失败,需要手动清除材料" , true),
  177. //("Application.GVL_A30_Auto.bError[2]" , "A30 3D检测NG抛料站NG抛料站材料缺失报警" , true),
  178. //("Application.GVL_A30_Auto.bError[25]" , "A30 3D检测NG抛料站NG料盒1满料" , true),
  179. //("Application.GVL_A30_Auto.bError[26]" , "A30 3D检测NG抛料站NG料盒2满料" , true),
  180. //("Application.GVL_A30_Auto.bError[27]" , "A30 3D检测NG抛料站NG料盒3满料" , true),
  181. //("Application.GVL_A30_Auto.bError[28]" , "A30 3D检测NG抛料站NG料盒4满料" , true),
  182. //("Application.GVL_A30_Auto.bError[31]" , "A30 3D检测NG抛料站NG料盒1缺失" , true),
  183. //("Application.GVL_A30_Auto.bError[32]" , "A30 3D检测NG抛料站NG料盒2缺失" , true),
  184. //("Application.GVL_A30_Auto.bError[33]" , "A30 3D检测NG抛料站NG料盒3缺失" , true),
  185. //("Application.GVL_A30_Auto.bError[34]" , "A30 3D检测NG抛料站NG料盒4缺失" , true),
  186. //("Application.GVL_A31_Auto.bError[1]" , "A31封装前定位1材料未取走报警" , true),
  187. //("Application.GVL_A31_Auto.bError[2]" , "A31封装前定位2材料缺失报警" , true),
  188. //("Application.Var_Auto_A33_Encapsulation1.b_Error[1]" , "A33载带丢失" , true),
  189. //("Application.Var_Auto_A33_Encapsulation1.b_Error[2]" , "A33盖膜丢失" , true),
  190. //("Application.Var_Auto_A33_Encapsulation1.b_Error[3]" , "A33加温过高" , true),
  191. //("Application.Var_Auto_A33_Encapsulation1.b_Error[4]" , "A33加温过低" , true),
  192. //("Application.Var_Auto_A33_Encapsulation1.b_Error[5]" , "A33封合罩丢失" , true),
  193. //("Application.Var_Auto_A33_Encapsulation1.b_Error[6]" , "A33叠料报警" , true),
  194. //("Application.Var_Auto_A33_Encapsulation1.b_Error[7]" , "A33封装站整租未到位" , true),
  195. //("Application.Var_Auto_A33_Encapsulation1.b_Error[8]" , "A33盖膜余量少于两卷,及时更换" , true),
  196. //("Application.Var_Auto_A33_Encapsulation1.b_Error[9]" , "A33载带余量少于两卷,及时更换" , true),
  197. //("Application.Var_Auto_A33_Encapsulation1.b_Error[10]" , "A33模式2上下吸嘴有残料" , true),
  198. //("Application.Var_Auto_A33_Encapsulation1.b_Error[11]" , "A33上下吸嘴料件丢失" , true),
  199. //("Application.Var_Auto_A33_Encapsulation1.b_Error[12]" , "A33默认模式上下吸嘴有残料" , true),
  200. //("Application.Var_Auto_A33_Encapsulation1.b_Error[13]" , "A33印字复检CCD未通过" , true),
  201. //("Application.Var_Auto_A33_Encapsulation1.b_Error[14]" , "A33空料检测检出异料" , true),
  202. //("Application.Var_Auto_A33_Encapsulation1.b_Error[15]" , "空料检测检出空料" , true),
  203. //("Application.Var_Auto_A33_Encapsulation1.b_Error[16]" , "A33走带时封合轴位置异常" , true),
  204. //("Application.Var_Auto_A33_Encapsulation1.b_Error[17]" , "A33走带时切刀位置异常,检查切刀电磁阀信号" , true),
  205. //("Application.Var_Auto_A33_Encapsulation1.b_Error[18]" , "A33压痕画像CCD未通过" , true),
  206. //("Application.Var_Auto_A33_Encapsulation1.b_Error[19]" , "A33切刀位置异常,不在初始位置" , true),
  207. //("Application.Var_Auto_A33_Encapsulation1.b_Error[20]" , "A33切刀伸出未到位" , true),
  208. //("Application.Var_Auto_A33_Encapsulation1.b_Error[21]" , "A33走带对位失败" , true),
  209. //("Application.Var_Auto_A33_Encapsulation1.b_Error[22]" , "A33封合气缸到位超时" , true),
  210. //("Application.Var_Auto_A33_Encapsulation1.b_Error[23]" , "A33印字复检相机超时" , true),
  211. //("Application.Var_Auto_A33_Encapsulation1.b_Error[24]" , "A33压痕画像相机超时" , true),
  212. //("Application.Var_Auto_A33_Encapsulation1.b_Error[25]" , "A33走带轴移动过大无法自动复位,需手动回记忆位" , true),
  213. //("Application.Var_Auto_A33_Encapsulation1.b_Error[30]" , "A33 CCD1发送EOT后返回结果超时" , true),
  214. //("Application.Var_Auto_A33_Encapsulation1.b_Error[31]" , "A33 CCD2发送EOT后返回结果超时" , true),
  215. //("Application.Var_Auto_A33_Encapsulation1.b_Error[32]" , "A33上料吸嘴与上料格同时有料,需手动抛掉其中一个" , true),
  216. //("Application.Var_Auto_A33_Encapsulation1.b_Error[33]" , "A33上料吸嘴取料连续失败" , true),
  217. //("Application.GVL_A35_Auto.bError[1]" , "A35封装前定位2材料未取走报警" , true),
  218. //("Application.GVL_A35_Auto.bError[2]" , "A35封装前定位2材料缺失报警" , true),
  219. //("Application.Var_Auto_A37_Encapsulation2.b_Error[1]" , "A37载带丢失" , true),
  220. //("Application.Var_Auto_A37_Encapsulation2.b_Error[2]" , "A37盖膜丢失" , true),
  221. //("Application.Var_Auto_A37_Encapsulation2.b_Error[3]" , "A37加温过高" , true),
  222. //("Application.Var_Auto_A37_Encapsulation2.b_Error[4]" , "A37加温过低" , true),
  223. //("Application.Var_Auto_A37_Encapsulation2.b_Error[5]" , "A37封合罩丢失" , true),
  224. //("Application.Var_Auto_A37_Encapsulation2.b_Error[6]" , "A37叠料报警" , true),
  225. //("Application.Var_Auto_A37_Encapsulation2.b_Error[7]" , "A37封装站整租未到位" , true),
  226. //("Application.Var_Auto_A37_Encapsulation2.b_Error[8]" , "A37盖膜余量少于两卷,及时更换" , true),
  227. //("Application.Var_Auto_A37_Encapsulation2.b_Error[9]" , "A37载带余量少于两卷,及时更换" , true),
  228. //("Application.Var_Auto_A37_Encapsulation2.b_Error[10]" , "A37模式2上下吸嘴有残料" , true),
  229. //("Application.Var_Auto_A37_Encapsulation2.b_Error[11]" , "A37上下吸嘴料件丢失" , true),
  230. //("Application.Var_Auto_A37_Encapsulation2.b_Error[12]" , "A37默认模式上下吸嘴有残料" , true),
  231. //("Application.Var_Auto_A37_Encapsulation2.b_Error[13]" , "A37印字复检CCD未通过" , true),
  232. //("Application.Var_Auto_A37_Encapsulation2.b_Error[14]" , "A37空料检测检出异料" , true),
  233. //("Application.Var_Auto_A37_Encapsulation2.b_Error[15]" , "A37空料检测检出空料" , true),
  234. //("Application.Var_Auto_A37_Encapsulation2.b_Error[16]" , "A37走带时封合轴位置异常" , true),
  235. //("Application.Var_Auto_A37_Encapsulation2.b_Error[17]" , "A37走带时切刀位置异常,检查切刀电磁阀信号" , true),
  236. //("Application.Var_Auto_A37_Encapsulation2.b_Error[18]" , "A37压痕画像CCD未通过" , true),
  237. //("Application.Var_Auto_A37_Encapsulation2.b_Error[19]" , "A37切刀位置异常,不在初始位置" , true),
  238. //("Application.Var_Auto_A37_Encapsulation2.b_Error[20]" , "A37切刀伸出未到位" , true),
  239. //("Application.Var_Auto_A37_Encapsulation2.b_Error[21]" , "A37走带对位失败" , true),
  240. //("Application.Var_Auto_A37_Encapsulation2.b_Error[22]" , "A37封合气缸到位超时" , true),
  241. //("Application.Var_Auto_A37_Encapsulation2.b_Error[23]" , "A37印字复检相机超时" , true),
  242. //("Application.Var_Auto_A37_Encapsulation2.b_Error[24]" , "A37压痕画像相机超时" , true),
  243. //("Application.Var_Auto_A37_Encapsulation2.b_Error[25]" , "A37走带轴移动过大无法自动复位,需手动回记忆位" , true),
  244. //("Application.Var_Auto_A37_Encapsulation2.b_Error[30]" , "A37 CCD1发送EOT后返回结果超时" , true),
  245. //("Application.Var_Auto_A37_Encapsulation2.b_Error[31]" , "A37 CCD2发送EOT后返回结果超时" , true),
  246. //("Application.Var_Auto_A37_Encapsulation2.b_Error[32]" , "A37上料吸嘴与上料格同时有料,需手动抛掉其中一个" , true),
  247. //("Application.Var_Auto_A37_Encapsulation2.b_Error[33]" , "A37上料吸嘴取料连续失败" , true),
  248. //("Application.Var_Auto_A39_OverflowBox.b_Error[1]" , "A39料盒丢失" , true),
  249. //("Application.Var_Auto_A39_OverflowBox.b_Error[2]" , "A39抛料超时" , true),
  250. //("Application.PieceDate.ar_b低良报警[1]" , "测试站1良率过低" , true),
  251. //("Application.PieceDate.ar_b低良报警[2]" , "测试站2良率过低" , true),
  252. //("Application.PieceDate.ar_b低良报警[3]" , "测试站3良率过低" , true),
  253. //("Application.PieceDate.ar_b低良报警[4]" , "测试站4良率过低" , true),
  254. //("Application.PieceDate.ar_b低良报警[5]" , "测试站5良率过低" , true),
  255. //("Application.PieceDate.ar_b低良报警[6]" , "热测良率过低" , true),
  256. //("Application.PieceDate.ar_b低良报警[7]" , "镭射打标CCD良率过低" , true),
  257. //("Application.PieceDate.ar_b低良报警[8]" , "3D检测良率过低" , true),
  258. //("Application.PieceDate.ar_b低良报警[9]" , "封装1CCD1良率过低" , true),
  259. //("Application.PieceDate.ar_b低良报警[10]" , "封装1CCD2良率过低" , true),
  260. //("Application.PieceDate.ar_b低良报警[11]" , "封装2CCD1良率过低" , true),
  261. //("Application.PieceDate.ar_b低良报警[12]" , "封装2CCD2良率过低" , true),
  262. ("Application.Var_state.b吸嘴寿命报警[1]" , "吸嘴1使用寿命到达" , true),
  263. ("Application.Var_state.b吸嘴寿命报警[2]" , "吸嘴2使用寿命到达" , true),
  264. ("Application.Var_state.b吸嘴寿命报警[3]" , "吸嘴3使用寿命到达" , true),
  265. ("Application.Var_state.b吸嘴寿命报警[4]" , "吸嘴4使用寿命到达" , true),
  266. ("Application.Var_state.b吸嘴寿命报警[5]" , "吸嘴5使用寿命到达" , true),
  267. ("Application.Var_state.b吸嘴寿命报警[6]" , "吸嘴6使用寿命到达" , true),
  268. ("Application.Var_state.b吸嘴寿命报警[7]" , "吸嘴7使用寿命到达" , true),
  269. ("Application.Var_state.b吸嘴寿命报警[8]" , "吸嘴8使用寿命到达" , true),
  270. ("Application.Var_state.b吸嘴寿命报警[9]" , "吸嘴9使用寿命到达" , true),
  271. ("Application.Var_state.b吸嘴寿命报警[10]" , "吸嘴10使用寿命到达" , true),
  272. ("Application.Var_state.b吸嘴寿命报警[11]" , "吸嘴11使用寿命到达" , true),
  273. ("Application.Var_state.b吸嘴寿命报警[12]" , "吸嘴12使用寿命到达" , true),
  274. ("Application.Var_state.b吸嘴寿命报警[13]" , "吸嘴13使用寿命到达" , true),
  275. ("Application.Var_state.b吸嘴寿命报警[14]" , "吸嘴14使用寿命到达" , true),
  276. ("Application.Var_state.b吸嘴寿命报警[15]" , "吸嘴15使用寿命到达" , true),
  277. ("Application.Var_state.b吸嘴寿命报警[16]" , "吸嘴16使用寿命到达" , true),
  278. ("Application.Var_state.b吸嘴寿命报警[17]" , "吸嘴17使用寿命到达" , true),
  279. ("Application.Var_state.b吸嘴寿命报警[18]" , "吸嘴18使用寿命到达" , true),
  280. ("Application.Var_state.b吸嘴寿命报警[19]" , "吸嘴19使用寿命到达" , true),
  281. ("Application.Var_state.b吸嘴寿命报警[20]" , "吸嘴20使用寿命到达" , true),
  282. ("Application.Var_state.b吸嘴寿命报警[21]" , "吸嘴21使用寿命到达" , true),
  283. ("Application.Var_state.b吸嘴寿命报警[22]" , "吸嘴22使用寿命到达" , true),
  284. ("Application.Var_state.b吸嘴寿命报警[23]" , "吸嘴23使用寿命到达" , true),
  285. ("Application.Var_state.b吸嘴寿命报警[24]" , "吸嘴24使用寿命到达" , true),
  286. ("Application.Var_state.b吸嘴寿命报警[25]" , "吸嘴25使用寿命到达" , true),
  287. ("Application.Var_state.b吸嘴寿命报警[26]" , "吸嘴26使用寿命到达" , true),
  288. ("Application.Var_state.b吸嘴寿命报警[27]" , "吸嘴27使用寿命到达" , true),
  289. ("Application.Var_state.b吸嘴寿命报警[28]" , "吸嘴28使用寿命到达" , true),
  290. ("Application.Var_state.b吸嘴寿命报警[29]" , "吸嘴29使用寿命到达" , true),
  291. ("Application.Var_state.b吸嘴寿命报警[30]" , "吸嘴30使用寿命到达" , true),
  292. ("Application.Var_state.b吸嘴寿命报警[31]" , "吸嘴31使用寿命到达" , true),
  293. ("Application.Var_state.b吸嘴寿命报警[32]" , "吸嘴32使用寿命到达" , true),
  294. ("Application.Var_state.b吸嘴寿命报警[33]" , "吸嘴33使用寿命到达" , true),
  295. ("Application.Var_state.b吸嘴寿命报警[34]" , "吸嘴34使用寿命到达" , true),
  296. ("Application.Var_state.b吸嘴寿命报警[35]" , "吸嘴35使用寿命到达" , true),
  297. ("Application.Var_state.b吸嘴寿命报警[36]" , "吸嘴36使用寿命到达" , true),
  298. ("Application.Var_state.b吸嘴寿命报警[37]" , "吸嘴37使用寿命到达" , true),
  299. ("Application.Var_state.b吸嘴寿命报警[38]" , "吸嘴38使用寿命到达" , true),
  300. ("Application.Var_state.b吸嘴寿命报警[39]" , "吸嘴39使用寿命到达" , true),
  301. ("Application.Var_state.b吸嘴寿命报警[40]" , "吸嘴40使用寿命到达" , true),
  302. };
  303. }
  304. public class AlarmDisplay
  305. {
  306. public int Id { get; set; }
  307. public int RowNumber { get; set; }
  308. public DateTime Timestamp { get; set; }
  309. public string Username { get; set; }
  310. public string AlarmMessage { get; set; }
  311. public string AlarmType { get; set; } // 显示为 "Error", "Warning" 等
  312. }
  313. public class PairedAlarm
  314. {
  315. public string Username { get; set; }
  316. public string AlarmMessage { get; set; }
  317. public DateTime StartTime { get; set; }
  318. public DateTime EndTime { get; set; } // 若未清除,则为 DateTime.MinValue
  319. public string Type { get; set; } // 显示为 "Error", "Warning" 等
  320. // 辅助属性(可选)
  321. public bool IsCleared => EndTime != DateTime.MinValue;
  322. public static List<PairedAlarm> PairAlarms(List<AlarmDisplay> logs)
  323. {
  324. if (logs == null || !logs.Any())
  325. return new List<PairedAlarm>();
  326. var grouped = logs.GroupBy(x => x.AlarmMessage);
  327. var result = new List<PairedAlarm>();
  328. foreach (var group in grouped)
  329. {
  330. DateTime pendingStart = DateTime.MinValue; // 用 MinValue 表示“无 pending”
  331. string alarmType=null;
  332. foreach (var log in group.OrderBy(x => x.Timestamp))
  333. {
  334. if (log.AlarmType != AlarmType.Cleared.ToString())
  335. {
  336. // 只有当前没有 pending 发生事件时,才记录新的开始
  337. if (pendingStart == DateTime.MinValue)
  338. {
  339. pendingStart = log.Timestamp;
  340. alarmType = log.AlarmType;
  341. }
  342. // 否则忽略重复“发生”
  343. }
  344. else if (log.AlarmType == AlarmType.Cleared.ToString())
  345. {
  346. if (pendingStart != DateTime.MinValue)
  347. {
  348. // 配对成功
  349. result.Add(new PairedAlarm
  350. {
  351. AlarmMessage = group.Key,
  352. StartTime = pendingStart,
  353. EndTime = log.Timestamp,
  354. Type=alarmType
  355. });
  356. pendingStart = DateTime.MinValue; // 清空 pending
  357. }
  358. // 否则:清除前无发生,忽略(或记录警告)
  359. }
  360. }
  361. // 循环结束后,若仍有 pending,说明未清除
  362. if (pendingStart != DateTime.MinValue)
  363. {
  364. result.Add(new PairedAlarm
  365. {
  366. AlarmMessage = group.Key,
  367. StartTime = pendingStart,
  368. EndTime = DateTime.Now // 表示未清除
  369. });
  370. }
  371. }
  372. return result.OrderBy(x => x.StartTime).ThenBy(x => x.AlarmMessage).ToList();
  373. }
  374. }
  375. }