This commit is contained in:
Dai Mr 2024-11-22 14:12:43 +08:00
parent ded12729d9
commit 66814a4fae
4 changed files with 148 additions and 42 deletions

View File

@ -153,6 +153,9 @@
/// </summary>
Odd
}
/// <summary>
/// 数据位
/// </summary>
public enum DataBit
{
D5 = 0,

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace JiShe.CollectBus.Common.Enums
{
public enum CommandChunkEnum188
{
A = 2,
C=9,
L=10,
DI=11,
Data=14
}
}

View File

@ -138,15 +138,18 @@ namespace JiShe.CollectBus.Common.Extensions
var bytes = BuildSendCommandBytes(reqParameter, dataUnit);
}
/// <summary>
/// 构建透明转发-下发数据单元
/// </summary>
/// <param name="port">终端通信端口 1~31</param>
/// <param name="baudRate">0~7 对应300,600,1200,2400,4800,7200,9600,19200</param>
/// <param name="stopBit"></param>
/// <param name="parity"></param>
/// <param name="dataBit"></param>
/// <param name="stopBit">停止位</param>
/// <param name="parity">校验方式</param>
/// <param name="dataBit">数据位</param>
/// <param name="waitContentTimeout">等待报文超时时间/s</param>
/// <param name="waitByteTimeout">等待字节超时时间/ms</param>
/// <param name="datas">转发内容</param>
/// <returns></returns>
public static List<string> BuildTransparentForwardingSendDataUnit(int port, BaudRate baudRate, StopBit stopBit, Parity parity, DataBit dataBit,
int waitContentTimeout, int waitByteTimeout, List<string> datas)
@ -492,25 +495,26 @@ namespace JiShe.CollectBus.Common.Extensions
/// 构建电表阀控下发数据单元
/// </summary>
/// <param name="address">电表地址</param>
/// <param name="specialnoode">特殊控制码</param>
/// <param name="specialControlCode">特殊控制码</param>
/// <param name="password">密码</param>
/// <param name="state">是否为开阀</param>
/// <param name="modelCode">型号码</param>
/// <returns></returns>
public static List<string> BuildAmmeterValveControlSendDataUnit(string address, string specialnocode, string password, bool state, string modelCode = "")
public static List<string> BuildAmmeterValveControlSendDataUnit(string address, string specialControlCode, string password, bool state, string modelCode = "")
{
var code = string.Empty;
if (state)
{
if (string.IsNullOrEmpty(specialnocode))
if (string.IsNullOrEmpty(specialControlCode))
code = "1B";
else
code = specialnocode == "1B" || specialnocode == "1C" ? specialnocode : "1C";
code = specialControlCode == "1B" || specialControlCode == "1C" ? specialControlCode : "1C";
}
else
code = "1A";//跳闸
if (specialnocode == "1W")
if (specialControlCode == "1W")
{
if (state)
code = "1A";
@ -532,12 +536,12 @@ namespace JiShe.CollectBus.Common.Extensions
}
var strDate = DateTime.Now.AddYears(3).ToString("000012ddMMyy").StrAddSpan();//命令有效截止时间
if (specialnocode == "1D" || modelCode == "SZBD_DDZY1225")
if (specialControlCode == "1D" || modelCode == "SZBD_DDZY1225")
strDate = "FF FF FF FF FF FF";
var strP = password.StrAddSpan().StrReverseOrder();
var strSJY = " " + pwdLevel + " " + strP + " 01 00 00 00 " + code + " 00 " + strDate;
var dataUnit = strSJY.Replace(" ", "").StringToPairs();
var dataList = BuildSendCommand(address, "1C", dataUnit);
var dataList = Build645SendCommand(address, "1C", dataUnit);
return dataList;
//string strLen = (strSJY.Replace(" ", "").Length / 2).ToString("X2");
@ -552,31 +556,24 @@ namespace JiShe.CollectBus.Common.Extensions
/// </summary>
/// <param name="address">电表地址</param>
/// <param name="password"></param>
/// <param name="state"></param>
/// <param name="state">true 保电 false 保电解除</param>
/// <param name="modelCode">型号码</param>
/// <returns></returns>
public static List<string> BuildAmmeterLockSendDataUnit(string address, string password, bool state, string modelCode = "")
{
string code = string.Empty;
if (state)
code = "3A";
else
code = "3B";
string strDate = (code + DateTime.Now.AddDays(1).ToString("00000012ddMMyy")).StrAddSpan();
var code = state ? "3A" : "3B";
var strDate = (code + DateTime.Now.AddDays(1).ToString("00000012ddMMyy")).StrAddSpan();
if (modelCode == "SZBD_DDZY1225")
strDate = $"{code} 00 FF FF FF FF FF FF";
string strP = password.StrAddSpan().StrReverseOrder();
string strSJY = " 02 " + strP + " 01 00 00 00 " + strDate;
var strP = password.StrAddSpan().StrReverseOrder();
var strSJY = " 02 " + strP + " 01 00 00 00 " + strDate;
var dataUnit = strSJY.Replace(" ", "").StringToPairs();
var dataList = BuildSendCommand(address, "1C", dataUnit);
var dataList = Build645SendCommand(address, "1C", dataUnit);
return dataList;
//string strLen = (strSJY.Replace(" ", "").Length / 2).ToString("X2");
//string strReturn = "68 " + address.StrAddSpan().StrReverseOrder() + " 68 1C " + strLen + " " + strSJY.StrAddHex33() + " ";
//string strSum = strReturn.Split(new string[] { " " }, System.StringSplitOptions.RemoveEmptyEntries).Select(i => Convert.ToInt32(i, 16)).Sum().ToString("X");
//strReturn += strSum.Substring(strSum.Length - 2) + " 16";
//return strReturn.Split(' ').ToList();
}
/// <summary>
@ -586,19 +583,19 @@ namespace JiShe.CollectBus.Common.Extensions
/// <param name="controlCode">控制码</param>
/// <param name="dataUnit">数据域 发送方按字节进行加33处理接收方按字节减33</param>
/// <returns></returns>
public static List<string> BuildSendCommand(string ammeterAddress, string controlCode, List<string>? dataUnit)
public static List<string> Build645SendCommand(string ammeterAddress, string controlCode, List<string>? dataUnit)
{
var cmdStrList = new List<string>();
cmdStrList.Add(startStr);
ammeterAddress = ammeterAddress.PadLeft(12, '0');
var addressList = ammeterAddress.StringToPairs();
var addressList = ammeterAddress.StringToPairs();
addressList.Reverse();
cmdStrList.AddRange(addressList);
cmdStrList.Add(startStr);
var len = dataUnit != null ? dataUnit.Count.DecToHex().PadLeft(2,'0') : "00";
var len = dataUnit != null ? dataUnit.Count.DecToHex().PadLeft(2, '0') : "00";
cmdStrList.Add(len);
if (dataUnit != null)
{
@ -634,25 +631,75 @@ namespace JiShe.CollectBus.Common.Extensions
#endregion
#region 188
/// <summary>
/// 标准 188协议阀控 WaterMeterSend
/// </summary>
/// <param name="address"></param>
/// <param name="mtype"></param>
/// <param name="waterMeterAddress"></param>
/// <param name="mtype">表计类型</param>
/// <returns></returns>
public static List<string> Confirm188WaterValve(string address, bool state, string mtype = "10")
public static List<string> BuildConfirm188WaterValve(string waterMeterAddress, bool state, string mtype = "10")
{
if (string.IsNullOrWhiteSpace(address)) return null;
var frm = $"68 {mtype} [00 00 00 00 00 00 00] 04 04 A0 17 00 {(state ? "55" : "99")} 21 16".Split(' ').ToList();
address = address.PadLeft(14, '0');
int n = 0;
for (int i = 7; i > 0; i--)
if (string.IsNullOrWhiteSpace(waterMeterAddress)) return null;
var dataUnit = new List<string>() { "A0", "17", "00", state ? "55" : "99" };
var dataList = Build188SendCommand(waterMeterAddress, "04", dataUnit);
return dataList;
}
/// <summary>
/// 构建188水表抄读下发数据单元
/// </summary>
/// <param name="waterMeterAddress"></param>
/// <returns></returns>
public static List<string> Build188WaterMeterReadingSendDataUnit(string waterMeterAddress)
{
//TODO:90 1F 还是1F 90
var dataUnit = new List<string>() { "90", "1F", "00" };
var dataList = Build188SendCommand(waterMeterAddress, "01", dataUnit);
return dataList;
}
/// <summary>
/// 构建188协议下发命令
/// </summary>
/// <param name="waterMeterAddress">水表地址</param>
/// <param name="controlCode">控制码</param>
/// <param name="dataUnit">数据域</param>
/// <param name="meterType">表类型</param>
/// <returns></returns>
public static List<string> Build188SendCommand(string waterMeterAddress, string controlCode, List<string>? dataUnit = null, string meterType = "10")
{
var cmdStrList = new List<string>();
cmdStrList.Add(startStr);
cmdStrList.Add(meterType);
waterMeterAddress = waterMeterAddress.PadLeft(14, '0');
var addressList = waterMeterAddress.StringToPairs();
addressList.Reverse();
cmdStrList.AddRange(addressList);
//控制码
cmdStrList.Add(controlCode);
var len = dataUnit != null ? dataUnit.Count.DecToHex().PadLeft(2, '0') : "00";
cmdStrList.Add(len);
if (dataUnit != null)
{
frm[i + 1] = address.Substring(n, 2);
n += 2;
cmdStrList.AddRange(dataUnit);
}
frm[frm.Count - 2] = GetCRC(frm.Take(frm.Count - 2).ToList());
return frm;
var strSum = cmdStrList.Select(i => Convert.ToInt32(i, 16)).Sum().ToString("X");
strSum = strSum.Substring(strSum.Length - 2);
cmdStrList.Add(strSum);
cmdStrList.Add(endStr);
return cmdStrList;
}
public static string GetCRC(List<string> inputFrm, int startIndex = 0)
@ -666,5 +713,45 @@ namespace JiShe.CollectBus.Common.Extensions
return sum16.Substring(sum16.Length - 2, 2).ToUpper();
}
public static object GetAnalyzeValue(this List<string> hexStringList, CommandChunkEnum188 chunk)
{
if (hexStringList.Count < 11)
{
return null;
}
switch (chunk)
{
case CommandChunkEnum188.A:
var aHexList = hexStringList[(int)CommandChunkEnum188.A].Take(7).ToList();
aHexList.Reverse();
return string.Join("", aHexList.Skip(1).Take(6).ToList());
case CommandChunkEnum188.C:
var cHex = hexStringList[(int)CommandChunkEnum188.C];
return cHex;
case CommandChunkEnum188.Data:
var lenIndex = (int)CommandChunkEnum188.L;
var len = hexStringList[lenIndex].HexToDec();
//验证长度 2=(帧校验和+结束字符)
if (hexStringList.Count - 2 != 11 + len)
return null;
var dataHexList = hexStringList.Skip(11).Take(len).ToList();
return dataHexList;
default:
throw new ArgumentOutOfRangeException(nameof(chunk), chunk, null);
}
}
//public double AnalyzeCurrentTotalRate(List<string> hexList)
//{
// var str = string.Join("", hexList);
// var number = Convert.ToInt32(str) * 0.01;
// return number;
//}
#endregion
}
}

View File

@ -629,7 +629,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
#endregion
}
}