20230201_145_upperpc/InSituLaboratory/Common/DataParsing.cs

355 lines
14 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.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 = "1000";
//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)
{
//判断当前时序运行状态
switch (dataNew[9])
{
case 0x00:
currentSequentiual.Status = "运行关闭";
break;
case 0x01:
currentSequentiual.Status = "正常运行";
break;
case 0x02:
currentSequentiual.Status = "运行存在问题";
break;
default:
break;
}
//当前时序序列号
currentSequentiual.Number = dataNew[10].ToString("X2");
//当前运行的设备编号
for (int i = 10; i <= bytes.Count(); i++)
{
switch (bytes[i])
{
case 0x00:
currentSequentiual.DeviceNumber += "工控机 ";
break;
case 0x01:
currentSequentiual.DeviceNumber += "色质联用 ";
break;
case 0x02:
currentSequentiual.DeviceNumber += "备用串口1 ";
break;
case 0x03:
currentSequentiual.DeviceNumber += "备用串口2 ";
break;
case 0x04:
currentSequentiual.DeviceNumber += "光通讯机 ";
break;
case 0x05:
currentSequentiual.DeviceNumber += "ADCP ";
break;
case 0x06:
currentSequentiual.DeviceNumber += "CTD ";
break;
case 0x07:
currentSequentiual.DeviceNumber += "气相色谱仪 ";
break;
case 0x08:
currentSequentiual.DeviceNumber += "甲烷传感器 ";
break;
case 0x09:
currentSequentiual.DeviceNumber += "二氧化碳同位素分析仪 ";
break;
case 0x0a:
currentSequentiual.DeviceNumber += "备用网口设备 ";
break;
case 0x0b:
currentSequentiual.DeviceNumber += "ICL ";
break;
case 0x0c:
currentSequentiual.DeviceNumber += "显微拉曼分析仪 ";
break;
case 0x0d:
currentSequentiual.DeviceNumber += "质谱仪 ";
break;
case 0x0e:
currentSequentiual.DeviceNumber += "声学定位 ";
break;
case 0x0f:
currentSequentiual.DeviceNumber += "摄像1 ";
break;
case 0x10:
currentSequentiual.DeviceNumber += "摄像2 ";
break;
case 0x11:
currentSequentiual.DeviceNumber += "电交换机2 ";
break;
default:
break;
}
}
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
{
db.Insertable<CurrentSequentiualSqlSugar>(currentSequentiual).ExecuteCommand();
}
}
//通用应答 消息ID0x1000
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
}
}