20240301_JSEQ_upperpc/JiangsuEarthquakeNowUI/JiangsuEarthquake/Models/VolCurCollectorModel.cs
2024-11-01 15:54:08 +08:00

434 lines
25 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 JiangsuEarthquake.Common;
using JiangsuEarthquake.DataAccess;
using JiangsuEarthquake.ViewModels;
using JiangsuEarthquake.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 ColorConverter = System.Windows.Media.ColorConverter;
using System.Reflection.Metadata;
namespace JiangsuEarthquake.Models
{
public class VolCurCollectorModel
{
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;
public void ParsingData(List<byte> byteList, int id)
{
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[22];
//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 < TotalMessage.VolCurCollectorVoltageMin || voltage > TotalMessage.VolCurCollectorVoltageMax || current < TotalMessage.VolCurCollectorCurrentMin || current > TotalMessage.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);
}
App.Current.Dispatcher.Invoke(() =>
{
if (id == 1)
{
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 == 0)
MainViewModel.baseStationStateModel1.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOn");
else
MainViewModel.baseStationStateModel1.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOff");
MainViewModel.realTimeDataViewModel1.BoosterStationVol = voltage.ToString("F2");
MainViewModel.realTimeDataViewModel1.BoosterStationCur = current.ToString("F2");
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)ColorConverter.ConvertFromString("#0690DC")),
Fill = new SolidColorBrush(Colors.Transparent)
},
};
MainViewModel.realTimeDataViewModel1.SeriesCollectionBoosterStationCur = new SeriesCollection
{
new LineSeries
{
Title = "输入电流",
Values = chartValuesBoosterStationCur,
LineSmoothness = 0,
ScalesYAt = 0,
Stroke = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#0690DC")),
Fill = new SolidColorBrush(Colors.Transparent)
},
};
}
else
{
MainViewModel.boosterStationStateDataViewModel2.AskDataBtnIsReceived = true;
MainViewModel.boosterStationStateDataViewModel2.AskDataBtnIsEnabled = true;
MainViewModel.boosterStationStateDataViewModel2.timerAskData.Stop();
MainViewModel.boosterStationStateDataViewModel2.AskDataMsgVisibility = Visibility.Visible;
MainViewModel.boosterStationStateDataViewModel2.AskDataMsg = "请求升压站状态数据成功!";
MainViewModel.boosterStationStateDataViewModel2.timerAskDataMsgCollapse.Start();
MainViewModel.boosterStationStateDataViewModel2.AskDataMsgForeground = new SolidColorBrush(Colors.Green);
if (relayStatus == 0)
MainViewModel.baseStationStateModel2.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOn");
else
MainViewModel.baseStationStateModel2.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOff");
MainViewModel.realTimeDataViewModel2.BoosterStationVol = voltage.ToString("F2");
MainViewModel.realTimeDataViewModel2.BoosterStationCur = current.ToString("F2");
MainViewModel.realTimeDataViewModel2.DataTimeBoosterStationVol = recordTime;
MainViewModel.realTimeDataViewModel2.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}", 2, 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.realTimeDataViewModel2.SeriesCollectionBoosterStationVol = new SeriesCollection
{
new LineSeries
{
Title = "输入电压",
Values = chartValuesBoosterStationVol,
LineSmoothness = 0,
ScalesYAt = 0,
Stroke = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#0690DC")),
Fill = new SolidColorBrush(Colors.Transparent)
},
};
MainViewModel.realTimeDataViewModel2.SeriesCollectionBoosterStationCur = new SeriesCollection
{
new LineSeries
{
Title = "输入电流",
Values = chartValuesBoosterStationCur,
LineSmoothness = 0,
ScalesYAt = 0,
Stroke = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#0690DC")),
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;
}
if (byteList[2] == 0x01 && byteList[3] == 0x30) //继电器输出
{
string record = "";
string state = "Off";
//if (id == 1)
//{
if (Tools.CompareByte(byteList.ToArray(), MainWindow.mainViewModel.RelayActivationRecv))
{
App.Current.Dispatcher.Invoke(() =>
{
// 更新UI的代码
MainWindow.mainViewModel.BaseStationPowerOnIsReceived = true;
MainWindow.mainViewModel.BaseStationPowerOpenBtnIsEnabled = true;
MainWindow.mainViewModel.BaseStationPowerCloseBtnIsEnabled = true;
MainWindow.mainViewModel.timerBaseStationPowerOn.Stop();
MainWindow.mainViewModel.BaseStationMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BaseStationMsg = "海底基站电源开启成功!";
MainWindow.mainViewModel.timerBaseStationMsgHidden.Start();
MainWindow.mainViewModel.BaseStationMsgForeground = new SolidColorBrush(Colors.Green);
if (id == 1)
MainViewModel.baseStationStateModel1.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOn");
else
MainViewModel.baseStationStateModel2.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOn");
record = "打开海底基站电源成功";
state = "On";
});
}
else if (Tools.CompareByte(byteList.ToArray(), MainWindow.mainViewModel.RelayShutdownRecv))
{
App.Current.Dispatcher.Invoke(() =>
{
// 更新UI的代码
MainWindow.mainViewModel.BaseStationPowerOffIsReceived = true;
MainWindow.mainViewModel.BaseStationPowerOpenBtnIsEnabled = true;
MainWindow.mainViewModel.BaseStationPowerCloseBtnIsEnabled = true;
MainWindow.mainViewModel.timerBaseStationPowerOff.Stop();
MainWindow.mainViewModel.BaseStationMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BaseStationMsg = "海底基站电源关闭成功!";
MainWindow.mainViewModel.timerBaseStationMsgHidden.Start();
MainWindow.mainViewModel.BaseStationMsgForeground = new SolidColorBrush(Colors.Green);
if (id == 1)
MainViewModel.baseStationStateModel1.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOff");
else
MainViewModel.baseStationStateModel2.JunBox_Power = (ImageSource)Application.Current.FindResource("DeviceOff");
record = "关闭海底基站电源成功";
state = "Off";
});
}
else
{
App.Current.Dispatcher.Invoke(() =>
{
// 更新UI的代码
//MainWindow.mainViewModel.BaseStationPowerOnIsReceived = false;
MainWindow.mainViewModel.BaseStationPowerOpenBtnIsEnabled = true;
MainWindow.mainViewModel.BaseStationPowerCloseBtnIsEnabled = true;
MainWindow.mainViewModel.timerBaseStationPowerOn.Stop();
MainWindow.mainViewModel.timerBaseStationPowerOff.Stop();
MainWindow.mainViewModel.BaseStationMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BaseStationMsg = "海底基站电源开启/关闭失败!";
MainWindow.mainViewModel.timerBaseStationMsgHidden.Start();
MainWindow.mainViewModel.BaseStationMsgForeground = new SolidColorBrush(Colors.Red);
record = "打开/关闭海底基站电源失败";
state = "Off";
});
}
//存储历史设置
sql = $"insert into switch_info_his(StationID,RecordTime,SwitchName,SwitchState) values('{id}','{DateTime.Now}','BaseStationPower','{state}');";
DBHelper.ExecuteNonQuery(sql, 1);
//存储最新设置
sql = $"update switch_info set SwitchState='{state}',RecordTime='{DateTime.Now}' where SwitchName='BaseStationPower' and StationID={id};";
DBHelper.ExecuteNonQuery(sql, 1);
//sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','升压站电控通信系统','系统控制','{record}');";
//DBHelper.ExecuteNonQuery(sql, 1);
//}
//else
//{
// if (Tools.CompareByte(byteList.ToArray(), MainViewModel.boosterStationStateDataViewModel2.RelayActivationRecv))
// {
// App.Current.Dispatcher.Invoke(() =>
// {
// // 更新UI的代码
// MainViewModel.boosterStationStateDataViewModel2.RelayActivationBtnIsReceived = true;
// MainViewModel.boosterStationStateDataViewModel2.RelayActivationBtnIsEnabled = true;
// MainViewModel.boosterStationStateDataViewModel2.timerRelayActivation.Stop();
// MainViewModel.boosterStationStateDataViewModel2.RelayControlMsgVisibility = Visibility.Visible;
// MainViewModel.boosterStationStateDataViewModel2.RelayControlMsg = "继电开启成功!";
// MainViewModel.boosterStationStateDataViewModel2.timerRelayControl.Start();
// MainViewModel.boosterStationStateDataViewModel2.RelayControlMsgForeground = new SolidColorBrush(Colors.Green);
// });
// }
// if (Tools.CompareByte(byteList.ToArray(), MainViewModel.boosterStationStateDataViewModel2.RelayShutdownRecv))
// {
// App.Current.Dispatcher.Invoke(() =>
// {
// // 更新UI的代码
// MainViewModel.boosterStationStateDataViewModel2.RelayShutdownBtnIsReceived = true;
// MainViewModel.boosterStationStateDataViewModel2.RelayShutdownBtnIsEnabled = true;
// MainViewModel.boosterStationStateDataViewModel2.timerRelayShutdown.Stop();
// MainViewModel.boosterStationStateDataViewModel2.RelayControlMsgVisibility = Visibility.Visible;
// MainViewModel.boosterStationStateDataViewModel2.RelayControlMsg = "继电关闭成功!";
// MainViewModel.boosterStationStateDataViewModel2.timerRelayControl.Start();
// MainViewModel.boosterStationStateDataViewModel2.RelayControlMsgForeground = new SolidColorBrush(Colors.Green);
// });
// }
//}
}
}
}
}
}