using AutoMapper.Internal; using CapMachine.Core; using CapMachine.Wpf.Models; using CapMachine.Wpf.Models.Tag; using CapMachine.Wpf.PrismEvent; using HslCommunication; using HslCommunication.Profinet.Siemens; using Microsoft.Extensions.Caching.Memory; using NPOI.SS.Formula.Atp; using Prism.Events; using Prism.Mvvm; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using static CapMachine.Wpf.Models.ComEnum; namespace CapMachine.Wpf.Services { /// /// 机器实时数据服务 /// public class MachineRtDataService : BindableBase { /// /// 事件聚合器 /// private IEventAggregator _EventAggregator { get; set; } /// /// PLCScanTask扫描Task /// private static Task PLCScanTask { get; set; } /// /// ScanTask扫描Task /// private static Task ScanTask { get; set; } /// /// 西门子连接驱动程序 /// public SiemensS7Net SiemensDrive { get; set; } /// /// PLC连接状态 /// public bool SiemensS7LinkState { get; set; } /// /// 仪表数据集合 /// public List ListMeterRtData { get; set; } ///// ///// Tag数据集合 ///// //public List ListRtDataModel { get; set; } /// /// 标签管理中心 /// public TagManager TagManger { get; set; } = new TagManager(); /// /// 扫描线程使能 /// public bool ThreadEnable { get; set; } = true; /// /// 历史数据 /// public List HistoryData = new List(); /// /// 实例化函数 /// /// public MachineRtDataService(IEventAggregator eventAggregator) { //ConcurrentDictionary keyValuePairs = new ConcurrentDictionary(); //Stopwatch stopwatch = new Stopwatch(); ////第一次计时 //stopwatch.Start(); //启动Stopwatch //for (var i = 0; i < 10000000; i++) //{ // keyValuePairs.TryAdd(DateTime.UtcNow, new RecordInfo() // { // CreateTime = DateTime.UtcNow, // WorkCondition = "dadf", // Temp = 23.3 // }); // //keyValuePairs.Add(new RecordInfo() // //{ // // CreateTime = DateTime.UtcNow, // // WorkCondition = "dadf", // // Temp = 23.3 // //}); //} //stopwatch.Stop(); //停止Stopwatch //Console.WriteLine("Add Elapsed output runTime:{0}", stopwatch.Elapsed.ToString()); //事件服务 _EventAggregator = eventAggregator; //TagManger.AddTag(new ByteTag("转速", "Speed", "rpm", ComEnum.TagType.Tag)); //dynamic dad=10; //TagManger.AddRange(new List() //{ // new ByteTag("转速","Speed","rpm",ComEnum.TagType.Tag, (byte)10), // new ShortTag("排气压力","ExPress","BarA",ComEnum.TagType.Tag), // new ShortTag("吸气压力","InhPress","BarA",ComEnum.TagType.Tag), // new ShortTag("吸气温度","InhTemp","℃",ComEnum.TagType.Tag), // new ShortTag("COND1温度","Cond1Temp","℃",ComEnum.TagType.Tag), // new ShortTag("润滑油压力","LubePress","BarA",ComEnum.TagType.Tag), // new ShortTag("COND2压力","Cond2Press","BarA",ComEnum.TagType.Tag), // new ShortTag("OCR","OCR","%",ComEnum.TagType.Tag), // new ShortTag("HV","HV","V",ComEnum.TagType.Tag), // new ShortTag("HV","HVCur","A",ComEnum.TagType.Tag), // new ShortTag("HV","HV","W",ComEnum.TagType.Tag), // new ShortTag("LV","LV","V",ComEnum.TagType.Tag), // new ShortTag("LV","LVCur","A",ComEnum.TagType.Tag), // new ShortTag("环境温度","EnvTemp","℃",ComEnum.TagType.Tag), // new ShortTag("环境湿度","EnvRH","%",ComEnum.TagType.Tag), // new ShortTag("OS1温度","OS1Temp","℃",ComEnum.TagType.Tag), // new ShortTag("OS2温度","OS2Temp","℃",ComEnum.TagType.Tag), // new ShortTag("COND2温度","Cond2Temp","℃",ComEnum.TagType.Tag), // new ShortTag("EVAP出口温度","EVAPExpTemp","℃",ComEnum.TagType.Tag), // new ShortTag("冷媒流量","VRV","L/min",ComEnum.TagType.Tag), // new ShortTag("润滑油流量","LubeFlow","L/min",ComEnum.TagType.Tag), // new ShortTag("排气温度","ExTemp","℃",ComEnum.TagType.Tag), // new ShortTag("膨胀阀前压力","TxvFrPress","BarA",ComEnum.TagType.Tag), // new ShortTag("膨胀阀前温度","TxvFrTemp","℃",ComEnum.TagType.Tag), // new ShortTag("EVAP出口压力","EVAPExpPress","BarA",ComEnum.TagType.Tag), // new ShortTag("腔内压力","IntrplPress","BarA",ComEnum.TagType.Tag), // new ShortTag("压缩机表面温度","CapSurfTemp","℃",ComEnum.TagType.Tag), // new ShortTag("PTC流量","PTCFlow","L/min",ComEnum.TagType.Tag), // new ShortTag("PTC入水温度","PTCEntTemp","℃",ComEnum.TagType.Tag), // new ShortTag("PTC出水温度","PTCExpTemp","℃",ComEnum.TagType.Tag), // new ShortTag("通讯Cmp母线电流","ComCapBusCur","A",ComEnum.TagType.Tag), // new ShortTag("通讯Cmp母线电压","ComCapBusVol","V",ComEnum.TagType.Tag), // new ShortTag("通讯Cmp逆变器温度","ComCapInvTemp","℃",ComEnum.TagType.Tag), // new ShortTag("通讯Cmp相电流","ComCapPhCur","A",ComEnum.TagType.Tag), // new ShortTag("通讯Cmp功率","ComCapPw","W",ComEnum.TagType.Tag), // new ShortTag("通讯Cmp芯片温度","ComCapChipTemp","℃",ComEnum.TagType.Tag), // new ShortTag("通讯PTC入水温度","ComPTCEntTemp","℃",ComEnum.TagType.Tag), // new ShortTag("通讯PTC出水温度","ComPTCExpTemp","℃",ComEnum.TagType.Tag), // new ShortTag("通讯PTC峰值电流","ComPTCPeakCur","A",ComEnum.TagType.Tag), // new ShortTag("通讯PTC母线电流","ComPTCBusCur","A",ComEnum.TagType.Tag), // new ShortTag("通讯PTC膜温","ComPTCFlmTemp","℃",ComEnum.TagType.Tag), // new ShortTag("通讯PTC模块温度","ComPTCMdTemp","℃",ComEnum.TagType.Tag), //}); #region ListMeterRtData实例化 //实例化集合 //ListMeterRtData = new List() //{ // new MeterRtDataModel(){ // MeterName = "EVA风量", // RtUIControlTitle="EVA风量" + Environment.NewLine + "m³/h", // RtUIControlTitleIndex="Title5", // Station = 1, // RtAddressPV = "101", // RtAddressMV = "105", // RtMVUIControlIndex="MV5", // RtSVUIControlIndex="SV5", // RtPVUIControlIndex="PV5", // MaxValue=500, // MinValue=0, // Accuracy=1, // Unit="m³/h", // MeterEnableStatePLCAddress="V30.3", // }, // new MeterRtDataModel(){//目前是DB表 // MeterName = "中间轴转速",//原来中间轴转速,先全部改为电机转速-开发过程中某个时刻中间轴转速改为电机转速 // RtUIControlTitle="中间轴转速" + Environment.NewLine + "(r/min)", // RtUIControlTitleIndex="Title3", // Station = 2, // RtAddressPV = "101", // RtAddressMV = "105", // RtMVUIControlIndex="MV3", // RtSVUIControlIndex="SV3", // RtPVUIControlIndex="PV3", // MaxValue=4000, // MinValue=0, // Accuracy=0, // Unit="(r/min)", // MeterEnableStatePLCAddress="", // }, // new MeterRtDataModel(){ // MeterName = "加热电力",//加热电力 // RtUIControlTitle="加热电力" + Environment.NewLine + "(KW)", // RtUIControlTitleIndex="Title7", // Station = 3, // RtAddressPV = "101", // RtAddressMV = "105", // RtMVUIControlIndex="MV7", // RtSVUIControlIndex="SV7", // RtPVUIControlIndex="PV7", // MaxValue=30, // MinValue=0, // Accuracy=2, // Unit="(KW)", // MeterEnableStatePLCAddress="V30.4", // }, // new MeterRtDataModel(){ // MeterName = "加湿电力", // RtUIControlTitle="加湿电力" + Environment.NewLine + "(KW)", // RtUIControlTitleIndex="Title8", // Station = 4, // RtAddressPV = "101", // RtAddressMV = "105", // RtMVUIControlIndex="MV8", // RtSVUIControlIndex="SV8", // RtPVUIControlIndex="PV8", // MaxValue=18, // MinValue=0, // Accuracy=2, // Unit="(KW)", // MeterEnableStatePLCAddress="V30.5", // }, // new MeterRtDataModel(){//目前是DB表 // MeterName = "EMPCV电流",//EMPCV电力 // RtUIControlTitle="EMPCV电流" + Environment.NewLine + "(A)", // RtUIControlTitleIndex="Title9", // Station = 5, // RtAddressPV = "101", // RtAddressMV = "105", // RtMVUIControlIndex="MV9", // RtSVUIControlIndex="SV9", // RtPVUIControlIndex="PV9", // MaxValue=1, // MinValue=0, // Accuracy=2, // Unit="(A)", // MeterEnableStatePLCAddress="V30.6", // }, // new MeterRtDataModel(){ // MeterName = "INJ压力", // RtUIControlTitle="INJ压力" + Environment.NewLine + "(MPa)", // RtUIControlTitleIndex="Title10", // Station = 6, // RtAddressPV = "101", // RtAddressMV = "105", // RtMVUIControlIndex="MV10", // RtSVUIControlIndex="SV10", // RtPVUIControlIndex="PV10", // MaxValue=5, // MinValue=0, // Accuracy=3, // Unit="(MPa)", // MeterEnableStatePLCAddress="V30.7", // }, // new MeterRtDataModel(){ // MeterName = "冷媒流量", // RtUIControlTitle="冷媒流量" + Environment.NewLine + "(kg/h)", // RtUIControlTitleIndex="Title11", // Station = 7, // RtAddressPV = "101", // RtAddressMV = "105", // RtMVUIControlIndex="MV11", // RtSVUIControlIndex="SV11", // RtPVUIControlIndex="PV11", // MaxValue=500, // MinValue=0, // Accuracy=1, // Unit="(kg/h)", // MeterEnableStatePLCAddress="V31.0", // }, //}; #endregion InitialPLCCom(); PubRtDataStart(); } /// /// 初始化PLC通信 /// private void InitialPLCCom() { var IPInfo = ConfigHelper.GetValue("PLCIP"); SiemensDrive = new SiemensS7Net(SiemensPLCS.S200Smart, IPInfo); // 连接对象 OperateResult connect = SiemensDrive.ConnectServer(); if (!connect.IsSuccess)//连接失败 { SiemensS7LinkState = false; Console.WriteLine("connect failed:" + connect.Message); MessageBox.Show($"PLC连接失败:{IPInfo}"); return; } else//连接成功 { SiemensS7LinkState = true; } //扫描线程成功 RtScanDeviceStart(); } /// /// PLC扫描线程 /// private void RtScanDeviceStart() { PLCScanTask = Task.Run(async () => { while (ThreadEnable) { await Task.Delay(50); //DiagnosticsTime.Reset(); //DiagnosticsTime.Start(); try { //RT TODO //SiemensDrive.Read("VW1", 2); foreach (var itemTag in TagManger.ListTag) { switch (itemTag.DataTypeInfo) { //case DataType.Byte: // itemTag.OperateResultSource = SiemensDrive.ReadByte(itemTag.Address); // break; //case DataType.Short: // itemTag.OperateResultSource = SiemensDrive.ReadInt16(itemTag.Address); // break; //case DataType.String: // itemTag.OperateResultSource = SiemensDrive.ReadString(itemTag.Address); // break; //case DataType.Double: // itemTag.OperateResultSource = SiemensDrive.ReadDouble(itemTag.Address); // break; default: break; } } } catch (Exception ex) { //LogService.Info($"时间:{DateTime.Now.ToString()}-【Meter】-{ex.Message}"); } //DiagnosticsTime.Stop(); //ScanRtTimeinfo = $"电表:{DiagnosticsTime.Elapsed.TotalMilliseconds.ToString()}"; } }); } private Random random = new Random(); /// ///发布实时数据 /// private void PubRtDataStart() { ScanTask = Task.Run(async () => { while (ThreadEnable) { try { await Task.Delay(1000); _EventAggregator.GetEvent().Publish(new List() { new Models.ChartRtValue(){Name="EVA风量",Value=random.NextDouble()*100,Unit="℃"}, new Models.ChartRtValue(){Name="中间轴转速",Value=random.NextDouble()*100,Unit="℃"}, new Models.ChartRtValue(){Name="加热电力",Value=random.NextDouble()*100,Unit="℃"}, new Models.ChartRtValue(){Name="加湿电力",Value=random.NextDouble()*100,Unit="℃"}, new Models.ChartRtValue(){Name="EMPCV电流",Value=random.NextDouble()*100,Unit="℃"}, new Models.ChartRtValue(){Name="INJ压力",Value=random.NextDouble()*100,Unit="℃"}, new Models.ChartRtValue(){Name="冷媒流量",Value=random.NextDouble()*100,Unit="℃"}, }); } catch (Exception ex) { var dd = 1; } } }); } } }