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
|
{
|
/// <summary>
|
/// OP05 打标完成标记,读取工控机中打印二维码信息
|
/// </summary>
|
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> 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<string>().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
|
//{
|
|
|
//}
|
}
|
|
}
|
}
|