using GRreader; using MaterialTraceability.Common; using MaterialTraceability.Entity.DAO; using MaterialTraceability.Entity.DTO; using MaterialTraceability.Entity.Enum; using MaterialTraceability.Entity.UpLoad; using MaterialTraceability.SqlSugar; using MaterialTraceability.SqlSugar.ServiceImpl; using MaterialTraceability.WebService; using MaterialTraceability.WebService.GetParametricValueServiceService; using MaterialTraceability.WebService.MachineIntegrationServiceService; using MaterialTraceability.WebService.MiBatchCompleteSfcAndAdujustQtyServiceService; using MaterialTraceability.WebService.MiFirstOperationForsfcServiceService; using MaterialTraceability.WebService.MiSignOffSFCsServiceService; using MaterialTraceability.WebService.Param; using MaterialTraceability.WebService.ProcessLotServiceWSService; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using System.Windows.Forms; namespace MaterialTraceability.Business.Impl { /// /// 模切PLC逻辑处理 /// public class MQSignalReadBusiness : ISignalReadFunction { /// /// 日志刷新 /// /// 日志内容 /// public delegate void LogRefresh(LogType logType, string massage); public static event LogRefresh LogRefreshEvent; /// /// 视图层数据刷新 /// /// public delegate void ViewModelRefresh(ViewModelDto viewModelDto); public static event ViewModelRefresh ViewModelRefreshEvent; /// /// PLC信号事件 /// /// /// public delegate void SignalReadInvoke(int status, int position); /// /// RFID读写器业务 /// private EquipBusiness equipBusiness = new EquipBusiness(); /// /// Mes WebService接口 /// private IMesWebServices MesWebServices = new MesWebServicesImpl(); //卷轴信息 private IBaseServices shaftInfoServices = new BaseServices(); //收卷记录 private IBaseServices downRecordServices = new BaseServices(); //上料记录 private IBaseServices upRecordServices = new BaseServices(); //新加2022-11-08 private MesAlarmInfo mesAlarmInfo = new MesAlarmInfo(); private PlcBusiness plcBusiness = new PlcBusiness(); /// /// 数据上传业务逻辑 /// private UpLoadBusiness upLoadBusiness = UpLoadBusiness.Instance; // INIFile配置文件 private INIFile inifile = new INIFile(System.Environment.CurrentDirectory + "/MesConfig/App.InI"); private AppConfigDto appConfig = AppConfigDto.Instance; /// /// 设备启动 /// public void MachineStartUp() { LogRefreshEvent?.Invoke(LogType.PlcLog, "开机启动信号触发成功"); LogHelper.Info("开机启动信号触发成功"); int upPosition = 0; //判断放卷生产轴 if (appConfig.machineId == 3) { if (PlcBusiness.readPlc(appConfig.mqAddress.左放卷状态) == 1) upPosition = 6; if (PlcBusiness.readPlc(appConfig.mqAddress.右放卷状态) == 1) upPosition = 5; } else { if (PlcBusiness.readPlc(appConfig.mqAddress.左放卷状态) == 1) upPosition = 5; if (PlcBusiness.readPlc(appConfig.mqAddress.右放卷状态) == 1) upPosition = 6; } LogHelper.Info("当前放卷生产轴为:" + Which(upPosition)); ProShaftInfo shaftInfo = this.GetShaftInfoByPosition(upPosition).Result; //判断收卷轴 List positions = new List(); if (shaftInfo == null || StringExtension.IsBlank(shaftInfo.bindSfc)) { LogHelper.Info("获取放卷轴信息为空"); return; } #region 重量特征数据上传 Add by Wenjy 2022-11-12 获取放卷运行方向并存储 if (upLoadBusiness.JudgeResourceIsUplpadData()) { this.GetDirections(upPosition, shaftInfo); } #endregion //判断收卷生产轴 if (appConfig.machineId == 3) { if (PlcBusiness.readPlc(appConfig.mqAddress.上左收卷状态) == 1) positions.Add(3); if (PlcBusiness.readPlc(appConfig.mqAddress.上右收卷状态) == 1) positions.Add(1); if (PlcBusiness.readPlc(appConfig.mqAddress.下左收卷状态) == 1) positions.Add(4); if (PlcBusiness.readPlc(appConfig.mqAddress.下右收卷状态) == 1) positions.Add(2); } else { if (PlcBusiness.readPlc(appConfig.mqAddress.上左收卷状态) == 1) positions.Add(1); if (PlcBusiness.readPlc(appConfig.mqAddress.上右收卷状态) == 1) positions.Add(3); if (PlcBusiness.readPlc(appConfig.mqAddress.下左收卷状态) == 1) positions.Add(2); if (PlcBusiness.readPlc(appConfig.mqAddress.下右收卷状态) == 1) positions.Add(4); } if (positions.Count == 0) { LogHelper.Info("获取收卷轴信息为空"); return; } foreach (var x in positions) { string downStr = ""; downStr = Which(x); LogHelper.Info("当前收卷生产轴为:" + downStr); //判断是否合卷 bool info = SelectSfcIsHeJuan(upPosition, x).Result; if (info) { LogHelper.Info("触发合卷报警,下发PLC报警指令写入2"); plcBusiness.writeDoublePlc(appConfig.mqAddress.全局报警, 2); return; } //获取收卷轴绑定信息 ProShaftInfo downShaftInfo = this.GetShaftInfoByPosition(x).Result; if (downShaftInfo == null) { LogHelper.Info("获取" + downStr + "轴绑定的信息为空"); return; } downShaftInfo.bindSfc = shaftInfo.bindSfc; downShaftInfo.bindTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if (shaftInfoServices.Update(downShaftInfo).Result) { LogHelper.Info(Which(upPosition) + "位,绑定" + downStr + "轴生产信息保存成功"); } else { LogHelper.Info(Which(upPosition) + "位,绑定" + downStr + "轴生产信息保存失败"); return; } #region 获取收卷运行方向并存储 Add by Wenjy 2022-11-12 this.GetDirections(x, downShaftInfo); #endregion } StartTimerReadRfid(); } /// /// 放卷涨紧 /// /// public void UpMaterialBegin(int position) { #region 参数定义 string logStr = Which(position); #endregion #region 未登录不让放卷涨紧生产,便于记录生产者 /*if (StringExtension.IsBlank(ConfigHelper.GetConfig("roleId"))) { MessageBox.Show("请先登录再开始生产"); LogHelper.Info("请先登录再开始生产"); LogRefreshEvent?.Invoke(LogType.AlarmLog, "请先登录再开始生产"); return; }*/ #endregion try { LogRefreshEvent?.Invoke(LogType.PlcLog, String.Format("{0}涨紧信号触发成功", logStr)); LogHelper.Info(String.Format("{0}涨紧信号触发成功", logStr)); //upLoadBusiness.SaveLogRecord(position, String.Format("{0}涨紧信号触发成功", logStr)); //读取卷筒RFID物料信息 ProEquip proEquip = equipBusiness.Equiplist.Where(x => x.positionId == position).FirstOrDefault(); if (proEquip == null) { LogRefreshEvent?.Invoke(LogType.AlarmLog, "获取" + logStr + "读写器设备信息异常"); //upLoadBusiness.SaveLogRecord(position, "获取" + logStr + "读写器设备信息异常"); return; } string epc = equipBusiness.ReadEPCByAntana(proEquip.equipId); //string epc = this.ReadEpcByPosition(position); epc = epc.Replace("\0", "").Trim(); SaveReadRecord(proEquip, epc); if (StringExtension.IsBlank(epc)) { //下发读取结果:结果写2、 报警写1 AngrilyResultSendToPlc(position, 2, 1); ViewModelRefreshEvent?.Invoke(new ViewModelDto() { rfidInfo = new RfidInfoDto() { rfid = "", sfc = "", ea = "", position = position, }, plcStatus = true, }); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "RFID条码信息读取失败"); //upLoadBusiness.SaveLogRecord(position, logStr + "RFID条码信息读取失败"); LogHelper.Info(logStr + "RFID条码信息读取失败"); return; } LogRefreshEvent?.Invoke(LogType.RfidLog, String.Format("{0}RFID读取成功,RFID为{1}", logStr, epc)); LogHelper.Info(String.Format("{0}RFID读取成功,RFID为{1}", logStr, epc)); //upLoadBusiness.SaveLogRecord(position, String.Format("{0}RFID读取成功,RFID为{1}", logStr, epc)); //判断是否串读 Add by wenjy 2022-10-05 if (PdRfidIsChuanDu(epc, position).Result) { //下发读取结果 2NG、报警1 AngrilyResultSendToPlc(position, 2, 1); LogHelper.Info(logStr + "RFID条码" + epc + "已存在其它位置,检查是否重复"); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "RFID条码" + epc + "已存在其它位置,检查是否重复"); //upLoadBusiness.SaveLogRecord(position, logStr + "RFID条码" + epc + "已存在其它位置,检查是否重复"); return; } //判断标签是否重复 if (BusinessHelper.UpRfidIsRecur(epc,position).Result) { //判断是否已经生产结束 if (UpMaterialIsEndProduction(epc).Result) { AngrilyResultSendToPlc(position, 2, 1); LogRefreshEvent?.Invoke(LogType.AlarmLog, String.Format("当前读取的RFID:{0},已经生产结束不允许再次上料", epc)); LogHelper.Info(String.Format("当前读取的RFID:{0},已经生产结束不允许再次上料", epc)); return; } else { LogHelper.Info(logStr + "RFID读取到的条码:" + epc + "与前一读取相同并且生产未结束,可以继续生产"); LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "RFID读取到的条码:" + epc + "与前一读取相同并且生产未结束,可以继续生产"); UpmaterialReadSuccess(position); return; } } //放卷涨紧MES入账处理 UpMaterialBeginByMes(position, epc, true); } catch (Exception ex) { LogHelper.Error("模切放卷涨紧PLC信号逻辑处理异常", ex); LogRefreshEvent?.Invoke(LogType.AlarmLog, "模切放卷涨紧PLC信号逻辑处理异常:" + ex.Message); } } /// /// 放卷开始信号 /// /// public void UpBegin(int position) { string logStr = this.Which(position); LogHelper.Info(logStr + "放卷开始,下发禁止下料信号"); ForbidBlank(position); } /// /// 放卷结束 /// /// public async void UpMaterialEnd(int position) { #region 参数定义 string logStr = ""; logStr = Which(position); #endregion try { LogRefreshEvent?.Invoke(LogType.PlcLog, "模切" + logStr + "位放卷结束信号触发成功"); LogRefreshEvent?.Invoke(LogType.RfidLog, "模切" + logStr + "位放卷结束信号触发成功"); //upLoadBusiness.SaveLogRecord(position, logStr + "位放卷结束信号触发成功"); LogHelper.Info("模切" + logStr + "位结束信号触发成功"); ProShaftInfo shaftInfo = await this.GetShaftInfoByPosition(position); if (shaftInfo == null) { LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "位放卷结束,获取卷轴绑定的信息为空"); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "位放卷结束,获取卷轴绑定的信息为空"); return; } Expression> upExp = s1 => true; upExp = upExp.And(x => x.Sfc == shaftInfo.bindSfc && x.Rfid == shaftInfo.bindRfid && x.IsProduction == 0); Expression> upOrder = (x) => x.RecordTime; ProUpRecord upRecord = await upRecordServices.QueryFirst(upExp, upOrder, false); if (upRecord == null) { LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "位放卷结束,获取上料信息为空"); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "位放卷结束,获取上料信息为空"); return; } //更新放卷信息 upRecord.endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); upRecord.IsProduction = 1; upRecord.isFinish = 1; await upRecordServices.Update(upRecord); LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "位放卷结束,生成放卷信息"); //upLoadBusiness.SaveLogRecord(position, logStr + "位放卷结束,生成放卷信息"); upLoadBusiness.UpdateUpRecord(upRecord); //清空绑定信息 //LogRefreshEvent?.Invoke(LogType.RfidLog, "放卷结束,清除卷轴绑定信息"); //shaftInfo.bindRfid = ""; //shaftInfo.bindSfc = ""; //shaftInfo.bindEaValue = "0"; shaftInfo.bindTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); await shaftInfoServices.Update(shaftInfo); LogRefreshEvent?.Invoke(LogType.RfidLog, "放卷结束,更新绑定信息"); //放卷结束获取收卷轴最后一卷 IsEndFlag(); } catch (Exception ex) { LogHelper.Error("放卷结束处理异常", ex); //upLoadBusiness.SaveLogRecord(position, "放卷结束处理异常"+ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "放卷结束处理异常:" + ex.Message); } //允许下料 AllowBlank(position); } /// /// 收卷涨紧 /// /// public void DownMaterialBegin(int position) { #region 参数定义 string logStr = ""; logStr = Which(position); #endregion try { LogRefreshEvent?.Invoke(LogType.PlcLog, logStr + "轴涨紧触发成功"); LogRefreshEvent?.Invoke(LogType.RfidLog, String.Format("开始读取{0}轴卷筒RFID物料信息", logStr)); //读取卷筒RFID物料信息 ProEquip proEquip = equipBusiness.Equiplist.Where(x => x.positionId == position).FirstOrDefault(); if (proEquip == null) { LogRefreshEvent?.Invoke(LogType.RfidLog, "获取" + logStr + "轴读写器设备信息异常"); LogRefreshEvent?.Invoke(LogType.AlarmLog, "获取" + logStr + "轴读写器设备信息异常"); return; } //读取协议更换 string epc = equipBusiness.ReadEPCByAntana(proEquip.equipId); epc = epc.Replace("\0", "").Trim(); SaveReadRecord(proEquip, epc); if (StringExtension.IsBlank(epc)) { LogHelper.Info(String.Format("{0}轴设备:{1};读取失败", logStr, proEquip.equipIp)); AngrilyResultSendToPlc(position, 2, 2);//收卷位报警 LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "轴条码信息读取失败"); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "轴条码信息读取失败"); ViewModelRefreshEvent?.Invoke(new ViewModelDto() { rfidInfo = new RfidInfoDto() { rfid = "", sfc = "", ea = "", position = position, }, plcStatus = true, }); return; } //判断是否串读 Add by wenjy 2022-10-05 if (PdRfidIsChuanDu(epc, position).Result) { AngrilyResultSendToPlc(position, 2, 1); LogHelper.Info(logStr + "RFID条码" + epc + "已存在其它位置,检查是否重复"); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "RFID条码" + epc + "已存在其它位置,检查是否重复"); return; } LogRefreshEvent?.Invoke(LogType.PlcLog, logStr + "轴读取成功,下发读取结果"); //add by yinzf 2022-8-11 UpmaterialReadSuccess(position); //end add LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "RFID条码信息读取成功:" + epc); LogHelper.Info(String.Format("{0}轴设备{1}读取RFID条码信息成功:{2}", logStr, proEquip.equipIp, epc)); //收卷位MES逻辑处理 DownMaterialBeginByMes(position, epc, true); } catch (Exception ex) { LogHelper.Error("模切收卷涨紧逻辑处理异常", ex); LogRefreshEvent?.Invoke(LogType.AlarmLog, "模切收卷涨紧逻辑处理异常:" + ex.Message); } } private void SaveReadRecord(ProEquip equip, string rfidStr) { ProReadRecord readRecord = new ProReadRecord() { MachineID = equip.machineId, EquipID = equip.equipId, PositionID = equip.positionId, Ant = StringChange.ParseToInt(equip.equipAnt), ReadEPC = rfidStr, Result = StringExtension.IsBlank(rfidStr) ? "0" : "1", ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; upLoadBusiness.SaveReadRecord(readRecord); } /// /// 收卷位开始,Add by wenjy 20220905 /// /// public void DownBegin(int position) { try { #region 参数定义 string logStr = Which(position); #endregion lock (string.Empty) { LogHelper.Info(logStr + "收卷开始,下发禁止下料信号"); //收卷开始下发收卷轴禁止下料 ForbidBlank(position); //解绑RFID与SFC的绑定信息 ProShaftInfo downShaftInfo = this.GetShaftInfoByPosition(position).Result; if (downShaftInfo != null) { LogHelper.Info(logStr + "位收卷开始," + downShaftInfo.bindRfid + "绑定的SFC信息"); LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "位收卷开始,解绑RFID条码:" + downShaftInfo.bindRfid + "绑定的SFC信息"); this.UnBindRfidAndSfc(downShaftInfo.bindRfid); } } } catch (Exception ex) { LogHelper.Error("收卷开始逻辑处理异常", ex); LogRefreshEvent?.Invoke(LogType.AlarmLog, "收卷开始逻辑处理异常:" + ex.Message); } } /// /// 收卷结束 /// /// public async void DownMaterialEnd(int position) { StopTimerReadRfid(position); string logStr = ""; int qty = 0; logStr = Which(position); try { LogRefreshEvent?.Invoke(LogType.PlcLog, logStr + "轴收卷结束信号触发成功"); //upLoadBusiness.SaveLogRecord(position, logStr + "轴收卷结束信号触发成功"); LogHelper.Info(logStr + "轴收卷结束信号触发成功"); //add by yinzf 2022-8-7 收到完成信号通知PLC禁止下料,直到完工流程走完 ForbidBlank(position); //end add //获取收卷轴绑定的RFID条码信息,取最新数据 ProShaftInfo shaftInfo = await this.GetShaftInfoByPosition(position); if (StringExtension.IsBlank(shaftInfo.bindSfc)) { LogRefreshEvent?.Invoke(LogType.RfidLog, String.Format("{0}轴收卷完工获取绑定信息为空不进入结束流程", logStr)); LogRefreshEvent?.Invoke(LogType.AlarmLog, String.Format("{0}轴收卷完工获取绑定信息为空不进入结束流程", logStr)); LogHelper.Info(String.Format("{0}轴收卷完工获取绑定信息为空不进入结束流程", logStr)); AllowBlank(position); return; } LogHelper.Info(String.Format("{0}轴当前绑定的物料信息为:{1}", logStr, JsonChange.ModeToJson(shaftInfo))); //EA新地址 Add by wenjy 2022-11-10 if (appConfig.machineId == 3) { if (position == 3) qty = PlcBusiness.readPlc(appConfig.mqAddress.上左收卷EA); if (position == 1) qty = PlcBusiness.readPlc(appConfig.mqAddress.上右收卷EA); if (position == 4) qty = PlcBusiness.readPlc(appConfig.mqAddress.下左收卷EA); if (position == 2) qty = PlcBusiness.readPlc(appConfig.mqAddress.下右收卷EA); } else { if (position == 1) qty = PlcBusiness.readPlc(appConfig.mqAddress.上左收卷EA); if (position == 3) qty = PlcBusiness.readPlc(appConfig.mqAddress.上右收卷EA); if (position == 2) qty = PlcBusiness.readPlc(appConfig.mqAddress.下左收卷EA); if (position == 4) qty = PlcBusiness.readPlc(appConfig.mqAddress.下右收卷EA); } LogRefreshEvent.Invoke(LogType.PlcLog, String.Format("{0}轴读取设备EA值:{1}", logStr, qty)); LogHelper.Info(String.Format("{0}轴读取设备EA值:{1}", logStr, qty)); if (qty < 5 || qty > 350) { LogHelper.Info(logStr + "获取设备EA为:" + qty + ",不进行完工处理,再判断绑定信息EA值为:"+shaftInfo.bindEaValue); if (StringChange.ParseToInt(shaftInfo.bindEaValue) < 5 || StringChange.ParseToInt(shaftInfo.bindEaValue) > 350) { LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "获取设备EA为:" + qty + "绑定信息为:"+shaftInfo.bindEaValue+",不进行完工处理"); LogHelper.Info(logStr + "获取设备EA为:" + qty + "绑定信息为:" + shaftInfo.bindEaValue + ",不进行完工处理"); //upLoadBusiness.SaveLogRecord(position, logStr + "获取设备EA为:" + qty + "绑定信息为:" + shaftInfo.bindEaValue + ",不进行完工处理"); AllowBlank(position); plcBusiness.writeDoublePlc(appConfig.mqAddress.全局报警, 0);//清除合卷报警 //清空卷轴绑定的物料信息 shaftInfo.bindRfid = ""; shaftInfo.bindSfc = ""; shaftInfo.bindEaValue = ""; await shaftInfoServices.Update(shaftInfo); return; } else { qty = StringChange.ParseToInt(shaftInfo.bindEaValue); } } //收卷结束MES逻辑处理 DownMaterialEndByMes(position, shaftInfo, qty); } catch (Exception ex) { LogHelper.Error("模切收卷结束逻辑处理异常", ex); LogRefreshEvent?.Invoke(LogType.AlarmLog, "模切收卷结束逻辑处理异常:"+ex.Message); } } /// /// 根据设备位置获取卷轴信息 /// /// /// public async Task GetShaftInfoByPosition(int position) { try { string str = appConfig.processId; Expression> exp = s1 => true; exp = exp.And(x => x.positionId == position.ToString() && x.processId == str); List result = await shaftInfoServices.Query(exp); if (result != null || result.Count > 0) { ProShaftInfo shaftInfo = result.FirstOrDefault(); return shaftInfo; } return null; } catch (Exception ex) { LogHelper.Info("获取卷轴信息异常:" + ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "获取卷轴信息异常:" + ex.Message); return null; } } /// /// 通过RFID获取Mes账目数量 /// /// /// /// private string GetMaterialEaByRfid(int position,string rfidStr) { string logStr = this.Which(position); //获取RFID绑定的SFC信息 string sfc = GetSfcByRfid(rfidStr); if (StringExtension.IsBlank(sfc)) { LogRefreshEvent?.Invoke(LogType.MesLog, rfidStr + "未绑定SFC"); LogRefreshEvent?.Invoke(LogType.AlarmLog, rfidStr + "未绑定SFC"); return "0"; } #region 获取放卷物料EA LogHelper.Info(logStr + ",通过MES接口获取放卷物料的EA值"); MiSFCQueryQtyServiceServiceParam sFCQueryQtyServiceServiceParam = new MiSFCQueryQtyServiceServiceParam() { // url = "http://lymesa.catlbattery.com:8103/atlmeswebservice/MiSFCQueryQtyServiceService?wsdl", // site = "2100", url = inifile.IniReadValue("MiSFCQueryQtyServiceServiceParam", "url"), site = inifile.IniReadValue("MiSFCQueryQtyServiceServiceParam", "site"), sfc = sfc }; LogHelper.Info(logStr + ",MES获取物料EA值接口请求参数:" + JsonChange.ModeToJson(sFCQueryQtyServiceServiceParam)); DateTime beginTime = DateTime.Now; try { if (appConfig.isMesFlag == 1) { var sfcQueryQtyResponse = MesWebServices.iMiSFCQueryQtyServiceService(sFCQueryQtyServiceServiceParam); LogHelper.Info(logStr + ",MES获取物料EA值接口返回参数:" + JsonChange.ModeToJson(sfcQueryQtyResponse)); if (sfcQueryQtyResponse.@return.code > 0) { LogHelper.Info(logStr + ",MES获取物料EA值接口请求失败:" + sfcQueryQtyResponse.@return.message); LogRefreshEvent?.Invoke(LogType.MesLog, String.Format(logStr + ",通过MES接口获取放卷物料{0}的SFC数量失败:{1}", sfc, upLoadBusiness.GetMesMessage(sfcQueryQtyResponse.@return.code, sfcQueryQtyResponse.@return.message))); LogRefreshEvent?.Invoke(LogType.AlarmLog, String.Format(logStr + ",通过MES接口获取放卷物料{0}的SFC数量失败:{1}", sfc, upLoadBusiness.GetMesMessage(sfcQueryQtyResponse.@return.code, sfcQueryQtyResponse.@return.message))); LogHelper.Info("下发机台报警及气涨信号"); return ""; } return sfcQueryQtyResponse.@return.qty; } else { return "0"; } } catch (Exception ex) { LogHelper.Info(String.Format(logStr + ",MES获取SFC数量接口异常:{1}", ex.Message)); WebServiceLog.saveMiSFCQueryQtyServiceService(sFCQueryQtyServiceServiceParam, null, beginTime, ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, String.Format(logStr + ",MES获取SFC数量接口异常:{1}", ex.Message)); return ""; } #endregion } /// /// 收卷结束MES逻辑处理 /// /// /// /// public async void DownMaterialEndByMes(int position, ProShaftInfo shaftInfo, int qty) { #region 参数定义 string logStr = ""; logStr = Which(position); #endregion LogHelper.Info(String.Format("{0}轴读取设备EA值:{1}", logStr, qty)); //获取RFID绑定的膜卷号 Expression> exp = x => true; exp = exp.And(x => x.PositionId == position && x.IsProduction == 0 && x.Rfid == shaftInfo.bindRfid); Expression> orders = x => x.beginTime; ProDownRecord downRecord = await downRecordServices.QueryFirst(exp, orders, false); if (downRecord == null) { LogRefreshEvent?.Invoke(LogType.AlarmLog, "收卷完成获取收卷记录信息为空"); return; } lock (string.Empty) { try { //获取重量特征数据上传至服务器 if (upLoadBusiness.JudgeResourceIsUplpadData()) { machineIntegrationParametricData[] datas = GetMaterialWeight(shaftInfo, position, shaftInfo.bindSfc).Result; UpLoadMaterialWeight(position, shaftInfo.bindSfc, downRecord.Id, datas); } #region 获取放卷物料EA LogHelper.Info(logStr + "完工,通过MES接口获取放卷物料的EA值"); shaftInfo.bindEaValue = GetMaterialEaByMes(shaftInfo, position); if (StringExtension.IsBlank(shaftInfo.bindEaValue)) { LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "完工,Mes账目EA数量为空"); //upLoadBusiness.SaveLogRecord(position, logStr + "完工,Mes账目EA数量为空"); return; } #endregion LogRefreshEvent?.Invoke(LogType.MesLog, logStr + "完工,Mes账目EA数量:" + shaftInfo.bindEaValue + ";设备实物数量:" + qty); LogHelper.Info(logStr + "完工,Mes账目EA数量:" + shaftInfo.bindEaValue + ";设备实物数量:" + qty); //upLoadBusiness.SaveLogRecord(position, logStr + "完工,Mes账目EA数量:" + shaftInfo.bindEaValue + ";设备实物数量:" + qty); //判断MES账目与实物数量,进行拆分完工 if (qty > StringChange.ParseToInt(shaftInfo.bindEaValue)) { LogRefreshEvent?.Invoke(LogType.MesLog, "实物数量大于MES数量,先调整再拆分"); LogHelper.Info("实物数量大于MES数量,先调整再拆分"); //upLoadBusiness.SaveLogRecord(position, "实物数量大于MES数量,先调整再拆分"); if (StringExtension.IsBlank(downRecord.Sfc)) { #region MES注销SFC接口 LogRefreshEvent?.Invoke(LogType.MesLog, logStr + "调用MES注销SFC接口"); //注销SFC if (!SignOffSFCs(shaftInfo)) { writeError(position, 2); return; } #endregion #region MES调整数量接口 int PLCqty = qty; //调取MES调整数量接口 if (!AdujustQtySfcByMes(shaftInfo, position, PLCqty)) { writeError(position, 2); return; } #endregion #region MES入账开始接口 LogRefreshEvent?.Invoke(LogType.MesLog, logStr + "MES入账开始接口"); if (!SFCBegin(shaftInfo)) { writeError(position, 2); return; } #endregion } else { LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "已拆分完成不再调整数量"); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), logStr + "已拆分完成不再调整数量"); } } #region MES自动完工接口 if (!CompleteSfcByMes(shaftInfo, position, qty, downRecord)) { writeError(position, 2); return; } #endregion downRecord.Sfc = GetSfcByRfid(shaftInfo.bindRfid); downRecord.eaValue = qty; downRecord.isFinish = 1; downRecord.IsProduction = 1; LogRefreshEvent?.Invoke(LogType.MesLog, String.Format("RFID:{0}绑定膜卷号:{1}", downRecord.Rfid, downRecord.Sfc)); ViewModelRefreshEvent?.Invoke(new ViewModelDto() { rfidInfo = new RfidInfoDto() { rfid = downRecord.Rfid, sfc = downRecord.Sfc, ea = downRecord.eaValue.ToString(), position = position, }, plcStatus = true, }); LogHelper.Info(logStr + "下料成功解除合卷报警限制,MW24624写0"); plcBusiness.writeDoublePlc(appConfig.mqAddress.全局报警, 0); //更新下料记录 //downRecord.DownMaterialId = shaftInfo.bindRfid; downRecord.endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); downRecordServices.Update(downRecord); upLoadBusiness.UpdateDownRecord(downRecord); //清空卷轴绑定的物料信息 shaftInfo.bindRfid = ""; shaftInfo.bindSfc = ""; shaftInfo.bindEaValue = ""; shaftInfoServices.Update(shaftInfo); //别忘了更新绑定条码的状态*********************** LogHelper.Info(logStr + "完工流程结束,更新生产信息状态"); //upLoadBusiness.SaveLogRecord(position, logStr + "完工流程结束,更新生产信息状态"); //add by yinzf 2022-8-7 流程走完,可以下料 AllowBlank(position); //end add LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "收卷完工流程结束"); } catch (Exception e) { writeError(position, 4); LogHelper.Info(e.ToString()); LogRefreshEvent?.Invoke(LogType.AlarmLog, "收卷结束MES流程处理异常:" + e.ToString()); //upLoadBusiness.SaveLogRecord(position, "收卷结束MES流程处理异常:" + e.ToString()); } } } /// /// 强制下料 /// /// public void ForceDown(int position) { throw new NotImplementedException(); } /// /// 放卷涨紧MES入账处理 /// /// /// /// public async void UpMaterialBeginByMes(int position, string epc, bool auto) { #region 参数定义 string sfc = ""; string qty = ""; string logStr = Which(position); #endregion //如果不是自动的就清掉PLC信号 if (!auto) { AngrilyResultSendToPlc(position, 1, 0); ManualClearWarning(position); } ViewModelRefreshEvent?.Invoke(new ViewModelDto() { rfidInfo = new RfidInfoDto() { rfid = epc, sfc = "", position = position, }, plcStatus = true, }); #region add by wenjy 20220903 放卷位入账EA防呆,小于20不入账 var mesQty = StringChange.ParseToInt(GetMaterialEaByRfid(position, epc)); if (mesQty < 20) { LogHelper.Info(logStr + "自动入账失败:EA值小于20,实际为:" + mesQty); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "自动入账失败:EA值小于20,实际为:" + mesQty); //upLoadBusiness.SaveLogRecord(position, logStr + "自动入账失败:EA值小于20,实际为:" + mesQty); //下发上料结果 AngrilyResultSendToPlc(position, 2, 2); return; } #endregion LogHelper.Info("开始调用MES自动入账接口"); LogRefreshEvent?.Invoke(LogType.MesLog, logStr + "调用MES入账接口"); //upLoadBusiness.SaveLogRecord(position, "开始调用MES自动入账接口"); MiFirstOperationForsfcServiceServiceParam miFirstOperationForsfcServiceServiceParam = new MiFirstOperationForsfcServiceServiceParam() { //url = "http://lymesa.catlbattery.com:8103/atlmeswebservice/MiFirstOperationForsfcServiceService?wsdl", //site = "2100", //sfc = "", //processLot = epc, //operation = appConfig.operation, //operationRevision = "#", //resource = appConfig.resource, //user = "SUP_LYA_RF01", //activity = "", //modeProcessSfc = "MODE_START_SFC", url = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "url"), site = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam","site"), sfc = "", processLot = epc, operation = appConfig.operation, operationRevision = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "operationRevision"), resource = appConfig.resource, user = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "user"), activity = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "activity"), modeProcessSfc = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "modeProcessSfc"), }; DateTime beginTime = DateTime.Now; miFirstOperationForsfcResponse firstOperationForsfcResponse = new miFirstOperationForsfcResponse(); try { LogHelper.Info("MES自动入账接口请求参数:" + JsonChange.ModeToJson(miFirstOperationForsfcServiceServiceParam)); //upLoadBusiness.SaveLogRecord(position, "MES自动入账接口请求参数:" + JsonChange.ModeToJson(miFirstOperationForsfcServiceServiceParam)); if (appConfig.isMesFlag == 1) { firstOperationForsfcResponse = MesWebServices.iMiFirstOperationForsfcServiceService(miFirstOperationForsfcServiceServiceParam); LogHelper.Info("MES自动入账接口返回参数:" + JsonChange.ModeToJson(firstOperationForsfcResponse)); //upLoadBusiness.SaveLogRecord(position, "MES自动入账接口返回参数:" + JsonChange.ModeToJson(firstOperationForsfcResponse)); //判断返回结果 if (firstOperationForsfcResponse.@return.code > 0) { LogHelper.Info("MES自动入账接口返回异常:" + firstOperationForsfcResponse.@return.message); //upLoadBusiness.SaveLogRecord(position, "MES自动入账接口返回异常:" + firstOperationForsfcResponse.@return.message); //下发上料结果 AngrilyResultSendToPlc(position, 2, 2); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "自动入账失败:" + upLoadBusiness.GetMesMessage(firstOperationForsfcResponse.@return.code, firstOperationForsfcResponse.@return.message)); LogRefreshEvent?.Invoke(LogType.MesLog, logStr + "自动入账失败,下发异常报警信息"); return; } sfc = firstOperationForsfcResponse.@return.sfc; qty = firstOperationForsfcResponse.@return.qty; } else { sfc = System.Guid.NewGuid().ToString("N").Substring(0, 14); qty = "14"; } LogRefreshEvent?.Invoke(LogType.MesLog, logStr + "MES入账接口调用成功,SFC:" + sfc + ";EA:" + qty); LogRefreshEvent?.Invoke(LogType.RfidLog, logStr + "MES入账接口调用成功,SFC:" + sfc + ";EA:" + qty); LogHelper.Info(logStr + "MES入账接口调用成功,SFC:" + sfc + ";EA:" + qty); //upLoadBusiness.SaveLogRecord(position, logStr + "MES入账接口调用成功,SFC:" + sfc + ";EA:" + qty); } catch (Exception ex) { LogHelper.Info(logStr + "MES自动入账接口请求异常:" + ex.Message); WebServiceLog.saveMiFirstOperationForsfcServiceService(miFirstOperationForsfcServiceServiceParam, null, beginTime, ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "MES自动入账接口异常:" + ex.Message); //下发上料结果 AngrilyResultSendToPlc(position, 2, 2); LogRefreshEvent?.Invoke(LogType.PlcLog, logStr + "MES自动入账接口异常下发异常报警信息"); //upLoadBusiness.SaveLogRecord(position, logStr + "MES自动入账接口请求异常:" + ex.Message); return; } //下发PLC读取结果 UpmaterialReadSuccess(position); ViewModelRefreshEvent?.Invoke(new ViewModelDto() { rfidInfo = new RfidInfoDto() { rfid = epc, position = position, sfc = sfc, ea = qty }, plcStatus = true, }); //实时绑定卷轴与RFID信息 LogHelper.Info(String.Format("绑定{0}卷轴与RFID:{1}获取卷轴信息", logStr, epc)); LogRefreshEvent?.Invoke(LogType.RfidLog, String.Format("绑定{0}卷轴与RFID:{1}获取卷轴信息", logStr, epc)); //upLoadBusiness.SaveLogRecord(position, String.Format("绑定{0}卷轴与RFID:{1}获取卷轴信息", logStr, epc)); ProShaftInfo shaftInfo = await this.GetShaftInfoByPosition(position); if (shaftInfo == null || StringExtension.IsBlank(shaftInfo.processId)) { LogRefreshEvent?.Invoke(LogType.RfidLog, "绑定卷轴与RFID获取卷轴信息为空"); LogHelper.Info("绑定卷轴与RFID获取卷轴信息为空"); //upLoadBusiness.SaveLogRecord(position, "绑定卷轴与RFID获取卷轴信息为空"); return; } LogHelper.Info("获取卷轴信息为:" + JsonChange.ModeToJson(shaftInfo)); shaftInfo.bindRfid = epc; shaftInfo.bindSfc = sfc; shaftInfo.bindEaValue = qty; shaftInfo.bindTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if(await shaftInfoServices.Update(shaftInfo)) { LogHelper.Info(String.Format("绑定{0}卷轴与RFID:{1}获取卷轴信息成功", logStr, epc)); } else { LogHelper.Info(String.Format("绑定{0}卷轴与RFID:{1}获取卷轴信息失败", logStr, epc)); } string UpMaterialId = ""; #region 重量特征数据上传 Add By wenjy 2022-12-02 获取冷压重量特征数据 if (upLoadBusiness.JudgeResourceIsUplpadData()) { GetParametricValueRequestData[] parametricValueRequestDatas = new GetParametricValueRequestData[] { new GetParametricValueRequestData { parameter= "LY_WLMX" }, new GetParametricValueRequestData { parameter= "LY_S_X01" }, new GetParametricValueRequestData { parameter= "LY_S_X02" }, new GetParametricValueRequestData { parameter= "LY_B_X01" }, new GetParametricValueRequestData { parameter= "LY_B_X02" }, new GetParametricValueRequestData { parameter= "S_TARGETCW" }, }; var lyMaterialCharacter = GetLyMaterialCharacter(sfc, parametricValueRequestDatas); //获取冷压特征数据 //foreach (var item in lyMaterialCharacter.paramValues) //{ // if (item.parameter == "S_TARGETCW") item.parameter = ; //} LogHelper.Info("获取冷压重量特征数据:" + JsonChange.ModeToJson(lyMaterialCharacter)); //upLoadBusiness.SaveLogRecord(position, "获取冷压重量特征数据:" + JsonChange.ModeToJson(lyMaterialCharacter)); UpMaterialId = JsonChange.ModeToJson(lyMaterialCharacter); } #endregion //添加上料记录 ProUpRecord upRecord = new ProUpRecord() { Id = System.Guid.NewGuid().ToString(), MachineId = appConfig.machineId, PositionId = position, UpMaterialId = UpMaterialId, Rfid = epc, IsProduction = 0, Sfc = sfc, eaValue = StringChange.ParseToInt(qty), RecordTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; await upRecordServices.Add(upRecord); upLoadBusiness.SaveUpRecord(upRecord); WriteSfcToPLC(sfc, position); } /// /// 收卷位涨紧MES信息处理 /// /// /// /// public async void DownMaterialBeginByMes(int position, string epc, bool auto) { #region 参数定义 string logStr = Which(position); #endregion try { ///如果是手动触发,清理信号 if (!auto) { AngrilyResultSendToPlc(position, 1, 0); ManualClearWarning(position); } ViewModelRefreshEvent?.Invoke(new ViewModelDto() { rfidInfo = new RfidInfoDto() { rfid = epc, position = position, }, plcStatus = true, }); // 不登录不让生产 AngrilyResultSendToPlc(position, 2, 2);//收卷位报警 //绑定卷轴与RFID信息 ProShaftInfo shaftInfo = await this.GetShaftInfoByPosition(position); if (shaftInfo == null) { LogRefreshEvent?.Invoke(LogType.RfidLog, "绑定卷轴与物料信息,获取卷轴信息为空"); LogRefreshEvent?.Invoke(LogType.AlarmLog, "绑定卷轴与物料信息,获取卷轴信息为空"); LogHelper.Info("绑定卷轴与物料信息,获取卷轴信息为空"); return; } if(StringExtension.IsBlank(shaftInfo.bindRfid) ||shaftInfo.bindRfid != epc) { shaftInfo.bindRfid = epc; shaftInfo.bindSfc = ""; shaftInfo.bindEaValue = ""; shaftInfo.bindTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); await shaftInfoServices.Update(shaftInfo); LogHelper.Info(String.Format("{0}绑定RFID条码信息:{1}", logStr, epc)); } #region 清除定时读取RFID条码信息 Add By wenjy 2022-12-04 DeleteBindInfo(shaftInfo); #endregion //添加下料记录 ProDownRecord downRecord = new ProDownRecord() { Id = System.Guid.NewGuid().ToString("N"), MachineId = appConfig.machineId, PositionId = position, Rfid = epc, IsProduction = 0, // 添加操作员字段 ----------- beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), RecordTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; await downRecordServices.Add(downRecord); upLoadBusiness.SaveDownRecord(downRecord); // 操作员字段,传到web ----------- } catch (Exception e) { LogHelper.Info(e.ToString()); LogRefreshEvent?.Invoke(LogType.AlarmLog, "收卷位涨紧MES信息处理异常:" + e.Message); } WriteSfcToPLC(epc, position); } /// /// MES自动入账接口开始SFC /// /// /// public bool SFCBegin(ProShaftInfo shaftInfo) { LogHelper.Info("调用MES自动入账开始接口"); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用MES自动入账开始接口"); MiFirstOperationForsfcServiceServiceParam miFirstOperationForsfcServiceServiceParam = new MiFirstOperationForsfcServiceServiceParam() { //url = "http://lymesa.catlbattery.com:8103/atlmeswebservice/MiFirstOperationForsfcServiceService?wsdl", //site = "2100", //sfc = shaftInfo.bindSfc, //processLot = "", //operation = appConfig.operation, //operationRevision = "#", //resource = appConfig.resource, //user = "SUP_LYA_RF01", //activity = "", //modeProcessSfc = "MODE_START_SFC", url = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "url"), site = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "site"), sfc = shaftInfo.bindSfc, processLot = "", operation = appConfig.operation, operationRevision = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "operationRevision"), resource = appConfig.resource, user = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "user"), activity = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "activity"), modeProcessSfc = inifile.IniReadValue("MiFirstOperationForsfcServiceServiceParam", "modeProcessSfc"), }; DateTime beginTime = DateTime.Now; try { LogHelper.Info("调用A面自动入账接口请求参数:" + JsonChange.ModeToJson(miFirstOperationForsfcServiceServiceParam)); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用A面自动入账接口请求参数:" + JsonChange.ModeToJson(miFirstOperationForsfcServiceServiceParam)); if (appConfig.isMesFlag == 1) { miFirstOperationForsfcResponse firstOperationForsfcResponse = MesWebServices.iMiFirstOperationForsfcServiceService(miFirstOperationForsfcServiceServiceParam); LogHelper.Info("调用A面自动入账接口返回参数:" + JsonChange.ModeToJson(firstOperationForsfcResponse)); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用A面自动入账接口返回参数:" + JsonChange.ModeToJson(firstOperationForsfcResponse)); if (firstOperationForsfcResponse.@return.code > 0) { LogHelper.Info("MES自动入账开始接口调用失败:" + firstOperationForsfcResponse.@return.message); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "MES自动入账开始接口调用失败:" + firstOperationForsfcResponse.@return.message); LogRefreshEvent?.Invoke(LogType.MesLog, "MES自动入账开始接口调用失败:" + upLoadBusiness.GetMesMessage(firstOperationForsfcResponse.@return.code, firstOperationForsfcResponse.@return.message)); LogRefreshEvent?.Invoke(LogType.AlarmLog, "MES自动入账开始接口调用失败:" + upLoadBusiness.GetMesMessage(firstOperationForsfcResponse.@return.code, firstOperationForsfcResponse.@return.message)); return false; } } } catch (Exception ex) { LogHelper.Info("调用MES自动入账接口异常:" + ex.Message); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用MES自动入账接口异常:" + ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "调用MES自动入账接口异常:" + ex.Message); WebServiceLog.saveMiFirstOperationForsfcServiceService(miFirstOperationForsfcServiceServiceParam, null, beginTime, ex.Message); return false; } LogHelper.Info("调用MES自动入账接口成功"); LogRefreshEvent?.Invoke(LogType.MesLog, "调用MES自动入账接口成功"); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用MES自动入账接口成功"); return true; } /// /// MES注销SFC接口 /// /// /// public bool SignOffSFCs(ProShaftInfo shaftInfo) { LogRefreshEvent?.Invoke(LogType.RfidLog, "调用MES注销SFC接口" + shaftInfo.bindSfc); LogHelper.Info("调用MES注销SFC接口" + shaftInfo.bindSfc); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用MES注销SFC接口" + shaftInfo.bindSfc); MiSignOffSFCsServiceServiceParam miSignOffSFCsServiceServiceParam = new MiSignOffSFCsServiceServiceParam() { //url = "http://lymesa.catlbattery.com:8103/atlmeswebservice/MiSignOffSFCsServiceService?wsdl", //site = "2100", //user = "SUP_LYA_RF01", //operation = appConfig.operation, //operationRevision = "A", //activityId = "EAP_WS", //Resource = appConfig.resource, //amount = "1", //sfcDataArray = null, //sfc = shaftInfo.bindSfc, url = inifile.IniReadValue("MiSignOffSFCsServiceServiceParam","url"), site = inifile.IniReadValue("MiSignOffSFCsServiceServiceParam", "site"), user = inifile.IniReadValue("MiSignOffSFCsServiceServiceParam", "user"), operation = appConfig.operation, operationRevision = inifile.IniReadValue("MiSignOffSFCsServiceServiceParam", "operationRevision"), activityId = inifile.IniReadValue("MiSignOffSFCsServiceServiceParam", "activityId"), Resource = appConfig.resource, amount = inifile.IniReadValue("MiSignOffSFCsServiceServiceParam", "amount"), sfcDataArray = null, sfc = shaftInfo.bindSfc, }; DateTime beginTime = DateTime.Now; try { LogHelper.Info("调用MES注销SFC接口请求参数:" + JsonChange.ModeToJson(miSignOffSFCsServiceServiceParam)); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用MES注销SFC接口请求参数:" + JsonChange.ModeToJson(miSignOffSFCsServiceServiceParam)); if (appConfig.isMesFlag == 1) { miSignOffSFCsResponse signOffSFCsResponse = MesWebServices.iMiSignOffSFCsServiceService(miSignOffSFCsServiceServiceParam); LogHelper.Info("调用MES注销SFC接口返回参数:" + JsonChange.ModeToJson(signOffSFCsResponse)); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用MES注销SFC接口返回参数:" + JsonChange.ModeToJson(signOffSFCsResponse)); if (signOffSFCsResponse == null || signOffSFCsResponse.@return.code > 0) { LogRefreshEvent?.Invoke(LogType.MesLog, "注销SFC接口调用失败:" + upLoadBusiness.GetMesMessage(signOffSFCsResponse.@return.code, signOffSFCsResponse.@return.message)); LogRefreshEvent?.Invoke(LogType.AlarmLog, "注销SFC接口调用失败:" + upLoadBusiness.GetMesMessage(signOffSFCsResponse.@return.code, signOffSFCsResponse.@return.message)); LogHelper.Info("注销SFC接口调用失败:" + signOffSFCsResponse.@return.message); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "注销SFC接口调用失败:" + signOffSFCsResponse.@return.message); return false; } } } catch (Exception ex) { LogHelper.Info("调用MES注销SFC接口异常:" + ex.Message); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用MES注销SFC接口异常:" + ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, String.Format("调用MES注销SFC接口异常:", ex.Message)); WebServiceLog.saveMiSignOffSFCsServiceService(miSignOffSFCsServiceServiceParam, null, beginTime, ex.Message); return false; } LogRefreshEvent?.Invoke(LogType.MesLog, String.Format("注销SFC接口调用成功,SFC:{0}", shaftInfo.bindSfc)); LogHelper.Info(String.Format("注销SFC接口调用成功,SFC:{0}", shaftInfo.bindSfc)); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), String.Format("注销SFC接口调用成功,SFC:{0}", shaftInfo.bindSfc)); return true; } /// /// 通过MES接口获取放卷位物料EA数量 /// /// /// private string GetMaterialEaByMes(ProShaftInfo shaftInfo, int position) { string logStr = Which(position); string mesQty = ""; MiSFCQueryQtyServiceServiceParam sFCQueryQtyServiceServiceParam = new MiSFCQueryQtyServiceServiceParam() { //url = "http://lymesa.catlbattery.com:8103/atlmeswebservice/MiSFCQueryQtyServiceService?wsdl", //site = "2100", //sfc = shaftInfo.bindSfc url = inifile.IniReadValue("MiSFCQueryQtyServiceServiceParam", "url"), site = inifile.IniReadValue("MiSFCQueryQtyServiceServiceParam", "site"), sfc = shaftInfo.bindSfc }; LogHelper.Info(logStr + ",MES获取物料EA值接口请求参数:" + JsonChange.ModeToJson(sFCQueryQtyServiceServiceParam)); DateTime beginTime = DateTime.Now; try { if (appConfig.isMesFlag == 1) { var sfcQueryQtyResponse = MesWebServices.iMiSFCQueryQtyServiceService(sFCQueryQtyServiceServiceParam); LogHelper.Info(logStr + ",MES获取物料EA值接口返回参数:" + JsonChange.ModeToJson(sfcQueryQtyResponse)); if (sfcQueryQtyResponse.@return.code > 0) { LogRefreshEvent?.Invoke(LogType.MesLog, String.Format(logStr + ",通过MES接口获取放卷物料{0}的SFC数量失败:{1}", shaftInfo.bindSfc, upLoadBusiness.GetMesMessage(sfcQueryQtyResponse.@return.code, sfcQueryQtyResponse.@return.message))); LogRefreshEvent?.Invoke(LogType.AlarmLog, String.Format(logStr + ",通过MES接口获取放卷物料{0}的SFC数量失败:{1}", shaftInfo.bindSfc, upLoadBusiness.GetMesMessage(sfcQueryQtyResponse.@return.code, sfcQueryQtyResponse.@return.message))); } else { mesQty = sfcQueryQtyResponse.@return.qty; } } } catch (Exception ex) { LogHelper.Info(String.Format(logStr + "完工,MES获取SFC数量接口异常:{1}", ex.Message)); WebServiceLog.saveMiSFCQueryQtyServiceService(sFCQueryQtyServiceServiceParam, null, beginTime, ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, String.Format(logStr + "完工,MES获取SFC数量接口异常:{1}", ex.Message)); writeError(position, 2); } return mesQty; } /// /// MES自动完工接口 /// /// /// /// private bool CompleteSfcByMes(ProShaftInfo shaftInfo, int position, int qty,ProDownRecord downRecord) { bool boolFlag = false; LogRefreshEvent?.Invoke(LogType.MesLog, "调用MES自动拆分接口"); LogHelper.Info("调用MES自动拆分接口"); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "调用MES自动拆分接口"); WebService.MiBatchCompleteSfcAndAdujustQtyServiceService.ModeProcessSfc modeProcessSfc = WebService.MiBatchCompleteSfcAndAdujustQtyServiceService.ModeProcessSfc.MODE_COMPLETE_SFC_POST_DC; machineIntegrationParametricData[] datas = GetCcdTreetopAmount(position); #region 重量特征数据上传 Add By wenjy 2022-12-02 过账模式只拆分不完工 if (upLoadBusiness.JudgeResourceIsUplpadData()) { LogHelper.Info("190品种获取重量特征数据"); modeProcessSfc = WebService.MiBatchCompleteSfcAndAdujustQtyServiceService.ModeProcessSfc.MODE_NONE; datas = GetMaterialWeight(shaftInfo, position, shaftInfo.bindSfc).Result; } #endregion miBatchCompleteSfcAndAdujustQtySfcEntity[] miBatchCompleteSfcAndAdujustQtySfcEntities = new miBatchCompleteSfcAndAdujustQtySfcEntity[] { new miBatchCompleteSfcAndAdujustQtySfcEntity() { processLot = shaftInfo.bindRfid, qty = qty.ToString(), unit = "EA", } }; var requestParam = new MiBatchCompleteSfcAndAdujustQtyServiceServiceParam() { //url = "http://lymesa.catlbattery.com:8103/atlmeswebservice/MiBatchCompleteSfcAndAdujustQtyServiceService?wsdl", url = inifile.IniReadValue("SplitSfcParam", "url"), site = inifile.IniReadValue("SplitSfcParam", "site"), sfcPre = shaftInfo.bindSfc, processLotPre = "", operation = appConfig.operation, operationRevision = inifile.IniReadValue("SplitSfcParam", "operationRevision"), resource = appConfig.resource, user = inifile.IniReadValue("SplitSfcParam", "user"), activity = inifile.IniReadValue("SplitSfcParam", "activity"), modeProcessSfc = modeProcessSfc, sfcList = miBatchCompleteSfcAndAdujustQtySfcEntities, }; if (StringExtension.IsNotBlank(downRecord.shaftNumber)) { requestParam.tailmark = downRecord.shaftNumber; } LogHelper.Info("MES自动拆分接口请求参数:" + JsonChange.ModeToJson(requestParam)); if (appConfig.isMesFlag == 1) { if (StringExtension.IsBlank(downRecord.Sfc)) { MiBatchCompleteSfcAndAdujustQtyResponse batchCompleteSfcAndAdujustQtyResponse = MesWebServices.iMiBatchCompleteSfcAndAdujustQtyServiceService(requestParam); LogHelper.Info("MES自动拆分接口返回参数:" + JsonChange.ModeToJson(batchCompleteSfcAndAdujustQtyResponse)); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "MES自动拆分接口返回参数:" + JsonChange.ModeToJson(batchCompleteSfcAndAdujustQtyResponse)); var result = batchCompleteSfcAndAdujustQtyResponse.@return; if (result.code > 0) { LogHelper.Info("MES自动拆分接口调用失败:" + batchCompleteSfcAndAdujustQtyResponse.@return.message); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "MES自动拆分接口调用失败:" + batchCompleteSfcAndAdujustQtyResponse.@return.message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "MES自动拆分接口调用失败:" + upLoadBusiness.GetMesMessage(batchCompleteSfcAndAdujustQtyResponse.@return.code, batchCompleteSfcAndAdujustQtyResponse.@return.message)); LogRefreshEvent?.Invoke(LogType.MesLog, "MES自动拆分接口调用失败:" + upLoadBusiness.GetMesMessage(batchCompleteSfcAndAdujustQtyResponse.@return.code, batchCompleteSfcAndAdujustQtyResponse.@return.message)); return false; } } LogHelper.Info("MES自动拆分接口调用成功"); LogRefreshEvent?.Invoke(LogType.MesLog, "MES自动拆分接口调用成功"); LogRefreshEvent?.Invoke(LogType.RfidLog, "MES自动拆分接口调用成功"); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "MES自动拆分接口调用成功"); #region 重量特征数据上传 Add By wenjy 2022-12-02 if (upLoadBusiness.JudgeResourceIsUplpadData()) { string splitMaterialSfc = GetSfcByRfid(shaftInfo.bindRfid); downRecord.Sfc = splitMaterialSfc; downRecord.eaValue = qty; downRecord.endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); downRecordServices.Update(downRecord); // ccd单独上传数据收集组*Y // UpMQMesData1(position, GetCcdTreetopAmount(position), splitMaterialSfc); if (UpMQMesData(position, datas, splitMaterialSfc,downRecord)) { LogHelper.Info("模切数据上传成功"); LogRefreshEvent?.Invoke(LogType.MesLog, "模切数据上传成功"); //upLoadBusiness.SaveLogRecord(position, "模切数据上传成功"); boolFlag = true; } else { LogHelper.Info("模切数据上传失败"); LogRefreshEvent?.Invoke(LogType.MesLog, "模切数据上传失败"); //upLoadBusiness.SaveLogRecord(position, "模切数据上传失败"); boolFlag = false; } } else { boolFlag = true; } #endregion } return boolFlag; } /// /// 调用MES调整数量接口 /// /// /// /// /// private bool AdujustQtySfcByMes(ProShaftInfo shaftInfo, int position, int PLCqty) { bool boolFlag = false; LogRefreshEvent?.Invoke(LogType.MesLog, "调用MES调整数量接口"); MiBatchCompleteSfcAndAdujustQtyServiceServiceParam miBatchCompleteSfcAndAdujustQtyServiceServiceParam = new MiBatchCompleteSfcAndAdujustQtyServiceServiceParam() { //url = "http://lymesa.catlbattery.com:8103/atlmeswebservice/MiBatchCompleteSfcAndAdujustQtyServiceService?wsdl", //site = "2100", //sfcPre = shaftInfo.bindSfc, //processLotPre = "", //operation = appConfig.operation, //operationRevision = "A", //resource = appConfig.resource, //user = "SUP_LYA_RF01", //activity = "Z_PR591", //modeProcessSfc = WebService.MiBatchCompleteSfcAndAdujustQtyServiceService.ModeProcessSfc.MODE_NONE, url = inifile.IniReadValue("AdujustQtyParam", "url"), site = inifile.IniReadValue("AdujustQtyParam", "site"), sfcPre = shaftInfo.bindSfc, processLotPre = "", operation = appConfig.operation, operationRevision = inifile.IniReadValue("AdujustQtyParam", "operationRevision"), resource = appConfig.resource, user = inifile.IniReadValue("AdujustQtyParam", "user"), activity = inifile.IniReadValue("AdujustQtyParam", "activity"), modeProcessSfc = WebService.MiBatchCompleteSfcAndAdujustQtyServiceService.ModeProcessSfc.MODE_NONE, sfcList = new miBatchCompleteSfcAndAdujustQtySfcEntity[] { new miBatchCompleteSfcAndAdujustQtySfcEntity() { processLot = "", sfc = shaftInfo.bindSfc, qty = PLCqty.ToString(), unit = "EA" } } }; LogHelper.Info("调用MES接口调整物料" + shaftInfo.bindSfc + "数量"); LogHelper.Info("MES调整数量接口请求参数:" + JsonChange.ModeToJson(miBatchCompleteSfcAndAdujustQtyServiceServiceParam)); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "MES调整数量接口请求参数:" + JsonChange.ModeToJson(miBatchCompleteSfcAndAdujustQtyServiceServiceParam)); if (appConfig.isMesFlag == 1) { var requestResult = MesWebServices.iMiBatchCompleteSfcAndAdujustQtyServiceService(miBatchCompleteSfcAndAdujustQtyServiceServiceParam); LogHelper.Info("MES调整数量接口返回参数:" + JsonChange.ModeToJson(requestResult)); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "MES调整数量接口返回参数:" + JsonChange.ModeToJson(requestResult)); if (requestResult.@return.code > 0) { LogHelper.Info("MES调整数量接口调用失败:" + requestResult.@return.message); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "MES调整数量接口调用失败:" + requestResult.@return.message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "MES调整数量接口调用失败:" + upLoadBusiness.GetMesMessage(requestResult.@return.code, requestResult.@return.message)); LogRefreshEvent?.Invoke(LogType.MesLog, "MES调整数量接口调用失败:" + upLoadBusiness.GetMesMessage(requestResult.@return.code, requestResult.@return.message)); } else { boolFlag = true; LogRefreshEvent?.Invoke(LogType.MesLog, "MES调整数量接口调用成功"); //upLoadBusiness.SaveLogRecord(StringChange.ParseToInt(shaftInfo.positionId), "MES调整数量接口调用成功"); } } return boolFlag; } /// /// 合卷判断 /// /// private async Task SelectSfcIsHeJuan(int upPosition, int downPosition) { string logStr = Which(downPosition); string upStr = Which(upPosition); LogHelper.Info("合卷逻辑判断:判断"+logStr+"轴与"+upStr+"轴绑定的SFC是否一致"); //获取放卷位信息 ProShaftInfo upShaftInfo = await this.GetShaftInfoByPosition(upPosition); //获取收卷轴绑定信息 ProShaftInfo downShaftInfo = await this.GetShaftInfoByPosition(downPosition); LogHelper.Info(String.Format("当前放卷轴信息:{0},收卷轴信息:{1}",JsonChange.ModeToJson(upShaftInfo),JsonChange.ModeToJson(downShaftInfo))); if(StringExtension.IsNotBlank(upShaftInfo.bindSfc) && StringExtension.IsNotBlank(downShaftInfo.bindSfc)) { if (upShaftInfo.bindSfc != downShaftInfo.bindSfc) { LogHelper.Info("合卷逻辑判断:" + logStr + "轴"+downShaftInfo.bindSfc+"与" + upStr + "轴" + upShaftInfo.bindSfc + "绑定的SFC不一致,触发合卷报警"); LogRefreshEvent?.Invoke(LogType.AlarmLog, logStr + "轴与" + upStr + "轴绑定的SFC不一致,触发合卷报警"); return true; } else { return false; } } else { return false; } } /// /// 串读判断 /// /// /// /// private async Task PdRfidIsChuanDu(string epc, int position) { try { LogHelper.Info("RFID条码:" + epc + "判断是否串读逻辑处理"); Expression> exp = s1 => true; exp = exp.And(x => x.bindRfid == epc && x.positionId != position.ToString() && x.processId == appConfig.processId); List shaftInfos = await shaftInfoServices.Query(exp); if (shaftInfos.Count > 0) { return true; } return false; } catch (Exception ex) { LogHelper.Error("串读逻辑处理异常", ex); LogRefreshEvent?.Invoke(LogType.AlarmLog, "串读逻辑处理异常:" + ex.Message); return false; } } /// /// 解绑RFID与SFC /// /// private void UnBindRfidAndSfc(string rfidStr) { //获取当前RFID是否绑定 string sfcStr = GetSfcByRfid(rfidStr); DateTime beginTime = new DateTime(); if (!StringExtension.IsBlank(sfcStr)) { ProcessLotServiceWSServiceParam lotServiceWSServiceParam = new ProcessLotServiceWSServiceParam() { url = inifile.IniReadValue("ProcessLotServiceWSServiceParam","url"), site = inifile.IniReadValue("ProcessLotServiceWSServiceParam", "site"), processlotref = "ProcessLotBO:2100," + rfidStr, memberlist = new string[] { "SFCBO:2100," + sfcStr } }; LogHelper.Info("MES解绑接口请求参数:" + JsonChange.ModeToJson(lotServiceWSServiceParam)); beginTime = DateTime.Now; try { if (appConfig.isMesFlag == 1) { removeMemberResponse removeMember = MesWebServices.iRemoveMember(lotServiceWSServiceParam); LogHelper.Info("MES解绑接口返回参数:" + JsonChange.ModeToJson(removeMember)); } } catch (Exception ex) { WebServiceLog.saveRemoveMember(lotServiceWSServiceParam, null, beginTime, ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, String.Format("RFID条码:{0}解绑失败:{1}!!!", rfidStr, ex.Message)); return; } } else { LogHelper.Info("RFID条码:" + rfidStr + "未绑定SFC信息"); LogRefreshEvent?.Invoke(LogType.RfidLog, "RFID条码:" + rfidStr + "未绑定SFC信息"); } } /// /// 涨紧逻辑处理结果及报警信息 /// /// /// 1、OK,2、NG /// 0、取消报警,1、RFID读取失败,2、MES接口异常 private void AngrilyResultSendToPlc(int position, int result, int alarm) { if (appConfig.processId.Equals("MQ_A")) { if (appConfig.machineId==3) { if (position == 1) { plcBusiness.writePlc(appConfig.mqAddress.上右收卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.上右收卷报警, alarm); } if (position == 2) { plcBusiness.writePlc(appConfig.mqAddress.下右收卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.下右收卷报警, alarm); } if (position == 3) { plcBusiness.writePlc(appConfig.mqAddress.上左收卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.上左收卷报警, alarm); } if (position == 4) { plcBusiness.writePlc(appConfig.mqAddress.下左收卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.下左收卷报警, alarm); } if (position == 5) { plcBusiness.writePlc(appConfig.mqAddress.右放卷读取结果, result); //RFID扫描结果 plcBusiness.writePlc(appConfig.mqAddress.右放卷报警, alarm); //RFID报警信息 } if (position == 6) { plcBusiness.writePlc(appConfig.mqAddress.左放卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.左放卷报警, alarm); } } else { if (position == 3) { plcBusiness.writePlc(appConfig.mqAddress.上右收卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.上右收卷报警, alarm); } if (position == 4) { plcBusiness.writePlc(appConfig.mqAddress.下右收卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.下右收卷报警, alarm); } if (position == 1) { plcBusiness.writePlc(appConfig.mqAddress.上左收卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.上左收卷报警, alarm); } if (position == 2) { plcBusiness.writePlc(appConfig.mqAddress.下左收卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.下左收卷报警, alarm); } if (position == 5) { plcBusiness.writePlc(appConfig.mqAddress.左放卷读取结果, result); plcBusiness.writePlc(appConfig.mqAddress.左放卷报警, alarm); //RFID报警信息 } if (position == 6) { plcBusiness.writePlc(appConfig.mqAddress.右放卷读取结果, result); //RFID扫描结果 plcBusiness.writePlc(appConfig.mqAddress.右放卷报警, alarm); } } } } /// /// 放卷RFID读取成功,下发PLC读取结果 /// /// private void UpmaterialReadSuccess(int position) { if (appConfig.machineId==3) { if (position == 1) { plcBusiness.writePlc(appConfig.mqAddress.上右收卷读取结果, 1); } if (position == 2) { plcBusiness.writePlc(appConfig.mqAddress.下右收卷读取结果, 1); } if (position == 3) { plcBusiness.writePlc(appConfig.mqAddress.上左收卷读取结果, 1); } if (position == 4) { plcBusiness.writePlc(appConfig.mqAddress.下左收卷读取结果, 1); } if (position == 5) { plcBusiness.writePlc(appConfig.mqAddress.右放卷读取结果, 1); } if (position == 6) { plcBusiness.writePlc(appConfig.mqAddress.左放卷读取结果, 1); } } else { if (position == 3) { plcBusiness.writePlc(appConfig.mqAddress.上右收卷读取结果, 1); } if (position == 4) { plcBusiness.writePlc(appConfig.mqAddress.下右收卷读取结果, 1); } if (position == 1) { plcBusiness.writePlc(appConfig.mqAddress.上左收卷读取结果, 1); } if (position == 2) { plcBusiness.writePlc(appConfig.mqAddress.下左收卷读取结果, 1); } if (position == 5) { plcBusiness.writePlc(appConfig.mqAddress.左放卷读取结果, 1); } if (position == 6) { plcBusiness.writePlc(appConfig.mqAddress.右放卷读取结果, 1); } } } /// /// 禁止下料 /// /// private void ForbidBlank(int position) { if (appConfig.machineId==3) { if (position == 1) plcBusiness.writePlc(appConfig.mqAddress.上右收卷下料, 1); if (position == 2) plcBusiness.writePlc(appConfig.mqAddress.下右收卷下料, 1); if (position == 3) plcBusiness.writePlc(appConfig.mqAddress.上左收卷下料, 1); if (position == 4) plcBusiness.writePlc(appConfig.mqAddress.下左收卷下料, 1); if (position == 5) plcBusiness.writePlc(appConfig.mqAddress.右放卷下料, 1); if (position == 6) plcBusiness.writePlc(appConfig.mqAddress.左放卷下料, 1); } else { if (position == 1) plcBusiness.writePlc(appConfig.mqAddress.上左收卷下料, 1); if (position == 2) plcBusiness.writePlc(appConfig.mqAddress.下左收卷下料, 1); if (position == 3) plcBusiness.writePlc(appConfig.mqAddress.上右收卷下料, 1); if (position == 4) plcBusiness.writePlc(appConfig.mqAddress.下右收卷下料, 1); if (position == 5) plcBusiness.writePlc(appConfig.mqAddress.左放卷下料, 1); if (position == 6) plcBusiness.writePlc(appConfig.mqAddress.右放卷下料, 1); } } /// /// 允许下料 /// /// private void AllowBlank(int position) { if (appConfig.machineId==3) { if (position == 3) plcBusiness.writePlc(appConfig.mqAddress.上左收卷下料, 0); if (position == 1) plcBusiness.writePlc(appConfig.mqAddress.上右收卷下料, 0); if (position == 4) plcBusiness.writePlc(appConfig.mqAddress.下左收卷下料, 0); if (position == 2) plcBusiness.writePlc(appConfig.mqAddress.下右收卷下料, 0); if (position == 5) plcBusiness.writePlc(appConfig.mqAddress.右放卷下料, 0); if (position == 6) plcBusiness.writePlc(appConfig.mqAddress.左放卷下料, 0); } else { if (position == 1) plcBusiness.writePlc(appConfig.mqAddress.上左收卷下料, 0); if (position == 3) plcBusiness.writePlc(appConfig.mqAddress.上右收卷下料, 0); if (position == 2) plcBusiness.writePlc(appConfig.mqAddress.下左收卷下料, 0); if (position == 4) plcBusiness.writePlc(appConfig.mqAddress.下右收卷下料, 0); if (position == 5) plcBusiness.writePlc(appConfig.mqAddress.左放卷下料, 0); if (position == 6) plcBusiness.writePlc(appConfig.mqAddress.右放卷下料, 0); } } /// ///判断当前是哪个轴 /// /// private string Which(int position) { string logStr = ""; if (appConfig.machineId==3) { if (position == 3) logStr = "上收卷左"; if (position == 1) logStr = "上收卷右"; if (position == 4) logStr = "下收卷左"; if (position == 2) logStr = "下收卷右"; if (position == 5) logStr = "右放卷"; if (position == 6) logStr = "左放卷"; } else { if (position == 1) logStr = "上收卷左"; if (position == 3) logStr = "上收卷右"; if (position == 2) logStr = "下收卷左"; if (position == 4) logStr = "下收卷右"; if (position == 5) logStr = "左放卷"; if (position == 6) logStr = "右放卷"; } return logStr; } /// /// 写入SFC /// /// /// private void WriteSfcToPLC(string sfc, int position) { string str = Which(position); string PLCaddress = ""; if (appConfig.machineId==3) { if (position == 3) PLCaddress = appConfig.mqAddress.上左收卷SFC; if (position == 1) PLCaddress = appConfig.mqAddress.上右收卷SFC; if (position == 4) PLCaddress = appConfig.mqAddress.下左收卷SFC; if (position == 2) PLCaddress = appConfig.mqAddress.下右收卷SFC; if (position == 5) PLCaddress = appConfig.mqAddress.右放卷SFC; if (position == 6) PLCaddress = appConfig.mqAddress.左放卷SFC; } else { if (position == 1) PLCaddress = appConfig.mqAddress.上左收卷SFC; if (position == 3) PLCaddress = appConfig.mqAddress.上右收卷SFC; if (position == 2) PLCaddress = appConfig.mqAddress.下左收卷SFC; if (position == 4) PLCaddress = appConfig.mqAddress.下右收卷SFC; if (position == 5) PLCaddress = appConfig.mqAddress.左放卷SFC; if (position == 6) PLCaddress = appConfig.mqAddress.右放卷SFC; } LogHelper.Info(str + "向PLC地址:" + PLCaddress + "写入SFC:" + sfc); PlcBusiness.writeStrPlc(PLCaddress, sfc); } private void writeError(int position, int alarmType) { if (appConfig.machineId==3) { if (position == 3) plcBusiness.writePlc(appConfig.mqAddress.上左收卷报警, alarmType); if (position == 1) plcBusiness.writePlc(appConfig.mqAddress.上右收卷报警, alarmType); if (position == 4) plcBusiness.writePlc(appConfig.mqAddress.下左收卷报警, alarmType); if (position == 2) plcBusiness.writePlc(appConfig.mqAddress.下右收卷报警, alarmType); } else { if (position == 1) plcBusiness.writePlc(appConfig.mqAddress.上左收卷报警, alarmType); if (position == 3) plcBusiness.writePlc(appConfig.mqAddress.上右收卷报警, alarmType); if (position == 2) plcBusiness.writePlc(appConfig.mqAddress.下左收卷报警, alarmType); if (position == 4) plcBusiness.writePlc(appConfig.mqAddress.下右收卷报警, alarmType); } } /// /// 手动写入时,清除当前报警信号 /// private void ManualClearWarning(int position) { if (appConfig.machineId==3) { if (position == 3) plcBusiness.writePlc(appConfig.mqAddress.上左收卷写入, 1); if (position == 1) plcBusiness.writePlc(appConfig.mqAddress.上右收卷写入, 1); if (position == 4) plcBusiness.writePlc(appConfig.mqAddress.下左收卷写入, 1); if (position == 2) plcBusiness.writePlc(appConfig.mqAddress.下右收卷写入, 1); if (position == 5) plcBusiness.writePlc(appConfig.mqAddress.右放卷写入, 1); if (position == 6) plcBusiness.writePlc(appConfig.mqAddress.左放卷写入, 1); } else { if (position == 1) plcBusiness.writePlc(appConfig.mqAddress.上左收卷写入, 1); if (position == 3) plcBusiness.writePlc(appConfig.mqAddress.上右收卷写入, 1); if (position == 2) plcBusiness.writePlc(appConfig.mqAddress.下左收卷写入, 1); if (position == 4) plcBusiness.writePlc(appConfig.mqAddress.下右收卷写入, 1); if (position == 5) plcBusiness.writePlc(appConfig.mqAddress.左放卷写入, 1); if (position == 6) plcBusiness.writePlc(appConfig.mqAddress.右放卷写入, 1); } } /// /// 放卷位四通道读写器读取 /// /// /// private string ReadEpcByPosition(int position) { List positionList = new List(); positionList.Add(position); List positionTag = equipBusiness.ReadEPCByAntanaGroup(positionList); string epc = ""; //add by wenjy 判断读取结果是否为null 20220825 if (positionTag != null) { foreach (var Tag in positionTag) { if (Tag.position == position) { epc = Tag.EPC; break; } } } return epc; } /// /// 放卷位物料是否结束生产 /// /// private async Task UpMaterialIsEndProduction(string rfidStr) { bool result = false; //通过MES获取RFID绑定的SFC string sfcStr = GetSfcByRfid(rfidStr); if (StringExtension.IsNotBlank(sfcStr)) { LogRefreshEvent?.Invoke(LogType.RfidLog, String.Format("当前RFID:{0}绑定的SFC为:{1}", rfidStr, sfcStr)); //通过SFC判断该卷物料是否已经生产结束,如果生产结束返回true,未结束返回false //upRecordServices Expression> exp = s1 => true; exp = exp.And(x => x.Sfc == sfcStr); Expression> order = s1 => s1.RecordTime; ProUpRecord upRecord = await upRecordServices.QueryFirst(exp, order, false); LogHelper.Info(String.Format("获取{0}对应的上料记录:{1}",sfcStr,JsonChange.ModeToJson(upRecord))); if (upRecord != null) { if (upRecord.IsProduction != 1) { LogRefreshEvent?.Invoke(LogType.RfidLog, String.Format("当前SFC:{0}放卷结束时间为空,生产未结束", sfcStr)); result = false; } else { LogRefreshEvent?.Invoke(LogType.RfidLog, String.Format("当前SFC:{0}放卷结束时间为:{1}", sfcStr, upRecord.endTime)); result = true; } } } else { LogRefreshEvent?.Invoke(LogType.RfidLog, String.Format("当前Rfid:{0}绑定的SFC为空,不允许继续生产!", rfidStr)); result = true; } return result; } /// /// 通过RFID获取SFC /// /// /// private string GetSfcByRfid(string rfidStr) { string sfcStr = ""; DateTime beginTime = new DateTime(); ProcessLotServiceWSServiceParam processLotServiceWSServiceParam = new ProcessLotServiceWSServiceParam() { //url = "http://lymesa.catlbattery.com:8103/manufacturing-papiservices/ProcessLotServiceWSService?wsdl", //site = "2100", url = inifile.IniReadValue("ProcessLotServiceWSServiceParam","url"), site = inifile.IniReadValue("ProcessLotServiceWSServiceParam", "site"), processlotref = String.Format("ProcessLotBO:2100,{0}", rfidStr) }; try { LogRefreshEvent?.Invoke(LogType.MesLog, "调用MES接口获取RFID绑定的SFC"); LogHelper.Info("MES获取膜卷号接口请求参数:" + JsonChange.ModeToJson(processLotServiceWSServiceParam)); if (appConfig.isMesFlag == 1) { readProcessLotResponse readProcessLotResponse = MesWebServices.readProcessLot(processLotServiceWSServiceParam); LogHelper.Info("MES获取膜卷号接口返回参数:" + JsonChange.ModeToJson(readProcessLotResponse)); if (readProcessLotResponse.Response.processLotMemberList != null) { sfcStr = readProcessLotResponse.Response.processLotMemberList[0].memberContext.Substring(11); LogHelper.Info("RFID条码:" + rfidStr + "绑定的SFC条码为:" + sfcStr); LogRefreshEvent?.Invoke(LogType.MesLog, "RFID条码:" + rfidStr + "绑定的SFC条码为:" + sfcStr); } } else { sfcStr = System.Guid.NewGuid().ToString("N").Substring(0, 14); } } catch (Exception ex) { LogHelper.Info("MES获取膜卷号接口调用异常:" + ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "MES获取膜卷号接口调用异常:" + ex.Message); WebServiceLog.saveReadProcessLot(processLotServiceWSServiceParam, null, beginTime, ex.Message); } return sfcStr; } #region RFID串读过滤方案 Add By wenjy 2022-11-26 private System.Timers.Timer timer = new System.Timers.Timer(1000 * 60 * 5); private IBaseServices tagInfoServices = new BaseServices(); private void StartTimerReadRfid() { try { if (!timer.Enabled) { timer.Elapsed += new System.Timers.ElapsedEventHandler(ReadRfidByTimer); timer.AutoReset = true; timer.Enabled = false; timer.Start(); LogHelper.Info("进入StartTimerReadRfid(),开启定时读取RFID"); } }catch(Exception ex) { LogHelper.Error("StartTimerReadRfid异常", ex); } } private async void ReadRfidByTimer(object source, System.Timers.ElapsedEventArgs e) { try { //判断当前收卷生产轴 List positions = new List(); if (appConfig.machineId == 3) { if (PlcBusiness.readPlc(appConfig.mqAddress.上左收卷状态) == 1) positions.Add(3); if (PlcBusiness.readPlc(appConfig.mqAddress.上右收卷状态) == 1) positions.Add(1); if (PlcBusiness.readPlc(appConfig.mqAddress.下左收卷状态) == 1) positions.Add(4); if (PlcBusiness.readPlc(appConfig.mqAddress.下右收卷状态) == 1) positions.Add(2); } else { if (PlcBusiness.readPlc(appConfig.mqAddress.上左收卷状态) == 1) positions.Add(1); if (PlcBusiness.readPlc(appConfig.mqAddress.上右收卷状态) == 1) positions.Add(3); if (PlcBusiness.readPlc(appConfig.mqAddress.下左收卷状态) == 1) positions.Add(2); if (PlcBusiness.readPlc(appConfig.mqAddress.下右收卷状态) == 1) positions.Add(4); } foreach (int item in positions) { string logStr = Which(item); LogHelper.Info(String.Format("生产过程中定时读取{0}RFID卷筒标签", logStr)); ProEquip proEquip = equipBusiness.Equiplist.Where(x => x.positionId == item).FirstOrDefault(); if (proEquip == null) { return; } //读取协议更换 List tagInfos = equipBusiness.ReadEpcByProduction(proEquip.equipId); //存储数据 ProShaftInfo shaftInfo = this.GetShaftInfoByPosition(item).Result; if (shaftInfo != null) { Expression> queryExp = s1 => true; queryExp = queryExp.And(x => x.PositionId == shaftInfo.id.ToString()); List bindInfos = await tagInfoServices.Query(queryExp); if (bindInfos.Count >= 100) { if (timer.Enabled) { timer.Stop(); timer.Close(); timer.Dispose(); timer = new System.Timers.Timer(1000 * 60 * 5); } } else { if (tagInfos != null) { int tagInfoLength = tagInfos.Count; for (int i = 0; i < tagInfoLength; i++) { ProTagInfo tagInfo = new ProTagInfo() { Id = System.Guid.NewGuid().ToString("N"), MachineId = appConfig.machineId.ToString(), PositionId = shaftInfo.id.ToString(), Count = tagInfos[i].Count.ToString(), Rssi = tagInfos[i].RSSI.ToString(), Antana = tagInfos[i].Antana.ToString(), Pcstring = tagInfos[i].PCstring == null ? "" : tagInfos[i].PCstring, Epcstring = tagInfos[i].EPCstring == null ? "" : tagInfos[i].EPCstring }; await tagInfoServices.Add(tagInfo); } } } } } }catch(Exception ex) { LogHelper.Error("生产过程中定时读取RFID异常",ex); } } private async void StopTimerReadRfid(int position) { try { LogHelper.Info("进入StopTimerReadRfid(),停止并释放定时读取"); if (timer.Enabled) { timer.Stop(); timer.Close(); timer.Dispose(); timer = new System.Timers.Timer(1000 * 60 * 5); } string logStr = Which(position); LogHelper.Info(String.Format("收卷结束,过滤{0}读取的RFID标签", logStr)); Dictionary keyValuePairs = new Dictionary(); ProShaftInfo shaftInfo = this.GetShaftInfoByPosition(position).Result; Expression> downexp = x => true; downexp = downexp.And(x => x.PositionId == position && x.IsProduction == 0 && x.Rfid == shaftInfo.bindRfid); Expression> orders = x => x.beginTime; ProDownRecord downRecord = await downRecordServices.QueryFirst(downexp, orders, false); Expression> exp = s1 => true; exp = exp.And(x => x.PositionId == shaftInfo.id.ToString()); List tagInfos = await tagInfoServices.Query(exp); if (tagInfos == null) { return; } List tagInfoList = new List(); if(tagInfos != null) { int tagInfosLength = tagInfos.Count; for(int i = 0; i < tagInfosLength; i++) { TagInfo tagInfo = new TagInfo() { Count = StringChange.ParseToInt(tagInfos[i].Count), RSSI = StringChange.ParseToInt(tagInfos[i].Rssi), Antana = StringChange.ParseToInt(tagInfos[i].Antana), PCstring = tagInfos[i].Pcstring, EPCstring = tagInfos[i].Epcstring }; tagInfoList.Add(tagInfo); } } string result = equipBusiness.FilterEpcByProductionEnd(tagInfoList); LogHelper.Info("获取最终RFID条码为:" + result); //判断最终获取的条码 if (StringExtension.IsNotBlank(result)) { if (shaftInfo.bindRfid != result) { shaftInfo.bindRfid = result; bool updateShaftInfo = await shaftInfoServices.Update(shaftInfo); if (updateShaftInfo) { LogHelper.Info("最终获取的RFID条码与涨紧读取绑定不一致,绑定信息更改成功"); } else { LogHelper.Info("最终获取的RFID条码与涨紧读取绑定不一致,绑定信息更改失败"); } } //更新下料信息 if (downRecord != null) { if (downRecord.Rfid != result) { downRecord.Rfid = result; bool downRecordResult = await downRecordServices.Update(downRecord); if (downRecordResult) { LogHelper.Info("最终获取的RFID条码与涨紧读取绑定不一致,下料信息更改成功"); } else { LogHelper.Info("最终获取的RFID条码与涨紧读取绑定不一致,下料信息更改失败"); } } } } tagInfos.ForEach(x => { tagInfoServices.Delete(x); }); } catch (Exception ex) { LogHelper.Error("定时读取结束异常", ex); } } private async void DeleteBindInfo(ProShaftInfo shaftInfo) { try { Expression> exp = s1 => true; exp = exp.And(x => x.PositionId == shaftInfo.id.ToString()); List tagInfos = await tagInfoServices.Query(exp); if (tagInfos == null) { return; } tagInfos.ForEach(x => { tagInfoServices.Delete(x); }); }catch(Exception ex) { LogHelper.Error("DeleteBindInfo异常", ex); } } #endregion /// /// 获取物料重量特征 /// /// /// /// /// /// private async Task GetMaterialWeight(ProShaftInfo shaftInfo, int position, string splitSfc) { try { string logStr = this.Which(position); //获取放卷方向-放卷开始时读取PLC地址将内容存入绑定信息:false(0)为顺时针,True(1)为逆时针 //根据收卷轴绑定的SFC获取放卷轴 Expression> exp = s1 => true; exp = exp.And(x => x.bindSfc == shaftInfo.bindSfc); Expression> order = s1 => s1.bindTime; ProShaftInfo upShaftInfo = await shaftInfoServices.QueryFirst(exp, order, false); if (upShaftInfo == null) { LogHelper.Info(String.Format("{0}上传数据获取放卷绑定信息为空", logStr)); //upLoadBusiness.SaveLogRecord(position, String.Format("{0}上传数据获取放卷绑定信息为空", logStr)); return null; } string upDirection = upShaftInfo.endFlag == 0 ? "顺时针" : "逆时针"; //获取收卷方向-收卷开始时读取PLC地址将内容存入绑定信息 string downDirection = shaftInfo.endFlag == 0 ? "顺时针" : "逆时针"; //是否首检,根据下料记录统计是否为换班后收卷料 bool isFirst = await IsFirstFlag(); LogHelper.Info(String.Format("{0}收卷结束,当前卷放卷方向:{1};收卷方向:{2};是否首检:{3}", logStr, upDirection, downDirection, isFirst)); //根据上料记录获取冷压特征数据 Expression> upExp = s1 => true; upExp = upExp.And(x => x.Sfc == upShaftInfo.bindSfc); Expression> upOrder = s1 => s1.RecordTime; ProUpRecord upRecord = await upRecordServices.QueryFirst(upExp, upOrder, false); if (upRecord == null) { LogHelper.Info(String.Format("{0}上传数据获取放卷信息为空", logStr)); //upLoadBusiness.SaveLogRecord(position, String.Format("{0}上传数据获取放卷信息为空", logStr)); return null; } var lyMaterialCharacter = JsonChange.JsonToMode(upRecord.UpMaterialId); LogHelper.Info("获取冷压重量特征数据:" + JsonChange.ModeToJson(lyMaterialCharacter)); //upLoadBusiness.SaveLogRecord(position, "获取冷压重量特征数据:" + lyMaterialCharacter); //获取冷压重量特征数据,如果数据库中为空则通过MES重新获取并存入数据库 Add by wenjy 2022-11-15 if (lyMaterialCharacter == null) { GetParametricValueRequestData[] parametricValueRequestDatas = new GetParametricValueRequestData[] { new GetParametricValueRequestData { parameter= "LY_WLMX" }, new GetParametricValueRequestData { parameter= "LY_S_X01" }, new GetParametricValueRequestData { parameter= "LY_S_X02" }, new GetParametricValueRequestData { parameter= "LY_B_X01" }, new GetParametricValueRequestData { parameter= "LY_B_X02" }, new GetParametricValueRequestData { parameter= "LY_B_X02" }, new GetParametricValueRequestData { parameter= "S_TARGETCW" }, }; lyMaterialCharacter = GetLyMaterialCharacter(upShaftInfo.bindSfc, parametricValueRequestDatas); //获取冷压特征数据 string lyMaterialCharacterJsonStr = JsonChange.ModeToJson(lyMaterialCharacter); LogHelper.Info(String.Format("数据库中冷压物料特征数据为空,通过MES获取{0}的物料特征数据:{1}", upShaftInfo.bindSfc, lyMaterialCharacterJsonStr)); //upLoadBusiness.SaveLogRecord(position, String.Format("数据库中冷压物料特征数据为空,通过MES获取{0}的物料特征数据:{1}", upShaftInfo.bindSfc, lyMaterialCharacterJsonStr)); upRecord.UpMaterialId = lyMaterialCharacterJsonStr; await upRecordServices.Update(upRecord); } //物料面向 string mqMaterialFace = ""; string stargetcwStr = ""; var lyMaterialFace = lyMaterialCharacter.paramValues.Where(x => x.parameter == "LY_WLMX").FirstOrDefault(); var S_TARGETCW = lyMaterialCharacter.paramValues.Where(x => x.parameter == "S_TARGETCW").FirstOrDefault(); if (lyMaterialFace != null) { mqMaterialFace = MaterialFaceStr(lyMaterialFace.value, upShaftInfo.endFlag, shaftInfo.endFlag); } if(S_TARGETCW != null){ stargetcwStr = S_TARGETCW.value; }else{ LogHelperBusiness.LogInfo("手动完工获取模切数据S_TARGETCW为null"); } LogHelper.Info(String.Format("冷压物料面向:{0};模切物料面向:{1}", lyMaterialFace, mqMaterialFace)); //upLoadBusiness.SaveLogRecord(position, String.Format("冷压物料面向:{0};模切物料面向:{1}", lyMaterialFace, mqMaterialFace)); string jrDirection = "";//卷绕理论方向 string S_CW = "";//模切S面某膜区某特征值 string B_CW = "";//模切B面某膜区某特征值 if (position % 2 != 0) { jrDirection = shaftInfo.endFlag == 0 ? "逆时针" : "顺时针"; var LY_S_X01 = lyMaterialCharacter.paramValues.Where(x => x.parameter == "LY_S_X01").FirstOrDefault(); var LY_B_X01 = lyMaterialCharacter.paramValues.Where(x => x.parameter == "LY_B_X01").FirstOrDefault(); if (LY_S_X01 != null) S_CW = LY_S_X01.value; if (LY_B_X01 != null) B_CW = LY_B_X01.value; } else { jrDirection = downDirection; var LY_S_X02 = lyMaterialCharacter.paramValues.Where(x => x.parameter == "LY_S_X02").FirstOrDefault(); var LY_B_X02 = lyMaterialCharacter.paramValues.Where(x => x.parameter == "LY_B_X02").FirstOrDefault(); if (LY_S_X02 != null) S_CW = LY_S_X02.value; if (LY_B_X02 != null) B_CW = LY_B_X02.value; } LogHelper.Info(String.Format("卷绕理论方向:{0};S面特征值:{1};B面特征值:{1}", jrDirection, S_CW, B_CW)); machineIntegrationParametricData[] ccdTreetopAmount = GetCcdTreetopAmount(position); machineIntegrationParametricData[] data = { new machineIntegrationParametricData() {name ="MQ_FJFX",dataType=ParameterDataType.TEXT, value= StringExtension.IsBlank(upDirection) ? "0" : upDirection}, new machineIntegrationParametricData() {name ="MQ_SJFX",dataType=ParameterDataType.TEXT, value= StringExtension.IsBlank(downDirection) ? "0" :downDirection}, new machineIntegrationParametricData() {name ="MQ_SJZ",dataType=ParameterDataType.TEXT, value= StringExtension.IsBlank(logStr) ? "0" :logStr}, new machineIntegrationParametricData() {name ="FIRST ARTICLE",dataType=ParameterDataType.TEXT, value= isFirst == true ? "OK" : "NG"}, new machineIntegrationParametricData() {name ="MQ_WLMX",dataType=ParameterDataType.TEXT, value= StringExtension.IsBlank(mqMaterialFace) ? "0" :mqMaterialFace}, new machineIntegrationParametricData() {name ="MQ_JRLLFX",dataType=ParameterDataType.TEXT, value= StringExtension.IsBlank(jrDirection) ? "0" :jrDirection}, new machineIntegrationParametricData() {name ="S_CW",dataType=ParameterDataType.TEXT, value=StringExtension.IsBlank(S_CW) ? "0" : S_CW}, new machineIntegrationParametricData() {name ="B_CW",dataType=ParameterDataType.TEXT, value=StringExtension.IsBlank(B_CW) ? "0" : B_CW}, ccdTreetopAmount[0], // ccd打标数 new machineIntegrationParametricData() {name ="S_TARGETCW",dataType=ParameterDataType.TEXT, value=StringExtension.IsBlank(stargetcwStr) ? "0" : stargetcwStr}, }; LogHelper.Info("GetMaterialWeight获取模切物料特征数据:" + JsonChange.ModeToJson(data)); return data; }catch(Exception ex) { LogRefreshEvent?.Invoke(LogType.AlarmLog, "模切物料特征数据获取异常:" + ex.Message); LogHelper.Error("模切物料特种数据获取异常",ex); return null; } } /// /// 模切物料特征数据上传服务器 /// /// /// /// /// private void UpLoadMaterialWeight(int positionId,string sfcStr,string downRecordId,machineIntegrationParametricData[] data) { try { MqUpLoad mqUpLoad = new MqUpLoad() { sfcStr = sfcStr,//拆分后膜卷号改为放卷位膜卷号 clientId = downRecordId, positionId = positionId, resource = appConfig.resource, operation = appConfig.operation, dcGroup = inifile.IniReadValue("MachineIntegrationServiceParam", "dcGroup"), upDirection = data.Where(x => x.name == "MQ_FJFX").FirstOrDefault().value, downDirection = data.Where(x => x.name == "MQ_SJFX").FirstOrDefault().value, downPosition = data.Where(x => x.name == "MQ_SJZ").FirstOrDefault().value, firstArticle = data.Where(x => x.name == "FIRST ARTICLE").FirstOrDefault().value, mqMaterialFace = data.Where(x => x.name == "MQ_WLMX").FirstOrDefault().value, jrDirection = data.Where(x => x.name == "MQ_JRLLFX").FirstOrDefault().value, scw = data.Where(x => x.name == "S_CW").FirstOrDefault().value, bcw = data.Where(x => x.name == "B_CW").FirstOrDefault().value, // s_targetcw = data.Where(x => x.name == "S_TARGETCW").FirstOrDefault().value, recordTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; upLoadBusiness.SaveMqUpLoad(mqUpLoad); }catch(Exception ex) { LogHelper.Info("模切物料特征数据上传服务器异常:"+ex.Message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "模切物料特征数据上传服务器异常:" + ex.Message); } } /// /// 获取CCD打标数 /// /// /// private machineIntegrationParametricData[] GetCcdTreetopAmount(int position) { try { string logStr = this.Which(position); string treeTop = ""; if (appConfig.machineId==3) { if (position == 1) treeTop = PlcBusiness.readStrPlc(appConfig.mqAddress.上右打标数, 60); //上右 if (position == 2) treeTop = PlcBusiness.readStrPlc(appConfig.mqAddress.下右打标数, 60); //下右 if (position == 3) treeTop = PlcBusiness.readStrPlc(appConfig.mqAddress.上左打标数, 60); //上左 if (position == 4) treeTop = PlcBusiness.readStrPlc(appConfig.mqAddress.下左打标数, 60); //下左 } else { if (position == 3) treeTop = PlcBusiness.readStrPlc(appConfig.mqAddress.上右打标数, 60); //上左 if (position == 4) treeTop = PlcBusiness.readStrPlc(appConfig.mqAddress.下右打标数, 60); //下左 if (position == 1) treeTop = PlcBusiness.readStrPlc(appConfig.mqAddress.上左打标数, 60); //上右 if (position == 2) treeTop = PlcBusiness.readStrPlc(appConfig.mqAddress.下左打标数, 60); //下右 } LogHelper.Info("通过PLC获取CCD打标数:" + treeTop); string[] array = treeTop.Replace("\0","").Trim().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); string amount = array.Length.ToString(); LogHelper.Info("CCD打标数:" + amount); // //upLoadBusiness.SaveLogRecord(position, String.Format("卷绕理论方向:{0};S面特征值:{1};B面特征值:{1}", jrDirection, S_CW, B_CW)); machineIntegrationParametricData[] data = { new machineIntegrationParametricData() {name ="CCD",dataType=ParameterDataType.TEXT, value= amount} }; return data; }catch(Exception ex) { LogHelper.Info("获取CCD打标数异常:" + ex.Message); return null; } } /// /// 上传模切数据 2022-11-8 /// /// /// /// private bool UpMQMesData(int position, machineIntegrationParametricData[] data,string splitSfc,ProDownRecord downRecord) { bool result = false; string logStr = this.Which(position); try { MachineIntegrationServiceParam machineIntegrationServiceParam = new MachineIntegrationServiceParam() { //url = "http://lymesa.catlbattery.com:8103/atlmeswebservice/MachineIntegrationServiceService?wsdl", //site = "2100", //sfc = splitSfc, //将数据上传至拆分后的膜卷号 //operation = appConfig.operation, //operationRevision = "#", //activityId = "EAP_WS", //resource = appConfig.resource, //dcGroup = upLoadBusiness.GerDcGroupByResource(), //dcGroupRevision = "#", //parametricArray = data, //modeProcessSfc = WebService.MachineIntegrationServiceService.ModeProcessSfc.MODE_COMPLETE_SFC_POST_DC url = inifile.IniReadValue("MachineIntegrationServiceParam","url"), site = inifile.IniReadValue("MachineIntegrationServiceParam", "site"), sfc = splitSfc, //将数据上传至拆分后的膜卷号 operation = appConfig.operation, operationRevision = inifile.IniReadValue("MachineIntegrationServiceParam", "operationRevision"), activityId = inifile.IniReadValue("MachineIntegrationServiceParam", "activityId"), resource = appConfig.resource, dcGroup = inifile.IniReadValue("MachineIntegrationServiceParam", "dcGroup"), dcGroupRevision = inifile.IniReadValue("MachineIntegrationServiceParam", "dcGroupRevision"), parametricArray = data, modeProcessSfc = WebService.MachineIntegrationServiceService.ModeProcessSfc.MODE_COMPLETE_SFC_POST_DC }; LogHelper.Info("上传MES数据接口请求参数:" + JsonChange.ModeToJson(machineIntegrationServiceParam)); //upLoadBusiness.SaveLogRecord(position, "上传MES数据接口请求参数:" + JsonChange.ModeToJson(machineIntegrationServiceParam)); var dataCollectForSfcExResponse = MesWebServices.machineIntegration(machineIntegrationServiceParam); var dataCollectForSfcExResponseResult = dataCollectForSfcExResponse.@return; if (dataCollectForSfcExResponseResult.code > 0) { LogHelper.Info("模切数据上传MES失败:" + dataCollectForSfcExResponseResult.message); //upLoadBusiness.SaveLogRecord(position, "模切数据上传MES失败:" + dataCollectForSfcExResponseResult.message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "模切数据上传MES失败:" + upLoadBusiness.GetMesMessage(dataCollectForSfcExResponseResult.code, dataCollectForSfcExResponseResult.message)); LogRefreshEvent?.Invoke(LogType.MesLog, "模切数据上传MES失败:" + upLoadBusiness.GetMesMessage(dataCollectForSfcExResponseResult.code, dataCollectForSfcExResponseResult.message)); result = false; } else { LogRefreshEvent?.Invoke(LogType.MesLog, "模切数据上传MES成功"); //upLoadBusiness.SaveLogRecord(position, "模切数据上传MES成功"); LogHelper.Info("模切数据上传MES成功"); result = true; } }catch(Exception ex) { LogHelper.Info("模切重量特征数据上传异常:" + ex.Message); //upLoadBusiness.SaveLogRecord(position, "模切重量特征数据上传异常:" + ex.Message); } return result; } /// /// ccd单独上传*Y数据收集组 /// /// /// /// private bool UpMQMesData1(int position, machineIntegrationParametricData[] data, string splitSfc) { bool result = false; string logStr = this.Which(position); try { MachineIntegrationServiceParam machineIntegrationServiceParam = new MachineIntegrationServiceParam() { url = inifile.IniReadValue("MachineIntegrationServiceParam", "url"), site = inifile.IniReadValue("MachineIntegrationServiceParam", "site"), sfc = splitSfc, //将数据上传至拆分后的膜卷号 operation = appConfig.operation, operationRevision = inifile.IniReadValue("MachineIntegrationServiceParam", "operationRevision"), activityId = inifile.IniReadValue("MachineIntegrationServiceParam", "activityId"), resource = appConfig.resource, dcGroup = "*Y", dcGroupRevision = inifile.IniReadValue("MachineIntegrationServiceParam", "dcGroupRevision"), parametricArray = data, modeProcessSfc = WebService.MachineIntegrationServiceService.ModeProcessSfc.MODE_COMPLETE_SFC_POST_DC }; LogHelper.Info("ccd单独上传MES数据接口请求参数:" + JsonChange.ModeToJson(machineIntegrationServiceParam)); //upLoadBusiness.SaveLogRecord(position, "上传MES数据接口请求参数:" + JsonChange.ModeToJson(machineIntegrationServiceParam)); var dataCollectForSfcExResponse = MesWebServices.machineIntegration(machineIntegrationServiceParam); var dataCollectForSfcExResponseResult = dataCollectForSfcExResponse.@return; if (dataCollectForSfcExResponseResult.code > 0) { LogHelper.Info("ccd单独上传MES失败:" + dataCollectForSfcExResponseResult.message); //upLoadBusiness.SaveLogRecord(position, "模切数据上传MES失败:" + dataCollectForSfcExResponseResult.message); LogRefreshEvent?.Invoke(LogType.AlarmLog, "ccd单独上传MES失败:" + upLoadBusiness.GetMesMessage(dataCollectForSfcExResponseResult.code, dataCollectForSfcExResponseResult.message)); LogRefreshEvent?.Invoke(LogType.MesLog, "ccd单独上传MES失败:" + upLoadBusiness.GetMesMessage(dataCollectForSfcExResponseResult.code, dataCollectForSfcExResponseResult.message)); result = false; } else { LogRefreshEvent?.Invoke(LogType.MesLog, "ccd上传MES数据收集组*Y成功"); //upLoadBusiness.SaveLogRecord(position, "模切数据上传MES成功"); LogHelper.Info("ccd上传MES数据收集组*Y成功"); result = true; } } catch (Exception ex) { LogHelper.Info("ccd上传MES数据收集组*Y上传异常:" + ex.Message); //upLoadBusiness.SaveLogRecord(position, "模切重量特征数据上传异常:" + ex.Message); } return result; } /// /// 获取放卷、收卷运行方向 /// /// private async void GetDirections(int position,ProShaftInfo shaftInfo) { string logStr = this.Which(position); LogHelper.Info(String.Format("读取{0}轴运行方向", logStr)); //false(0)为顺时针,True(1)为逆时针 int directions = 0; if (position > 4) { directions = Convert.ToInt32(PlcBusiness.readBoolPlc(appConfig.mqAddress.放卷方向)); } else { if (position % 2 != 0) //上轴 { directions = Convert.ToInt32(PlcBusiness.readBoolPlc(appConfig.mqAddress.上轴方向)); } else //下轴 { directions = Convert.ToInt32(PlcBusiness.readBoolPlc(appConfig.mqAddress.下轴方向)); } } //绑定信息存储运行方向 shaftInfo.endFlag = directions; //使用endFlag存储运行方向 if (await shaftInfoServices.Update(shaftInfo)) { LogHelper.Info(String.Format("{0}运行方向更新成功:{1}", logStr, directions == 0 ? "顺时针" : "逆时针")); } else { LogHelper.Info(String.Format("{0}运行方向更新失败:{1}", logStr, directions == 0 ? "顺时针" : "逆时针")); } } /// /// 是否首件 /// /// private async Task IsFirstFlag() { bool result = false; try { DateTime dayShift = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 12:00:00")); DateTime nightShift = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")); LogHelper.Info(String.Format("判断当前物料是否为首件,白班时间{0},夜班时间{1}",dayShift,nightShift)); Expression> exp = s1 => true; if (DateTime.Now > dayShift && DateTime.Now < nightShift) { exp = exp.And(x => Convert.ToDateTime(x.RecordTime) > dayShift); }else if(DateTime.Now > nightShift && DateTime.Now < dayShift.AddDays(1)) { exp = exp.And(x => Convert.ToDateTime(x.RecordTime) > nightShift); } else { //次日凌晨直接返回 return false; } List downRecords = await downRecordServices.Query(exp); if (downRecords.Count < 2) { result = true; } else { result = false; } }catch(Exception ex) { LogHelper.Info("判断当前物料是否为首件异常:"+ex.Message); result = false; } return result; } /// /// 根据冷压面向、膜区收放卷放卷判断膜区面向 /// /// /// /// /// private string MaterialFaceStr(string lyMaterialFace,int upDirections,int downDirections) { string mqMaterialFace = ""; if (StringExtension.IsBlank(lyMaterialFace)) { return mqMaterialFace; } if(lyMaterialFace == "S面") { if(upDirections == downDirections) { mqMaterialFace = "S面"; } else { mqMaterialFace = "B面"; } }else if(lyMaterialFace == "B面") { if (upDirections == downDirections) { mqMaterialFace = "B面"; } else { mqMaterialFace = "S面"; } } return mqMaterialFace; } /// /// 获取冷压物料面向 /// /// private TBParametricValueResult GetLyMaterialCharacter(string sfc, GetParametricValueRequestData[] parameters) { TBDataServiceParam tbServiceParam = new TBDataServiceParam() { url = inifile.IniReadValue("TBParametricValueParam","url"), site = inifile.IniReadValue("TBParametricValueParam", "site"), sfc = sfc, memberlist = parameters }; var lyresult = MesWebServices.findTBData(tbServiceParam); return lyresult; } /// /// 获取最后一卷,绑定信息中的endFlag用于存储运行方向,使用ProDownRecord中的shaftNumber存储是否最后一卷 /// 放卷结束后进行判断 /// private async void IsEndFlag() { try { //通过PLC获取收卷轴,设置下轴为最后一卷 //判断当前收卷生产轴 List positions = new List(); if (appConfig.machineId == 3) { if (PlcBusiness.readPlc(appConfig.mqAddress.上左收卷状态) == 1) positions.Add(3); if (PlcBusiness.readPlc(appConfig.mqAddress.上右收卷状态) == 1) positions.Add(1); if (PlcBusiness.readPlc(appConfig.mqAddress.下左收卷状态) == 1) positions.Add(4); if (PlcBusiness.readPlc(appConfig.mqAddress.下右收卷状态) == 1) positions.Add(2); } else { if (PlcBusiness.readPlc(appConfig.mqAddress.上左收卷状态) == 1) positions.Add(1); if (PlcBusiness.readPlc(appConfig.mqAddress.上右收卷状态) == 1) positions.Add(3); if (PlcBusiness.readPlc(appConfig.mqAddress.下左收卷状态) == 1) positions.Add(2); if (PlcBusiness.readPlc(appConfig.mqAddress.下右收卷状态) == 1) positions.Add(4); } int position = positions.Max(); ProShaftInfo shaftInfo = await GetShaftInfoByPosition(position); Expression> downexp = x => true; downexp = downexp.And(x => x.PositionId == position && x.IsProduction == 0); if (shaftInfo!= null) { downexp = downexp.And(x => x.Rfid == shaftInfo.bindRfid); } Expression> orders = x => x.beginTime; ProDownRecord downRecord = await downRecordServices.QueryFirst(downexp, orders, false); LogHelper.Info("放卷结束,获取最后一卷收卷轴信息:" + JsonChange.ModeToJson(downRecord)); if (downRecord != null) { downRecord.shaftNumber = "X"; await downRecordServices.Update(downRecord); } }catch(Exception ex) { LogHelper.Info("放卷结束,标识最后一卷收卷轴异常:"+ex.Message); } } } }