dict.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package faultRecordProtocol
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. )
  7. // FunctionCodeNames 命令控制符(功能码),FaultFilter 文档 5.4.1
  8. var FunctionCodeNames = map[int]string{
  9. 1: "清除设备故障波形",
  10. 2: "采样通道配置",
  11. 3: "手动触发故障录波",
  12. 4: "设备对时",
  13. 5: "故障录波采样频率",
  14. 6: "配置可配采样通道",
  15. 7: "故障录波功能状态控制",
  16. }
  17. // DangerousFunctionCodes 设置前需要醒目确认的功能码
  18. var DangerousFunctionCodes = map[int]string{
  19. 1: "清除设备上的故障波形,不可恢复",
  20. 3: "立即触发一次故障录波",
  21. 4: "修改设备时间",
  22. }
  23. // RealtimeCodeNames 实时数据类别,FaultFilter 文档 5.1
  24. var RealtimeCodeNames = map[int]string{
  25. 1: "故障总体信息",
  26. 2: "设备故障录波功能基本信息",
  27. 3: "故障录波总目录",
  28. }
  29. // TriggerSourceNames 事件触发源(F15),FaultFilter 文档 10.4
  30. var TriggerSourceNames = map[uint16]string{
  31. 0x0FF0: "手动触发 _Fix",
  32. 0x0FF1: "模拟故障触发 _Auto",
  33. 0x1000: "SL_DSP 预留触发源 16_1",
  34. 0x1001: "并网发生状态切换故障",
  35. 0x1002: "离网发生 aPower 离运问题",
  36. 0x1003: "油机发生状态切换故障",
  37. 0x5000: "PE_INV 预留触发源 16_1",
  38. 0x5001: "运行态下逆变故障",
  39. 0xD000: "MPPT 预留触发源 16_1",
  40. 0xD001: "运行态下 MPPT 故障",
  41. 0xD800: "APBOX2.0 预留触发源 16_1",
  42. 0xD801: "运行态下 APBOX2.0 故障",
  43. 0xE000: "DIF 预留触发源 16_1",
  44. 0xE001: "并网发生状态切换故障",
  45. 0xE002: "离网发生 aPower 离运问题",
  46. }
  47. // internalErrorCodes 设备内部通信错误判定码(F13),FaultFilter 文档 10.5
  48. var internalErrorCodes = map[uint64]string{
  49. 0x3: "下发命令与子设备回复的命令不一致",
  50. 0x4: "数据读取阶段:子设备回复错误",
  51. 0x5: "数据读取阶段:回复的数据类别不符",
  52. 0x6: "记录传输阶段:起始报文接收错误",
  53. 0x7: "记录传输阶段:后续数据未接收完成",
  54. 0x8: "记录传输阶段:数据块不连续",
  55. 0x9: "记录传输阶段:数据块内序号不连续",
  56. 0xa: "记录传输阶段:收到多余的后续数据",
  57. 0xb: "记录传输阶段:首包数据过短",
  58. 0xc: "记录传输结束阶段:后续数据未接收完成",
  59. 0xd: "数据读取阶段:接收超时",
  60. 0xe: "记录传输阶段:接收超时",
  61. 0xf: "记录传输结束阶段:接收超时",
  62. 0x10: "其他命令:接收超时",
  63. 0x11: "记录传输阶段:后续数据接收超时",
  64. 0x12: "参数读写阶段:读/写类型不一致",
  65. 0x13: "参数读写阶段:回复的功能码不一致",
  66. 0x14: "参数读写阶段:回复数据过短",
  67. 0x15: "参数读写阶段:接收超时",
  68. 0x16: "参数读写阶段:后续数据未接收完成",
  69. }
  70. // subDeviceErrorCodes 子设备错误码(F12),FaultFilter 文档 10.6
  71. var subDeviceErrorCodes = map[uint64]string{
  72. 0x10: "GeneralReject 诊断服务被拒绝",
  73. 0x11: "serviceNotSupported 不支持该诊断请求",
  74. 0x12: "subFunctionNotSupported 不支持该子功能",
  75. 0x13: "incorrectMessageLengthOrInvalidFormat 报文长度或格式错误",
  76. 0x14: "ResponseTooLong 响应过长",
  77. 0x22: "conditionsNotCorrect 条件错误",
  78. 0x23: "commTimeoutError 通信超时",
  79. 0x31: "requestOutOfRange 请求超过范围",
  80. 0x33: "securityAccessDenied 安全访问拒绝",
  81. 0x35: "invalidKey 密钥错误",
  82. 0x36: "exceedNumberOfAttempts 尝试次数超限",
  83. 0x37: "requiredTimeDelayNotExpired 延时未到期",
  84. 0x70: "UploadDownloadNotAccepted 上传或下载失败",
  85. 0x71: "TransferDataSuspended 数据传输中断",
  86. 0x72: "GeneralProgrammingFailure 擦写 Flash 错误",
  87. 0x73: "WrongBlockSequenceCounter 数据包序号错误",
  88. 0x78: "ResponsePending 子设备正忙",
  89. 0x7F: "serviceNotSupportedInActiveSession 当前模式不支持",
  90. }
  91. var fixedResultOne = map[string]string{
  92. "ok": "成功",
  93. "cancomerr:time out": "与子设备通信超时",
  94. "emserr:can p null": "未取到目标子设备",
  95. "emserr:can data null": "子设备返回数据为空",
  96. "emserr:set cmd err": "下发命令失败",
  97. "emserr:other": "其他错误",
  98. }
  99. var errorReplyResults = map[string]string{
  100. "json unpack err": "消息体不是合法 JSON",
  101. "cmd unpack err": "缺少 cmd 字段",
  102. "data unpack err": "缺少 data 字段",
  103. "busy": "设备正在处理其他命令",
  104. "pe sn not find": "pe 设备序列号无法匹配",
  105. "cmd no define": "不支持的命令码",
  106. "test fail": "连通性测试失败",
  107. }
  108. // DescribeResultOne 子项结果的中文说明,未知值原样返回
  109. func DescribeResultOne(s string) string {
  110. if d, ok := fixedResultOne[s]; ok {
  111. return d
  112. }
  113. if v, ok := strings.CutPrefix(s, "cancomerr:suberrcode="); ok {
  114. return describeCode("子设备错误码", v, subDeviceErrorCodes)
  115. }
  116. if v, ok := strings.CutPrefix(s, "cancomerr:index="); ok {
  117. return describeCode("设备内部通信错误", v, internalErrorCodes)
  118. }
  119. return s
  120. }
  121. // DescribeReplyResult 379 整体结果的中文说明
  122. func DescribeReplyResult(s string) string {
  123. switch s {
  124. case ResultOk:
  125. return "全部成功"
  126. case ResultError:
  127. return "存在失败的子项"
  128. }
  129. if d, ok := errorReplyResults[s]; ok {
  130. return d
  131. }
  132. return s
  133. }
  134. func describeCode(prefix, hexStr string, table map[uint64]string) string {
  135. code, err := strconv.ParseUint(strings.TrimPrefix(strings.ToLower(hexStr), "0x"), 16, 32)
  136. if err != nil {
  137. return fmt.Sprintf("%s %s", prefix, hexStr)
  138. }
  139. if d, ok := table[code]; ok {
  140. return fmt.Sprintf("%s 0x%X:%s", prefix, code, d)
  141. }
  142. return fmt.Sprintf("%s 0x%X", prefix, code)
  143. }
  144. // TriggerSourceName 触发源名称,表外代码返回空字符串
  145. func TriggerSourceName(code uint16) string {
  146. return TriggerSourceNames[code]
  147. }