20230201_145_upperpc/InSituLaboratory/Common/DataParsing.cs

396 lines
15 KiB
C#
Raw Normal View History

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
}
}