using iWare_SCADA_BusinessLogical.BLL; using iWare_SCADA_BusinessLogical.Utils; using iWare_SCADA_Model; using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web.UI.WebControls; namespace iWare_SCADA_BusinessLogical { /// /// OP05 打标完成标记,读取工控机中打印二维码信息 /// public class DataCaptureHandler_OP0501 : DataCaptureHandler { public static readonly DataCaptureHandler_OP0501 Instance = new DataCaptureHandler_OP0501(); public DataCaptureHandler_OP0501() { } public override string WorkingProcedure { get { return _dataCaptureConfig.WorkingProcedure; } } public override string DataCapturePointCode { get { return _dataCaptureConfig.DataCapturePointCode; } } public override string DataCapturePointCname { get { return _dataCaptureConfig.DataCapturePointCname; } } public override void RefreshDataList(List dataCaptureConfig) { } private string CheackPath(string path,int type,int time) { var directory = Path.GetDirectoryName(path); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } if (!File.Exists(path)) { File.Create(path).Close(); } string content = ""; // 同步来源数据 using (StreamReader reader = new StreamReader(path)) { content = reader.ReadToEnd(); Console.WriteLine("读取的内容是:" + content); if (content == null || content == "") { switch (type) { case 1: content = DateTimeHelper.GetDateTime().AddYears(time).ToString();break; case 2: content = DateTimeHelper.GetDateTime().AddMonths(time).ToString();break; case 3: content = DateTimeHelper.GetDateTime().AddDays(time).ToString();break; case 4: content = DateTimeHelper.GetDateTime().AddHours(time).ToString();break; case 5: content = DateTimeHelper.GetDateTime().AddMinutes(time).ToString();break; case 6: content = DateTimeHelper.GetDateTime().AddSeconds(time).ToString();break; default: content = DateTimeHelper.GetDateTime().ToString(); break; } //content = DateTimeHelper.GetDateTime().AddMinutes(-10).ToString(); } } return content; } public override void DataCaptureStart() { if (IsCaptureflag) { //// plc连接 //var plcService = PLCManger.GetSinglePLCService(_dataCaptureConfig); //if (plcService == null) //{ // SystemValue.lbl_Alert_OP0501 = $"{RandomHelper.GenerateRandomCode(4)} 没有找到{_dataCaptureConfig.WorkingProcedure}的PLC设备"; // return; //} //if (plcService != null && !plcService.IsConnected) //{ // plcService.Close(); // plcService.OpenService(); //} while (true) { ThreadStatusMonitor threadStatusMonitor = new ThreadStatusMonitor(); threadStatusMonitor.Threadcode = DataCapturePointCode; threadStatusMonitor.Threadcname = DataCapturePointCname; threadStatusMonitor.Threadendtime = DateTime.Now; threadStatusMonitor.Threadlastmodifytime = DateTime.Now; threadStatusMonitor.Threadstatue = 0; threadStatusMonitor.ThreadId = Thread.CurrentThread.ManagedThreadId.ToString(); try { ////_dataCaptureConfig //if (plcService == null || !plcService.IsConnected) //{ // SystemValue.lbl_Alert_OP0501 = $" {RandomHelper.GenerateRandomCode(4)} {_dataCaptureConfig.WorkingProcedure} PLC连接已断开,正在尝试打开!"; // plcService.Close(); // plcService.OpenService(); // Thread.Sleep(100); // continue; //} //else { //var value = plcService.ReadValuePoint(_dataCaptureConfig.DbNumber, _dataCaptureConfig.Offset, PLCManger.GetTypeForString(_dataCaptureConfig.DataCaptureColumnType)); //if (SystemValue.value_OP0501.Equals("0") && value.ToString().Equals("1")) {//当上一标记位0,当前获取标记为1时, //触发操作, 并给静态变量赋值为1 //业务代码 //读码完成没啥业务操作,获取二维码,然后放到队列中 #region 从工控机获取相关二维码 var path = ConfigHelper.GetConfigString("WorkPeiceIDPath");//打码机打码二维码路径 //扫描共享目录并将新的文件扫描返回 一般节拍在15秒左右(可以确认一下) //扫描修改时间在上次扫描时间之前10秒到当前时间的之间的文件 var dataTime = CheackPath(Environment.CurrentDirectory + "\\OP05-LastScapTime.txt",4,-10); var scapEndTime = DateTimeHelper.GetDateTime(); var newFiles = FileHelper.DetectNewFilesCSV(path, 60, Convert.ToDateTime(dataTime), scapEndTime); Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{_dataCaptureConfig.WorkingProcedure}工序读取工控机中二维码信息开始:{dataTime}"); foreach (System.IO.FileInfo file in newFiles) { Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{_dataCaptureConfig.WorkingProcedure}工序读取工控机中二维码信息,文件名:{file.FullName}"); DataTable dt = null; dt = CSVHelper.ReadCSV(file.FullName); if (dt == null) { continue; } lock (SystemValue.lock5QRcodeList) { #region 清过期缓存 try { //清过期缓存 var lstRemoveKey = SystemValue.QRcodeList .Where(p => p.Value < DateTimeHelper.GetDateTime().AddMinutes(-600)) .Select(p => p.Key).ToList(); if (lstRemoveKey.Count > 0) { foreach (var key in lstRemoveKey) SystemValue.QRcodeList.Remove(key); Log4NetHelper.WriteInfoLog(LogType.PLCOP05, $"清除缓存数量:({lstRemoveKey.Count}) 剩余缓存数量:({SystemValue.QRcodeList.Count})"); } } catch (Exception ex) { Log4NetHelper.WriteErrorLog(LogType.PLCOP05, "清除告警报文ID缓存错误!", ex); } #endregion ////筛选需要处理的二维码信息 //DataRow[] drArr = dt.Select(" 扫码结果='成功'"); //查询 //DataTable dtNew = dt.Clone(); //for (int i = 0; i < drArr.Length; i++) //{ // var now = DateTime.Now; // var list = drArr[i]["时间"].ToString().Split(':'); // var d = new DateTime(now.Year, now.Month, now.Day, Convert.ToInt32(list[0]), Convert.ToInt32(list[1]), Convert.ToInt32(list[2]), DateTimeKind.Local); // //and 时间> '19:19:34:547' // if (Convert.ToDateTime(DateTime.Now.ToShortDateString() + " " +drArr[i]["时间"]).TimeOfDay> Convert.ToDateTime(DateTime.Now.ToShortDateString() + " 19:19:34:547").TimeOfDay) // dtNew.ImportRow(drArr[i]); // //获取到的工件号异常 // SystemValue.lbl_Alert_OP0501 = $"{_dataCaptureConfig.WorkingProcedure}工序打标完成标记,读取工控机中打印二维码信息:【" + WorkPieceID + "】长度异常,长度不等于22位"; // Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), // $"{_dataCaptureConfig.WorkingProcedure}工序打标完成标记,读取工控机中打印二维码信息:【" + WorkPieceID + "】长度异常,长度不等于22位"); //} DataTable newDt = new DataTable(); var dates = file.Name.Split('-', '.'); var date = string.Format("{0:D4}-{1:D2}-{2:D2}", int.Parse(dates[0]), int.Parse(dates[1]), int.Parse(dates[2])); if (DateTimeHelper.GetDateTime().Date != Convert.ToDateTime(date) && DateTimeHelper.GetDateTime().AddDays(-1).Date != Convert.ToDateTime(date)) { continue; } DataRow[] filteredRows = new DataRow[dt.Rows.Count]; if (dt.Rows.Count > 0) { int j = 0; var cache = DataCache.GetCache("OP501-LastTime"); DateTime? lasttime = null; if (cache != null) { lasttime = Convert.ToDateTime(cache); } Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{_dataCaptureConfig.WorkingProcedure}工序读取工控机中二维码信息,工件最新时间:{(cache==null?"无缓存":cache.ToString())}"); for (int i = dt.Rows.Count - 1; i >= 0; i--) { try { string timeValue = dt.Rows[i]["时间"].ToString(); string[] timeComponents = timeValue.Split(':'); string correctedTime = string.Format("{0:D2}:{1:D2}:{2:D2}", int.Parse(timeComponents[0]), int.Parse(timeComponents[1]), int.Parse(timeComponents[2])); var newTime = date + " " + correctedTime; dt.Rows[i]["时间"] = newTime; var currrentTime = Convert.ToDateTime(dt.Rows[i]["时间"]); if (cache == null) { if (j == 0) { lasttime = currrentTime; } var oldTime = DateTime.Now.AddMinutes(-10); if (currrentTime <= oldTime) { break; } filteredRows[j] = dt.Rows[i]; } else { var cacheTime = Convert.ToDateTime(cache); if (currrentTime <= cacheTime) { break; } filteredRows[j] = dt.Rows[i]; } if (lasttime != null && lasttime < currrentTime) { lasttime = currrentTime; } j++; } catch (Exception ex) { SystemValue.lbl_Alert_OP0501 = $" {_dataCaptureConfig.WorkingProcedure}文件打标时间异常,请查看日志!"; Log4NetHelper.WriteErrorLog(LogType.PLCOP05, $" {_dataCaptureConfig.WorkingProcedure}文件打标时间,出现异常:", ex); } } filteredRows = filteredRows.Where(item=>item!=null).ToArray(); // 设置缓存值 DateTime absoluteExpiration = DateTime.Now.AddDays(30); TimeSpan slidingExpiration = TimeSpan.FromMinutes(20); if (slidingExpiration == TimeSpan.Zero) { absoluteExpiration = DateTime.Now.AddDays(30); } else { absoluteExpiration = DateTime.MaxValue; } DataCache.SetCache("OP501-LastTime", lasttime, absoluteExpiration, slidingExpiration); if (filteredRows.Count() <= 0) { return; } if (file.LastAccessTime < Convert.ToDateTime(dataTime)) continue; using (StreamWriter writer = new StreamWriter(Environment.CurrentDirectory + "\\OP05-LastScapTime.txt", false)) { dataTime = file.LastAccessTime.ToString(); writer.Write(dataTime); } Log4NetHelper.WriteInfoLog(LogType.PLCOP05, $"读取到{filteredRows.Count()}行数据,时间范围是{filteredRows[j-1]["时间"]}-{filteredRows[0]["时间"]}"); } //// 工件号(二维码值) //string WorkPieceID = dt.Rows[0][""].ToString(); //if (WorkPieceID.Length != 22) //{ // //获取到的工件号异常 // SystemValue.lbl_Alert_HMI01 = $"{_dataCaptureConfig.WorkingProcedure}工序打标完成标记,读取工控机中打印二维码信息:【" + WorkPieceID + "】长度异常,长度不等于22位"; // Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), // $"{_dataCaptureConfig.WorkingProcedure}工序打标完成标记,读取工控机中打印二维码信息:【" + WorkPieceID + "】长度异常,长度不等于22位"); //} //SystemValue.QRcodeList.Add("", DateTimeHelper.GetDateTime());//二维码添加到列表中 WorkPieceLog wplog = new WorkPieceLog(); wplog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); wplog.WorkingProcedure = "OP05"; //wplog.EquipmentID = WorkingProcedure; wplog.Remarks = "cs"; wplog.MonitoringPoint = DataCapturePointCode; wplog.CreatedTime = DateTimeHelper.GetDateTime(); wplog.CreatedUserName = CultureInfo.CurrentUICulture.Name; wplog.UpdatedTime = DateTimeHelper.GetDateTime(); wplog.UpdatedUserName = "测试"; wplog.IsDeleted = false; wplog.EquipmentID = "123"; wplog.OnlineTime = DateTimeHelper.GetDateTime();//给上线时间用 wplog.QualityState = 1; wplog.ProcessingDuration = 1; wplog.MachineToolState = 1; wplog.AlertType = 1; wplog.WorkPieceNumber = 1; wplog.WorkPieceOnlineTime = Convert.ToDateTime(dataTime); wplog.WorkPieceOfflineTime = Convert.ToDateTime(dataTime).AddHours(1); wplog.WorkPieceStartMachiningTime = Convert.ToDateTime(dataTime); wplog.WorkPieceEndMachiningTime = DateTime.Now.AddDays(7); wplog.KnifeEdgeNumber = 10; wplog.KnifeToolLife = 10; wplog.KnifeToolEarlyWarningLife = 3; wplog.KnifeToolSurplusLife = 10; foreach (var item in filteredRows) { Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{_dataCaptureConfig.WorkingProcedure}工序读取工控机中二维码信息,读取工件二维码:{item["打标内容"].ToString()}"); if (item == null) break; wplog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); wplog.WorkPieceID = item["打标内容"].ToString(); wplog.OfflineTime = Convert.ToDateTime(dataTime); wplog.Remarks = item["时间"].ToString() + "|" + item["打标内容"].ToString() + "|" + item["打标内容"].ToString() + "|" + item["扫码等级"].ToString() + "|" + item["扫码结果"].ToString(); WorkPieceInfoManager.ReadQRcode(wplog, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), null, _dataCaptureConfig.IsFeedback); threadStatusMonitor.Threadstatue = 1; } } } #endregion var fileCount = newFiles.Cast().ToList(); Log4NetHelper.WriteInfoLog(LogType.PLCOP05, $"扫描完成,共扫描到:({fileCount.Count()})个文件"); } //SystemValue.value_OP0501 = value.ToString(); } } catch (Exception ex) { SystemValue.lbl_Alert_OP0501 = $" {_dataCaptureConfig.WorkingProcedure}工序打标完成标记,读取工控机中打印二维码信息,出现异常,请查看日志!"; Log4NetHelper.WriteErrorLog(LogType.PLCOP05, $" {_dataCaptureConfig.WorkingProcedure}工序打标完成标记,读取工控机中打印二维码信息,出现异常:", ex); } finally { WorkPieceInfoManager.ThreadMonitor(threadStatusMonitor); } //线程多久执行一次(不包含业务处理时间) if (!_dataCaptureConfig.DataCaptureFrequency.HasValue || _dataCaptureConfig.DataCaptureFrequency < 10) { Thread.Sleep(3000); } else { Thread.Sleep(_dataCaptureConfig.DataCaptureFrequency.Value); } } } else { SystemValue.lbl_Alert_OP0501 = $"{_dataCaptureConfig.WorkingProcedure}工序打标完成标记,读取工控机中打印二维码信息,不做校验,请确认配置信息!"; Log4NetHelper.WriteInfoLog(LogType.PLCOP05, $"{_dataCaptureConfig.WorkingProcedure}工序打标完成标记,读取工控机中打印二维码信息,不做校验,请确认配置异常"); } //if (SystemValue.isStartedModel) //{ // #region 从工控机获取相关二维码 // //扫描共享目录并将新的文件扫描返回 // var newFiles = FileHelper.DetectNewFilesCSV("", 10, DateTimeHelper.GetDateTime()); // foreach (System.IO.FileInfo file in newFiles) // { // var datatable = CSVHelper.ReadCSV(file.FullName); // } // lock (SystemValue.lock5QRcodeList) // { // try // { // var plcService = PLCManger.GetSinglePLCService(_dataCaptureConfig); // //清过期缓存 // var lstRemoveKey = SystemValue.QRcodeList // .Where(p => p.Value < DateTimeHelper.GetDateTime().AddMinutes(-600)) // .Select(p => p.Key).ToList(); // if (lstRemoveKey.Count > 0) // { // foreach (var key in lstRemoveKey) SystemValue.QRcodeList.Remove(key); // Log4NetHelper.WriteInfoLog(LogType.PLCOP05, $"清除缓存数量:({lstRemoveKey.Count}) 剩余缓存数量:({SystemValue.QRcodeList.Count})"); // } // WorkPieceLog wplog = new WorkPieceLog(); // wplog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); // wplog.WorkingProcedure = WorkingProcedure; // //wplog.EquipmentID = WorkingProcedure; // wplog.Remarks = WorkingProcedure; // wplog.MonitoringPoint = DataCapturePointCode; // wplog.CreatedTime = DateTimeHelper.GetDateTime(); // wplog.CreatedUserName = DataCapturePointCode; // wplog.UpdatedTime = DateTimeHelper.GetDateTime(); // wplog.UpdatedUserName = DataCapturePointCode; // wplog.IsDeleted = false; // wplog.EquipmentID= _dataCaptureConfig.EquipmentID; // wplog.QualityState = (int)QualityState.OK; // wplog.OnlineTime = DateTimeHelper.GetDateTime();//给上线时间用 // wplog.WorkPieceID = WorkPieceID; // if (wplog.WorkPieceID.Length != 22) // {//获取到的工件号异常 // } // else // {//获取其他配置的待采集项 // //foreach (var col in colConfig.Where(o => o.DataCapturePointCode == DataCapturePointCode)) // //{ // // var valuecol = plcService.ReadValuePoint(col.DbNumber, col.Offset, col.DataCaptureColumnLength.Value, PLCManger.GetTypeForString(col.DataCaptureColumnType)); // // wplog.GetType().GetProperty(col.DataCaptureColumnTabelName).SetValue(wplog, valuecol);//给动态字段赋值 // //} // } // //读取二维码后更新数据库 // var info = WorkPieceInfoManager.ReadQRcode(wplog, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), plcService, _dataCaptureConfig.IsFeedback); // } // catch (Exception ex) // { // Log4NetHelper.WriteErrorLog(LogType.PLCOP05, "清除告警报文ID缓存错误!", ex); // } // if (SystemValue.QRcodeList.ContainsKey(WorkPieceID)) // { // SystemValue.QRcodeList[WorkPieceID] = DateTimeHelper.GetDateTime(); // } // else // { // SystemValue.QRcodeList.Add(WorkPieceID, DateTimeHelper.GetDateTime());//二维码添加到列表中 // } // } // #endregion //} //else //{ //} } } }