public void SetReadSeries(ReceiveItem data, ReceiveItem alarm, ReceiveItem alarmtatus) { try { int index = this.chart1.Series["Series" + data.Name].Points.AddXY(ScadaHexByteOperator.GetDateTime(data.DateTime).Value.ToString("mm:ss"), data.Value); if (data.Value == "-9999") { this.chart1.Series["Series" + data.Name].Points[index].IsEmpty = true; } if (this.chart1.Series["Series" + data.Name].Points.Count > 400) { this.chart1.Series["Series" + data.Name].Points.RemoveAt(0); } if (this.chart1.Series["Series" + data.Name].Points.Count > 0) { if (this.chart1.Series["Series" + data.Name].YAxisType == System.Windows.Forms.DataVisualization.Charting.AxisType.Primary) { this.chart1.ChartAreas[this.chart1.Series["Series" + data.Name].ChartArea].AxisY.Maximum = this.chart1.Series["Series" + data.Name].Points.FindMaxByValue().YValues[0] + this.chart1.Series["Series" + data.Name].Points.FindMaxByValue().YValues[0] / 10.0d; } else { this.chart1.ChartAreas[this.chart1.Series["Series" + data.Name].ChartArea].AxisY2.Maximum = this.chart1.Series["Series" + data.Name].Points.FindMaxByValue().YValues[0] + this.chart1.Series["Series" + data.Name].Points.FindMaxByValue().YValues[0] / 10.0d; } } } catch { } }
public void SetReadSeries(ReceiveItem data, ReceiveItem alarm, ReceiveItem alarmtatus) { ///设置值 for (int i = 0; i < this.flowLayoutPanel.Controls.Count; i++) { if (this.flowLayoutPanel.Controls[i].GetType() == typeof(ChanelSeries)) { ChanelSeries channelReal = (ChanelSeries)this.flowLayoutPanel.Controls[i]; if (!string.IsNullOrEmpty(channelReal.Channel.BindingArress) && channelReal.Channel.BindingArress == data.Address) { channelReal.SetReadSeries(data, alarm, alarmtatus); } } } }
public void PushItem(ReceiveItem item) { lock (thisLock) { //总是将最新的数据放到最前头 ReceiveItems.Insert(0, item); if (ReceiveItems.Count > MaxNumber) { int rnum = ReceiveItems.Count - MaxNumber; if (rnum > 0) { ReceiveItems.RemoveRange(ReceiveItems.Count - 1, rnum); } } if (OnPushed != null) { OnPushed(item); } } }
public static void InitMonitorManager(MainForm mainForm) { try { MainForm = mainForm; //实时数据缓存池 ReceiveCachec = new ReceiveCachec(); ReceiveCachec.OnGeted += ReceiveCachec_OnGeted; ReceiveCachec.OnPushed += ReceiveCachec_OnPushed; ReceiveCachec.MaxNumber = 1000; //报警缓存池 ReceiveAlarmCachec = new ReceiveCachec(); ReceiveAlarmCachec.OnGeted += ReceiveAlarmCachec_OnGeted; ReceiveAlarmCachec.OnPushed += ReceiveAlarmCachec_OnPushed; ReceiveAlarmCachec.MaxNumber = 1000; ///报警状态 ReceiveAlarmStatusCachec = new ReceiveCachec(); ReceiveAlarmStatusCachec.OnGeted += ReceiveAlarmStatusCachec_OnGeted; ReceiveAlarmStatusCachec.OnPushed += ReceiveAlarmStatusCachec_OnPushed; ReceiveAlarmStatusCachec.MaxNumber = 1000; Config = new GasMonitorConfig(); GasMonitorManager.Chanels = Config.Channels; //加载系统配置表单信息 systenSetFrm.InitForms(); realDataFrm.InitForms(); realSeriesFrm.InitForms(); alarmSetFrm.InitForms(); //初始化主界面左边树结构 MainForm.InitForms(); SerialConfig serialConfig = new SerialConfig() { BaudRate = int.Parse(Config.SerialPort.BaudRate), CollectFaultsInternal = int.Parse(Config.SerialPort.CollectFaultsInternal), CollectFaultsNumber = int.Parse(Config.SerialPort.CollectFaultsNumber), ContinueCollect = string.IsNullOrEmpty(Config.SerialPort.ContinueCollect) || Config.SerialPort.ContinueCollect.Trim() == "0" ? false : true, DataBits = int.Parse(Config.SerialPort.DataBits), ModbusType = "RTU", OffsetInterval = int.Parse(Config.SerialPort.OffsetInterval), PackMaxSize = int.Parse(Config.SerialPort.PackMaxSize), ReadTimeout = int.Parse(Config.SerialPort.ReadTimeout), WriteTimeout = int.Parse(Config.SerialPort.WriteTimeout), SerialCheck = (Parity)Enum.Parse(typeof(Parity), Config.SerialPort.CheckBit), SerialPort = Config.SerialPort.Port, UpdateCycle = Config.SerialPort.UpdateCycle, RTSEnable = string.IsNullOrEmpty(Config.SerialPort.RTSEnable) || Config.SerialPort.RTSEnable.Trim() == "0" ? false : true, RSTSendPreKeeyTime = int.Parse(Config.SerialPort.RSTSendPreKeeyTime), RTSSendAfterKeeyTime = int.Parse(Config.SerialPort.RSTSendPreKeeyTime), Chanels = Chanels, StopBits = StopBits.One, ModbusParas = Config.ModbusPara }; switch (Config.SerialPort.StopBit.Trim()) { case "0": serialConfig.StopBits = StopBits.None; break; case "1": serialConfig.StopBits = StopBits.One; break; case "2": serialConfig.StopBits = StopBits.Two; break; case "1.5": serialConfig.StopBits = StopBits.OnePointFive; break; default: serialConfig.StopBits = StopBits.One; break; } ModbusSlave = new Modbus_Serial(serialConfig); ModbusSlave.LogOutput = new Action <string>((s) => { if (logFrm != null && !logFrm.IsDisposed) { logFrm.AddLog(s); } }); //接收到数据,在此处进行解析 ModbusSlave.ReadDataSuccessed = new Action <List <RealData> >((s) => { try { if (s == null || s.Count <= 0) { return; } string datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "," + DateTime.Now.Millisecond.ToString(); string str = ""; foreach (RealData d in s) { if (d.ReadSendByte == null || d.ReadSendByte.Length <= 0) { continue; } str += ModbusConvert.ByteToHexStr(d.ReadSendByte) + " ,"; try { ReceiveItem realData = new ReceiveItem(); ReceiveItem alarmData = new ReceiveItem(); ReceiveItem alarmstatus = new ReceiveItem(); realData.Id = d.SlaveId; realData.Name = d.ParaName; realData.Address = d.Address; realData.DateTime = datetime; realData.Value = "-9999"; alarmData.Id = d.SlaveId; alarmData.Name = d.ParaName; alarmData.Address = d.Address; alarmData.DateTime = datetime; alarmData.Value = "0.00"; alarmstatus.Id = d.SlaveId; alarmstatus.Name = d.ParaName; alarmstatus.Address = d.Address; alarmstatus.DateTime = datetime; alarmstatus.Value = "0.00"; //获取放大倍数 byte[] blxs = new byte[2]; Array.Copy(d.ReadSendByte, 12, blxs, 0, 2); float blxsvalue = ModbusConvert.GetUShort(ModbusConvert.Bytes2Ushorts(blxs), 0); blxsvalue = Convert.ToSingle(Math.Pow(10, blxsvalue)); //获取单位 byte[] unitb = new byte[2]; Array.Copy(d.ReadSendByte, 14, unitb, 0, 2); realData.Unit = (new GasUnit(ModbusConvert.GetUShort(ModbusConvert.Bytes2Ushorts(unitb), 0))).Unit; //获取气体值 realData.Address = d.Address; realData.DateTime = datetime; byte[] vub = new byte[4]; Array.Copy(d.ReadSendByte, 0, vub, 0, 4); realData.Value = (ModbusConvert.GetUInt(ModbusConvert.Bytes2Ushorts(vub), 0) / blxsvalue).ToString("0.00"); //获取报警状态 alarmstatus.Address = d.Address; alarmstatus.DateTime = datetime; byte[] alarmstatusb = new byte[2]; Array.Copy(d.ReadSendByte, 4, alarmstatusb, 0, 2); alarmstatus.Value = ModbusConvert.GetUShort(ModbusConvert.Bytes2Ushorts(alarmstatusb), 0).ToString(); //获取报警值 if (alarmstatus.Value == "0")//无报警 { alarmData.Address = d.Address; alarmData.DateTime = datetime; alarmData.Value = "0"; } else if (alarmstatus.Value == "1")//低报警 { alarmData.Address = d.Address; alarmData.DateTime = datetime; byte[] alarmb = new byte[4]; Array.Copy(d.ReadSendByte, 16, alarmb, 0, 4); alarmData.Value = (ModbusConvert.GetUInt(ModbusConvert.Bytes2Ushorts(alarmb), 0) / blxsvalue).ToString("0.00"); } else if (alarmstatus.Value == "2")//高报警 { alarmData.Address = d.Address; alarmData.DateTime = datetime; byte[] alarmb = new byte[4]; Array.Copy(d.ReadSendByte, 20, alarmb, 0, 4); alarmData.Value = (ModbusConvert.GetUInt(ModbusConvert.Bytes2Ushorts(alarmb), 0) / blxsvalue).ToString("0.00"); } alarmData.Id = realData.Id; alarmData.Unit = realData.Unit; alarmData.Name = d.ParaName; alarmData.Address = d.Address; alarmData.DateTime = datetime; if (realData != null && realData.Value != "-9999") { realDataFrm.SetChannelStatus(); realDataFrm.SetReadData(realData, alarmData, alarmstatus); realSeriesFrm.SetReadSeries(realData, alarmData, alarmstatus); GasMonitorManager.ReceiveCachec.PushItem(realData); GasMonitorManager.ReceiveAlarmCachec.PushItem(alarmData); GasMonitorManager.ReceiveAlarmStatusCachec.PushItem(alarmstatus); } } catch { continue; } } logFrm.AddLog(str); } catch (Exception emx) { logFrm.AddLog(emx.Message); } }); GasMonitorManager.Start(); } catch (Exception emx) { logFrm.AddLog(emx.Message + " ERROR=01"); } }
/// <summary> /// 发布实时数据 /// </summary> private async static void PublicRealDataJson(string clientid) { logFrm.AddLog("客户端发布数据 " + clientid); if (clientid == null || clientid == "") { return; } if (Config.MQTT.ClientID.Trim().ToLower() != clientid.Trim().ToLower()) { return; } try { if (MqttClient != null && MqttClient.IsConnected) { //构造一个对象 PublicMqttJsonObject publicJsonObject = new PublicMqttJsonObject(); publicJsonObject.device = new PublicMqttJsonDevice() { uid = "1" }; publicJsonObject.paras = new List <PublicMqttJsonPara>(); for (int i = 0; i < Config.Channels.Count; i++) { if (Config.Channels[i].BindingArress.Trim() != "") { foreach (ModbusPara para in Config.ModbusPara) { //获取当前缓存的数据 List <ReceiveItem> channelDatas = ReceiveCachec.GetItems(MqttUpdateCycle, Config.Channels[i].Id.Trim(), para.Name); List <ReceiveItem> channelAlarmDatas = ReceiveAlarmCachec.GetItems(MqttUpdateCycle, Config.Channels[i].Id.Trim(), para.Name); List <ReceiveItem> channelAlarmStatusDatas = ReceiveAlarmStatusCachec.GetItems(MqttUpdateCycle, Config.Channels[i].Id.Trim(), para.Name); //当前缓存最新的数据 ReceiveItem receiveItem = channelDatas.Find(x => int.Parse(x.Address) == int.Parse(Config.Channels[i].BindingArress.Trim())); if (receiveItem != null) { PublicMqttJsonPara paraData = new PublicMqttJsonPara() { name = receiveItem.Name + "_" + int.Parse(Config.Channels[i].Id).ToString() + "_" + int.Parse(receiveItem.Address).ToString(), data = new List <object>() { receiveItem.DateTime, receiveItem.Value, receiveItem.Unit }, }; publicJsonObject.paras.Add(paraData); } //报警值 ReceiveItem receiveAlarmItem = channelAlarmDatas.Find(x => int.Parse(x.Address) == int.Parse(Config.Channels[i].BindingArress.Trim())); if (receiveAlarmItem != null) { PublicMqttJsonPara paraData = new PublicMqttJsonPara() { name = receiveAlarmItem.Name + "_" + int.Parse(Config.Channels[i].Id).ToString() + "_" + int.Parse(receiveAlarmItem.Address).ToString() + "_alarm", data = new List <object>() { receiveAlarmItem.DateTime, receiveAlarmItem.Value, receiveAlarmItem.Unit } }; publicJsonObject.paras.Add(paraData); } ; //报警值 ReceiveItem receiveAlarmStatusItem = channelAlarmStatusDatas.Find(x => int.Parse(x.Address) == int.Parse(Config.Channels[i].BindingArress.Trim())); if (receiveAlarmStatusItem != null) { PublicMqttJsonPara paraData = new PublicMqttJsonPara() { name = receiveAlarmStatusItem.Name + "_" + int.Parse(Config.Channels[i].Id).ToString() + "_" + int.Parse(receiveAlarmItem.Address).ToString() + "_status", data = new List <object>() { receiveAlarmStatusItem.DateTime, receiveAlarmStatusItem.Value, receiveAlarmStatusItem.Unit } }; publicJsonObject.paras.Add(paraData); } ; } } } string json = ScadaHexByteOperator.ObjectToJson(publicJsonObject); //发布订阅的数据 await MqttClient.PublishAsync(new MqttApplicationMessage() { Payload = Encoding.UTF8.GetBytes(json), QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, Retain = false, Topic = Config.MQTT.DataPublicTopic }); } } catch (Exception emx) { logFrm.AddLog(emx.Message); return; } }
private static void ReceiveCachec_OnPushed(ReceiveItem item) { }
private static void ReceiveAlarmStatusCachec_OnPushed(ReceiveItem item) { }
/// <summary> /// 传入读取的数据,data, 报警 alarm,报警状态 ,alarmstatus /// </summary> /// <param name="data"></param> /// <param name="alarm"></param> /// <param name="alarmStatu"></param> public void SetReadData(ReceiveItem data, ReceiveItem alarm, ReceiveItem alarmtatus) { ChannelAlarm channelAlarm = GasMonitorManager.Config.ChannelAlarms.Find(x => int.Parse(x.ChanelID) == int.Parse(this.Channel.Id)); uledTime.Text = ScadaHexByteOperator.GetDateTime(data.DateTime).Value.ToString("HH:mm:ss"); ///设置值 switch (data.Name) { case "CO": uledCO.Text = data.Value.ToString(); uslabCO.Text = data.Name + "/" + data.Unit; //系统报警优先 if (alarmtatus.Value.ToString() == "0") //无报警 { uledbubCO.Color = Color.Green; uiLedAlarmCO.Text = ""; } else if (alarmtatus.Value.ToString() == "1") //低报警 { uledbubCO.Color = Color.Yellow; uiLedAlarmCO.Text = alarm.Value.ToString(); } else if (alarmtatus.Value.ToString() == "2") //高报警 { uledbubCO.Color = Color.Red; uiLedAlarmCO.Text = alarm.Value.ToString(); } //设置曲线 if (channelAlarm != null) { ParaAlarm paraAlarm = channelAlarm.ParaAlarms.Find(x => x.Name.Trim().ToUpper() == "CO" && x.Enable == "1"); //表示系统报警开启 if (paraAlarm != null) { float high = Convert.ToSingle(paraAlarm.High); float low = Convert.ToSingle(paraAlarm.Low); float v = Convert.ToSingle(data.Value); if (v <= low) { uledbubCO.Color = Color.Yellow; uiLedAlarmCO.Text = alarm.Value.ToString(); } else if (v >= high) { uledbubCO.Color = Color.Red; uiLedAlarmCO.Text = alarm.Value.ToString(); } } } break; case "EX": uledEX.Text = data.Value.ToString(); uslabEX.Text = data.Name + "/" + data.Unit; if (alarmtatus.Value.ToString() == "0") //无报警 { uledbubEX.Color = Color.Green; uiLedAlarmEX.Text = ""; } else if (alarmtatus.Value.ToString() == "1") //低报警 { uledbubEX.Color = Color.Yellow; uiLedAlarmEX.Text = alarm.Value.ToString(); } else if (alarmtatus.Value.ToString() == "2") //高报警 { uledbubEX.Color = Color.Red; uiLedAlarmEX.Text = alarm.Value.ToString(); } if (channelAlarm != null) { ParaAlarm paraAlarm = channelAlarm.ParaAlarms.Find(x => x.Name.Trim().ToUpper() == "EX" && x.Enable == "1"); if (paraAlarm != null) { //表示系统报警开启 float high = Convert.ToSingle(paraAlarm.High); float low = Convert.ToSingle(paraAlarm.Low); float v = Convert.ToSingle(data.Value); if (v <= low) { uledbubEX.Color = Color.Yellow; uiLedAlarmEX.Text = alarm.Value.ToString(); } else if (v >= high) { uledbubEX.Color = Color.Red; uiLedAlarmEX.Text = alarm.Value.ToString(); } } } break; case "H2S": uledH2S.Text = data.Value.ToString(); uslabH2S.Text = data.Name + "/" + data.Unit; if (alarmtatus.Value.ToString() == "0") //无报警 { uledbubH2S.Color = Color.Green; uiLedAlarmH2S.Text = ""; } else if (alarmtatus.Value.ToString() == "1") //低报警 { uledbubH2S.Color = Color.Yellow; uiLedAlarmH2S.Text = alarm.Value.ToString(); } else if (alarmtatus.Value.ToString() == "2") //高报警 { uledbubH2S.Color = Color.Red; uiLedAlarmH2S.Text = alarm.Value.ToString(); } if (channelAlarm != null) { ParaAlarm paraAlarm = channelAlarm.ParaAlarms.Find(x => x.Name.Trim().ToUpper() == "H2S" && x.Enable == "1"); //表示系统报警开启 if (paraAlarm != null) { float high = Convert.ToSingle(paraAlarm.High); float low = Convert.ToSingle(paraAlarm.Low); float v = Convert.ToSingle(data.Value); if (v <= low) { uledbubH2S.Color = Color.Yellow; uiLedAlarmH2S.Text = alarm.Value.ToString(); } else if (v >= high) { uledbubH2S.Color = Color.Red; uiLedAlarmH2S.Text = alarm.Value.ToString(); } } } break; case "O2": uledO2.Text = data.Value.ToString(); uslabO2.Text = data.Name + "/" + data.Unit; if (alarmtatus.Value.ToString() == "0") //无报警 { uledbubO2.Color = Color.Green; uiLedAlarmO2.Text = ""; } else if (alarmtatus.Value.ToString() == "1") //低报警 { uledbubO2.Color = Color.Yellow; uiLedAlarmO2.Text = alarm.Value.ToString(); } else if (alarmtatus.Value.ToString() == "2") //高报警 { uledbubO2.Color = Color.Red; uiLedAlarmO2.Text = alarm.Value.ToString(); } if (channelAlarm != null) { ParaAlarm paraAlarm = channelAlarm.ParaAlarms.Find(x => x.Name.Trim().ToUpper() == "H2S" && x.Enable == "1"); //表示系统报警开启 if (paraAlarm != null) { float high = Convert.ToSingle(paraAlarm.High); float low = Convert.ToSingle(paraAlarm.Low); float v = Convert.ToSingle(data.Value); if (v <= low) { uledbubO2.Color = Color.Yellow; uiLedAlarmO2.Text = alarm.Value.ToString(); } else if (v >= high) { uledbubO2.Color = Color.Red; uiLedAlarmO2.Text = alarm.Value.ToString(); } } } break; } if (!string.IsNullOrEmpty(data.Value) && data.Value != "-9999") { uiLedDeviceStatus.Color = Color.Green; } int index = this.chart1.Series["Series" + data.Name].Points.AddXY(ScadaHexByteOperator.GetDateTime(data.DateTime).Value.ToString("mm:ss"), data.Value); if (data.Value == "-9999") { this.chart1.Series["Series" + data.Name].Points[index].IsEmpty = true; } if (this.chart1.Series["Series" + data.Name].Points.Count > 200) { this.chart1.Series["Series" + data.Name].Points.RemoveAt(0); } if (this.chart1.Series["Series" + data.Name].Points.Count > 0) { if (this.chart1.Series["Series" + data.Name].YAxisType == System.Windows.Forms.DataVisualization.Charting.AxisType.Primary) { this.chart1.ChartAreas[this.chart1.Series["Series" + data.Name].ChartArea].AxisY.Maximum = this.chart1.Series["Series" + data.Name].Points.FindMaxByValue().YValues[0] + this.chart1.Series["Series" + data.Name].Points.FindMaxByValue().YValues[0] / 10.0d; } else { this.chart1.ChartAreas[this.chart1.Series["Series" + data.Name].ChartArea].AxisY2.Maximum = this.chart1.Series["Series" + data.Name].Points.FindMaxByValue().YValues[0] + this.chart1.Series["Series" + data.Name].Points.FindMaxByValue().YValues[0] / 10.0d; } } }