645 188
This commit is contained in:
parent
ded12729d9
commit
66814a4fae
@ -153,6 +153,9 @@
|
||||
/// </summary>
|
||||
Odd
|
||||
}
|
||||
/// <summary>
|
||||
/// 数据位
|
||||
/// </summary>
|
||||
public enum DataBit
|
||||
{
|
||||
D5 = 0,
|
||||
|
||||
16
JiShe.CollectBus.Common/Enums/CommandChunkEnum188.cs
Normal file
16
JiShe.CollectBus.Common/Enums/CommandChunkEnum188.cs
Normal 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
|
||||
}
|
||||
}
|
||||
@ -144,9 +144,12 @@ namespace JiShe.CollectBus.Common.Extensions
|
||||
/// </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,7 +583,7 @@ 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);
|
||||
@ -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--)
|
||||
{
|
||||
frm[i + 1] = address.Substring(n, 2);
|
||||
n += 2;
|
||||
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;
|
||||
}
|
||||
frm[frm.Count - 2] = GetCRC(frm.Take(frm.Count - 2).ToList());
|
||||
return frm;
|
||||
|
||||
/// <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)
|
||||
{
|
||||
cmdStrList.AddRange(dataUnit);
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user