private void BtnDel_Click(object sender, RoutedEventArgs e) { //删除 FmsAssetCommParam assetComm = gridItem.SelectedItem as FmsAssetCommParam; if (assetComm == null) { return; } if ( MessageBox.Show($"确定要删除 设备编号为【{assetComm.ASSET_CODE}】的通讯配置信息吗?", "删除", MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK) { return; } assetComm.USE_FLAG = (int)EmUseFlag.Deleted; //已删除 assetComm.UPDATED_BY = CBaseData.LoginName; assetComm.LAST_UPDATE_DATE = DateTime.Now; assetComm.UPDATED_INTROD += "删除 "; _fmsClient.UseService(s => s.UpdateFmsAssetCommParam(assetComm)); NotificationInvoke.NewNotification("删除提示", "设备通讯配置信息已删除!"); GetPage(); //重新刷新数据,根据需求是否进行刷新数据 }
public FmsAssetCommParam GetFmsAssetCommParamById(string Id) { using (IFmsAssetCommParamBLL FmsAssetCommParamBLL = BLLContainer.Resolve <IFmsAssetCommParamBLL>()) { FmsAssetCommParam model = FmsAssetCommParamBLL.GetFirstOrDefault(Id); return(model); } }
/// <summary> /// 获取主轴刀号信息 /// </summary> private void GetMainToolsInfo() { TmsDeviceToolsPos toolsPos = gridChangeTools.SelectedItem as TmsDeviceToolsPos; if (toolsPos == null) { return; } //获取主轴刀号 FmsAssetTagSetting tagSetting = wsFMS.UseService( s => s.GetFmsAssetTagSettings( $"USE_FLAG = 1 AND ASSET_CODE = '{toolsPos.DEVICE_PKNO}' AND TAG_NAME = '主轴刀号'")) .FirstOrDefault(); if (tagSetting == null) { tbMainToolsNO.Text = "【主轴刀号】的Tag地址未设置!"; return; } FmsAssetCommParam device = wsFMS.UseService(s => s.GetFmsAssetCommParams($"USE_FLAG = 1 AND ASSET_CODE = '{toolsPos.DEVICE_PKNO}'")) .FirstOrDefault(); if (device == null) { tbMainToolsNO.Text = "设备未设置通讯信息!"; return; } string commAddress = device.COMM_ADDRESS; DeviceCommInterface interfaceType = EnumHelper.ParserEnumByValue(device.INTERFACE_TYPE, DeviceCommInterface.CNC_Fanuc); int period = Convert.ToInt32(device.SAMPLING_PERIOD); //采样周期 DeviceManager deviceCommunication = new DeviceManager(device.PKNO, interfaceType, commAddress, period * 1000); List <DeviceTagParam> deviceTags = new List <DeviceTagParam>(); DeviceTagParam deviceTag = new DeviceTagParam(tagSetting.PKNO, tagSetting.TAG_CODE, tagSetting.TAG_NAME, tagSetting.TAG_ADDRESS, EnumHelper.ParserEnumByValue(tagSetting.VALUE_TYPE, TagDataType.Default), EnumHelper.ParserEnumByValue(tagSetting.SAMPLING_MODE, DataSimplingMode.AutoReadDevice), deviceCommunication); //通讯参数 deviceTags.Add(deviceTag); //添加 deviceCommunication.InitialDevice(deviceTags, null); string error = ""; string sResult = deviceCommunication.SyncReadData(tagSetting.TAG_ADDRESS, out error); if (error != "") { mainToolsNO = sResult; } tbMainToolsNO.Text = (error == "") ? "主轴刀号:T" + sResult : "读取主轴刀号错误,代码 " + error; }
private void GridControl_SelectedItemChanged(object sender, DevExpress.Xpf.Grid.SelectedItemChangedEventArgs e) { try { ListProgram.Items.Clear(); AmAssetMasterN amAssetMasterN = e.NewItem as AmAssetMasterN; amAssetMasterN_temp = amAssetMasterN; FmsAssetCommParam fmsAssetCommParams = new FmsAssetCommParam(); string stra = " ASSET_CODE = " + amAssetMasterN.ASSET_CODE + " AND INTERFACE_TYPE = 1"; fmsAssetCommParams = _FMSClient.UseService(s => s.GetFmsAssetCommParams(" ASSET_CODE = " + amAssetMasterN.ASSET_CODE + " AND INTERFACE_TYPE = 1")).FirstOrDefault(); if (fmsAssetCommParams != null) { IP = fmsAssetCommParams.COMM_ADDRESS; //this.lstbx_CNCProgramPath.Items.Clear(); string ip = IP; ushort Flibhndl = 0; short ret = Focas1.cnc_allclibhndl3(ip, 8193, 3, out Flibhndl); if (ret != Focas1.EW_OK) { Flibhndl = 0; return; } string drive = ""; Focas1.ODBPDFDRV odbpdfdrv = new Focas1.ODBPDFDRV(); ret = Focas1.cnc_rdpdf_drive(Flibhndl, odbpdfdrv); switch (odbpdfdrv.max_num) { case 1: drive = "//" + odbpdfdrv.drive1 + "/";// break; } //this.lbCNCPath.Text = drive;//"//CNC_MEM/" GetProgramDir(drive); foreach (var item in array_Folder) { ListProgram.Items.Add(item.ToString()); //this.lstbx_CNCProgramPath.Items.Add(item.ToString()); } foreach (var item in array_File) { ListProgram.Items.Add(item.ToString()); //this.lstbx_CNCProgramPath.Items.Add(item.ToString()); } } } catch (Exception) { } }
public bool AddFmsAssetCommParam(FmsAssetCommParam mFmsAssetCommParam) { if (mFmsAssetCommParam == null) { return(false); } using (IFmsAssetCommParamBLL FmsAssetCommParamBLL = BLLContainer.Resolve <IFmsAssetCommParamBLL>()) { return(FmsAssetCommParamBLL.Add(mFmsAssetCommParam)); } }
public bool DelFmsAssetCommParam(string Id) { using (IFmsAssetCommParamBLL FmsAssetCommParamBLL = BLLContainer.Resolve <IFmsAssetCommParamBLL>()) { try { FmsAssetCommParam item = FmsAssetCommParamBLL.GetFirstOrDefault(Id); return(FmsAssetCommParamBLL.Delete(item)); } catch { return(false); } } }
private void cmbAssetInfo_SelectionChanged(object sender, SelectionChangedEventArgs e) { AmAssetMasterN asset = cmbAssetInfo.SelectedItem as AmAssetMasterN; if (asset == null) { return; } FmsAssetCommParam comm = _fmsClient .UseService(s => s.GetFmsAssetCommParams($"ASSET_CODE = '{asset.ASSET_CODE}' AND USE_FLAG = 1")) .FirstOrDefault(); tbAddressIntrod.DataContext = comm; }
public bool DelFmsAssetCommParams(string[] Ids) { using (IFmsAssetCommParamBLL FmsAssetCommParamBLL = BLLContainer.Resolve <IFmsAssetCommParamBLL>()) { try { List <FmsAssetCommParam> entitys = new List <FmsAssetCommParam>(); foreach (string id in Ids) { FmsAssetCommParam item = FmsAssetCommParamBLL.GetFirstOrDefault(id); entitys.Add(item); } return(FmsAssetCommParamBLL.Delete(entitys)); } catch { return(false); } } }
private void BtnSave_Click(object sender, RoutedEventArgs e) { //保存 AmAssetMasterN asset = cmbAssetInfo.SelectedItem as AmAssetMasterN; FmsAssetCommParam assetComm = gbItem.DataContext as FmsAssetCommParam; if (assetComm == null) { return; } #region //TODO: 校验;保存 if (asset == null) { MessageBox.Show("请选择设备!", "保存", MessageBoxButton.OK, MessageBoxImage.Exclamation); return; } if (assetComm.PKNO == "") { assetComm.PKNO = CBaseData.NewGuid(); assetComm.CREATED_BY = CBaseData.LoginName; assetComm.CREATION_DATE = DateTime.Now; assetComm.LAST_UPDATE_DATE = DateTime.Now; //最后修改日期 _fmsClient.UseService(s => s.AddFmsAssetCommParam(assetComm)); } else { assetComm.UPDATED_BY = CBaseData.LoginName; assetComm.LAST_UPDATE_DATE = DateTime.Now; _fmsClient.UseService(s => s.UpdateFmsAssetCommParam(assetComm)); } NotificationInvoke.NewNotification("保存", "设备通讯配置信息已保存。"); #endregion GetPage(); //重新刷新数据,根据需求是否进行刷新数据 //保存成功 gbItem.IsCollapsed = true; gbItem.Visibility = Visibility.Collapsed; BindHelper.SetDictDataBindingGridItem(gbItem, gridItem); }
private void bToolsChange_Click(object sender, System.Windows.RoutedEventArgs e) { //换刀 向CNC发送换刀动作 TmsDeviceToolsPos toolsPos = gridChangeTools.SelectedItem as TmsDeviceToolsPos; if (toolsPos == null) { return; } //获取主轴刀号 FmsAssetTagSetting tagSetting = wsFMS.UseService( s => s.GetFmsAssetTagSettings( $"USE_FLAG = 1 AND ASSET_CODE = '{toolsPos.DEVICE_PKNO}' AND TAG_NAME = '机床换刀'")) .FirstOrDefault(); if (tagSetting == null) { tbMainToolsNO.Text = "【机床换刀】的Tag地址未设置!"; return; } FmsAssetCommParam device = wsFMS.UseService(s => s.GetFmsAssetCommParams($"USE_FLAG = 1 AND ASSET_CODE = '{toolsPos.DEVICE_PKNO}'")) .FirstOrDefault(); if (device == null) { tbMainToolsNO.Text = "设备未设置通讯信息!"; return; } string commAddress = device.COMM_ADDRESS; int interfaceType = device.INTERFACE_TYPE; int period = Convert.ToInt32(device.SAMPLING_PERIOD); //采样周期 OperateResult ret = DeviceHelper.WriteDataByAddress(device.ASSET_CODE, interfaceType, commAddress, tagSetting.PKNO, tagSetting.TAG_ADDRESS, toolsPos.TOOLS_POS_NO); tbMainToolsNO.Text = (ret.IsSuccess) ? "机床换刀准备 " + toolsPos.TOOLS_POS_NO : "发送换刀指令错误,代码 " + ret.Message; if (ret.IsSuccess) { mainToolsNO = ""; //开始换刀 } }
private void BtnRefreshCnc(object sender, RoutedEventArgs e) { ListProgram.Items.Clear(); AmAssetMasterN amAssetMasterN = amAssetMasterN_temp as AmAssetMasterN; FmsAssetCommParam fmsAssetCommParams = new FmsAssetCommParam(); fmsAssetCommParams = _FMSClient.UseService(s => s.GetFmsAssetCommParams(" ASSET_CODE = " + amAssetMasterN.ASSET_CODE + "")).FirstOrDefault(); if (fmsAssetCommParams != null) { IP = fmsAssetCommParams.COMM_ADDRESS; //this.lstbx_CNCProgramPath.Items.Clear(); string ip = IP; ushort Flibhndl = 0; short ret = Focas1.cnc_allclibhndl3(ip, 8193, 3, out Flibhndl); if (ret != Focas1.EW_OK) { Flibhndl = 0; return; } string drive = ""; Focas1.ODBPDFDRV odbpdfdrv = new Focas1.ODBPDFDRV(); ret = Focas1.cnc_rdpdf_drive(Flibhndl, odbpdfdrv); switch (odbpdfdrv.max_num) { case 1: drive = "//" + odbpdfdrv.drive1 + "/";// break; } //this.lbCNCPath.Text = drive;//"//CNC_MEM/" GetProgramDir(drive); foreach (var item in array_Folder) { ListProgram.Items.Add(item.ToString()); //this.lstbx_CNCProgramPath.Items.Add(item.ToString()); } foreach (var item in array_File) { ListProgram.Items.Add(item.ToString()); //this.lstbx_CNCProgramPath.Items.Add(item.ToString()); } } }
private void BtnAdd_Click(object sender, RoutedEventArgs e) { //新增 #region //TODO: 校验,空的类绑定到界面的DataContent FmsAssetCommParam assetComm = new FmsAssetCommParam { PKNO = "", ASSET_CODE = "", USE_FLAG = 1 }; gbItem.DataContext = assetComm; #endregion dictBasic.Header = $"{HeaderName} 【新增】"; gbItem.IsCollapsed = false; gbItem.Visibility = Visibility.Visible; }
/// <summary> /// 向设备写入标签值 /// </summary> /// <param name="tagPKNO"></param> /// <param name="value"></param> /// <param name="error">输出错误信息</param> /// <returns>0:成功;1:标签PKNO为空;2:标签不存在;3:通讯设备不存在;10:写入设备失败</returns> public static int WriteTagToDevice(string tagPKNO, string value, out string error) { int ret = 0; error = ""; if (string.IsNullOrEmpty(tagPKNO)) { error = "标签PKNO为空"; return(1); } FmsAssetTagSetting tagSetting = GetTagSettingById(tagPKNO); if (tagSetting == null) { error = "标签不存在"; return(2); } FmsAssetCommParam deviceCommParam = _devices.FirstOrDefault(c => c.ASSET_CODE == tagSetting.ASSET_CODE); if (deviceCommParam == null) { error = "通讯设备不存在"; return(3); } OperateResult result = DeviceHelper.WriteDataByAddress(deviceCommParam.ASSET_CODE, deviceCommParam.INTERFACE_TYPE, deviceCommParam.COMM_ADDRESS, tagSetting.PKNO, tagSetting.TAG_ADDRESS, value); //写入设备 if (!result.IsSuccess) { error = "向设备写入失败,错误:" + result.Message; return(10); } //更新当前值 SetTagSettingValue(tagSetting, value); return(ret); }
private void Timer_Elapsed(object sender, ElapsedEventArgs e) { this.timer.Enabled = false; WcfClient <IFMSService> ws = new WcfClient <IFMSService>(); //try //{ lock (objLock) { FmsAssetCommParam comm = ws.UseService(s => s.GetFmsAssetCommParams("")).FirstOrDefault(); comm.LAST_UPDATE_DATE = DateTime.Now; ws.UseService(s => s.UpdateFmsAssetCommParam(comm)); } //} //catch (Exception ex) //{ // Console.WriteLine(ex.Message); //} Console.WriteLine($"Thread Write{iWriteTest++}"); this.timer.Enabled = true; }
/// <summary> /// 读取设备线程 /// </summary> /// <param name="device">设备</param> private void TheadGetDeviceData(FmsAssetCommParam device) { if ((!bMonitor) || (device == null)) { return; //未开启监控 } int readSpan = 0; //设定采样周期的变量 #region 获取基础参数 int period = Convert.ToInt32(device.SAMPLING_PERIOD); //采样周期 if (period <= 0) { return; //采样周期<=0时不采样 } string deviceCode = device.ASSET_CODE; DeviceCommInterface interfaceType = EnumHelper.ParserEnumByValue(device.INTERFACE_TYPE, DeviceCommInterface.CNC_Fanuc); string commAddress = device.COMM_ADDRESS; List <FmsAssetTagSetting> tagSettings = _tagSettings.Where(c => c.ASSET_CODE == deviceCode).ToList(); // if (tagSettings.Count <= 0) { return; } #endregion DeviceManager deviceCommunication = new DeviceManager(device.ASSET_CODE, interfaceType, commAddress, period * 1000, "", ""); List <DeviceTagParam> deviceTags = new List <DeviceTagParam>(); foreach (var tagSetting in tagSettings) { DeviceTagParam deviceTag = new DeviceTagParam(tagSetting.PKNO, tagSetting.TAG_CODE, tagSetting.TAG_NAME, tagSetting.TAG_ADDRESS, EnumHelper.ParserEnumByValue(tagSetting.VALUE_TYPE, TagDataType.Default), EnumHelper.ParserEnumByValue(tagSetting.SAMPLING_MODE, DataSimplingMode.ReadAndWrite), deviceCommunication); //通讯参数 deviceTags.Add(deviceTag); //添加 } deviceCommunication.InitialDevice(deviceTags, SaveData); while (!CBaseData.AppClosing) { #region 暂停 if (bPause) { System.Threading.Thread.Sleep(200); continue; } #endregion try { readSpan++; if ((period > 0) && (readSpan % (period * 10) == 0)) //读取数据 { #region 定期刷新数据 - 目前针对OPC订阅方式 if (deviceCommunication.DeviceCore is OpcClassicManager) //如果是OPC读取方式 { var ret = ((OpcClassicManager)deviceCommunication.DeviceCore).RefreshData(); if (!ret.IsSuccess) //错误时 { EventLogger.Log("数据刷新失败,错误为:" + ret.Message); continue; } } #endregion #region 正常读取 List <FmsAssetTagSetting> readTags = tagSettings.Where(c => c.SAMPLING_MODE == 0 || c.SAMPLING_MODE == 10).ToList(); //这些需要读取的。 foreach (FmsAssetTagSetting curSetting in readTags) { try { if (curSetting.SAMPLING_MODE == 11) { continue; //暂时不读 } Thread.Sleep(50); //防止读取过快 OperateResult read = deviceCommunication.AsyncReadData(curSetting.TAG_ADDRESS); //异步读取数据 if (!read.IsSuccess) //错误时 { curSetting.CUR_VALUE = ""; EventLogger.Log($"读取[{curSetting.TAG_ADDRESS}]失败,错误为:" + read.Message); continue; } //读取成功,读取数据有结果时,一般为同步读取数据时 OperateResult <string> result = read as OperateResult <string>; if (result != null) { SaveData(curSetting.PKNO, result.Content); } } catch (Exception ex) { EventLogger.Log($"读取设备[{device.ASSET_CODE}]的值错误,错误为:", ex); } } #endregion readSpan = 0; } } catch (Exception ex) { Console.WriteLine("读取失败, 错误为:" + ex.Message); } System.Threading.Thread.Sleep(100); } }
/// <summary> /// 读取DA数据 /// </summary> /// <param name="device"></param> private void ThreadGetDaMonitor(FmsAssetCommParam device) { if ((!bMonitor) || (device == null)) { return; //未开启监控 } int readSpan = 0; //设定采样周期的变量 #region 获取基础参数 string deviceCode = device.ASSET_CODE; DeviceCommInterface interfaceType = EnumHelper.ParserEnumByValue(device.INTERFACE_TYPE, DeviceCommInterface.CNC_Fanuc); string commAddress = device.COMM_ADDRESS; int period = Convert.ToInt32(device.SAMPLING_PERIOD); //采样周期 List <FmsAssetTagSetting> tagSettings = _tagSettings.Where(c => c.ASSET_CODE == deviceCode && c.SAMPLING_MODE == 3).ToList(); //DA采集模式 if (tagSettings.Count <= 0) { return; } #endregion DeviceManager deviceCommunication = new DeviceManager(CBaseData.NewGuid(), interfaceType, commAddress, period * 1000); List <DeviceTagParam> deviceTags = new List <DeviceTagParam>(); foreach (var tagSetting in tagSettings) { DeviceTagParam deviceTag = new DeviceTagParam(tagSetting.PKNO, tagSetting.TAG_CODE, tagSetting.TAG_NAME, tagSetting.TAG_ADDRESS, EnumHelper.ParserEnumByValue(tagSetting.VALUE_TYPE, TagDataType.Default), EnumHelper.ParserEnumByValue(tagSetting.SAMPLING_MODE, DataSimplingMode.ReadAndWrite), deviceCommunication); //通讯参数 deviceTags.Add(deviceTag); //添加 } deviceCommunication.InitialDevice(deviceTags, SaveData); while (!CBaseData.AppClosing) { #region 暂停 if (bPause) { System.Threading.Thread.Sleep(200); continue; } #endregion try { readSpan++; if ((period > 0) && (readSpan % (period * 10) == 0)) //读取数据 { string error = ""; lock (locakDA) { List <FmsAssetTagSetting> daTags = tagSettings.Where(c => c.SAMPLING_MODE == 3).ToList(); //这些为Focas的 if (daTags.Any()) { #region 采集实时信息 DAMachineRealTimeInfo realTimeInfo = ws_DA.UseService( s => s.GetDAMachineRealTimeInfos("ASSET_CODE = " + device.ASSET_CODE + "")) .FirstOrDefault(); if (realTimeInfo != null) { //实况信息采集和录入 realTimeInfo.STATUS = int.Parse(deviceCommunication.SyncReadData("状态", out error)); realTimeInfo.MAIN_PROG = deviceCommunication.SyncReadData("程序号", out error); realTimeInfo.SPINDLE_OVERRIDE = deviceCommunication.SyncReadData("主轴负载", out error); realTimeInfo.SPINDLE_SPPED = deviceCommunication.SyncReadData("主轴转速", out error); realTimeInfo.FEED_SPEED = deviceCommunication.SyncReadData("进给速度", out error); realTimeInfo.FEED_RATE = deviceCommunication.SyncReadData("进给倍率", out error); realTimeInfo.DA_TIME = DateTime.Now; ws_DA.UseService(s => s.UpdateDAMachineRealTimeInfo(realTimeInfo)); //实时更新 } #endregion #region 采集产量信息 //设备产量记录采集 DAProductRecord productRecord = ws_DA.UseService(s => s.GetDAProductRecords($"ASSET_CODE = '{device.ASSET_CODE}'")) .OrderByDescending(c => c.END_TIME) .FirstOrDefault(); //获取生产记录 if (productRecord != null) { int part_num = 0; int.TryParse(deviceCommunication.SyncReadData("工件数", out error), out part_num); int total_num = 0; int.TryParse(deviceCommunication.SyncReadData("工件总数", out error), out total_num); if (part_num == productRecord.PART_NUM) { if (productRecord.END_TIME <= DateTime.Now.AddMinutes(-5)) //每5分钟,更新数据库 { productRecord.END_TIME = DateTime.Now; ws_DA.UseService(s => s.UpdateDAProductRecord(productRecord)); } } else //不一致 { productRecord.END_TIME = DateTime.Now; ws_DA.UseService(s => s.UpdateDAProductRecord(productRecord)); //插入新的纪录 DAProductRecord newProductRecord = new DAProductRecord(); newProductRecord.ASSET_CODE = deviceCode; newProductRecord.PKNO = Guid.NewGuid().ToString("N"); newProductRecord.START_TIME = DateTime.Now; newProductRecord.END_TIME = DateTime.Now.AddMilliseconds(100); newProductRecord.PART_NUM = part_num; newProductRecord.TOTAL_PART_NUM = total_num; ws_DA.UseService(s => s.AddDAProductRecord(newProductRecord)); //新增当前值到数据库 } } #endregion #region 采集报警信息 string a = deviceCommunication.SyncReadData("报警信息", out error); #endregion } } } readSpan = 0; } catch (Exception ex) { Console.WriteLine("ThreadGetDAMonitor, 错误为:" + ex.Message); } System.Threading.Thread.Sleep(100); } }
/// <summary> /// 读取设备线程 /// </summary> private void TheadCheckData() { while (!CBaseData.AppClosing) { Thread.Sleep(200); //暂停 try { for (int i = 1; i <= 5; i++) { string basicAddress = "[fuzhou]MES.JG.SB_" + i.ToString(); //基本地址 string qingqiuAddress = ".Qing_qiu"; //请求 string gongyiIDAddress = ".Gongyi_ID"; //工艺ID string chanpinIDAddress = ".chanpin_ID"; //产品ID string querenAddress = ".que_ren"; //确认地址 querenAddress.Substring(0, 1); FmsAssetTagSetting tag_qingqiu = DeviceMonitor.GetTagSettings($"TAG_ADDRESS = '{basicAddress}{qingqiuAddress}'") .FirstOrDefault(); if ((tag_qingqiu == null) || (tag_qingqiu.CUR_VALUE != "1")) { continue; } #region 触发请求 FmsAssetTagSetting tag_gongyi = DeviceMonitor.GetTagSettings($"TAG_ADDRESS = '{basicAddress}{gongyiIDAddress}'") .FirstOrDefault(); //工艺ID if (tag_gongyi == null) { continue; } FmsAssetTagSetting tag_chanpin = DeviceMonitor.GetTagSettings($"TAG_ADDRESS = '{basicAddress}{chanpinIDAddress}'") .FirstOrDefault(); //产品ID if (tag_chanpin == null) { continue; } FmsAssetTagSetting tag_queren = DeviceMonitor.GetTagSettings($"TAG_ADDRESS = '{basicAddress}{querenAddress}'") .FirstOrDefault(); //确认 if (tag_queren == null) { continue; } EmCheckResult checkResult = EmCheckResult.NoCheck; //无校验 #region 1.校验程序号 AmAssetMasterN checkDevice = wsEAM.UseService(s => s.GetAmAssetMasterNs($"USE_FLAG = 1 AND ASSET_TYPE = '机床' AND ASSET_LABEL = '{i.ToString()}'")) .FirstOrDefault(); if (checkDevice == null) { Console.WriteLine("...error:没有相应的机床设备."); continue; } FmsAssetTagSetting tag_focas = DeviceMonitor.GetTagSettings( $"ASSET_CODE = '{checkDevice.ASSET_CODE}' AND TAG_ADDRESS = '程序号'") .FirstOrDefault(); //获取程序号 if ((tag_focas != null) && (tag_focas.CUR_VALUE == tag_gongyi.CUR_VALUE)) //程序号相同 { checkResult = EmCheckResult.Success; } else { checkResult = EmCheckResult.ProgramError; } #endregion #region 2.校验产品 MesJobOrder curJob = wsPlm.UseService(s => s.GetMesJobOrders($"RUN_STATE = 3 AND LINE_PKNO = '{CBaseData.CurLinePKNO}'")).FirstOrDefault(); //开工确认完成的 if (curJob != null) { RsItemMaster itemMaster = wsRSM.UseService(s => s.GetRsItemMasterById(curJob.ITEM_PKNO)); if ((itemMaster != null) && (itemMaster.ITEM_ABV == tag_chanpin.CUR_VALUE)) { if (checkResult == EmCheckResult.Success) //程序校验成功 { checkResult = EmCheckResult.Success; } } else { checkResult = EmCheckResult.ProductError; } } else { checkResult = EmCheckResult.ProductError; } #endregion #region 向PLC反馈 FmsAssetCommParam deviceComm = ws.UseService( s => s.GetFmsAssetCommParams( $"ASSET_CODE = '{tag_qingqiu.ASSET_CODE}' AND USE_FLAG = 1")).FirstOrDefault(); //反馈设备 string error = ""; OperateResult ret = DeviceHelper.WriteDataByAddress(deviceComm.ASSET_CODE, deviceComm.INTERFACE_TYPE, deviceComm.COMM_ADDRESS, tag_queren.PKNO, tag_queren.TAG_ADDRESS, ((int)checkResult).ToString()); //反馈 #endregion if (!ret.IsSuccess) { Console.WriteLine("...error:向设备" + tag_queren.ASSET_CODE + "反馈确认结果失败。"); } #endregion } } catch (Exception ex) { Console.WriteLine("...error:生产过程校验错误,错误为:" + ex.Message); } } }