diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Abstracts/ProtocolPlugin.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Abstracts/ProtocolPlugin.cs
index a323787..c92b704 100644
--- a/protocols/JiShe.CollectBus.Protocol.Contracts/Abstracts/ProtocolPlugin.cs
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Abstracts/ProtocolPlugin.cs
@@ -94,8 +94,9 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
/// 控制域C解析
///
///
- public virtual C? Analysis_C(List hexStringList)
+ public virtual C Analysis_C(List hexStringList)
{
+ C c = new C();
try
{
if (hexStringList.Count > 6)
@@ -108,7 +109,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
if (baseHexMessage.HexMessageList.Count == 0)
return null;
string binStr = baseHexMessage.HexMessageString.HexTo4BinZero();
- C c = new C
+ c = new C
{
BaseHexMessage = baseHexMessage,
FC = binStr.Substring(binStr.Length - 4, 4).BinToDec(),
@@ -125,7 +126,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
_logger.LogError($"解析Analysis_C错误,报文:{string.Join("", hexStringList)},异常:{ex.Message}");
}
- return null;
+ return c;
}
///
@@ -133,8 +134,9 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
///
///
///
- public virtual A? Analysis_A(List hexStringList)
+ public virtual A Analysis_A(List hexStringList)
{
+ A a = new A();
try
{
if (hexStringList.Count > 7)
@@ -144,17 +146,15 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
HexMessageList = hexStringList.GetRange(7, 5) // 地址域 5个字节
};
baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
- if (baseHexMessage.HexMessageList.Count == 0)
- return null;
- A a = new A
+ a = new A
{
BaseHexMessage = baseHexMessage,
A1 = baseHexMessage.HexMessageList.ListReverseToStr(0, 2),//.DataConvert(10);//行政区划码A1
A2 = baseHexMessage.HexMessageList.ListReverseToStr(2, 2).PadLeft(5, '0').HexToDec(),//终端地址A2
A3 = Analysis_A3(baseHexMessage.HexMessageList) //主站地址和组地址标志A3
};
- a.Code = $"{a.A1.PadLeft(4, '0')}{a.A2.ToString().PadLeft(5, '0')}";
- return a;
+ a.Code = $"{a.A1.PadLeft(4, '0')}{a.A2.ToString()!.PadLeft(5, '0')}";
+
}
}
catch (Exception ex)
@@ -162,7 +162,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
_logger.LogError($"解析Analysis_A错误,报文:{string.Join("", hexStringList)},异常:{ex.Message}");
}
- return null;
+ return a;
}
@@ -171,185 +171,192 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
///
/// 地址域A集合
///
- public virtual A3? Analysis_A3(List hexAList)
+ public virtual A3 Analysis_A3(List hexAList)
{
+ A3 a3 = new A3();
try
{
- BaseHexMessage baseHexMessage = new BaseHexMessage
+ if (hexAList.Count != 0)
{
- HexMessageList = hexAList.GetRange(4, 1) // 站地址和组地址标志A3 1个字节
- };
- baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
- if (baseHexMessage.HexMessageList.Count == 0)
- return null;
- var binStr = baseHexMessage.HexMessageString.HexTo4BinZero();
- A3 a3 = new A3
- {
- BaseHexMessage = baseHexMessage,
- D0 = binStr.Substring(binStr.Length - 1, 1).BinToDec(),
- D1_D7 = binStr.Substring(0, binStr.Length - 1).BinToDec()
- };
- return a3;
+ BaseHexMessage baseHexMessage = new BaseHexMessage
+ {
+ HexMessageList = hexAList.GetRange(4, 1) // 站地址和组地址标志A3 1个字节
+ };
+ baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
+ var binStr = baseHexMessage.HexMessageString.HexTo4BinZero();
+ a3 = new A3
+ {
+ BaseHexMessage = baseHexMessage,
+ D0 = binStr.Substring(binStr.Length - 1, 1).BinToDec(),
+ D1_D7 = binStr.Substring(0, binStr.Length - 1).BinToDec()
+ };
+ }
}
catch (Exception ex)
{
_logger.LogError($"解析Analysis_A3错误,报文:{string.Join("", hexAList)},异常:{ex.Message}");
}
- return null;
+ return a3;
}
///
/// AFN_FC功能码
///
///
- public virtual AFN_FC? Analysis_AFN_FC(List hexStringList)
+ public virtual AFN_FC Analysis_AFN_FC(List hexStringList)
{
+ AFN_FC aFN_FC = new AFN_FC();
try
{
- BaseHexMessage baseHexMessage = new BaseHexMessage
+ if (hexStringList.Count == 0)
{
- HexMessageList = hexStringList.GetRange(12, 1) //AFN功能码 1个字节
- };
- baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
- if (baseHexMessage.HexMessageList.Count == 0)
- return null;
- AFN_FC aFN_FC = new AFN_FC
- {
- BaseHexMessage = baseHexMessage,
- AFN = baseHexMessage.HexMessageString.HexToDec(),
- };
- return aFN_FC;
+
+ BaseHexMessage baseHexMessage = new BaseHexMessage
+ {
+ HexMessageList = hexStringList.GetRange(12, 1) //AFN功能码 1个字节
+ };
+ baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
+
+ aFN_FC = new AFN_FC
+ {
+ BaseHexMessage = baseHexMessage,
+ AFN = baseHexMessage.HexMessageString.HexToDec(),
+ };
+ }
+
}
catch (Exception ex)
{
_logger.LogError($"解析Analysis_AFN_FC错误,报文:{string.Join("", hexStringList)},异常:{ex.Message}");
}
- return null;
+ return aFN_FC;
}
///
/// 解析帧序列域SEQ
///
///
- public virtual SEQ? Analysis_SEQ(List hexStringList)
+ public virtual SEQ Analysis_SEQ(List hexStringList)
{
+ SEQ seq = new SEQ();
try
{
- BaseHexMessage baseHexMessage = new BaseHexMessage
+ if (hexStringList.Count != 0)
{
- HexMessageList = hexStringList.GetRange(13, 1) //帧序列域 SEQ 1个字节
- };
- baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
- if (baseHexMessage.HexMessageList.Count == 0)
- return null;
- var binStr = baseHexMessage.HexMessageString.HexTo4BinZero();
- SEQ seq = new SEQ
- {
- PSEQ = binStr.Substring(binStr.Length - 4, 4).BinToDec(),
- CON = binStr.Substring(3, 1).BinToDec(),
- FIN = binStr.Substring(2, 1).BinToDec(),
- FIR = binStr.Substring(1, 1).BinToDec(),
- TpV = binStr.Substring(0, 1).BinToDec()
- };
- return seq;
+ BaseHexMessage baseHexMessage = new BaseHexMessage
+ {
+ HexMessageList = hexStringList.GetRange(13, 1) //帧序列域 SEQ 1个字节
+ };
+ baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
+ var binStr = baseHexMessage.HexMessageString.HexTo4BinZero();
+ seq = new SEQ
+ {
+ PSEQ = binStr.Substring(binStr.Length - 4, 4).BinToDec(),
+ CON = binStr.Substring(3, 1).BinToDec(),
+ FIN = binStr.Substring(2, 1).BinToDec(),
+ FIR = binStr.Substring(1, 1).BinToDec(),
+ TpV = binStr.Substring(0, 1).BinToDec()
+ };
+ }
+
}
catch (Exception ex)
{
_logger.LogError($"解析Analysis_SEQ错误,报文:{string.Join("", hexStringList)},异常:{ex.Message}");
}
- return null;
+ return seq;
}
///
/// 数据单元标识及数据单元数据
///
- public virtual UnitData? Analysis_UnitData(List hexStringList)
+ public virtual UnitData Analysis_UnitData(List hexStringList)
{
+ UnitData unitData = new UnitData();
try
{
-
- UnitData unitData = new UnitData
+ if (hexStringList.Count != 0)
{
- HexMessageList = hexStringList.GetRange(14, hexStringList.Count - 14 - 2) //总数字节数-固定长度报文头-控制域C-地址域A-校验和CS-结束字符(16H)
- };
- unitData.HexMessageString = string.Join("", unitData.HexMessageList);
- if (unitData.HexMessageList.Count == 0)
- return null;
- return unitData;
+ unitData = new UnitData
+ {
+ HexMessageList = hexStringList.GetRange(14, hexStringList.Count - 14 - 2) //总数字节数-固定长度报文头-控制域C-地址域A-校验和CS-结束字符(16H)
+ };
+ unitData.HexMessageString = string.Join("", unitData.HexMessageList);
+ }
}
catch (Exception ex)
{
_logger.LogError($"解析Analysis_UnitData错误,报文:{string.Join("", hexStringList)},异常:{ex.Message}");
}
- return null;
+ return unitData;
}
///
/// 信息点DA Pn
///
///
- public virtual DA? Analysis_DA(List hexStringList)
+ public virtual DA Analysis_DA(List hexStringList)
{
+ DA da = new DA();
try
{
- BaseHexMessage baseHexMessage = new BaseHexMessage
+ if (hexStringList.Count != 0)
{
- HexMessageList = hexStringList.GetRange(14, 2) //信息点DA Pn 2个字节
- };
- baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
- if (baseHexMessage.HexMessageList.Count == 0)
- return null;
- var da1 = baseHexMessage.HexMessageList[0];
- var da2 = baseHexMessage.HexMessageList[1];
- DA da = new DA()
- {
- BaseHexMessage = baseHexMessage,
- Pn = CalculatePn(da1, da2)
- };
- return da;
-
+ BaseHexMessage baseHexMessage = new BaseHexMessage
+ {
+ HexMessageList = hexStringList.GetRange(14, 2) //信息点DA Pn 2个字节
+ };
+ baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
+ var da1 = baseHexMessage.HexMessageList[0];
+ var da2 = baseHexMessage.HexMessageList[1];
+ da = new DA()
+ {
+ BaseHexMessage = baseHexMessage,
+ Pn = CalculatePn(da1, da2)
+ };
+ }
}
catch (Exception ex)
{
_logger.LogError($"解析Analysis_DA错误,报文:{string.Join("", hexStringList)},异常:{ex.Message}");
}
- return null;
+ return da;
}
///
/// 信息类DT Fn
///
///
- public virtual DT? Analysis_DT(List hexStringList)
+ public virtual DT Analysis_DT(List hexStringList)
{
+ DT dt = new DT();
try
{
- BaseHexMessage baseHexMessage = new BaseHexMessage
+ if (hexStringList.Count != 0)
{
- HexMessageList = hexStringList.GetRange(16, 2) //信息类DT Fn 2个字节
- };
- baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
- if (baseHexMessage.HexMessageList.Count == 0)
- return null;
- var dt1 = baseHexMessage.HexMessageList[0];
- var dt2 = baseHexMessage.HexMessageList[1];
- DT dt = new DT()
- {
- BaseHexMessage = baseHexMessage,
- Fn = CalculateFn(dt1, dt2)
- };
- return dt;
-
+ BaseHexMessage baseHexMessage = new BaseHexMessage
+ {
+ HexMessageList = hexStringList.GetRange(16, 2) //信息类DT Fn 2个字节
+ };
+ baseHexMessage.HexMessageString = string.Join("", baseHexMessage.HexMessageList);
+ var dt1 = baseHexMessage.HexMessageList[0];
+ var dt2 = baseHexMessage.HexMessageList[1];
+ dt = new DT()
+ {
+ BaseHexMessage = baseHexMessage,
+ Fn = CalculateFn(dt1, dt2)
+ };
+ }
}
catch (Exception ex)
{
_logger.LogError($"解析Analysis_DT错误,报文:{string.Join("", hexStringList)},异常:{ex.Message}");
}
- return null;
+ return dt;
}
@@ -360,7 +367,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
///
///
///
- public int CalculatePn(string da1, string da2) => (da2.HexToDec() - 1) * 8 + (8 - da1.HexTo4BinZero().IndexOf(da1.Equals("00") ? "0" : "1"));
+ public static int CalculatePn(string da1, string da2) => (da2.HexToDec() - 1) * 8 + (8 - da1.HexTo4BinZero().IndexOf(da1.Equals("00") ? "0" : "1"));
///
@@ -369,7 +376,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
///
///
///
- public int CalculateFn(string dt1, string dt2) => dt2.HexToDec() * 8 + (8 - dt1.HexTo4BinZero().IndexOf("1"));
+ public static int CalculateFn(string dt1, string dt2) => dt2.HexToDec() * 8 + (8 - dt1.HexTo4BinZero().IndexOf("1"));
}
}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Models/TB3761.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Models/TB3761.cs
index a24090a..75727d2 100644
--- a/protocols/JiShe.CollectBus.Protocol.Contracts/Models/TB3761.cs
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Models/TB3761.cs
@@ -15,45 +15,45 @@ namespace JiShe.CollectBus.Protocol.Contracts.Models
///
/// 报文
///
- public BaseHexMessage? BaseHexMessage { get; set;}
+ public BaseHexMessage BaseHexMessage { get; set;}=new BaseHexMessage();
///
/// 控制域C
///
- public C? C { get; set; }
+ public C C { get; set; } = new C();
///
/// 地址域A
///
- public A? A { get; set; }
+ public A A { get; set; } = new A();
///
/// 帧序列域 SEQ
///
- public SEQ? SEQ { get; set; }
+ public SEQ SEQ { get; set; } = new SEQ();
///
/// 用户数据区
/// 功能码
///
- public AFN_FC? AFN_FC { get; set; }
+ public AFN_FC AFN_FC { get; set; } = new AFN_FC();
///
/// 用户数据区
/// 信息点DA Pn
///
- public DA? DA { get; set; }
+ public DA DA { get; set; } = new DA();
///
/// 用户数据区
/// 信息类DT Fn
///
- public DT? DT { get; set; }
+ public DT DT { get; set; } = new DT();
///
/// 数据单元标识和数据单元格式
///
- public UnitData? UnitData { get; set; }
+ public UnitData UnitData { get; set; } = new UnitData();
}
#region
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN0_F1_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN0_F1_AnalysisDto.cs
deleted file mode 100644
index ede07c1..0000000
--- a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN0_F1_AnalysisDto.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace JiShe.CollectBus.Protocol.Dto
-{
- public class AFN0_F1_AnalysisDto: UnitDataDto
- {
- public bool Verify { get; set; } = true;
- }
-}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN10_F10_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN10_F10_AnalysisDto.cs
new file mode 100644
index 0000000..46b7581
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN10_F10_AnalysisDto.cs
@@ -0,0 +1,95 @@
+using JiShe.CollectBus.Protocol.Dto;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN10_F10_AnalysisDto
+ {
+ ///
+ /// 本次电能表/交流采样装置配置数量 n
+ ///
+ public int ConfigNum { get; set; }
+
+ ///
+ /// 电能表/交流采样装置配置信息
+ ///
+ public List AFN10F10Entitys { get; set; } = new List();
+ }
+
+
+ public class AFN10F10Entity
+ {
+ ///
+ /// 电能表/交流采样装置序号
+ ///
+ public int SerialNum { get; set; }
+
+ ///
+ /// 所属测量点号
+ ///
+ public int Point { get; set; }
+
+ ///
+ /// 通信速率
+ ///
+ public int BaudRate { get; set; }
+
+ ///
+ /// 端口号
+ ///
+ public int Port { get; set; }
+
+
+ ///
+ /// 通信协议类型
+ ///
+ public string RuleType { get; set; }
+
+ ///
+ /// 通信地址
+ ///
+ public string ComAddress { get; set; }
+
+ ///
+ /// 通信密码
+ ///
+ public string ComPwd { get; set; }
+
+
+ ///
+ /// 电能费率个数
+ ///
+ public int ElectricityRatesNum { get; set; }
+
+
+ ///
+ /// 有功电能示值整数位及小数位个数
+ ///
+ public int IntegerBitsNum { get; set; }
+
+ ///
+ /// 有功电能示值小数位个数
+ ///
+ public int DecimalPlacesNum { get; set; }
+
+ ///
+ /// 所属采集器通信地址
+ ///
+ public string CollectorAddress{ get; set; }
+
+ ///
+ /// 用户大类号
+ ///
+ public int UserCategoryNum { get; set;}
+
+ ///
+ /// 用户小类号
+ ///
+ public int UserSubclassNum { get; set; }
+ }
+
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN10_F66_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN10_F66_AnalysisDto.cs
new file mode 100644
index 0000000..c3c8306
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN10_F66_AnalysisDto.cs
@@ -0,0 +1,45 @@
+using JiShe.CollectBus.Protocol.Dto;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN10_F66_AnalysisDto
+ {
+ ///
+ /// 定时发送周期
+ /// 1:用 D6~D7 编码表示,取值 0~3 依次表示分、时、日、月
+ /// 2:用 D0~D5 表示,为定时上报数据的时间周期
+ ///
+ public int Cycle { get; set; }
+ ///
+ /// 定时发送周期(单位)
+ ///
+ public int Unit { get; set; }
+ ///
+ /// 发送基准时间
+ ///
+ public DateTime BaseTime { get; set; }
+
+ ///
+ /// 曲线数据提取倍率
+ ///
+ public int CurveRatio { get; set; }
+
+ ///
+ /// 任务号
+ ///
+ public int Pn { get; set; }
+
+ public List Details { get; set; } = new List();
+ }
+
+ public class SetAutoItemCodeDetails
+ {
+ public int Pn { get; set; }
+ public int Fn { get; set; }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F129_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F129_AnalysisDto.cs
new file mode 100644
index 0000000..30719e9
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F129_AnalysisDto.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F129_AnalysisDto : AnalysisBaseDto
+ {
+ public DateTime ReadTime { get; set; }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F130_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F130_AnalysisDto.cs
new file mode 100644
index 0000000..9a9259b
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F130_AnalysisDto.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F130_AnalysisDto : AnalysisBaseDto
+ {
+ public DateTime ReadTime { get; set; }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F131_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F131_AnalysisDto.cs
new file mode 100644
index 0000000..edc5ca7
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F131_AnalysisDto.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F131_AnalysisDto: AnalysisBaseDto
+ {
+ public DateTime ReadTime { get; set; }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F132_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F132_AnalysisDto.cs
new file mode 100644
index 0000000..1625f15
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F132_AnalysisDto.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F132_AnalysisDto: AnalysisBaseDto
+ {
+ public DateTime ReadTime { get; set; }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F145_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F145_AnalysisDto.cs
new file mode 100644
index 0000000..96f0c37
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F145_AnalysisDto.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F145_AnalysisDto : AnalysisBaseDto
+ {
+ ///
+ /// 最大需量时标
+ ///
+ public string TimeSpan { get; set; }
+
+ public DateTime ReadingDate { get; set; }
+ }
+
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F149_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F149_AnalysisDto.cs
new file mode 100644
index 0000000..fb9dafe
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F149_AnalysisDto.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F149_AnalysisDto : AnalysisBaseDto
+ {
+ ///
+ /// 最大需量时标
+ ///
+ public string TimeSpan { get; set; }
+
+ public DateTime ReadingDate { get; set; }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F188_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F188_AnalysisDto.cs
new file mode 100644
index 0000000..1afb8ff
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F188_AnalysisDto.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F188_AnalysisDto : AnalysisBaseDto
+ {
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F25_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F25_AnalysisDto.cs
new file mode 100644
index 0000000..ca8b8ff
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F25_AnalysisDto.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F25_AnalysisDto: AnalysisBaseDto
+ {
+ ///
+ /// 读取时间
+ ///
+ public DateTime ReadTime { get; set; }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F2_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F2_AnalysisDto.cs
new file mode 100644
index 0000000..e069382
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F2_AnalysisDto.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F2_AnalysisDto: AnalysisBaseDto
+ {
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F33_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F33_AnalysisDto.cs
new file mode 100644
index 0000000..b917969
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F33_AnalysisDto.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F33_AnalysisDto
+ {
+ ///
+ /// 终端抄表时间
+ ///
+ public string ReadTime { get; set; }
+
+ ///
+ /// 费率数M(1≤M≤12)
+ ///
+ public int RatingCount { get; set; }
+ ///
+ /// 当前正向有功总电能示值
+ ///
+ public ParentNodes F_A_Kwh { get; set; }
+ ///
+ /// 当前正向无功(组合无功1)总电能示值
+ ///
+ public ParentNodes R_R_Kvarh { get; set; }
+
+ ///
+ /// 当前一象限无功总电能示值
+ ///
+ public ParentNodes Q1_R_Kvarh { get; set; }
+ ///
+ /// 当前四象限无功总电能示值
+ ///
+ public ParentNodes Q4_R_Kvarh { get; set; }
+ }
+
+ public class ParentNodes
+ {
+ ///
+ /// 总电能示值
+ ///
+ public decimal Total_Value { get; set; }
+ public List childNodes { get; set; }
+ }
+ public class ChildNodes
+ {
+ ///
+ /// 费率总电能示值
+ ///
+ public decimal Value { get; set; }
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F49_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F49_AnalysisDto.cs
new file mode 100644
index 0000000..ce0aeb7
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN12_F49_AnalysisDto.cs
@@ -0,0 +1,15 @@
+using JiShe.CollectBus.Protocol.Dto;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN12_F49_AnalysisDto: AnalysisBaseDto
+ {
+ }
+
+
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN9_F1_AnalysisDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN9_F1_AnalysisDto.cs
new file mode 100644
index 0000000..7b7bc3a
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AFN9_F1_AnalysisDto.cs
@@ -0,0 +1,38 @@
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AFN9_F1_AnalysisDto
+ {
+ public int FocusID { get; set; }
+ public string? AreaCode { get; set; }
+ public string? Address { get; set; }
+
+ ///
+ /// 厂商代号
+ ///
+ public string? MakerNo { get; set; }
+ ///
+ /// 设备编号
+ ///
+ public string? DeviceNo { get; set; }
+ ///
+ /// 终端软件版本号
+ ///
+ public string? SoftwareVersion { get; set; }
+ ///
+ /// 终端软件发布日期:日月年
+ ///
+ public string? SoftwareReleaseDate { get; set; }
+
+ ///
+ /// 硬件软件版本号
+ ///
+ public string? HardwareVersion { get; set; }
+ ///
+ /// 硬件软件发布日期:日月年
+ ///
+ public string? HardwareReleaseDate { get; set; }
+
+ public string? AddDate { get; set; }
+ }
+
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AnalysisBaseDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AnalysisBaseDto.cs
new file mode 100644
index 0000000..49f9054
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/AnalysisBaseDto.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
+{
+ public class AnalysisBaseDto
+ {
+
+ ///
+ /// 是否有效数据
+ ///
+ public bool ValidData { get; set; } = true;
+
+ ///
+ /// 数据类型
+ ///
+ public string DataType { get; set; }
+
+ ///
+ /// 错误码信息
+ ///
+ public string ErrorCodeMsg { get; set; }
+
+ ///
+ /// 字段名
+ ///
+ public string FiledName { get; set; }
+
+ ///
+ /// 字段描述
+ ///
+ public string FiledDesc { get; set; }
+ }
+
+ public class AnalysisBaseDto : AnalysisBaseDto
+ {
+ ///
+ /// 抄读值
+ ///
+ public T? DataValue { get; set; }
+ }
+
+}
diff --git a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/UnitDataDto.cs b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/UnitDataAnalysis.cs
similarity index 52%
rename from protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/UnitDataDto.cs
rename to protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/UnitDataAnalysis.cs
index cd59203..3a03923 100644
--- a/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/UnitDataDto.cs
+++ b/protocols/JiShe.CollectBus.Protocol.Contracts/Protocol/Dto/UnitDataAnalysis.cs
@@ -1,12 +1,6 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace JiShe.CollectBus.Protocol.Dto
+namespace JiShe.CollectBus.Protocol.Dto
{
- public class UnitDataDto
+ public class UnitDataAnalysis
{
///
/// 集中器地址
@@ -28,15 +22,15 @@ namespace JiShe.CollectBus.Protocol.Dto
///
public int Fn { get; set; }
- ///
- /// 数据时标(最近数据时间点的时间),如:8:00 08:15 记录08:15
- ///
- public string? DataTime { get; set; }
-
- ///
- /// 密度(分)
- ///
- public int TimeDensity { get; set; }
+
}
-
+
+ public class UnitDataAnalysis: UnitDataAnalysis
+ {
+ ///
+ /// 数据
+ ///
+ public T? Data { get; set; }
+ }
+
}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_00H/AFN0_F1_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_00H/AFN0_F1_Analysis.cs
index 2223868..09b23fc 100644
--- a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_00H/AFN0_F1_Analysis.cs
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_00H/AFN0_F1_Analysis.cs
@@ -14,9 +14,9 @@ using Volo.Abp.DependencyInjection;
namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_00H
{
///
- /// 全部确认:对收到报文中的全部数据单元标识进行确认
+ /// 5.1.3.1 F1:全部确认:对收到报文中的全部数据单元标识进行确认
///
- public class AFN0_F1_Analysis : IAnalysisStrategy
+ public class AFN0_F1_Analysis: IAnalysisStrategy>
{
private readonly ILogger _logger;
@@ -55,24 +55,24 @@ namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_00H
{
_logger = logger;
}
-
- public Task ExecuteAsync(TB3761 tB3761)
+ public Task> ExecuteAsync(TB3761 input)
{
try
{
- ArgumentNullException.ThrowIfNull(nameof(tB3761));
- AFN0_F1_AnalysisDto dto = new AFN0_F1_AnalysisDto
+ ArgumentNullException.ThrowIfNull(input);
+ UnitDataAnalysis dto = new UnitDataAnalysis
{
- Code = tB3761.A?.Code,
- AFN = tB3761.AFN_FC?.AFN ?? 0,
- Fn = tB3761.DT?.Fn ?? 0,
- Pn = tB3761.DA?.Pn ?? 0
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn ,
+ Data = true,
};
return Task.FromResult(dto);
}
catch (Exception ex)
{
- _logger.LogError(ex, $"00_1解析失败:{tB3761.A?.Code}-{tB3761.DT?.Fn ?? 0}-{tB3761?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ _logger.LogError(ex, $"00_1解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
return null;
}
}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_00H/AFN0_F2_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_00H/AFN0_F2_Analysis.cs
new file mode 100644
index 0000000..2801a3c
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_00H/AFN0_F2_Analysis.cs
@@ -0,0 +1,47 @@
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_00H
+{
+ ///
+ /// 5.1.3.2 F2:全部否认
+ ///
+ public class AFN0_F2_Analysis : IAnalysisStrategy>
+ {
+ private readonly ILogger _logger;
+
+ public AFN0_F2_Analysis(ILogger logger)
+ {
+ _logger = logger;
+ }
+ public Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ UnitDataAnalysis dto = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = false,
+ };
+ return Task.FromResult(dto);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"00_2解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_09H/AFN9_F1_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_09H/AFN9_F1_Analysis.cs
new file mode 100644
index 0000000..2e76ae5
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_09H/AFN9_F1_Analysis.cs
@@ -0,0 +1,74 @@
+using DeviceDetectorNET.Class;
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.AFN_00H;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TouchSocket.Core;
+using YamlDotNet.Core;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_09H
+{
+ ///
+ /// 5.9.1.2 F1:终端版本信息
+ ///
+ public class AFN9_F1_Analysis : IAnalysisStrategy>
+ {
+ private readonly ILogger _logger;
+
+ public AFN9_F1_Analysis(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList);
+ var data = AnalysisDataUnit(input.UnitData.HexMessageList);
+ data.AreaCode = input.A.Code?.Substring(0, 4);
+ data.Address = input.A.Code?.Substring(4, 5);
+ UnitDataAnalysis dto = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data= data
+ };
+ return Task.FromResult(dto);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"09_1解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+
+ private AFN9_F1_AnalysisDto AnalysisDataUnit(List hexMessageList)
+ {
+ AFN9_F1_AnalysisDto version = new AFN9_F1_AnalysisDto();
+ version.MakerNo = Encoding.ASCII.GetString(string.Join("", hexMessageList.Skip(4).Take(4).ToList()).HexToByte());//厂商代号
+ version.DeviceNo = Encoding.ASCII.GetString(string.Join("", hexMessageList.Skip(8).Take(8).ToList()).HexToByte()).Replace("\0", "");//设备编号
+ version.SoftwareVersion = Encoding.ASCII.GetString(string.Join("", hexMessageList.Skip(16).Take(4).ToList()).HexToByte());//终端软件版本号
+ version.HardwareVersion = Encoding.ASCII.GetString(string.Join("", hexMessageList.Skip(38).Take(4).ToList()).HexToByte());//终端硬件版本号
+ version.AddDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ var dateArr = hexMessageList.Skip(20).Take(3).ToList();
+ var dateArr2 = hexMessageList.Skip(42).Take(3).ToList();
+ dateArr.Reverse();
+ dateArr2.Reverse();
+ version.SoftwareReleaseDate = $"{DateTime.Now.Year.ToString().Substring(0, 2)}{string.Join("-", dateArr)}";//终端软件发布日期:日月年
+ version.HardwareReleaseDate = $"{DateTime.Now.Year.ToString().Substring(0, 2)}{string.Join("-", dateArr2)}";//终端硬件发布日期:日月年
+ return version;
+ }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_09H/AFN9_F9_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_09H/AFN9_F9_Analysis.cs
new file mode 100644
index 0000000..fefe177
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_09H/AFN9_F9_Analysis.cs
@@ -0,0 +1,51 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.AFN_00H;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_09H
+{
+ ///
+ /// 5.9.2.4.9 F9:远程通信模块版本信息(只读解析SIM卡号)
+ ///
+ public class AFN9_F9_Analysis : IAnalysisStrategy>
+ {
+ private readonly ILogger _logger;
+
+ public AFN9_F9_Analysis(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList);
+ UnitDataAnalysis dto = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = Encoding.ASCII.GetString(string.Join("", input.UnitData.HexMessageList.Skip(30).Take(20).ToList()).HexToByte()).Replace("\0", "") //SIM卡
+ };
+ return Task.FromResult(dto);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"00_1解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F10_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F10_Analysis.cs
new file mode 100644
index 0000000..9f2e384
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F10_Analysis.cs
@@ -0,0 +1,165 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.AFN_09H;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0AH
+{
+ ///
+ /// 5.10.1.3.1 F10:终端电能表/交流采样装置配置参数
+ ///
+ internal class AFN10_F10_Analysis : IAnalysisStrategy>
+ {
+ private readonly ILogger _logger;
+
+ public AFN10_F10_Analysis(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList);
+ Tuple> tuple = AFN10F10EntityAnalysis(input.UnitData.HexMessageList);
+ UnitDataAnalysis dto = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data=new AFN10_F10_AnalysisDto()
+ {
+ AFN10F10Entitys = tuple.Item2,
+ ConfigNum = tuple.Item1
+ }
+ };
+ return Task.FromResult(dto);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0A_10解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+
+
+
+ public Tuple> AFN10F10EntityAnalysis(List hexMessageList)
+ {
+ List> meterList = new List>();
+ int total = $"{hexMessageList[5]}{hexMessageList[4]}".HexToDec();
+ List aFN10F10Entitys = new List();
+ for (int i = 0; i < total; i++)
+ {
+ List sArray = hexMessageList.GetRange(6 + 27 * i, 27);
+ AFN10F10Entity aFN10F10Entity = new AFN10F10Entity()
+ {
+ SerialNum = $"{sArray[1]}{sArray[0]}".HexToDec(),
+ Point = $"{sArray[3]}{sArray[2]}".HexToDec(),
+ RuleType= GetProtocol(sArray[5]),
+ ComAddress= $"{sArray[11]}{sArray[10]}{sArray[9]}{sArray[8]}{sArray[7]}{sArray[6]}",
+ ComPwd= $"{sArray[17]}{sArray[16]}{sArray[15]}{sArray[14]}{sArray[13]}{sArray[12]}".Substring(6, 6),
+ ElectricityRatesNum= sArray[18].HexToBin().Substring(2, 6).BinToDec(),
+ CollectorAddress = $"{sArray[25]}{sArray[24]}{sArray[23]}{sArray[22]}{sArray[21]}{sArray[20]}",
+
+ };
+
+ string baudPort = sArray[4].HexToBin().PadLeft(8, '0'); //波特率和端口号放在一个字节内
+ aFN10F10Entity.BaudRate = GetBaudrate(baudPort.Substring(0, 3));
+ aFN10F10Entity.Port = baudPort.Substring(3, 5).BinToDec();
+
+ string dataDigit = sArray[19].HexToBin().PadLeft(8, '0'); //有功电能示值整数位及小数位个数
+ aFN10F10Entity.IntegerBitsNum = dataDigit.Substring(4, 2).BinToDec() + 4;
+ aFN10F10Entity.DecimalPlacesNum = dataDigit.Substring(6, 2).BinToDec() + 1;
+
+ string classNo = sArray[26].HexToBin().PadLeft(8, '0');//用户大类号及用户小类号
+ aFN10F10Entity.UserCategoryNum = classNo.Substring(0, 4).BinToDec() + 1;
+ aFN10F10Entity.UserCategoryNum = classNo.Substring(4, 4).BinToDec() + 1;
+ aFN10F10Entitys.Add(aFN10F10Entity);
+ }
+ return Tuple.Create(total, aFN10F10Entitys);
+ }
+
+ ///
+ /// 获取波特率
+ ///
+ ///
+ ///
+ private int GetBaudrate(string binBaud)
+ {
+ int baudRate = 0;
+ switch (binBaud)
+ {
+ case "001":
+ baudRate = 600;
+ break;
+ case "010":
+ baudRate = 1200;
+ break;
+ case "011":
+ baudRate = 2400;
+ break;
+ case "100":
+ baudRate = 4800;
+ break;
+ case "101":
+ baudRate = 7200;
+ break;
+ case "110":
+ baudRate = 9600;
+ break;
+ case "111":
+ baudRate = 19200;
+ break;
+ default:
+ baudRate = 0;
+ break;
+ }
+ return baudRate;
+ }
+
+ ///
+ /// 获取通信协议文本说明
+ ///
+ ///
+ ///
+ private string GetProtocol(string protocol)
+ {
+ int dataUnit = protocol.HexToDec();
+
+ if (dataUnit == 1)
+ {
+ return "DL/T 645—1997";
+ }
+ if (dataUnit == 2)
+ {
+ return "交流采样装置通信协议";
+ }
+ if (dataUnit == 30)
+ {
+ return "DL/T 645—2007";
+ }
+ if (dataUnit == 31)
+ {
+ return "串行接口连接窄带低压载波通信模块";
+ }
+ if (dataUnit == 32)
+ {
+ return "CJ/T 188—2018协议";
+ }
+ return "其他协议";
+ }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F66_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F66_Analysis.cs
new file mode 100644
index 0000000..ce2cf12
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F66_Analysis.cs
@@ -0,0 +1,84 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Abstracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0AH
+{
+ ///
+ /// 5.5.1.3.53 F66:定时上报 2 类数据任务设置
+ ///
+ public class AFN10_F66_Analysis : IAnalysisStrategy>
+ {
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN10_F66_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext= analysisStrategyContext;
+ }
+
+ public async Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList);
+ var data = await GenerateFinalResult(input.UnitData.HexMessageList);
+ data.Pn = input.DA.Pn;
+ UnitDataAnalysis dto = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data= data
+ };
+ return await Task.FromResult(dto);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0A_66解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+
+ public async Task GenerateFinalResult(List hexMessageList)
+ {
+ AFN10_F66_AnalysisDto entity = new AFN10_F66_AnalysisDto();
+ var cycleBin = hexMessageList[4].HexToBin().PadLeft(8, '0');
+ var cycleUnitBin = cycleBin.Substring(0, 2);
+ var cycleValueBin = cycleBin.Substring(2, 6);
+
+ entity.Cycle = cycleValueBin.BinToDec();//定时发送周期
+ entity.Unit = cycleUnitBin.BinToDec();//定时发送周期(单位)
+ //TODO:发送基准时间
+ var arrBaseTime = hexMessageList.GetRange(5, 6);
+
+ var baseTimeArrStr = await _analysisStrategyContext.ExecuteAsync, string>("Appendix_A1", arrBaseTime);
+ var baseTimeArr= baseTimeArrStr.Split('_');
+ //entity.BaseTime = DateTime.Parse($"{DateTime.Now.Year.ToString().Substring(0, 2)}{arrBaseTime[0]}-{arrBaseTime[1]}-{arrBaseTime[2]} {arrBaseTime[3]}:{arrBaseTime[4]}:{arrBaseTime[5]}");
+
+ entity.BaseTime = Convert.ToDateTime(baseTimeArr[0]);
+ entity.CurveRatio = hexMessageList[11].HexToDec();
+ var count = hexMessageList[12].HexToDec();
+ var dataArr = hexMessageList.GetRange(13, 4 * count);
+ for (int i = 0; i < count; i++)
+ {
+ var pnfnArr = dataArr.GetRange(0, 4);
+ var tempPn = ProtocolPlugin.CalculatePn(pnfnArr[0], pnfnArr[1]);
+ var tempFn = ProtocolPlugin.CalculateFn(pnfnArr[2], pnfnArr[3]);
+ entity.Details.Add(new SetAutoItemCodeDetails() { Fn = tempFn, Pn = tempPn });
+ dataArr.RemoveRange(0, 4);
+ }
+
+ return entity;
+ }
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F68_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F68_Analysis.cs
new file mode 100644
index 0000000..8b32e24
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0AH/AFN10_F68_Analysis.cs
@@ -0,0 +1,49 @@
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0AH
+{
+ ///
+ /// 5.5.1.3.55 F68:定时上报 2 类数据任务启动/停止设置
+ ///
+ public class AFN10_F68_Analysis : IAnalysisStrategy>
+ {
+ private readonly ILogger _logger;
+
+ public AFN10_F68_Analysis(ILogger logger)
+ {
+ _logger = logger;
+ }
+ public Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList);
+ UnitDataAnalysis dto = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = input.UnitData.HexMessageList[4].Equals("55")
+ };
+
+ return Task.FromResult(dto);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0A_68解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F129_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F129_Analysis.cs
new file mode 100644
index 0000000..e857bcd
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F129_Analysis.cs
@@ -0,0 +1,103 @@
+using JiShe.CollectBus.Common.Enums;
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.85 F129:当前正向有功电能示值(总、费率1~M)
+ ///
+ public class AFN12_F129_Analysis : IAnalysisStrategy>>
+ {
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F129_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+ public async Task>> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ List datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
+ List list = GenerateFinalResult(2, datas, "正向有功电能示值", input.AFN_FC.AFN, input.DT.Fn);
+ UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis>
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = list
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_129解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+
+ #region 单元数据值解析
+ ///
+ /// 单元数据值解析
+ ///
+ ///
+ private async Task> AnalysisDataUnitAsync(List hexMessageList)
+ {
+ List values = new List();
+ values.Add(hexMessageList.GetReadTime(4, 5));
+ int rationgCount = hexMessageList.GetRatingCount(9, 1);
+ values.Add(rationgCount.ToString());
+ for (int i = 0; i < rationgCount + 1; i++)
+ {
+ var arr = hexMessageList.GetRange(10 + (i * 5), 5);
+ var errorCode = arr.CheckErrorCode();
+ if (errorCode != null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, decimal>(nameof(Appendix_A14), arr); //从第10个开始,每加5个字节为下一个值的开始
+ values.Add(value.ToString());
+ }
+ }
+ return values;
+ }
+ #endregion
+
+ public List GenerateFinalResult(int index, List data, string remark = "", int afn = 0, int fn = 0)
+ {
+ List list = new List();
+ for (int i = index; i < data.Count; i++)
+ {
+ AFN12_F129_AnalysisDto meter = new AFN12_F129_AnalysisDto();
+
+ decimal value = 0;
+ var errorCode = data[i].CheckErrorCode();
+ if (errorCode != null)
+ meter.ValidData = false;
+ else
+ decimal.TryParse(data[i], out value);
+ meter.DataValue = value;
+
+ meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
+ meter.ReadTime = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
+ list.Add(meter);
+ }
+ return list;
+ }
+
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F130_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F130_Analysis.cs
new file mode 100644
index 0000000..0afadc6
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F130_Analysis.cs
@@ -0,0 +1,94 @@
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.86 F130:当前正向无功(组合无功 1)电能示值(总、费率 1~M)
+ ///
+ public class AFN12_F130_Analysis : IAnalysisStrategy>>
+ {
+
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F130_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+ public async Task>> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ List datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
+ List list = GenerateFinalResult(2, datas, "正向无功电能示值", input.AFN_FC.AFN, input.DT.Fn);
+ UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis>
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = list
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_130解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+
+ private async Task> AnalysisDataUnitAsync(List hexMessageList)
+ {
+ List values = new List();
+ values.Add(hexMessageList.GetReadTime(4, 5));
+ int ratingCount = hexMessageList.GetRatingCount(9, 1);
+ values.Add(ratingCount.ToString());
+ for (int i = 0; i < ratingCount + 1; i++)
+ {
+ var arr = hexMessageList.GetRange(10 + (i * 4), 4);
+ var errorCode = arr.CheckErrorCode();
+ if (errorCode != null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, decimal>(nameof(Appendix_A11), arr); //从第10个开始,每加5个字节为下一个值的开始
+ values.Add(value.ToString());
+ }
+ }
+ return values;
+ }
+ public List GenerateFinalResult(int index, List data, string remark = "", int afn = 0, int fn = 0)
+ {
+ List list = new List();
+ for (int i = index; i < data.Count; i++)
+ {
+ AFN12_F130_AnalysisDto meter = new AFN12_F130_AnalysisDto();
+ decimal value = 0;
+ var errorCode = data[i].CheckErrorCode();
+ if (errorCode != null)
+ meter.ValidData = false;
+ else
+ decimal.TryParse(data[i], out value);
+ meter.DataValue = value;
+ meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
+ meter.ReadTime = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
+ list.Add(meter);
+ }
+ return list;
+ }
+
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F131_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F131_Analysis.cs
new file mode 100644
index 0000000..c52e7e3
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F131_Analysis.cs
@@ -0,0 +1,94 @@
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.87 F131:当前反向有功电能示值(总、费率 1~M)
+ ///
+ public class AFN12_F131_Analysis : IAnalysisStrategy>>
+ {
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F131_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+ public async Task>> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ List datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
+ List list = GenerateFinalResult(2, datas, "反向有功总电能示值", input.AFN_FC.AFN, input.DT.Fn);
+ UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis>
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = list
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_131解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}");
+ return null;
+ }
+
+ }
+
+ private async Task> AnalysisDataUnitAsync(List hexMessageList)
+ {
+ List values = new List();
+ values.Add(hexMessageList.GetReadTime(4, 5));
+ int ratingCount = hexMessageList.GetRatingCount(9, 1);
+ values.Add(ratingCount.ToString());
+ for (int i = 0; i < ratingCount + 1; i++)
+ {
+ var arr = hexMessageList.GetRange(10 + (i * 5), 5);
+ var errorCode = arr.CheckErrorCode();
+ if (errorCode != null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, decimal>(nameof(Appendix_A14), arr); //从第10个开始,每加5个字节为下一个值的开始
+ values.Add(value.ToString());
+ }
+ }
+ return values;
+ }
+ public List GenerateFinalResult(int index, List data, string remark = "", int afn = 0, int fn = 0)
+ {
+ List list = new List();
+ for (int i = index; i < data.Count; i++)
+ {
+ AFN12_F131_AnalysisDto meter = new AFN12_F131_AnalysisDto();
+ decimal value = 0;
+ var errorCode = data[i].CheckErrorCode();
+ if (errorCode != null)
+ meter.ValidData = false;
+ else
+ decimal.TryParse(data[i], out value);
+ meter.DataValue = value;
+ meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
+ meter.ReadTime = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
+ list.Add(meter);
+ }
+ return list;
+ }
+
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F132_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F132_Analysis.cs
new file mode 100644
index 0000000..85c3f88
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F132_Analysis.cs
@@ -0,0 +1,95 @@
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.88 F132:当前反向无功(组合无功 2)电能示值(总、费率 1~M)
+ ///
+ public class AFN12_F132_Analysis : IAnalysisStrategy>>
+ {
+
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F132_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+
+ public async Task>> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ List datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
+ List list = GenerateFinalResult(2, datas, "反向无功电能示值", (int)input.AFN_FC.AFN!, (int)input.DT.Fn!);
+ UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis>
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn ,
+ Pn = input.DA.Pn,
+ Data = list
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_132解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}");
+ return null;
+ }
+
+ }
+ private async Task> AnalysisDataUnitAsync(List hexMessageList)
+ {
+ List values = new List();
+ values.Add(hexMessageList.GetReadTime(4, 5));
+ int ratingCount = hexMessageList.GetRatingCount(9, 1);
+ values.Add(ratingCount.ToString());
+ for (int i = 0; i < ratingCount + 1; i++)
+ {
+ var arr = hexMessageList.GetRange(10 + (i * 4), 4);
+ var errorCode = arr.CheckErrorCode();
+ if (errorCode != null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, decimal>(nameof(Appendix_A11), arr); //从第10个开始,每加4个字节为下一个值的开始
+ values.Add(value.ToString());
+ }
+ }
+ return values;
+ }
+ public List GenerateFinalResult(int index, List data, string remark = "",int afn=0,int fn=0)
+ {
+ List list = new List();
+ for (int i = index; i < data.Count; i++)
+ {
+ AFN12_F132_AnalysisDto meter = new AFN12_F132_AnalysisDto();
+ decimal value = 0;
+ var errorCode = data[i].CheckErrorCode();
+ if (errorCode != null)
+ meter.ValidData = false;
+ else
+ decimal.TryParse(data[i], out value);
+ meter.DataValue = value;
+ meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
+ meter.ReadTime = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
+ list.Add(meter);
+ }
+ return list;
+ }
+
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F145_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F145_Analysis.cs
new file mode 100644
index 0000000..6a3d126
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F145_Analysis.cs
@@ -0,0 +1,108 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.101 F145:当月正向有功最大需量及发生时间(总、费率 1~M)
+ ///
+ public class AFN12_F145_Analysis : IAnalysisStrategy>
+ {
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F145_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+
+ public async Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ List datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
+ AFN12_F145_AnalysisDto data = GenerateFinalResult(2, datas, "当月正向有功最大需量及发生时间");
+ data.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
+ UnitDataAnalysis unitDataAnalysis = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = data
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_145解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}");
+ return null;
+ }
+
+ }
+
+ private async Task> AnalysisDataUnitAsync(List hexMessageList)
+ {
+ List values = new List();
+ values.Add(hexMessageList.GetReadTime(4, 5));
+ int ratingCount = hexMessageList.GetRatingCount(9, 1);
+ values.Add(ratingCount.ToString());
+ for (int i = 0; i < ratingCount + 1; i++)
+ {
+ var arr = hexMessageList.GetRange(10 + i * 7, 3);
+ var errorCode = arr.CheckErrorCode();
+ if (errorCode != null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, decimal>(nameof(Appendix_A23), arr);
+ values.Add(value.ToString());//正向有功总最大需量
+ }
+ arr = hexMessageList.GetRange(10 + i * 7 + 3, 4);
+
+ errorCode = arr.CheckErrorCode();
+ if (errorCode != null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, string>(nameof(Appendix_A17), arr);
+ values.Add(value.ToString());//正向有功总最大需量发生时间
+ }
+ }
+ return values;
+ }
+
+ public AFN12_F145_AnalysisDto GenerateFinalResult(int index, List data, string remark = "")
+ {
+ AFN12_F145_AnalysisDto dto = new AFN12_F145_AnalysisDto();
+
+ decimal value = 0;
+ var errorCode = data[2].CheckErrorCode();
+ if (errorCode != null)
+ dto.ValidData = false;
+ else
+ decimal.TryParse(data[2], out value);
+
+ dto.DataValue = value;
+ dto.TimeSpan = $"{DateTime.Now.Year}-{data[3].Substring(0, 2)}-{data[3].Substring(2, 2)} {data[3].Substring(4, 2)}:{data[3].Substring(6, 2)}:00";//$"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)}";
+ if (DateTime.TryParse(dto.TimeSpan, out DateTime readingDate))
+ {
+ dto.ReadingDate = readingDate;
+ }
+ return dto;
+ }
+
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F149_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F149_Analysis.cs
new file mode 100644
index 0000000..986d52b
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F149_Analysis.cs
@@ -0,0 +1,120 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+using System.Threading.Tasks;
+using Volo.Abp.Domain.Entities;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.105 F149:上月(上一结算日)正向有功最大需量及发生时间(总、费率 1~M)
+ ///
+ public class AFN12_F149_Analysis : IAnalysisStrategy>
+ {
+
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F149_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+
+ public async Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ List datas = await AnalysisDataUnit(input.UnitData.HexMessageList);
+ AFN12_F149_AnalysisDto data = GenerateFinalResult(2, datas, "上月(上一结算日)正向有功最大需量及发生时间");
+ data.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
+ UnitDataAnalysis unitDataAnalysis = new UnitDataAnalysis
+ {
+ Code = input.A?.Code,
+ AFN = input.AFN_FC?.AFN ?? 0,
+ Fn = input.DT?.Fn ?? 0,
+ Pn = input.DA?.Pn ?? 0,
+ Data = data
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_149解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}");
+ return null;
+ }
+
+ }
+ private async Task> AnalysisDataUnit(List hexMessageList)
+ {
+ List values = new List();
+ values.Add(hexMessageList.GetReadTime(4, 5));
+ int ratingCount = hexMessageList.GetRatingCount(9, 1);
+ values.Add(ratingCount.ToString());
+ for (int i = 0; i < ratingCount + 1; i++)
+ {
+ var arr = hexMessageList.GetRange(10 + i * 7, 3);
+ var errorCode = arr.CheckErrorCode();
+ if (errorCode!=null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, decimal>(nameof(Appendix_A23), arr);
+ values.Add(value.ToString());//正向有功总最大需量
+ }
+
+ arr = hexMessageList.GetRange(13 + i * 7, 4);
+
+ errorCode = arr.CheckErrorCode();
+ if (errorCode != null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, string>(nameof(Appendix_A17), arr);//正向有功总最大需量发生时间
+ values.Add(value);//正向有功总最大需量
+ }
+ }
+ return values;
+ }
+ public AFN12_F149_AnalysisDto GenerateFinalResult(int index, List data, string remark = "")
+ {
+ AFN12_F149_AnalysisDto dto = new AFN12_F149_AnalysisDto();
+
+ var errorCodeInfo = data[2].CheckErrorCode();
+ if (errorCodeInfo != null)
+ dto.ValidData = false;
+ decimal.TryParse(data[2], out decimal value);
+ dto.DataValue = value;
+
+ //TODO:最大需量发生时间
+ errorCodeInfo = data[3].CheckErrorCode();
+ if (data[3].Length != 8 && errorCodeInfo != null)
+ dto.ValidData = false;
+ else
+ dto.TimeSpan = $"{DateTime.Now.Year}-{data[3].Substring(0, 2)}-{data[3].Substring(2, 2)} {data[3].Substring(4, 2)}:{data[3].Substring(6, 2)}:00";
+
+
+ //TODO:时间标
+ if (!DateTime.TryParse(dto.TimeSpan, out DateTime readingDate))
+ dto.ValidData = false;
+ dto.ReadingDate = readingDate;
+ if (DateTime.Now.Month.Equals(1))//如果为1月份,则日期减去1年
+ {
+ dto.ReadingDate = dto.ReadingDate.AddYears(-1);
+ dto.TimeSpan = dto.ReadingDate.ToString("yyyy-MM-dd HH:mm:ss");
+ }
+ return dto;
+ }
+
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F188_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F188_Analysis.cs
new file mode 100644
index 0000000..45f455d
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F188_Analysis.cs
@@ -0,0 +1,73 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 水表抄读取
+ ///
+ public class AFN12_F188_Analysis : IAnalysisStrategy>
+ {
+
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F188_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+ public async Task> ExecuteAsync(TB3761 input)
+ {
+
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ ArgumentNullException.ThrowIfNull(input.AFN_FC.AFN);
+ ArgumentNullException.ThrowIfNull(input.DT.Fn);
+ var data = GenerateFinalResult(input.UnitData.HexMessageList);
+ data.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
+ UnitDataAnalysis dto = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = data
+ };
+ return await Task.FromResult(dto);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_188解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+ public AFN12_F149_AnalysisDto GenerateFinalResult(List hexMessageList)
+ {
+ AFN12_F149_AnalysisDto dto = new AFN12_F149_AnalysisDto();
+ decimal value = 0;
+ var arr = hexMessageList.GetRange(11, 4);
+ var errorCodeInfo = arr.CheckErrorCode();
+ if (errorCodeInfo != null)
+ {
+ dto.ValidData = false;
+ dto.ErrorCodeMsg = errorCodeInfo.Item2;
+ }
+ else
+ decimal.TryParse($"{arr[11]}{arr[12]}{arr[13]}.{arr[14]}", out value);
+
+ dto.DataValue = value;
+ //dto.ReadTime = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
+ return dto;
+ }
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F25_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F25_Analysis.cs
new file mode 100644
index 0000000..f3fd66b
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F25_Analysis.cs
@@ -0,0 +1,120 @@
+using JiShe.CollectBus.Common.Enums;
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Volo.Abp.Domain.Entities;
+using YamlDotNet.Core.Tokens;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.22 F25:当前三相及总有/无功功率、功率因数,三相电压、电流、零序电流、视在功率
+ ///
+ public class AFN12_F25_Analysis : IAnalysisStrategy>>
+ {
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F25_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+ public List DataType { get; set; } = new List() { "YGGL", "YGGL_A", "YGGL_B", "YGGL_C", "WGGL", "WGGL_A", "WGGL_B", "WGGL_C", "GLYS", "GLYS_A", "GLYS_B", "GLYS_C", "DY_A", "DY_B", "DY_C", "DL_A", "DL_B", "DL_C", "LXDL", "SZGL", "SZGL_A", "SZGL_B", "SZGL_C" };
+
+ public async Task>> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ List remarks = new List() { "当前总有功功率", "当前A相有功功率", "当前B相有功功率", "当前C相有功功率", "当前总无功功率", "当前A相无功功率", "当前B相无功功率", "当前C相无功功率", "当前总功率因数", "当前A相功率因数", "当前B相功率因数", "当前C相功率因数", "当前A相电压", "当前B相电压", "当前C相电压", "当前A相电流", "当前C相电流", "当前 C相电流", "当前零序电流", "当前总视在功率", "当前A相视在功率", "当前B相视在功率", "当前C相视在功率" };
+ List list = new List();
+ List data = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
+
+ for (int i = 1; i < data.Count; i++)
+ {
+ AFN12_F25_AnalysisDto dto = new AFN12_F25_AnalysisDto();
+ decimal value = 0;
+ var errorCodeInfo = data[i].CheckErrorCode();
+ if (errorCodeInfo != null)
+ {
+ dto.ValidData = false;
+ dto.ErrorCodeMsg = errorCodeInfo.Item2;
+ }
+ else
+ decimal.TryParse(data[i], out value);
+ dto.DataValue = value;
+ dto.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}_{DataType[i-1]}";
+ dto.FiledName = DataType[i - 1];
+ dto.ReadTime = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
+ dto.FiledDesc = remarks[i - 1];
+ list.Add(dto);
+ }
+ UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis>
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = list
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_25解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+
+ private async Task> AnalysisDataUnitAsync(List hexMessageList)
+ {
+ List values = new List();
+ values.Add(hexMessageList.GetReadTime(4, 5));
+ values.AddRange(await CutOutAsync(9, 8, 3, nameof(Appendix_A9), hexMessageList));//解析 总/ABC相有功/无功功率
+ values.AddRange(await CutOutAsync(33, 4, 2, nameof(Appendix_A5), hexMessageList));//解析 总/ABC相功率因数
+ values.AddRange(await CutOutAsync(41, 3, 2, nameof(Appendix_A7), hexMessageList));//ABC相电压
+ values.AddRange(await CutOutAsync(47, 4, 3, nameof(Appendix_A25), hexMessageList));//ABC相/零序电流
+ values.AddRange(await CutOutAsync(59, 4, 3, nameof(Appendix_A9), hexMessageList));//总视\ABC相视在功率
+ return values;
+ }
+ ///
+ /// 截取值
+ ///
+ /// 开始位置
+ /// 总项数
+ /// 每项字节数
+ /// 解析方式
+ /// 解析数据
+ private async Task> CutOutAsync(int Index, int count, int byteCount, string appendixName, List hexMessageList)
+ {
+ List values = new List();
+ var temp = hexMessageList.GetRange(Index, count * byteCount);//截取位置(9),解析项*截取字节数(8*3)
+ for (int i = 0; i < count; i++)
+ {
+ var arr = temp.GetRange(i * byteCount, byteCount);
+ var errorCode = arr.CheckErrorCode();
+ if (errorCode!=null)
+ values.Add(errorCode.Item1);
+ else
+ {
+ var value = await _analysisStrategyContext.ExecuteAsync, decimal>(appendixName, arr);
+ values.Add(value.ToString());
+ }
+ }
+ return values;
+ }
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F2_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F2_Analysis.cs
new file mode 100644
index 0000000..bd034c6
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F2_Analysis.cs
@@ -0,0 +1,72 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.1 F2:终端日历时钟
+ ///
+ public class AFN12_F2_Analysis : IAnalysisStrategy>
+ {
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F2_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+ public async Task> ExecuteAsync(TB3761 input)
+ {
+
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
+ var data= await GenerateFinalResultAsync(input.UnitData.HexMessageList);
+ data.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
+ UnitDataAnalysis dto = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = data
+ };
+ return await Task.FromResult(dto);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_2解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+
+ public async Task GenerateFinalResultAsync(List hexMessageList)
+ {
+ AFN12_F2_AnalysisDto dto = new AFN12_F2_AnalysisDto();
+ var arr = hexMessageList.GetRange(4, 6);
+ var errorCodeInfo = arr.CheckErrorCode();
+ if (errorCodeInfo != null)
+ {
+ dto.ValidData = false;
+ dto.ErrorCodeMsg = errorCodeInfo.Item2;
+ }
+ else
+ dto.DataValue = await _analysisStrategyContext.ExecuteAsync, string>(nameof(Appendix_A1), arr);
+
+ dto.FiledName = "TerminalTime";
+ dto.FiledDesc = "召读终端时间";
+ return await Task.FromResult(dto);
+ }
+
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F33_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F33_Analysis.cs
new file mode 100644
index 0000000..12d49fc
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F33_Analysis.cs
@@ -0,0 +1,124 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.30 F33:当前正向有/无功电能示值、一/四象限无功电能示值(总、费率 1~M,1≤M≤12)
+ ///
+ public class AFN12_F33_Analysis : IAnalysisStrategy>
+ {
+ private List DataUnitHexList { get; set; }=new List();
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F33_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+
+ public async Task> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+ ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList);
+ int rationgCount = input.UnitData.HexMessageList!.GetRatingCount(23, 1);
+
+ DataUnitHexList = input.UnitData.HexMessageList.GetRange(24, (5 * (rationgCount + 1)) + (4 * (rationgCount + 1)) * 3);
+ GetDataUnitHexString(input.UnitData.HexMessageList, rationgCount);
+ UnitDataAnalysis unitDataAnalysis = new UnitDataAnalysis
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data = await AnalysisDataUnit(input.UnitData.HexMessageList, rationgCount)
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_33解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+
+ #region 获取当前正向有/无功电能示值数据单元格式 private void GetDataUnitHexString(int rationgCount)
+ private void GetDataUnitHexString(List hexMessageList, int rationgCount)
+ {
+ //(5*(x+1))+(4*(x+1))*3
+ var lenght = (5 * (rationgCount + 1)) + (4 * (rationgCount + 1)) * 3;//(rationgCount * 5 + 5) + (4 * 3) + (rationgCount * 4) * 2;//费率数(R):4 公式:5+5+(费率数*5)+ (4+(费率数*4))*2
+ DataUnitHexList = hexMessageList.GetRange(24, lenght);
+ }
+ #endregion
+
+ #region 单元数据值解析 private F33Entity AnalysisDataUnit()
+ private async Task AnalysisDataUnit(List hexMessageList, int rationgCount)
+ {
+ AFN12_F33_AnalysisDto f33Entity = new AFN12_F33_AnalysisDto();
+ f33Entity.ReadTime = hexMessageList.GetReadTime(18, 5); // 终端抄表时间
+ f33Entity.RatingCount = hexMessageList.GetRatingCount(23, 1); // 费率数 M(1≤M≤12)
+ f33Entity.F_A_Kwh = await GetDataAsync(f33Entity.RatingCount, 0, 5, nameof(Appendix_A14));//当前正向有功总电能示值
+ f33Entity.R_R_Kvarh = await GetDataAsync(f33Entity.RatingCount, 25, 4, nameof(Appendix_A11));//当前正向无功(组合无功1)总电能示值 0+5*5
+ f33Entity.Q1_R_Kvarh = await GetDataAsync(f33Entity.RatingCount, 45, 4, nameof(Appendix_A11));//当前一象限无功总电能示值 25+4*5
+ f33Entity.Q4_R_Kvarh = await GetDataAsync(f33Entity.RatingCount, 65, 4, nameof(Appendix_A11));//当前四象限无功总电能示值 45+4*5
+ return f33Entity;
+ }
+ #region 有功/无功、费率总电能示值
+ ///
+ /// 有功/无功、费率总电能示值
+ ///
+ /// 费率数
+ /// 开始位置
+ /// 长度
+ ///
+ private async Task GetDataAsync(int ratingCount, int startIndex, int len, string appendxName)
+ {
+ ParentNodes parent = new ParentNodes();
+ var value = await _analysisStrategyContext.ExecuteAsync, decimal>(appendxName, DataUnitHexList.GetRange(startIndex, len));
+ parent.Total_Value = value;
+ parent.childNodes = await GetChildDataAsync(ratingCount, startIndex, len, appendxName);
+ return parent;
+ }
+
+ ///
+ /// 费率总电能示值
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private async Task> GetChildDataAsync(int RatingCount, int startIndex, int len, string appendxName)
+ {
+ List children = new List();
+ for (int i = 0; i < RatingCount; i++)
+ {
+ ChildNodes model = new ChildNodes()
+ {
+ Value = await _analysisStrategyContext.ExecuteAsync, decimal>(appendxName, DataUnitHexList.GetRange((i * len) + (startIndex + len), len)) //29,4 33,4 37,4 41,4
+ };
+ children.Add(model);
+ }
+ return children;
+ }
+
+
+ #endregion
+
+
+ #endregion
+
+ }
+}
diff --git a/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F49_Analysis.cs b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F49_Analysis.cs
new file mode 100644
index 0000000..14b46ad
--- /dev/null
+++ b/protocols/JiShe.CollectBus.Protocol/AnalysisData/AFN_0CH/AFN12_F49_Analysis.cs
@@ -0,0 +1,95 @@
+using JiShe.CollectBus.Common.Extensions;
+using JiShe.CollectBus.Protocol.AnalysisData.Appendix;
+using JiShe.CollectBus.Protocol.Contracts;
+using JiShe.CollectBus.Protocol.Contracts.Interfaces;
+using JiShe.CollectBus.Protocol.Contracts.Models;
+using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
+using JiShe.CollectBus.Protocol.Dto;
+using Microsoft.Extensions.Logging;
+
+namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0CH
+{
+ ///
+ /// 5.12.2.4.46 F49:当前电压、电流相位角
+ ///
+ public class AFN12_F49_Analysis : IAnalysisStrategy>>
+ {
+ private readonly ILogger _logger;
+ private readonly AnalysisStrategyContext _analysisStrategyContext;
+
+ public AFN12_F49_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext)
+ {
+ _logger = logger;
+ _analysisStrategyContext = analysisStrategyContext;
+ }
+
+ public List DataType { get; set; } = new List() { "Uab_Ua", "Ub", "Ucb_Uc", "Ia", "Ib", "Ic" };
+
+ public async Task>> ExecuteAsync(TB3761 input)
+ {
+ try
+ {
+ ArgumentNullException.ThrowIfNull(input);
+
+ List data = await AnalysisDataUnitAsync(input.UnitData?.HexMessageList!);
+ List remarks = new List() { "Uab/Ua 相位角", "Ub 相位角", "Ucb/Uc 相位角", "Ia 相位角", "Ib 相位角", "Ic 相位角" };
+ List list = new List();
+ for (int i = 0; i < data.Count; i++)
+ {
+ AFN12_F49_AnalysisDto dto = new AFN12_F49_AnalysisDto();
+ decimal value = 0;
+ var errorCodeInfo = data[i].CheckErrorCode();
+ if (errorCodeInfo != null)
+ {
+ dto.ValidData = false;
+ dto.ErrorCodeMsg = errorCodeInfo.Item2;
+ }
+ else
+ decimal.TryParse(data[i], out value);
+ dto.DataValue = value;
+
+ dto.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}_{DataType[i]}";
+ dto.FiledName = DataType[i];
+ dto.FiledDesc= remarks[i];
+ list.Add(dto);
+ }
+ UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis>
+ {
+ Code = input.A.Code,
+ AFN = input.AFN_FC.AFN,
+ Fn = input.DT.Fn,
+ Pn = input.DA.Pn,
+ Data= list
+ };
+
+ return await Task.FromResult(unitDataAnalysis);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"0C_49解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}");
+ return null;
+ }
+ }
+ private async Task> AnalysisDataUnitAsync(List