2024-05-17 10:37:55 +00:00
|
|
|
|
using InSituLaboratory.Entities;
|
2024-06-12 10:17:01 +00:00
|
|
|
|
using InSituLaboratory.Entities.SqlSugar;
|
2024-05-17 10:37:55 +00:00
|
|
|
|
using InSituLaboratory.Service;
|
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
2024-05-22 10:37:51 +00:00
|
|
|
|
using SqlSugar;
|
2024-05-17 10:37:55 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
2024-06-12 10:17:01 +00:00
|
|
|
|
using System.Windows.Markup;
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
|
|
|
|
|
namespace InSituLaboratory.Common
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 数据解析
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class DataParsing
|
|
|
|
|
|
{
|
2024-05-22 10:37:51 +00:00
|
|
|
|
//连接钥匙
|
|
|
|
|
|
private static readonly string ConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["db"].ConnectionString;
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
2024-06-12 10:17:01 +00:00
|
|
|
|
public DataParsingModelSqlSugar dataParsingModel = new DataParsingModelSqlSugar();// 数据解析通用字段
|
|
|
|
|
|
|
|
|
|
|
|
public SysSensorModelSqlSugar sysSensorModel = new SysSensorModelSqlSugar();//与下位机通信类 --- 传感器
|
|
|
|
|
|
|
|
|
|
|
|
public CurrentSequentiualSqlSugar currentSequentiual = new CurrentSequentiualSqlSugar(); //当前运行时序状态表 ---下位机
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
|
|
|
|
|
//获取当前程序运行路径
|
|
|
|
|
|
private string Save_Path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"数据记录\";
|
|
|
|
|
|
|
|
|
|
|
|
//记录第一包数据的创建时间
|
|
|
|
|
|
public static DateTime Record_firstCode = DateTime.Now;
|
|
|
|
|
|
|
|
|
|
|
|
//标志位头
|
2024-05-22 10:37:51 +00:00
|
|
|
|
byte flag = 0x7f;
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
|
|
|
|
|
//应答流水号
|
|
|
|
|
|
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");
|
|
|
|
|
|
|
2024-05-22 10:37:51 +00:00
|
|
|
|
//SqlSugar配置文件
|
|
|
|
|
|
ConnectionConfig connectionConfig = new ConnectionConfig()
|
|
|
|
|
|
{
|
|
|
|
|
|
ConnectionString = ConnStr,
|
|
|
|
|
|
IsAutoCloseConnection = true,
|
|
|
|
|
|
DbType = DbType.Sqlite
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2024-06-12 10:17:01 +00:00
|
|
|
|
#region 转义
|
2024-05-17 10:37:55 +00:00
|
|
|
|
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") + " ";
|
|
|
|
|
|
}
|
2024-05-22 10:37:51 +00:00
|
|
|
|
|
2024-06-12 10:17:01 +00:00
|
|
|
|
//数据域数组 --消息头+消息体
|
2024-05-22 10:37:51 +00:00
|
|
|
|
List<byte> bytes = new List<byte>();
|
|
|
|
|
|
for (int i = 1; i < dataTemp.Length - 2; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
bytes.Add(dataTemp[i]);
|
|
|
|
|
|
}
|
2024-06-12 10:17:01 +00:00
|
|
|
|
#endregion
|
2024-05-22 10:37:51 +00:00
|
|
|
|
|
2024-05-17 10:37:55 +00:00
|
|
|
|
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");
|
|
|
|
|
|
|
2024-05-22 10:37:51 +00:00
|
|
|
|
nr_crc = tools.CRC(bytes.ToArray(), 0, bytes.Count);
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
|
|
|
|
|
///包头包尾 crc校验
|
2024-05-22 10:37:51 +00:00
|
|
|
|
if (((dataNew[0] != flag) || (dataNew[byteList.Count - 1]) != flag) || dataNew[14] != nr_crc)
|
2024-05-17 10:37:55 +00:00
|
|
|
|
return;
|
|
|
|
|
|
|
2024-06-12 10:17:01 +00:00
|
|
|
|
///下位机主动上传的腔体输出状态信息
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
|
|
|
|
|
//通用应答 消息ID:0x1000
|
|
|
|
|
|
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
|
2024-05-22 10:37:51 +00:00
|
|
|
|
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-局部控制开关";
|
|
|
|
|
|
}
|
2024-05-17 10:37:55 +00:00
|
|
|
|
//结果
|
2024-05-22 10:37:51 +00:00
|
|
|
|
switch (dataNew[13])
|
2024-05-17 10:37:55 +00:00
|
|
|
|
{
|
2024-05-22 10:37:51 +00:00
|
|
|
|
case 0x00:
|
2024-05-17 10:37:55 +00:00
|
|
|
|
dataParsingModel.ResponseResult = "成功/确认";
|
|
|
|
|
|
break;
|
2024-05-22 10:37:51 +00:00
|
|
|
|
case 0x01:
|
2024-05-17 10:37:55 +00:00
|
|
|
|
dataParsingModel.ResponseResult = "失败/不存在";
|
|
|
|
|
|
break;
|
2024-05-22 10:37:51 +00:00
|
|
|
|
case 0x02:
|
2024-05-17 10:37:55 +00:00
|
|
|
|
dataParsingModel.ResponseResult = "消息错误";
|
|
|
|
|
|
break;
|
2024-05-22 10:37:51 +00:00
|
|
|
|
case 0x03:
|
2024-05-17 10:37:55 +00:00
|
|
|
|
dataParsingModel.ResponseResult = "不支持";
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-05-22 10:37:51 +00:00
|
|
|
|
|
|
|
|
|
|
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
|
|
|
|
|
|
{
|
|
|
|
|
|
db.Insertable<DataParsingModelSqlSugar>(dataParsingModel).ExecuteCommand();
|
|
|
|
|
|
}
|
2024-05-17 10:37:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|