using DefaultEdit.Communication; using DefaultEdit.Log4xml; using DefaultEdit.Model; using Newtonsoft.Json.Linq; using NextTreatMesDemo.Models; using NextTreatMesDemo.Utils; using ObservableCollections; using Prism.Modularity; using Prism.Mvvm; using ScottPlot; using SqlSugar; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; namespace DefaultEdit.Core { public class Management : BindableBase { private CurentApplicationSettings _CurentApplicationSettings=new CurentApplicationSettings(); private IServer _httpService = new MesServer(); private S7PlcCommunicate s7PlcCommunicate; public event Action RuningToWorkEvent; public event Action ProduceDataToChangeEvent; private List _RfIDList=new List(); public List RfIDList { get => _RfIDList; set => _RfIDList = value; } private ObservableCollection _RuningData=new ObservableCollection(); public ObservableCollection RuningData { get => _RuningData; set => _RuningData = value; } private CurrConfig _currConfig = new CurrConfig(); public CurrConfig CurrConfig { get => _currConfig; set { SetProperty(ref _currConfig, value); } } private DateTime _DateTimeNow; /// /// 当前时间 /// public DateTime DateTimeNow { get { return _DateTimeNow; } set { SetProperty(ref _DateTimeNow, value); } } private ObservableCollection _CurrStationRfid=new ObservableCollection(); public ObservableCollection CurrStationRfid { get => _CurrStationRfid; set => _CurrStationRfid = value; } /// /// 用户Id(从MES接口内获取) /// private string _UserId = ""; /// /// 用户名(从MES接口内获取) /// private string _UserName = "未登录"; /// /// 用于记录后处理数据来打印小票 /// public ObservableCollection processDataModels = new ObservableCollection(); public double[] ProduceData = new double[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 }; public IServer HttpService { get => _httpService; set { SetProperty(ref _httpService, value); } } public string UserId { get => _UserId; set { SetProperty(ref _UserId, value); } } public string UserName { get => _UserName; set { SetProperty(ref _UserName, value); } } public CurentApplicationSettings CurentApplicationSettings { get => _CurentApplicationSettings; set { SetProperty(ref _CurentApplicationSettings, value); } } //运行线程 private Thread WorkThread; public Management() { for ( int i = 0; i < 6; i++ ) { CurrStationRfid.Add(""); } RuningToWorkEvent += Management_RuningToWorkEvent; ; WorkThread = new Thread(DataBridging); WorkThread.Name = "Plc读取"; WorkThread.IsBackground = true; WorkThread.Start(); } public void ConnectPlc() { s7PlcCommunicate = new S7PlcCommunicate(CurentApplicationSettings.PlcIP); s7PlcCommunicate.OpenPlc(); } private void Management_RuningToWorkEvent(string key, bool value) { switch ( key ) { case "1工位离心开始": if ( value ) { if ( RfIDList.Count != 0 ) { int index= RfIDList.FindIndex(x => x.StationId == 1); if ( index != -1 ) { RfIDList[ index ].StationId = 2; CurrStationRfid[ 1 ] = RfIDList[ index ].Rfid; LogHelper.Info(RfIDList[ index ].Rfid + " 1工位离心开始"); } else { LogHelper.Info(" 1工位离心开始"); } } } break; case "1工位离心完成": if ( value ) { if ( RfIDList.Count != 0 ) { int index= RfIDList.FindIndex(x => x.StationId == 2); if ( index != -1 ) { RfIDList[ index ].StationId = 4; LogHelper.Info(CurrStationRfid[ 1 ] + " 1工位离心完成"); } else { LogHelper.Info(" 1工位离心完成"); } } } break; case "2工位离心开始": if ( value ) { if ( RfIDList.Count != 0 ) { int index= RfIDList.FindIndex(x => x.StationId == 1); if ( index != -1 ) { RfIDList[ index ].StationId = 3; CurrStationRfid[ 2 ] = RfIDList[ index ].Rfid; LogHelper.Info(RfIDList[ index ].Rfid + " 2工位离心开始"); } else { LogHelper.Info( " 2工位离心开始"); } } } break; case "2工位离心完成": if ( value ) { if ( RfIDList.Count != 0 ) { int index= RfIDList.FindIndex(x => x.StationId == 3); if ( index != -1 ) { RfIDList[ index ].StationId = 4; LogHelper.Info(CurrStationRfid[ 2 ] + " 2工位离心完成"); } else { LogHelper.Info(" 2工位离心完成"); } } } break; case "脱模开始": if ( value ) { LogHelper.Info(CurrConfig.Rfid + " 脱模开始"); PlateInPlace(CurrConfig.Rfid); } break; case "脱模完成": if ( value ) { LogHelper.Info(CurrConfig.Rfid + " 脱模完成"); PrintInfo(processDataModels[0],""); } break; case "固化开始": if ( value ) { if ( RfIDList.Count != 0 ) { int index= RfIDList.FindIndex(x => x.StationId ==4 ); if ( index != -1 ) { RfIDList[ index ].StationId = 5; CurrStationRfid[ 3 ] = RfIDList[ index ].Rfid; LogHelper.Info(RfIDList[ index ].Rfid + " 固化开始"); } else { LogHelper.Info( " 固化开始"); } } } break; case "固化完成": if ( value ) { if ( RfIDList.Count != 0 ) { int index= RfIDList.FindIndex(x => x.StationId ==5 ); if ( index != -1 ) { RfIDList.RemoveAt(index); LogHelper.Info(RfIDList[ index ].Rfid + " 固化完成"); } else { LogHelper.Info( " 固化完成"); } int hour= DateTime.Now.Hour; ProduceData[ hour ] = ProduceData[ hour ]+1; for ( int i = hour+1; i < ProduceData.Length; i++ ) { ProduceData[ i ] = 0; } ProduceDataToChangeEvent?.Invoke(); } } break; default: break; } } public void DataBridging() { ObservableDictionary BoolPairs=new ObservableDictionary(); BoolPairs.Add("1工位离心开始", false); BoolPairs.Add("1工位离心完成", false); BoolPairs.Add("2工位离心开始", false); BoolPairs.Add("2工位离心完成", false); BoolPairs.Add("脱模开始", false); BoolPairs.Add("脱模完成", false); BoolPairs.Add("固化开始", false); BoolPairs.Add("固化完成", false); BoolPairs.CollectionChanged += BoolPairs_CollectionChanged; while ( true ) { try { if (s7PlcCommunicate!=null&& s7PlcCommunicate.IsConnected ) { byte []buff= s7PlcCommunicate.ReadByte(25, 780, 74); int actuallength=buff[53]; byte[] buffsT = new byte[ actuallength ]; Array.Copy(buff, 54, buffsT, 0, actuallength); CurrConfig.Rfid = Encoding.ASCII.GetString(buffsT); BoolPairs[ "1工位离心开始" ] = s7PlcCommunicate.GetBitAt(buff, 0, 0); BoolPairs[ "1工位离心完成" ] = s7PlcCommunicate.GetBitAt(buff, 0, 1); BoolPairs[ "2工位离心开始" ] = s7PlcCommunicate.GetBitAt(buff, 1, 0); BoolPairs[ "2工位离心完成" ] = s7PlcCommunicate.GetBitAt(buff, 1, 1); BoolPairs[ "脱模开始" ] = s7PlcCommunicate.GetBitAt(buff, 2, 0); BoolPairs[ "脱模完成" ] = s7PlcCommunicate.GetBitAt(buff, 2, 1); BoolPairs[ "固化开始" ] = s7PlcCommunicate.GetBitAt(buff, 3, 0); BoolPairs[ "固化完成" ] = s7PlcCommunicate.GetBitAt(buff, 3, 1); CurrConfig.Speed = s7PlcCommunicate.GetShortAt(buff, 12); CurrConfig.Time = s7PlcCommunicate.GetTimeSpanAt(buff, 16); CurrConfig.Power1_1 = s7PlcCommunicate.GetShortAt(buff, 20); CurrConfig.Power1_2 = s7PlcCommunicate.GetShortAt(buff, 22); CurrConfig.Power1_3 = s7PlcCommunicate.GetShortAt(buff, 24); CurrConfig.Power1_4 = s7PlcCommunicate.GetShortAt(buff, 26); CurrConfig.Pressure1 = s7PlcCommunicate.GetRealAt(buff, 36); CurrConfig.PTime1 = s7PlcCommunicate.GetTimeSpanAt(buff, 44); } } catch { } } } private void BoolPairs_CollectionChanged(in NotifyCollectionChangedEventArgs> e) { if ( e.NewItem.Value != e.OldItem.Value ) { RuningToWorkEvent?.Invoke(e.OldItem.Key, e.NewItem.Value); } } private void Serial_ConnectionChanged(SerialCommunication arg1, bool arg2) { if ( arg2 ) LogHelper.Info(arg1.PortName + ":已连接"); if ( !arg2 ) LogHelper.Info(arg1.PortName + ":断开连接"); } private void Serial_DataReceived(SerialCommunication arg1, string arg2) { LogHelper.Info("收到" + arg1.PortName + $"消息:{arg2}"); } /// /// 网板读取获取数据并上传记录 /// public async Task PlateInPlace(string value) { var IsOK = true; try { if ( !string.IsNullOrEmpty(value) ) { try { if ( value.Length != 8 ) { return; } else { var boardId = value; string boardguid = Guid.NewGuid().ToString(); var modelsinfo = ""; var materialtype = ""; var printdeviceId = ""; var brand = ""; var printTagProduct = ""; var iskid = false; var ishaiwai = false; var isLarge = "无"; var count = 0; var tip = ""; var isoutline = false; var groupdata = _httpService.GetGroupItems(boardId, CurentApplicationSettings.DeviceId); if ( !groupdata.Success ) { if ( groupdata.RawText.Contains("未点检") ) { var s = MessageBox.Show("设备未点检,请点检后确认!", "提示", MessageBoxButton.OK); } LogHelper.MesInfo($"网板ID:{boardId}获取信息失败,Code:{( int ) groupdata.Code},原因:{groupdata.RawText}"); isoutline = true; } else { if ( groupdata.Data.Count <= 0 ) { LogHelper.MesInfo($"网板ID:{boardId}获取信息失败,Code:{( int ) groupdata.Code},原因:{groupdata.RawText}"); isoutline = true; } } if ( !isoutline ) { ///上传后处理记录 var result = UpdateRecord(boardId); if ( !string.IsNullOrEmpty(result) ) { LogHelper.MesInfo($"上传记录失败,{result}!"); var boxresult = MessageBox.Show($"{result}(是:放回;否:重试)", "提示", MessageBoxButton.YesNo); if ( boxresult == MessageBoxResult.Yes ) { IsOK = false; return; } } ///读取网板内的牙模的信息(方便打印在小票上),如果读取失败就读取下一个牙模,读取成功就跳出循环 for ( int i = 0; i < 10; i++ ) { try { modelsinfo = ""; count = groupdata.Data.Count; var Id = groupdata.Data[groupdata.Data.Count - i].itemId; var infos = _httpService.GetModels(Id, CurentApplicationSettings.DeviceId); if ( infos.Success ) { modelsinfo = infos.Data.uvcuringReleaseBatch + " " + infos.Data.alignerSpec.material + "-" + infos.Data.alignerSpec.thickness; if ( infos.Data.order.is_expedited == "1" || infos.Data.remade || infos.Data.produceType == "R" ) { modelsinfo = modelsinfo + "\r\n"; if ( infos.Data.order.is_expedited == "1" ) { modelsinfo = modelsinfo + " 加急"; } if ( infos.Data.remade ) { modelsinfo = modelsinfo + " 返工"; } if ( infos.Data.produceType == "R" ) { modelsinfo = modelsinfo + " 保持器"; } } iskid = infos.Data.isKid; ishaiwai = infos.Data.order.country.Contains("中国") ? false : true; if ( infos.Data.processParameters != null ) { var carrierf = infos.Data.processParameters.FirstOrDefault(x => x.key == "carrier"); if ( carrierf != null ) { isLarge = carrierf.value == "small" ? "小载具" : "大载具"; } } var record = _httpService.GetProductionRecord(Id); if ( record.Success ) { printdeviceId = record.Data.First().deviceId; if ( record.Data.First().description.FirstOrDefault(x => x.key == "printTaskId") != null ) { var taskId = record.Data.First().description.FirstOrDefault(x => x.key == "printTaskId").value; var taskinfo = _httpService.GetPrintTask(taskId); if ( taskinfo.Success ) { materialtype = taskinfo.Data.description.FirstOrDefault(x => x.key == "filmType") != null ? taskinfo.Data.description.FirstOrDefault(x => x.key == "filmType").value : ""; printTagProduct = taskinfo.Data.description.FirstOrDefault(x => x.key == "printTagProduct") != null ? taskinfo.Data.description.FirstOrDefault(x => x.key == "printTagProduct").value : ""; brand = taskinfo.Data.description.FirstOrDefault(x => x.key == "productOfProduce") != null ? taskinfo.Data.description.FirstOrDefault(x => x.key == "productOfProduce").value : ""; break; } } } } } catch ( Exception e ) { LogHelper.Error("读取网板内牙模信息异常:" + e.ToString()); } } } else { LogHelper.MesInfo($"网板{value}获取数据异常,不上传记录"); modelsinfo = "异常"; materialtype = "异常"; printTagProduct = "异常"; printdeviceId = "异常"; brand = "异常"; } ///将生产信息记录下,用于在打印完成时打印小票 App.Current.Dispatcher.Invoke(( System.Action ) delegate { //添加记录 processDataModels.Add(new ProcessDataModel() { BoardId = boardId, ModelsInfo = modelsinfo, StartTime = DateTime.Now.ToString("HH:mm:ss"), State = ProcessState.入料中, BoardGuid = boardguid, stopwatch = new System.Diagnostics.Stopwatch(), MaterialType = materialtype, PrintTagProduct = printTagProduct, PrintDeviceId = printdeviceId, IsKid = iskid, Tip = tip, IsOverSea = ishaiwai, IsLarge = isLarge, Brand = brand, Count = count, }); if ( processDataModels.Count > 10 ) { processDataModels.RemoveAt(0); } RfidInfo rfidInfo= new RfidInfo() { Rfid = value, StationId = 1, ModelsInfo=modelsinfo, State="入料中", StartTime=DateTime.Now }; if ( RfIDList.Find(x=>x.Rfid==value)==null ) { RfIDList.Add(rfidInfo); RuningData.Add(rfidInfo); } }); } } catch ( Exception e ) { LogHelper.Error("网板读取获取数据异常,原因:" + e.ToString()); } } else { LogHelper.Info("未读取到网板编号"); //WriteInfo($"未读取到网板编号"); } } catch { } finally { } } /// /// 上传生产记录 /// /// 从扫码枪获取的网板Id /// public string UpdateRecord(string RfidId) { try { Rt_ProductionRecordDto rt_ProductionRecord = new Rt_ProductionRecordDto() { userId = UserId,///用户Id creationTime = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz"),///生产时间 deviceId = CurentApplicationSettings.DeviceId,///设备编号 productionType = "UVcuringNextTreat",///生产工序,固定不变 description = new List() { ///从扫码枪获取的网板Id new DescriptionItem(){ key="containerId",value=RfidId}, //后处理配方(根据设备不同参数也不同,具体需要上传什么参数要具体咨询下现场的工艺人员(程朋)) new DescriptionItem(){ key="CentrifugalTime1",value=""}, new DescriptionItem(){ key="CentrifugalTime2",value=""}, new DescriptionItem(){ key="LightSolidifiedTime",value=""}, } }; var recordData = _httpService.PostRecord(rt_ProductionRecord); if ( recordData.Success ) { LogHelper.MesInfo($"网板ID:{RfidId}上传记录成功"); return ""; } else { LogHelper.MesInfo($"网板ID:{RfidId}上传记录失败,Code:{( int ) recordData.Code},原因:{recordData.RawText}"); /////记录至数据库 //Rt_AngelNetRecordDto recordDto = new Rt_AngelNetRecordDto() //{ // DevcieId = DataPathcs.GetConnectionStringsConfig("DeviceID"), // EquipmentType = 4, // UserId = UserName, // descriptions = new List() { // new Description(){ Key="BoardId",KeyValue=RfidId }, // new Description(){ Key="Code",KeyValue=recordData.Code.ToString() }, // new Description(){ Key="RawText",KeyValue=recordData.RawText } // } //}; //var recorddata = alignServer.InsertProductionRecord(recordDto); return $"{recordData.RawText}"; } } catch ( Exception ex ) { LogHelper.Error($"网板ID:{RfidId}上传记录异常,原因{ex.Message}"); return ex.ToString(); } } /// /// 小票打印 /// /// /// public void PrintInfo(ProcessDataModel printinfo, string Position) { try { var pmTitle = new PrintModel { FontFamily = "宋体", FontSize = 15, IsBold = true, Text = new StringReader("\n" + "<<<<后处理收料信息>>>>") //首行需要空行,某些打印机首行不为空时会出现“首行乱码问题” }; var count = 0; if ( printinfo.SolidifyStation != 0 ) { count = printinfo.SolidifyStation % 2 == 1 ? 1 : 2; } var printContent = new StringBuilder(); printContent.Append("<<<----------------------------->>>" + "\n"); printContent.Append($"出料窗口:{CurentApplicationSettings.DeviceId}" + $",{Position}传送带,第{count}板" + "\n"); printContent.Append($"网板编号:{printinfo.BoardId}" + "\n"); printContent.Append("出票时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n"); printContent.Append("<<<----------------------------->>>" + "\n"); printContent.Append(" " + "\n"); var batchs = new PrintModel { FontFamily = "宋体", FontSize = 12, IsBold = true, Text = new StringReader(printContent.ToString()) }; var sb = new StringBuilder(); if ( !string.IsNullOrEmpty(printinfo.Tip) ) { sb.Append($"记录上传异常:{printinfo.Tip}" + "\n"); } sb.Append($"3D打印设备:{printinfo.PrintDeviceId}" + "\n"); sb.Append($"批次:{printinfo.ModelsInfo}" + "\n"); sb.Append($"膜片规格:{printinfo.MaterialType}" + "\n"); sb.Append($"类型:{printinfo.PrintTagProduct}" + "\n"); sb.Append($"品牌:{printinfo.Brand}" + "\n"); sb.Append($"是否Kid:{( printinfo.IsKid == true ? "是" : "否" )}" + "\n"); sb.Append($"是否海外:{( printinfo.IsOverSea == true ? "是" : "否" )}" + "\n"); sb.Append($"大小载具:{printinfo.IsLarge}" + "\n"); sb.Append($"数量:{printinfo.Count.ToString()}" + "\n"); var pmContent2 = new PrintModel { FontFamily = "宋体", FontSize = 10, IsBold = false, Text = new StringReader(sb.ToString().Trim()) }; PrintModel[] pms = { pmTitle, batchs, pmContent2 }; LogHelper.Info($"打印内容{printContent}" + "\n" + sb + "\n" + "<<<------------------------------->>>"); TicketPrinterHelper.Print(pms, CurentApplicationSettings.PrinterName); } catch ( Exception ex ) { LogHelper.Error("打印异常,原因:" + ex.ToString()); } } } }