20240801_FJEQ_upperpc/FujianEarthquake_seabed/FujianEarthquake/Models/ProtocolAnalyseModels/ShoreBaseStationModel.cs
XuMin 1f5631afb3 1 研究上下位机通信协议,编写协议解析代码;
2 研究岸基站可编程电源通信协议,编写岸基站状态数据显示页面;
2024-08-29 18:03:03 +08:00

253 lines
13 KiB
C#
Raw Permalink 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 FujianEarthquake.Common;
using FujianEarthquake.DataAccess;
using FujianEarthquake.ViewModels;
using FujianEarthquake.Views.UserControls;
using LiveCharts.Defaults;
using LiveCharts.Wpf;
using LiveCharts;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using Application = System.Windows.Application;
using MySql.Data.MySqlClient;
using Color = System.Windows.Media.Color;
using System.Reflection.Metadata;
namespace FujianEarthquake.Models.ProtocolAnalyseModels
{
public class ShoreBaseStationModel
{
private byte fromDeviceAddress { get; set; } //从设备地址
private byte functionCode { get; set; } //功能码
private byte[] startingRegisterAddress { get; set; } = new byte[2]; //起始寄存器地址
private byte[] registerNumber { get; set; } = new byte[2]; //寄存器个数
private byte[] checkCodeCRC { get; set; } = new byte[2]; //校验码
private List<byte> checkByte { get; set; } = new List<byte>(); //校验码Byte
private byte dataAreaBytes { get; set; } //数据区字节数
private List<byte> dataArea { get; set; } = new List<byte>(); //数据区
private float voltage { get; set; }
private float current { get; set; }
private float power { get; set; }
private float posEleDegree { get; set; }
private float revEleDegree { get; set; }
private float uVoltage { get; set; }
private float uCurrent { get; set; }
private int relayStatus { get; set; }
private float highResVoltage { get; set; }
private float highResCurrent { get; set; }
private float forAmpereHour { get; set; }
private float revAmpereHour { get; set; }
int ChartPointNum = 15;
private int id = 1;
public void ParsingData(List<byte> byteList)
{
if (byteList.Count == 0)
return;
//原始数据存储
string sql = $"insert into boosterstation_state_originaldata(StationID,RecordTime,OriginalData) values('{id}','{DateTime.Now}','{BitConverter.ToString(byteList.ToArray())}');";
DBHelper.ExecuteNonQuery(sql, 1);
checkByte.Clear();
//CRC校验
for (int i = 0; i < byteList.Count - 2; i++)
checkByte.Add(byteList[i]);
checkCodeCRC = Tools.CRCCalcRev(checkByte.ToArray());
//CRC校验失败
if (!Tools.CompareByte(checkCodeCRC, new byte[2] { byteList[byteList.Count - 2], byteList[byteList.Count - 1] }))
{
string content = "升压站电控通信系统数据CRC校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','升压站电控通信系统数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
if (byteList[1] == 0x03) //查询从设备寄存器内容
{
//目前为读取寄存器 0000H-000FH即所有数据
//长度校验
dataAreaBytes = byteList[2];
if (dataAreaBytes + 5 != byteList.Count)
{
string content = "升压站电控通信系统状态数据长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','升压站电控通信系统数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
DateTime recordTime = DateTime.Now;
try
{
//获取电压电流的量程;
int VoltageRange = int.Parse(Tools.GetAppSetting("SYZVoltageRange"));
int CurrentRange = int.Parse(Tools.GetAppSetting("SYZCurrentRange"));
voltage = BitConverter.ToInt16(new byte[2] { byteList[4], byteList[3] }) / 10000f * VoltageRange;
current = BitConverter.ToInt16(new byte[2] { byteList[6], byteList[5] }) / 10000f * CurrentRange;
//power = voltage * current;
power = BitConverter.ToInt16(new byte[2] { byteList[8], byteList[7] }) / 10000f * VoltageRange * CurrentRange;
posEleDegree = BitConverter.ToUInt32(new byte[4] { byteList[12], byteList[11], byteList[10], byteList[9] }) * VoltageRange * CurrentRange / (1000 * 3600);
revEleDegree = BitConverter.ToUInt32(new byte[4] { byteList[16], byteList[15], byteList[14], byteList[13] }) * VoltageRange * CurrentRange / (1000 * 3600);
uVoltage = BitConverter.ToUInt16(new byte[2] { byteList[18], byteList[17] }) / 10000f * VoltageRange;
uCurrent = BitConverter.ToUInt16(new byte[2] { byteList[20], byteList[19] }) / 10000f * VoltageRange;
relayStatus = byteList[21];
//highResVoltage = BitConverter.ToInt16(new byte[2] { byteList[23], byteList[22] }) / 50000f * VoltageRange;
//highResCurrent = BitConverter.ToInt16(new byte[2] { byteList[25], byteList[24] }) / 50000f * CurrentRange;
//forAmpereHour = BitConverter.ToUInt32(new byte[4] { byteList[29], byteList[28], byteList[27], byteList[26] }) * CurrentRange / 3600;
//revAmpereHour = BitConverter.ToUInt32(new byte[4] { byteList[33], byteList[32], byteList[31], byteList[30] }) * CurrentRange / 3600;
recordTime = DateTime.Now;
sql = $"insert into boosterstation_state(StationID,RecordTime,In_Vol,In_Cur,Power,PosEleDegree," +
$"RevEleDegree,uVoltage,uCurrent,RelayStatus,HighResVoltage,HighResCurrent,ForAmpereHour," +
$"RevAmpereHour) values('{id}','{recordTime}','{voltage}','{current}','{power}','{posEleDegree}'," +
$"'{revEleDegree}','{uVoltage}','{uCurrent}','{relayStatus}','{highResVoltage}'," +
$"'{highResCurrent}','{forAmpereHour}','{revAmpereHour}');";
DBHelper.ExecuteNonQuery(sql, 1);
//异常数据存储
if (voltage < DataLimited.VolCurCollectorVoltageMin || voltage > DataLimited.VolCurCollectorVoltageMax || current < DataLimited.VolCurCollectorCurrentMin || current > DataLimited.VolCurCollectorCurrentMax)
{
sql = $"insert into boosterstation_state_abnormaldata(StationID,RecordTime,In_Vol,In_Cur,Power,PosEleDegree," +
$"RevEleDegree,uVoltage,uCurrent,RelayStatus,HighResVoltage,HighResCurrent,ForAmpereHour," +
$"RevAmpereHour) values('{id}','{recordTime}','{voltage}','{current}','{power}','{posEleDegree}'," +
$"'{revEleDegree}','{uVoltage}','{uCurrent}','{relayStatus}','{highResVoltage}'," +
$"'{highResCurrent}','{forAmpereHour}','{revAmpereHour}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','升压站电控通信系统','数据请求','请求升压站状态数据成功');";
DBHelper.ExecuteNonQuery(sql, 1);
}
catch (Exception ex)
{
string content = "升压站电控通信系统状态数据解析失败," + ex.Message;
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','升压站电控通信系统数据解析','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Application.Current.Dispatcher.Invoke(() =>
{
//MainViewModel.boosterStationStateDataViewModel1.AskDataBtnIsReceived = true;
//MainViewModel.boosterStationStateDataViewModel1.AskDataBtnIsEnabled = true;
//MainViewModel.boosterStationStateDataViewModel1.timerAskData.Stop();
//MainViewModel.boosterStationStateDataViewModel1.AskDataMsgVisibility = Visibility.Visible;
//MainViewModel.boosterStationStateDataViewModel1.AskDataMsg = "请求升压站状态数据成功!";
//MainViewModel.boosterStationStateDataViewModel1.timerAskDataMsgCollapse.Start();
//MainViewModel.boosterStationStateDataViewModel1.AskDataMsgForeground = new SolidColorBrush(Colors.Green);
//if (relayStatus == 1)
// MainViewModel.baseStationStateModel1.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOn");
//else
// MainViewModel.baseStationStateModel1.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOff");
//MainViewModel.realTimeDataViewModel1.BaseStationStatus[2].Value = voltage.ToString();
//MainViewModel.realTimeDataViewModel1.BaseStationStatus[5].Value = current.ToString();
//MainViewModel.realTimeDataViewModel1.DataTimeBoosterStationVol = recordTime;
//MainViewModel.realTimeDataViewModel1.DataTimeBoosterStationCur = recordTime;
//var chartValuesBoosterStationVol = new ChartValues<DateTimePoint>();
//var chartValuesBoosterStationCur = new ChartValues<DateTimePoint>();
//sql = string.Format("select * from boosterstation_state where StationID = {0} ORDER by id desc limit {1}", 1, ChartPointNum);
//MySqlDataReader dataReader = DBHelper.ExecuteReader(sql, 1);
//while (dataReader.Read())
//{
// if (!Convert.IsDBNull(dataReader["In_Vol"]) && !Convert.IsDBNull(dataReader["In_Cur"]))
// {
// chartValuesBoosterStationVol.Add(new DateTimePoint
// {
// Value = Convert.ToSingle(dataReader["In_Vol"]),
// DateTime = Convert.ToDateTime(dataReader["RecordTime"]),
// });
// chartValuesBoosterStationCur.Add(new DateTimePoint
// {
// Value = Convert.ToSingle(dataReader["In_Cur"]),
// DateTime = Convert.ToDateTime(dataReader["RecordTime"]),
// });
// }
//}
//dataReader.Dispose();
//MainViewModel.realTimeDataViewModel1.SeriesCollectionBoosterStationVol = new SeriesCollection
// {
// new LineSeries
// {
// Title = "输入电压",
// Values = chartValuesBoosterStationVol,
// LineSmoothness = 0,
// ScalesYAt = 0,
// Stroke = new SolidColorBrush(Color.FromArgb(255, 43, 237, 241)),
// Fill = new SolidColorBrush(Colors.Transparent)
// },
// };
//MainViewModel.realTimeDataViewModel1.SeriesCollectionBoosterStationCur = new SeriesCollection
// {
// new LineSeries
// {
// Title = "输入电流",
// Values = chartValuesBoosterStationCur,
// LineSmoothness = 0,
// ScalesYAt = 0,
// Stroke = new SolidColorBrush(Color.FromArgb(255, 43, 237, 241)),
// Fill = new SolidColorBrush(Colors.Transparent)
// },
// };
});
}
else if (byteList[1] == 0x06) //对从设备单个寄存器置数
{
//长度校验
if (byteList.Count != 8)
{
string content = "升压站电控通信系统对从设备单个寄存器置数回复长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','升压站电控通信系统数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
}
else if (byteList[1] == 0x10) //对从设备多个寄存器置数
{
//长度校验
if (byteList.Count != 8)
return;
}
}
}
}