20230201_145_upperpc/InSituLaboratory/Common/DataParsing.cs

396 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using InSituLaboratory.Entities;
using InSituLaboratory.Entities.SqlSugar;
using InSituLaboratory.Service;
using Microsoft.EntityFrameworkCore;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Markup;
namespace InSituLaboratory.Common
{
/// <summary>
/// 数据解析
/// </summary>
public class DataParsing
{
//连接钥匙
private static readonly string ConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["db"].ConnectionString;
public DataParsingModelSqlSugar dataParsingModel = new DataParsingModelSqlSugar();// 数据解析通用字段
public SysSensorModelSqlSugar sysSensorModel = new SysSensorModelSqlSugar();//与下位机通信类 --- 传感器
public CurrentSequentiualSqlSugar currentSequentiual = new CurrentSequentiualSqlSugar(); //当前运行时序状态表 ---下位机
//获取当前程序运行路径
private string Save_Path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"数据记录\";
//记录第一包数据的创建时间
public static DateTime Record_firstCode = DateTime.Now;
//标志位头
byte flag = 0x7f;
//应答流水号
string ResponseNum = "";
//应答ID
string ResponID = "";
//通用应答消息ID
string MessageID = "0000";
//crc
static byte nr_crc = 0;
/// <summary>
/// 数据解析
/// </summary>
/// <param name="byteList"></param>
public void ParsingData(List<byte> byteList)
{
//如果数组长度为0 舍弃
if (byteList.Count() == 0)
return;
//将报文中的内容截取出来 并保存至本地TXT文件内
string NR_TXT = "";
for (int i = 0; i < byteList.Count; i++)
{
NR_TXT += byteList[i].ToString("X2") + " ";
}
tools.AddLgoToTXT("原始数据报文.txt", Save_Path + System.DateTime.Now.ToString("yyyy_MM_dd") + @"\", System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ---- " + NR_TXT + "\r\n");
//SqlSugar配置文件
ConnectionConfig connectionConfig = new ConnectionConfig()
{
ConnectionString = ConnStr,
IsAutoCloseConnection = true,
DbType = DbType.Sqlite
};
#region
int j = 0;
for (int i = 0; i < byteList.Count; i++)
{
if (byteList[i] == 0x7e && byteList[i + 1] == 0x01)
{
byteList[j] = 0x7e;
i++;
}
else if (byteList[i] == 0x7e && byteList[i + 1] == 0x02)
{
byteList[j] = 0x7f;
i++;
}
else
{
byteList[j] = byteList[i];
}
j++;
}
//定义转义后的byte数组
byte[] dataTemp = new byte[j];
for (int i = 0; i < j; i++)
{
dataTemp[i] = byteList[i];
}
//定义转义后的list数组
List<byte> dataNew = new List<byte>();
string Latter_TXT = "";
for (int i = 0; i < dataTemp.Length; i++)
{
dataNew.Add(dataTemp[i]);
Latter_TXT += dataTemp[i].ToString("X2") + " ";
}
//数据域数组 --消息头+消息体
List<byte> bytes = new List<byte>();
for (int i = 1; i < dataTemp.Length - 2; i++)
{
bytes.Add(dataTemp[i]);
}
#endregion
tools.AddLgoToTXT("转义后数据报文.txt", Save_Path + System.DateTime.Now.ToString("yyyy_MM_dd") + @"\", System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ---- " + Latter_TXT + "\r\n");
nr_crc = tools.CRC(bytes.ToArray(), 0, bytes.Count);
///包头包尾 crc校验
if (((dataNew[0] != flag) || (dataNew[byteList.Count - 1]) != flag) || dataNew[14] != nr_crc)
return;
///下位机主动上传的腔体输出状态信息
if (dataNew[1] == 0x01 && dataNew[2] == 0x03)
{
sysSensorModel.CMSpectrometry = dataNew[9] == 0x00 ? "关" : "开";
sysSensorModel.Light1 = dataNew[10] == 0x00 ? "关" : "开";
sysSensorModel.Light2 = dataNew[11] == 0x00 ? "关" : "开";
sysSensorModel.LightMachine = dataNew[12] == 0x00 ? "关" : "开";
sysSensorModel.ADCP = dataNew[13] == 0x00 ? "关" : "开";
sysSensorModel.CTD = dataNew[14] == 0x00 ? "关" : "开";
sysSensorModel.SP = dataNew[15] == 0x00 ? "关" : "开";
sysSensorModel.CH4 = dataNew[16] == 0x00 ? "关" : "开";
sysSensorModel.CO2 = dataNew[17] == 0x00 ? "关" : "开";
sysSensorModel.NetEquipment = dataNew[18] == 0x00 ? "关" : "开";
sysSensorModel.SerialPortServer = dataNew[19] == 0x00 ? "关" : "开";
sysSensorModel.InComputer = dataNew[20] == 0x00 ? "关" : "开";
sysSensorModel.RamanAnalyzer = dataNew[21] == 0x00 ? "关" : "开";
sysSensorModel.ZP = dataNew[22] == 0x00 ? "关" : "开";
sysSensorModel.AcousticPositioning = dataNew[23] == 0x00 ? "关" : "开";
sysSensorModel.Camera1 = dataNew[24] == 0x00 ? "关" : "开";
sysSensorModel.Camera2 = dataNew[25] == 0x00 ? "关" : "开";
sysSensorModel.ElectricSwitch2 = dataNew[26] == 0x00 ? "关" : "开";
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
{
db.Insertable<SysSensorModelSqlSugar>(sysSensorModel).ExecuteCommand();
}
}
///当前运行状态时序
if (dataNew[1] == 0x01 && dataNew[2] == 0x05)
{
//判断时序1运行状态
switch (dataNew[9])
{
case 0x00:
currentSequentiual.Sequentiual1Status = "关闭";
break;
case 0x01:
currentSequentiual.Sequentiual1Status = "等待";
break;
case 0x02:
currentSequentiual.Sequentiual1Status = "运行";
break;
case 0x03:
currentSequentiual.Sequentiual1Status = "结束";
break;
case 0x04:
currentSequentiual.Sequentiual1Status = "不存在时序";
break;
case 0x05:
currentSequentiual.Sequentiual1Status = "时序状态变更交替中";
break;
case 0x06:
currentSequentiual.Sequentiual1Status = "异常";
break;
default:
break;
}
//判断时序2运行状态
switch (dataNew[10])
{
case 0x00:
currentSequentiual.Sequentiual2Status = "关闭";
break;
case 0x01:
currentSequentiual.Sequentiual2Status = "等待";
break;
case 0x02:
currentSequentiual.Sequentiual2Status = "运行";
break;
case 0x03:
currentSequentiual.Sequentiual2Status = "结束";
break;
case 0x04:
currentSequentiual.Sequentiual2Status = "不存在时序";
break;
case 0x05:
currentSequentiual.Sequentiual2Status = "异常";
break;
default:
break;
}
//判断时序3运行状态
switch (dataNew[11])
{
case 0x00:
currentSequentiual.Sequentiual3Status = "关闭";
break;
case 0x01:
currentSequentiual.Sequentiual3Status = "等待";
break;
case 0x02:
currentSequentiual.Sequentiual3Status = "运行";
break;
case 0x03:
currentSequentiual.Sequentiual3Status = "结束";
break;
case 0x04:
currentSequentiual.Sequentiual3Status = "不存在时序";
break;
case 0x05:
currentSequentiual.Sequentiual3Status = "异常";
break;
default:
break;
}
//判断时序4运行状态
switch (dataNew[12])
{
case 0x00:
currentSequentiual.Sequentiual4Status = "关闭";
break;
case 0x01:
currentSequentiual.Sequentiual4Status = "等待";
break;
case 0x02:
currentSequentiual.Sequentiual4Status = "运行";
break;
case 0x03:
currentSequentiual.Sequentiual4Status = "结束";
break;
case 0x04:
currentSequentiual.Sequentiual4Status = "不存在时序";
break;
case 0x05:
currentSequentiual.Sequentiual4Status = "异常";
break;
default:
break;
}
//判断时序5运行状态
switch (dataNew[13])
{
case 0x00:
currentSequentiual.Sequentiual5Status = "关闭";
break;
case 0x01:
currentSequentiual.Sequentiual5Status = "等待";
break;
case 0x02:
currentSequentiual.Sequentiual5Status = "运行";
break;
case 0x03:
currentSequentiual.Sequentiual5Status = "结束";
break;
case 0x04:
currentSequentiual.Sequentiual5Status = "不存在时序";
break;
case 0x05:
currentSequentiual.Sequentiual5Status = "异常";
break;
default:
break;
}
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
{
db.Insertable<CurrentSequentiualSqlSugar>(currentSequentiual).ExecuteCommand();
}
}
//通用应答 消息ID0x0000
if (MessageID == dataNew[1].ToString("X2") + dataNew[2].ToString("X2"))
{
dataParsingModel.CreateTime = System.DateTime.Now;
//应答流水号
dataParsingModel.ResponseNum = dataNew[9].ToString("X2") + dataNew[10].ToString("X2");
//应答ID
if (dataNew[11].ToString("X2") + dataNew[12].ToString("X2") == "9100")
{
dataParsingModel.ResponseID = "9100-时序下发";
}
else if (dataNew[11].ToString("X2") + dataNew[12].ToString("X2") == "9201")
{
dataParsingModel.ResponseID = "9201-局部控制开关";
}
//结果
switch (dataNew[13])
{
case 0x00:
dataParsingModel.ResponseResult = "成功/确认";
break;
case 0x01:
dataParsingModel.ResponseResult = "失败/不存在";
break;
case 0x02:
dataParsingModel.ResponseResult = "消息错误";
break;
case 0x03:
dataParsingModel.ResponseResult = "不支持";
break;
default:
break;
}
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
{
db.Insertable<DataParsingModelSqlSugar>(dataParsingModel).ExecuteCommand();
}
}
}
#region
/// <summary>
/// 转义
/// </summary>
/// <param name="tBuffer">没有头尾和校验的byte数组</param>
/// <param name="code">校验码</param>
/// <param name="flag">标志位</param>
/// <returns></returns>
public static List<byte> Transform(List<byte> tBuffer, byte code, byte flag)
{
int j = 0;
tBuffer.Add(code);
int length = tBuffer.ToArray().Length;
byte[] newAnswer = tBuffer.ToArray();
for (int i = 0; i < length; i++)
{
if (newAnswer[i] == 0x7e || newAnswer[i] == 0x7f)
{
j++;
}
}
byte[] newSendBuffer = new byte[length + j];
for (int i = 0; i < length; i++)
{
newSendBuffer[i] = newAnswer[i];
}
for (int i = 0; i < length + j; i++)
{
if (newSendBuffer[i] == 0x7e)
{
for (int k = length + j - 1; k > i + 1; k--)
{
newSendBuffer[k] = newSendBuffer[k - 1];
}
newSendBuffer[i + 1] = 0x01;
}
if (newSendBuffer[i] == 0x7f)
{
newSendBuffer[i] = 0x7e;
for (int k = length + j - 1; k > i + 1; k--)
{
newSendBuffer[k] = newSendBuffer[k - 1];
}
newSendBuffer[i + 1] = 0x02;
}
}
List<byte> buffer = new List<byte>();
buffer.Add(flag);
for (int i = 0; i < newSendBuffer.Length; i++)
{
buffer.Add(newSendBuffer[i]);
}
buffer.Add(flag);
return buffer;
}
#endregion
}
}