Exemple #1
0
        //写并置位
        private void btnSetAndReset_Click(object sender, RoutedEventArgs e)
        {
            FmsAssetTagSetting tag = cmbTags.SelectedItem as FmsAssetTagSetting;

            if (tag == null)
            {
                return;
            }

            string error     = "";
            string sTagValue = tbTagResult.Text;

            DeviceMonitor.WriteTagToDevice(tag.PKNO, sTagValue, out error);  //写入执行的值
            if (!error.IsEmpty())
            {
                DeviceMonitor.WriteTagToDevice(tag.PKNO, sTagValue, out error);  //写入执行的值
                if (!error.IsEmpty())
                {
                    tbTagResult.Text = error;
                }
            }
            else
            {
                Thread.Sleep(200);
                DeviceMonitor.WriteTagToDevice(tag.PKNO, "0", out error);  //写入执行的值 置0
                if (!error.IsEmpty())
                {
                    DeviceMonitor.WriteTagToDevice(tag.PKNO, "0", out error);  //写入执行的值 置0
                    if (!error.IsEmpty())
                    {
                        tbTagResult.Text = error;
                    }
                }
            }
        }
Exemple #2
0
        private void BtnDel_Click(object sender, RoutedEventArgs e)
        {
            //删除
            FmsAssetTagSetting assetTag = gridItem.SelectedItem as FmsAssetTagSetting;

            if (assetTag == null)
            {
                return;
            }

            if (
                MessageBox.Show($"确定要删除 标签名称【{assetTag.TAG_NAME}】的通讯标签配置信息吗?", "删除", MessageBoxButton.OKCancel,
                                MessageBoxImage.Question) != MessageBoxResult.OK)
            {
                return;
            }
            assetTag.USE_FLAG         = (int)EmUseFlag.Deleted; //已删除
            assetTag.UPDATED_BY       = CBaseData.LoginName;
            assetTag.LAST_UPDATE_DATE = DateTime.Now;
            assetTag.UPDATED_INTROD  += "删除 ";
            _fmsClient.UseService(s => s.UpdateFmsAssetTagSetting(assetTag));

            NotificationInvoke.NewNotification("删除提示", "设备通讯标签配置已删除!");

            GetPage();  //重新刷新数据,根据需求是否进行刷新数据
        }
Exemple #3
0
        private void BtnAdd_Click(object sender, RoutedEventArgs e)
        {
            //新增
            #region

            //TODO: 校验,空的类绑定到界面的DataContent

            FmsAssetTagSetting assetTag = new FmsAssetTagSetting
            {
                PKNO            = "",
                ASSET_CODE      = "",
                STATE_MARK_TYPE = 0,
                SAMPLING_MODE   = 0,
                RECORD_TYPE     = 0, //默认不记录
                USE_FLAG        = 1
            };

            gbItem.DataContext = assetTag;

            #endregion

            dictBasic.Header   = $"{HeaderName}  【新增】";
            gbItem.IsCollapsed = false;
            gbItem.Visibility  = Visibility.Visible;
        }
Exemple #4
0
 /// <summary>
 /// 记录标签值
 /// </summary>
 /// <param name="tagSetting">标签配置信息</param>
 /// <param name="tagValue">标签值</param>
 private void TagValueRecord(FmsAssetTagSetting tagSetting, string tagValue)
 {
     lock (lockRecord)
     {
         try
         {
             EventLogger.Log($"======开始写入【{tagSetting.TAG_VALUE_NAME}】Record=====");
             FmsSamplingRecord record = new FmsSamplingRecord
             {
                 PKNO             = CBaseData.NewGuid(),
                 ASSET_CODE       = tagSetting.ASSET_CODE,
                 TAG_SETTING_PKNO = tagSetting.PKNO,
                 TAG_VALUE_NAME   = tagSetting.TAG_VALUE_NAME,
                 TAG_VALUE        = tagValue,
                 SAMPLING_TIME    = DateTime.Now,
                 CREATION_DATE    = DateTime.Now,
                 CREATED_BY       = CBaseData.LoginName,
                 REMARK           = "",
             };
             ws.UseService(s => s.AddFmsSamplingRecord(record));
             EventLogger.Log($"======完成写入【{tagSetting.TAG_VALUE_NAME}】Record=====");
         }
         catch (Exception ex)
         {
             EventLogger.Log($"!!!!!!写入【{tagSetting.TAG_VALUE_NAME}】Record失败,原因:{ex.Message}!!!!!!");
         }
     }
 }
Exemple #5
0
        //UI6下降沿
        private void BtnPauseStart_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                FmsAssetTagSetting tag = DeviceMonitor.GetTagSettings("TAG_CODE = 'UI6'").FirstOrDefault();

                if (tag == null)
                {
                    return;
                }

                Cursor = Cursors.Wait;
                int    ret    = 0;
                string error  = "";
                int    iWrite = 0;
                while (iWrite < ReWriteCount)
                {
                    ret = DeviceMonitor.WriteTagToDevice(tag.PKNO, "1", out error);
                    if (ret == 0)
                    {
                        break;
                    }

                    iWrite++;
                    Thread.Sleep(100);
                }

                if (ret != 0)
                {
                    Cursor = Cursors.Arrow;
                    return;
                }

                Thread.Sleep(500);

                iWrite = 0;
                while (iWrite < ReWriteCount)
                {
                    ret = DeviceMonitor.WriteTagToDevice(tag.PKNO, "0", out error);
                    if (ret == 0)
                    {
                        break;
                    }

                    iWrite++;
                    Thread.Sleep(100);
                }

                Cursor = Cursors.Arrow;
                if (ret == 0)
                {
                    WPFMessageBox.ShowInfo("机器人的暂停后启动信息已经成功给出!", "启动机器人");
                }
            }
            catch (Exception ex)
            {
                Cursor = Cursors.Arrow;
            }
        }
Exemple #6
0
 public FmsAssetTagSetting GetFmsAssetTagSettingById(string Id)
 {
     using (IFmsAssetTagSettingBLL FmsAssetTagSettingBLL = BLLContainer.Resolve <IFmsAssetTagSettingBLL>())
     {
         FmsAssetTagSetting model = FmsAssetTagSettingBLL.GetFirstOrDefault(Id);
         return(model);
     }
 }
Exemple #7
0
        /// <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;
        }
Exemple #8
0
 public bool AddFmsAssetTagSetting(FmsAssetTagSetting mFmsAssetTagSetting)
 {
     if (mFmsAssetTagSetting == null)
     {
         return(false);
     }
     using (IFmsAssetTagSettingBLL FmsAssetTagSettingBLL = BLLContainer.Resolve <IFmsAssetTagSettingBLL>())
     {
         return(FmsAssetTagSettingBLL.Add(mFmsAssetTagSetting));
     }
 }
Exemple #9
0
 public bool DelFmsAssetTagSetting(string Id)
 {
     using (IFmsAssetTagSettingBLL FmsAssetTagSettingBLL = BLLContainer.Resolve <IFmsAssetTagSettingBLL>())
     {
         try
         {
             FmsAssetTagSetting item = FmsAssetTagSettingBLL.GetFirstOrDefault(Id);
             return(FmsAssetTagSettingBLL.Delete(item));
         }
         catch { return(false); }
     }
 }
Exemple #10
0
        private bool CopyTag()
        {
            jobTaskModel.Tags     = DeviceMonitor.GetTagSettings("");
            jobTaskModel.CopyTags = new List <FmsAssetTagSetting>();

            foreach (var tag in jobTaskModel.Tags)
            {
                FmsAssetTagSetting copyTag = new FmsAssetTagSetting();
                copyTag.CopyDataItem(tag);
                jobTaskModel.CopyTags.Add(copyTag);
            }
            return(true);
        }
Exemple #11
0
 private void SaveData(string pkno, string sReadResult)
 {
     try
     {
         FmsAssetTagSetting deviceTagSetting = _tagSettings.FirstOrDefault(c => c.PKNO == pkno);
         if (deviceTagSetting == null)
         {
             return;
         }
         SaveData(deviceTagSetting, sReadResult);
     }
     catch (Exception)
     {
     }
 }
Exemple #12
0
        private void SaveData(FmsAssetTagSetting deviceTagSetting, string sReadResult)
        {
            if (deviceTagSetting == null)
            {
                return;
            }
            lock (lockSave)
            {
                try
                {
                    #region  条件保存记录到数据库

                    if (deviceTagSetting.RECORD_TYPE == 10)                                                //持续结果的记录
                    {
                        new Thread(c => { TagValueResultRecord(deviceTagSetting, sReadResult); }).Start(); //持续结果记录
                    }
                    else if ((deviceTagSetting.RECORD_TYPE == 2) ||
                             ((deviceTagSetting.RECORD_TYPE == 1) && (deviceTagSetting.CUR_VALUE != sReadResult))
                             )                                                                       //一个周期记录一次或者有改变则记录
                    {
                        new Thread(c => { TagValueRecord(deviceTagSetting, sReadResult); }).Start(); //一个周期记录一次或者有改变则记录
                    }

                    #endregion

                    #region 将当前值反馈到改变中,便于更新数据库

                    if (deviceTagSetting.CUR_VALUE != sReadResult) //新的值 != 原值
                    {
                        if (CurValueChanged.ContainsKey(deviceTagSetting.PKNO))
                        {
                            CurValueChanged[deviceTagSetting.PKNO] = true; //当前值已经更新了
                        }
                        else
                        {
                            CurValueChanged.Add(deviceTagSetting.PKNO, true);
                        }

                        deviceTagSetting.CUR_VALUE = sReadResult; //更新当前值
                    }

                    #endregion
                }
                catch (Exception)
                {
                }
            }
        }
Exemple #13
0
        private void btnTestCopy_Click(object sender, RoutedEventArgs e)
        {
            copyTags.Clear();
            #region  制当前Tag值,保证数据一致性,作为判断条件用

            List <FmsAssetTagSetting> tags = DeviceMonitor.GetTagSettings("");

            foreach (var tag in tags)
            {
                FmsAssetTagSetting copyTag = new FmsAssetTagSetting();
                copyTag.CopyDataItem(tag);
                copyTags.Add(copyTag);
            }

            #endregion
        }
Exemple #14
0
        public bool ProductProgress()
        {
            productProcess = jobTaskMode.ProductProcesses.FirstOrDefault(c => c.PKNO == curProcess.CUR_PRODUCT_CODE_PKNO);  //产品生产情况;

            #region 当前工序的开始条件

            startTag = jobTaskMode.CopyTags.FirstOrDefault(c => c.PKNO == curAction.START_CONDITION_TAG_PKNO);

            startCondition = "";
            if (startTag != null)
            {
                startCondition = startTag.PKNO + ".VALUE = " + curAction.START_CONDITION_VALUE;
            }
            #endregion

            return(true);
        }
Exemple #15
0
 public bool DelFmsAssetTagSettings(string[] Ids)
 {
     using (IFmsAssetTagSettingBLL FmsAssetTagSettingBLL = BLLContainer.Resolve <IFmsAssetTagSettingBLL>())
     {
         try
         {
             List <FmsAssetTagSetting> entitys = new List <FmsAssetTagSetting>();
             foreach (string id in Ids)
             {
                 FmsAssetTagSetting item = FmsAssetTagSettingBLL.GetFirstOrDefault(id);
                 entitys.Add(item);
             }
             return(FmsAssetTagSettingBLL.Delete(entitys));
         }
         catch { return(false); }
     }
 }
Exemple #16
0
        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 = "";                 //开始换刀
            }
        }
Exemple #17
0
        public string GetTagPkno(string tagpkno)
        {
            if (tagpkno == "")
            {
                return(tagpkno);
            }
            FmsAssetTagSetting tageTagSetting = ws.UseService(s => s.GetFmsAssetTagSettingById(tagpkno));

            if (tageTagSetting.ASSET_CODE == "SH00001")
            {
                FmsAssetTagSetting tageTagSettinglike = ws.UseService(s => s.GetFmsAssetTagSettings("TAG_ADDRESS = " + tageTagSetting.TAG_ADDRESS + " AND ASSET_CODE = 'SH00003'")).FirstOrDefault();
                if (tageTagSettinglike != null)
                {
                    return(tageTagSettinglike.PKNO);
                }
            }

            return(tagpkno);
        }
Exemple #18
0
        /// <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);
        }
Exemple #19
0
        /// <summary>
        /// 设置Tag点的值,结果OK
        /// </summary>
        /// <param name="tagSetting">Tag点</param>
        /// <param name="newValue">新的值</param>
        /// <returns>OK;错误代码</returns>
        public static string SetTagSettingValue(FmsAssetTagSetting tagSetting, string newValue)
        {
            string error = "OK";

            if (tagSetting == null)
            {
                return("标签参数为空");
            }

            try
            {
                if (bMonitor)                             //已经开启监控
                {
                    if (tagSetting.CUR_VALUE != newValue) //新的值 != 原值
                    {
                        if (CurValueChanged.ContainsKey(tagSetting.PKNO))
                        {
                            CurValueChanged[tagSetting.PKNO] = true;  //当前值已经更新了
                        }
                        else
                        {
                            CurValueChanged.Add(tagSetting.PKNO, true);
                        }
                        tagSetting.CUR_VALUE = newValue; //更新当前值
                    }
                }
                else  //没有开启监控
                {
                    tagSetting.CUR_VALUE = newValue;
                    WcfClient <IFMSService> wsThis = new WcfClient <IFMSService>();
                    wsThis.UseService(s => s.UpdateFmsAssetTagSetting(tagSetting));
                }
            }
            catch (Exception e)
            {
                error = "手动更新Tag点的值失败,具体 " + e.Message;
                Console.WriteLine(error);
            }

            return(error);
        }
Exemple #20
0
        private void ReadThread(object obj)
        {
            FmsAssetTagSetting tag = obj as FmsAssetTagSetting;

            if (tag == null)
            {
                return;
            }
            string error = "";

            string value = DeviceMonitor.ReadTagFormDevice(tag.PKNO, out error);

            if (!error.IsEmpty())
            {
                value = error;
            }

            Dispatcher.BeginInvoke((Action)(delegate()
            {
                tbTagResult.Text = value;
            }));
        }
Exemple #21
0
        //写
        private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            FmsAssetTagSetting tag = cmbTags.SelectedItem as FmsAssetTagSetting;

            if (tag == null)
            {
                return;
            }

            string error     = "";
            string sTagValue = tbTagResult.Text;

            DeviceMonitor.WriteTagToDevice(tag.PKNO, sTagValue, out error);  //写入执行的值
            if (!error.IsEmpty())
            {
                DeviceMonitor.WriteTagToDevice(tag.PKNO, sTagValue, out error);  //写入执行的值
                if (!error.IsEmpty())
                {
                    tbTagResult.Text = error;
                }
            }
        }
Exemple #22
0
        private void CmbTag_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            FmsAssetTagSetting tag = cmbTag.SelectedItem as FmsAssetTagSetting;

            if (tag == null)
            {
                tbTagType.Text = "请选择Tag";
                return;
            }

            string stateName = "未知";
            int    state     = tag.STATE_MARK_TYPE ?? 0;

            if (state == 0)
            {
                stateName = "普通";
            }
            else if (state == 1)
            {
                stateName = "状态-脱机";
            }
            else if (state == 3)
            {
                stateName = "状态-工作";
            }
            else if (state == 4)
            {
                stateName = "状态-故障";
            }
            else if (state == 10)
            {
                stateName = "状态";
            }
            else if (state == 11)
            {
                stateName = "位移";
            }
            tbTagType.Text = stateName;
        }
Exemple #23
0
        public bool Init()
        {
            if ((RunState != 1) && (!CBaseData.AppClosing))  //正在运行才执行
            {
                return(false);
            }

            #region 整线报警

            FmsAssetTagSetting alertTag = DeviceMonitor.GetTagSettings("TAG_CODE = '整线报警'").FirstOrDefault();

            string alertValue = alertTag?.CUR_VALUE;

            if (alertValue == "1")  //有整线报警,系统退出
            {
                //break;
            }

            #endregion
            FMSControlService.iConditionStartAddPause = 10; //条件启动启动后附加的延时  正常10ms,按条件启动后500ms
            FMSControlService.bStart = false;               //已经启动了,只要启动了就重新获取订单信息
            return(true);
        }
Exemple #24
0
        /// <summary>
        /// 获取动态文本的值
        /// </summary>
        /// <param name="text">文本</param>
        /// <returns>转换后的值</returns>
        private string GetDynamicValue(string text)
        {
            if (string.IsNullOrEmpty(text))
            {
                return("");
            }
            string result = text;

            if (text.Length > 4)                                                                 //"{[TagCode]}形式"
            {
                if ((text.Substring(0, 2) == "{[") && (text.Substring(text.Length - 2) == "]}")) //按照TagCode获取Tag点的当前
                {
                    string tagCode = text.Substring(2, text.Length - 4);                         //

                    FmsAssetTagSetting tag = DeviceMonitor.GetTagSettings($"TAG_CODE = '{tagCode}'").FirstOrDefault();
                    if (tag != null)
                    {
                        result = tag.CUR_VALUE;               //
                    }
                }
            }

            return(result);
        }
Exemple #25
0
        private const int ReWriteCount = 3;  //数据重写次数

        //下发刀补
        private void btnWriteToolsSet_Click(object sender, RoutedEventArgs e)
        {
            AmAssetMasterN asset = cmbDeviceInfo.SelectedItem as AmAssetMasterN;

            if (asset == null)
            {
                return;
            }
            TmsDeviceToolsPos mTmsDeviceToolsPos = gridItem.SelectedItem as TmsDeviceToolsPos;

            if (mTmsDeviceToolsPos == null)
            {
                return;
            }
            TmsToolsMaster tools = ws.UseService(s => s.GetTmsToolsMasterById(mTmsDeviceToolsPos.TOOLS_PKNO));

            if (tools == null)
            {
                return;
            }

            if (WPFMessageBox.ShowConfirm($"确定要将机床【{asset.ASSET_NAME}】上刀号【{mTmsDeviceToolsPos.TOOLS_POS_NO}】的补偿值覆盖吗?",
                                          "下发刀补") != WPFMessageBoxResult.OK)
            {
                return;
            }

            Cursor = Cursors.Wait;

            string tagName = "写入刀补";

            FmsAssetTagSetting tag = DeviceMonitor.GetTagSettings($"ASSET_CODE = '{asset.ASSET_CODE}' AND TAG_NAME = '{tagName}'").FirstOrDefault();

            if (tag == null)
            {
                Cursor = Cursors.Arrow;
                return;
            }

            //0:长度(形状);1:长度(磨损);2:半径(形状);3:半径(磨损)
            List <string> values = new List <string>();

            values.Add(mTmsDeviceToolsPos.TOOLS_POS_NO);              //机床刀号
            values.Add(tools.COMPENSATION_SHAPE_LENGTH.ToString());   //长度(形状)
            //values.Add(tools.COMPENSATION_ABRASION_LENGTH.ToString()); //长度(磨损)
            values.Add(tools.COMPENSATION_SHAPE_DIAMETER.ToString()); //半径(形状)
            //values.Add(tools.COMPENSATION_ABRASION_DIAMETER.ToString());  //半径(磨损)

            string offSetValue = string.Join("|", values.ToArray());

            #region  发刀补

            int    iWrite = 0;
            int    ret    = 0;
            string error  = "";

            while (iWrite < ReWriteCount)
            {
                ret = DeviceMonitor.WriteTagToDevice(tag.PKNO, offSetValue, out error);
                if (ret == 0)
                {
                    break;
                }
                iWrite++;
                Thread.Sleep(100);
            }

            #endregion

            Cursor = Cursors.Arrow;

            if (ret == 0)
            {
                WPFMessageBox.ShowTips("刀补值下发成功!", "下发刀补");
            }
        }
Exemple #26
0
        /// <summary>
        /// 状态类标签值保存结果
        /// </summary>
        /// <param name="tagSetting"></param>
        /// <param name="tagValue"></param>
        private void TagValueResultRecord(FmsAssetTagSetting tagSetting, string tagValue)
        {
            const int addMinutes  = -10; //分钟
            const int spanSaveSec = -5;  //每个5秒更新结束时间

            lock (lockResultRecord)
            {
                try
                {
                    EventLogger.Log($"======开始写入【{tagSetting.TAG_VALUE_NAME}】Result=====");

                    DateTime dtNow = DateTime.Now;

                    List <FmsStateResultRecord> records =
                        ws.UseService(
                            s =>
                            s.GetFmsStateResultRecords(
                                $"ASSET_CODE = '{tagSetting.ASSET_CODE}' AND TAG_SETTING_PKNO = '{tagSetting.PKNO}' " +
                                $"AND END_TIME >= '{dtNow.AddMinutes(addMinutes * 2)}'"))     //2倍时间以上时不再继续续写
                        .OrderByDescending(c => c.END_TIME)
                        .ThenByDescending(c => c.BEGINT_TIME)
                        .ThenByDescending(c => c.CREATION_DATE)
                        .ToList();

                    FmsStateResultRecord oldRecord = records.FirstOrDefault();
                    bool bFirstRecord = !ResultRecordFirsts.ContainsKey(tagSetting.PKNO) ||
                                        ResultRecordFirsts[tagSetting.PKNO];

                    bool isAddNewResult = (bFirstRecord) || (oldRecord == null) || (oldRecord.TAG_VALUE != tagValue) ||
                                          (oldRecord.END_TIME <= dtNow.AddMinutes(addMinutes)) || //10分钟之前的数据则重新增加;
                                          (oldRecord.END_TIME.Value.Date != dtNow.Date);          //跨天数据则新增加


                    if ((!bFirstRecord) && (oldRecord != null))                                        //不是第一次运行则修改之前的时间,一个周期更新一次结束时间+++++
                    {
                        if ((isAddNewResult) || (oldRecord.END_TIME <= dtNow.AddSeconds(spanSaveSec))) //新增记录时,修改原值
                        {
                            oldRecord.END_TIME = dtNow;                                                //更新状态时间
                            ws.UseService(s => s.UpdateFmsStateResultRecord(oldRecord));
                        }
                    }

                    if (isAddNewResult) //新增值
                    {
                        #region 新增值

                        FmsStateResultRecord record = new FmsStateResultRecord
                        {
                            PKNO             = CBaseData.NewGuid(),
                            ASSET_CODE       = tagSetting.ASSET_CODE,
                            TAG_SETTING_PKNO = tagSetting.PKNO,
                            TAG_VALUE_NAME   = tagSetting.TAG_VALUE_NAME,
                            TAG_VALUE        = tagValue,
                            BEGINT_TIME      = dtNow,
                            END_TIME         = DateTime.Now,
                            CREATION_DATE    = DateTime.Now,
                            CREATED_BY       = CBaseData.LoginName,
                            REMARK           = "",
                        };
                        ws.UseService(s => s.AddFmsStateResultRecord(record));

                        #endregion
                    }

                    if (!ResultRecordFirsts.ContainsKey(tagSetting.PKNO))
                    {
                        ResultRecordFirsts.Add(tagSetting.PKNO, false); //不是第一次
                    }
                    else
                    {
                        ResultRecordFirsts[tagSetting.PKNO] = false;
                    }

                    EventLogger.Log($"======完成写入【{tagSetting.TAG_VALUE_NAME}】Result=====");
                }
                catch (Exception ex)
                {
                    EventLogger.Log($"!!!!!!写入【{tagSetting.TAG_VALUE_NAME}】Result失败,原因:{ex.Message}!!!!!!");
                }
            }
        }
Exemple #27
0
        public bool FinishProgress()
        {
            if (curProcess.PROCESS_STATE == 2)                                                          //正在执行,完成该动作
            {
                if (!string.IsNullOrEmpty(startCondition) && !LimitConditions.Contains(startCondition)) //未完成的任务需要增加开始条件
                {
                    LimitConditions.Add(startCondition);
                }

                #region 完成执行工序 共 3 步

                /************ !!!工序完成的条件!!!  ************/
                string sCurFinishValue = "";  //当前完成的结果

                #region 1. 检验当前工序是否完成,未完成,则下一个任务

                FmsAssetTagSetting finishTag = jobTaskMode.CopyTags.FirstOrDefault(c => c.PKNO == curAction.FINISH_CONDITION_TAG_PKNO);

                if (finishTag != null)
                {
                    string condition = finishTag.PKNO + ".VALUE = " + curAction.FINISH_CONDITION_VALUE;

                    //如果前面的Job存在需要判断该状态,则不执行完成当前
                    if ((startCondition != condition) && LimitConditions.Contains(condition))
                    {
                        string sErrorInfo =
                            $"正在执行[{ctrolName}],完成条件[{finishTag?.TAG_NAME}]不足.";
                        if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                        {
                            mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                            PServiceEvent?.Invoke(s => s.UpdateMesJobOrder(mesJobOrder));
                        }

                        if (FMSControlService.bStart)
                        {
                            return(true);
                        }
                    }

                    if (finishTag.SAMPLING_MODE == 11)  //动作开始后自动开启 => 尚未开启,需要开启
                    {
                        var tag0 = DeviceMonitor.GetTagSettingById(curAction.FINISH_CONDITION_TAG_PKNO);
                        tag0.SAMPLING_MODE = 10;                    //尚未开启,需要开启
                        DeviceMonitor.SetTagSettingValue(tag0, ""); //清空完成条件

                        if (FMSControlService.bStart)
                        {
                            return(true);
                        }
                    }

                    sCurFinishValue = finishTag.CUR_VALUE;             //当前设备的值

                    string checkValue = sCurFinishValue.Split('|')[0]; //多结果情况,适用于检测

                    string   finishValue  = curAction.FINISH_CONDITION_VALUE;
                    string[] finishValues = finishValue.Split('|'); //多个完成条件

                    if (!finishValues.Contains(checkValue))         //当前值不是工序结束值,不完成
                    {
                        string sErrorInfo =
                            $"正在执行[{ctrolName}],获取到完成结果为[{checkValue}],判断完成条件为[{finishValue}],生产过程[{ctrolName}]尚未完成.";
                        if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                        {
                            mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                            PServiceEvent?.Invoke(s => s.UpdateMesJobOrder(mesJobOrder));
                        }

                        if (!LimitConditions.Contains(condition))
                        {
                            LimitConditions.Add(condition);                                       //完成条件不满足
                        }
                        if (FMSControlService.bStart)
                        {
                            return(true);
                        }
                    }

                    //移除完成限制条件
                    LimitConditions.Remove(condition);  //完成条件满足 则移除不满足的条件

                    if (string.IsNullOrEmpty(startCondition))
                    {
                        LimitConditions.Remove(startCondition);                                        //移除开始的限制条件
                    }
                }
                else  //没有动作完成的检测值,手动完成。
                {
                    string sErrorInfo = $"生产过程[{ctrolName}]没有设置过程完成的检测值,请手动完成该过程."; //生产执行信息
                    if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                    {
                        mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                        PServiceEvent?.Invoke(s => s.UpdateMesJobOrder(mesJobOrder));
                    }

                    if (string.IsNullOrEmpty(startCondition))
                    {
                        LimitConditions.Remove(startCondition);                                        //移除开始的限制条件
                    }
                    if (FMSControlService.bStart)
                    {
                        return(true);
                    }
                }

                #endregion

                /************ !!!工序已经完成!!!  ************/

                Console.WriteLine($"收到设备完成指令,完成反馈结果为[{sCurFinishValue}],完成生产过程[{ctrolName}]");

                #region 2. 根据工序类型处理 完成当前工序

                if (curProcess.PROCESS_ACTION_TYPE == 3) //检测完成
                {
                    //合格数量
                    string[] checkResult     = sCurFinishValue.Split('|');
                    int      qualifiedNumber = 1; //合格品数量
                    if (checkResult.Count() >= 2)
                    {
                        qualifiedNumber = SafeConverter.SafeToInt(checkResult[1], 1);
                    }
                    curProcess.COMPLETE_QTY  = qualifiedNumber;                                                            //生产数量 - 含不合格的丢弃
                    curProcess.QUALIFIED_QTY = qualifiedNumber;                                                            //合格品数量

                    mesJobOrder.ONLINE_QTY = mesJobOrder.ONLINE_QTY - firstProcess.PROCESS_QTY + curProcess.QUALIFIED_QTY; //在线数量,更新再制品数量
                    if (mesJobOrder.ONLINE_QTY < 0)
                    {
                        mesJobOrder.ONLINE_QTY = 0;
                    }
                }

                if (productProcess != null)
                {
                    if (bLastProcess)
                    {
                        productProcess.PRODUCT_STATE = 100;                             //最后一道工序 正常完成
                    }
                    string result = DeviceProcessControl.FinishCurBusiness(curProcess); //完成业务
                    if (result != "OK")
                    {
                        string sErrorInfo = $"业务完成失败,写入数据库错误!";
                        if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                        {
                            mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                            PServiceEvent?.Invoke(s => s.UpdateMesJobOrder(mesJobOrder));
                        }
                    }
                }

                #region 已删除 - 之前的方式

                if (curProcess.PROCESS_ACTION_TYPE == 1) //加工完成
                {
                    //if (productProcess != null)
                    //{
                    //    productProcess.CUR_ITEM_PKNO = curProcess.FINISH_ITEM_PKNO; //生产完成
                    //}
                }
                else if (curProcess.PROCESS_ACTION_TYPE == 2) //搬运完成
                {
                    //if (productProcess != null)
                    //{
                    //    productProcess.PRODUCT_POSITION = curProcess.FINISH_POSITION; //目标位置
                    //}
                }
                else if (curProcess.PROCESS_ACTION_TYPE == 3) //检测完成
                {
                    //合格数量
                    string[] result          = sCurFinishValue.Split('|');
                    int      qualifiedNumber = 1; //合格品数量
                    if (result.Count() >= 2)
                    {
                        qualifiedNumber = SafeConverter.SafeToInt(result[1], 1);
                    }
                    curProcess.COMPLETE_QTY  = qualifiedNumber;                                                            //生产数量 - 含不合格的丢弃
                    curProcess.QUALIFIED_QTY = qualifiedNumber;                                                            //合格品数量

                    mesJobOrder.ONLINE_QTY = mesJobOrder.ONLINE_QTY - firstProcess.PROCESS_QTY + curProcess.QUALIFIED_QTY; //在线数量,更新再制品数量
                    if (mesJobOrder.ONLINE_QTY < 0)
                    {
                        mesJobOrder.ONLINE_QTY = 0;
                    }
                }
                else if (curProcess.PROCESS_ACTION_TYPE == 11) //出库完成
                {
                    //if (productProcess != null) productProcess.PRODUCT_POSITION = curProcess.FINISH_POSITION; //目标位置

                    //#region 解锁货位地址 - 货位清空

                    //if (!string.IsNullOrEmpty(curProcess.BEGIN_POSITION))
                    //{
                    //    WmsAllocationInfo rawAllo = wsWMS.UseService(s =>
                    //        s.GetWmsAllocationInfoById(curProcess.BEGIN_POSITION));

                    //    if (rawAllo != null)
                    //    {
                    //        rawAllo.CUR_PALLET_NO = "";
                    //        rawAllo.ALLOCATION_STATE = 0;  //空

                    //        wsWMS.UseService(s => s.UpdateWmsAllocationInfo(rawAllo));

                    //        WmsInventory inv = wsWMS.UseService(s => s.GetWmsInventorys($"ALLOCATION_PKNO = '{rawAllo.PKNO}'"))
                    //            .FirstOrDefault();

                    //        if (inv != null) wsWMS.UseService(s => s.DelWmsInventory(inv.PKNO));
                    //    }
                    //}

                    //#endregion
                }
                else if (curProcess.PROCESS_ACTION_TYPE == 12) //入库完成
                {
                    //if (productProcess != null) productProcess.PRODUCT_POSITION = curProcess.FINISH_POSITION; //目标位置

                    //#region 产品入库处理 - 解锁货位地址、增加产品库存

                    //if (!string.IsNullOrEmpty(curProcess.FINISH_POSITION))
                    //{
                    //    WmsAllocationInfo prodAllo = wsWMS.UseService(s =>
                    //        s.GetWmsAllocationInfoById(curProcess.FINISH_POSITION));

                    //    if (prodAllo != null)  //入库货位
                    //    {
                    //        prodAllo.ALLOCATION_STATE = 100; //满货位

                    //        WmsInventory inv = new WmsInventory()
                    //        {
                    //            PKNO = CBaseData.NewGuid(),
                    //            COMPANY_CODE = "",
                    //            MATERIAL_PKNO = curProcess.FINISH_ITEM_PKNO,
                    //            ALLOCATION_PKNO = prodAllo.PKNO,
                    //            AREA_PKNO = prodAllo.AREA_PKNO,
                    //            BATCH_NO = curProcess.SUB_JOB_ORDER_NO,
                    //            INVENTORY_NUM = 1, //curProcess.QUALIFIED_QTY?? 1,
                    //            REMARK = "",
                    //        };  //库存

                    //        wsWMS.UseService(s => s.UpdateWmsAllocationInfo(prodAllo));  //修改货位

                    //        wsWMS.UseService(s => s.AddWmsInventory(inv));
                    //    }
                    //}

                    //#endregion
                }
                else if ((curProcess.PROCESS_ACTION_TYPE >= 40) &&
                         (curProcess.PROCESS_ACTION_TYPE < 50)) //换刀
                {
                    //40:换刀;41:取刀;42:卸刀;43:装刀;44:放刀
                    //if (curProcess.PROCESS_ACTION_TYPE == 41)  //取刀
                    //{
                    //    TmsToolsMaster mToolsMaster = wsTMS.UseService(s =>
                    //        s.GetTmsToolsMasterById(curProcess.BEGIN_ITEM_PKNO));   //装上刀具
                    //    if (mToolsMaster != null)
                    //    {
                    //        mToolsMaster.TOOLS_POSITION = 10;  //出库
                    //        mToolsMaster.TOOLS_POSITION_PKNO = "";
                    //        wsTMS.UseService(s => s.UpdateTmsToolsMaster(mToolsMaster));
                    //    }
                    //}
                    //else if (curProcess.PROCESS_ACTION_TYPE == 42)  //卸刀
                    //{
                    //    TmsDeviceToolsPos mTmsDeviceToolsPos = wsTMS.UseService(s => s.GetTmsDeviceToolsPosById(curProcess.BEGIN_ITEM_PKNO)); //卸下刀具
                    //    if (mTmsDeviceToolsPos != null)
                    //    {
                    //        mTmsDeviceToolsPos.TOOLS_PKNO = "";
                    //        wsTMS.UseService(s => s.UpdateTmsDeviceToolsPos(mTmsDeviceToolsPos));    //更新
                    //    }
                    //    TmsToolsMaster mToolsMaster = wsTMS.UseService(s =>
                    //        s.GetTmsToolsMasterById(curProcess.FINISH_ITEM_PKNO));  //卸下刀具
                    //    if (mToolsMaster != null)
                    //    {
                    //        mToolsMaster.TOOLS_POSITION = 10;  //已出库
                    //        mToolsMaster.TOOLS_POSITION_PKNO = "";
                    //        wsTMS.UseService(s => s.UpdateTmsToolsMaster(mToolsMaster));  //已出库
                    //    }
                    //}
                    //else if (curProcess.PROCESS_ACTION_TYPE == 43)  //装刀
                    //{
                    //    TmsDeviceToolsPos mTmsDeviceToolsPos = wsTMS.UseService(s => s.GetTmsDeviceToolsPosById(curProcess.BEGIN_ITEM_PKNO)); //装上刀具
                    //    if (mTmsDeviceToolsPos != null)
                    //    {
                    //        mTmsDeviceToolsPos.TOOLS_PKNO = curProcess.FINISH_ITEM_PKNO;  //装上刀具PKNO
                    //        wsTMS.UseService(s => s.UpdateTmsDeviceToolsPos(mTmsDeviceToolsPos));    //更新
                    //    }
                    //    TmsToolsMaster mToolsMaster = wsTMS.UseService(s =>
                    //        s.GetTmsToolsMasterById(curProcess.FINISH_ITEM_PKNO)); //装上刀具PKNO
                    //    if (mToolsMaster != null)
                    //    {
                    //        mToolsMaster.TOOLS_POSITION = 2;  //在设备
                    //        mToolsMaster.TOOLS_POSITION_PKNO = curProcess.BEGIN_POSITION;  //装刀机床PKNO
                    //        wsTMS.UseService(s => s.UpdateTmsToolsMaster(mToolsMaster));  //已出库
                    //    }
                    //}
                    //else if (curProcess.PROCESS_ACTION_TYPE == 44)  //放刀
                    //{
                    //    TmsToolsMaster mToolsMaster = wsTMS.UseService(s =>
                    //        s.GetTmsToolsMasterById(curProcess.BEGIN_ITEM_PKNO));   //卸下刀具
                    //    if (mToolsMaster != null)
                    //    {
                    //        mToolsMaster.TOOLS_POSITION = 1;
                    //        mToolsMaster.TOOLS_POSITION_PKNO = curProcess.FINISH_ITEM_PKNO;   //位置信息
                    //        wsTMS.UseService(s => s.UpdateTmsToolsMaster(mToolsMaster));  //已出库
                    //    }
                    //}
                }

                #endregion

                #endregion

                #region 3. 更新数据  共更新 4 个类

                #region 3.1 加工控制

                curProcess.PROCESS_END_TIME = DateTime.Now;
                curProcess.PROCESS_STATE    = 10;
                curProcess.PROCESS_END_TYPE = 1;
                PServiceEvent?.Invoke(s => s.UpdateMesProcessCtrol(curProcess));
                #endregion

                #region 3.2 Job处理

                #region 最后一道工序的处理

                mesJobOrder.PROCESS_INFO = "正常"; //生产执行信息

                if (bLastProcess)                //最后一道工序
                {
                    mesJobOrder.COMPLETE_QTY    = curProcess.COMPLETE_QTY;
                    mesJobOrder.ONLINE_QTY      = 0;   //任务完成
                    mesJobOrder.ACT_FINISH_TIME = DateTime.Now;
                    mesJobOrder.RUN_STATE       = 100; //正常完成
                    mesJobOrder.PROCESS_INFO    = $"正常完成,计划数量[{mesJobOrder.TASK_QTY}],完成数量[{mesJobOrder.COMPLETE_QTY}]";
                    Console.WriteLine($"订单[{mesJobOrder.JOB_ORDER_NO}]生产完成,计划数量[{mesJobOrder.TASK_QTY}],完成数量[{mesJobOrder.COMPLETE_QTY}]");
                }

                #endregion
                PServiceEvent?.Invoke(s => s.UpdateMesJobOrder(mesJobOrder));


                #endregion

                #region 3.4 清空完成反馈状态,将完成条件置空

                var tag = DeviceMonitor.GetTagSettingById(curAction.FINISH_CONDITION_TAG_PKNO);
                if (tag != null) //将完成结果置为空
                {
                    if (tag.SAMPLING_MODE == 10)
                    {
                        tag.SAMPLING_MODE = 11;                          //按照条件关闭
                    }
                    DeviceMonitor.SetTagSettingValue(tag, "");
                }

                #endregion

                #endregion

                #endregion

                Thread.Sleep(50);
                return(true);
            }
            return(true);
        }
Exemple #28
0
        /// <summary>
        /// 自动保存实时结果
        /// </summary>
        private void ThreadSaveCurValue()
        {
            int runSpan = 0; //循环变量
            WcfClient <IFMSService> wsThis = new WcfClient <IFMSService>();

            while (!CBaseData.AppClosing)
            {
                #region 暂停

                if ((bPause) || (SaveCurValueSpan <= 0))
                {
                    System.Threading.Thread.Sleep(200);
                    continue;
                }

                #endregion

                runSpan++;

                if (runSpan % (SaveCurValueSpan * 10) == 0) //到达周期
                {
                    #region 自动保存当前值到Tag点

                    lock (lockUpdateCurValue)
                    {
                        try
                        {
                            foreach (FmsAssetTagSetting deviceTagSetting in _tagSettings)
                            {
                                if (CurValueChanged.ContainsKey(deviceTagSetting.PKNO))
                                {
                                    if (!CurValueChanged[deviceTagSetting.PKNO])
                                    {
                                        continue;                                           //没有更新则退出
                                    }
                                }
                                else
                                {
                                    CurValueChanged.Add(deviceTagSetting.PKNO, false);
                                }

                                FmsAssetTagSetting changeValue = wsThis.UseService(s =>
                                                                                   s.GetFmsAssetTagSettingById(deviceTagSetting.PKNO));
                                if (changeValue == null)
                                {
                                    continue;
                                }
                                changeValue.CUR_VALUE = deviceTagSetting.CUR_VALUE;
                                wsThis.UseService(s => s.UpdateFmsAssetTagSetting(changeValue)); //只更新当前值到数据库

                                if ((CurValueChanged.ContainsKey(deviceTagSetting.PKNO)) &&
                                    (CurValueChanged[deviceTagSetting.PKNO]))
                                {
                                    CurValueChanged[deviceTagSetting.PKNO] = false; //更新完成
                                }
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }

                    #endregion

                    runSpan = 0;
                }

                System.Threading.Thread.Sleep(100);
            }
        }
Exemple #29
0
        /// <summary>
        /// 自动计算标签值
        /// 采用动态代码执行方式,编译一次,采用参数传入的方式执行
        /// </summary>
        private void ThreadAutoCalculation()
        {
            Type dynamicCode = null;                                                                                                         //获取编译后代码,调用该类用
            List <FmsTagCalculation> TagCalculations = null;                                                                                 //计算规则
            Dictionary <string, Dictionary <string, string> > FuncAndParamTagPKNO = new Dictionary <string, Dictionary <string, string> >(); //函数和对应参数的Tag的PKNO

            while (!CBaseData.AppClosing)
            {
                #region 暂停

                if (bPause)
                {
                    System.Threading.Thread.Sleep(200);
                    continue;
                }

                #endregion

                try
                {
                    int index;

                    if (bRefreshAutoCal) //刷新计算规则
                    {
                        WcfClient <IFMSService> wsThis = new WcfClient <IFMSService>();
                        TagCalculations = wsThis.UseService(s => s.GetFmsTagCalculations("USE_FLAG = 1"));

                        bRefreshAutoCal = false;

                        if ((TagCalculations == null) || (!TagCalculations.Any()))
                        {
                            Thread.Sleep(500);
                            continue;
                        }

                        string className = "C" + Guid.NewGuid().ToString("N");

                        #region 形成执行的代码

                        string execCode = "using System; \r\n" +
                                          "using System.Text; \r\n" +
                                          "using System.Collections.Generic; \r\n" +
                                          "using BFM.Common.Base; \r\n\r\n";

                        execCode += "public class " + className + "\r\n" +
                                    "{ \r\n";

                        string basicFuc = "AutoCalculation";

                        index = 1;
                        FuncAndParamTagPKNO.Clear();

                        foreach (FmsTagCalculation calculation in TagCalculations)
                        {
                            FmsAssetTagSetting tagResult = GetTagSettingById(calculation.RESULT_TAG_PKNO); //结果

                            string exp = calculation.CALCULATION_EXPRESSION;                               //表达式

                            string funcname = basicFuc + index.ToString();                                 //函数名称
                            Dictionary <string, string> paramTas = new Dictionary <string, string>();      //参数对应的标签的PKNO, param

                            List <string> funcParam = new List <string>();                                 //带类型的参数

                            string code       = "";
                            string resultType = "string";

                            //将标签替换成参数名
                            foreach (var line in exp.Split(new string[] { "\r\n" }, StringSplitOptions.None))
                            {
                                string ret = line;

                                #region 替换标签值,将标签替换成参数名

                                string[] expTags = line.Split('{');

                                for (int i = 0; i < expTags.Length; i++)
                                {
                                    string str    = expTags[i];
                                    int    length = str.IndexOf('}');

                                    if (length < 0) //没有找到  }
                                    {
                                        continue;
                                    }

                                    string tagPKNO = str.Substring(0, length); //{ } 内为PKNO

                                    string param = "{" + tagPKNO + "}";

                                    if (paramTas.ContainsKey(tagPKNO))  //已经添加了该参数
                                    {
                                        param = paramTas[tagPKNO];
                                    }
                                    else
                                    {
                                        FmsAssetTagSetting tag = GetTagSettingById(tagPKNO);

                                        if (tag == null)
                                        {
                                            continue;
                                        }

                                        param = "param" + paramTas.Count;
                                        paramTas.Add(tagPKNO, param);
                                        string paramType = "string";  //所有参数传入都是string型
                                        //string paramType =
                                        //    ((calculation.CALCULATION_TYPE == 2) ||
                                        //     (tag.VALUE_TYPE > 0 && tag.VALUE_TYPE < 20))
                                        //        ? "double"
                                        //        : "string";
                                        funcParam.Add(paramType + " " + param);
                                    }

                                    ret = ret.Replace("{" + tagPKNO + "}", param);
                                }

                                #endregion

                                if (string.IsNullOrEmpty(code))
                                {
                                    code = "    " + ret;
                                }
                                else
                                {
                                    code += Environment.NewLine + "    " + ret;
                                }
                            }

                            //确定返回结果类型,将code语句转换成C#的语句
                            if (calculation.CALCULATION_TYPE == 1) //逻辑运算
                            {
                                //(结果为1,0):({标签1}==1)&&({标签2}==1)&&({标签3}==0||{标签4}==0)&&({标签5}==1)
                                code       = code.Replace("AND", "&&").Replace("and", "&&").Replace("OR", "||").Replace("or", "||");
                                resultType = "bool";
                            }
                            else if (calculation.CALCULATION_TYPE == 2) //数值运算
                            {
                                //{标签1}+3+{标签2}+4
                                resultType = "double";
                            }
                            else if (calculation.CALCULATION_TYPE == 3) //字符运算
                            {
                                //{标签1}+"123"
                            }
                            else if (calculation.CALCULATION_TYPE == 12) //条件数值运算
                            {
                                //{标签1}==3:{标签2}+1;{标签1}==4:{标签2}+2;{标签1}==5:{标签2}+3
                                resultType = "double";
                                List <string> exps = code.Split(';').ToList();
                                string        temp = "";
                                foreach (var exp1 in exps)
                                {
                                    if (exp1.Split(':').Length < 2)
                                    {
                                        continue;
                                    }
                                    temp += "        if (" + exp1.Split(':')[0] + ") { return (" + exp1.Split(':')[1] + "); } \r\n";
                                }

                                temp += "        return 0; \r\n";

                                code = temp;
                            }
                            else if (calculation.CALCULATION_TYPE == 13) //条件字符运算
                            {
                                //{标签1}==3:{标签1}+"123";{标签1}==4:{标签1}+"123"
                                List <string> exps = code.Split(';').ToList();
                                string        temp = "";
                                foreach (var exp1 in exps)
                                {
                                    if (exp1.Split(':').Length < 2)
                                    {
                                        continue;
                                    }
                                    temp += "        if (" + exp1.Split(':')[0] + ") { return (" + exp1.Split(':')[1] + ").ToString(); } \r\n";
                                }

                                temp += "        return \"\"; \r\n";

                                code = temp;
                            }
                            else if (calculation.CALCULATION_TYPE == 100) //C#脚本
                            {
                                //支持C#语法,最后返回值(Double/String)
                                resultType = "string";
                            }
                            else  //不支持的类型
                            {
                                code = $"        return \"计算类型[{calculation.CALCULATION_TYPE}],不支持的类型。\"; \r\n";
                            }

                            execCode += DynamicCode.BuildExecFunc(funcname, resultType, code, funcParam);  //增加一个函数

                            index++;

                            FuncAndParamTagPKNO.Add(funcname, paramTas); //添加
                        }

                        execCode += "}\r\n";

                        #endregion

                        #region 编译代码

                        CodeDomProvider    compiler = new CSharpCodeProvider();
                        CompilerParameters cp       = new CompilerParameters()
                        {
                            GenerateExecutable = false, GenerateInMemory = true,
                        };
                        cp.ReferencedAssemblies.Add("BFM.Common.Base.dll");
                        CompilerResults cr = compiler.CompileAssemblyFromSource(cp, execCode);
                        if (cr.Errors.HasErrors)
                        {
                            NetLog.Error("DeviceMonitor.ThreadAutoCalculation Invaild Code: :" + execCode);
                        }

                        dynamicCode = cr.CompiledAssembly.GetType(className);  //获取

                        #endregion
                    }

                    if ((TagCalculations == null) || (!TagCalculations.Any()) || (dynamicCode == null) || (FuncAndParamTagPKNO.Count <= 0))
                    {
                        Thread.Sleep(500);
                        continue;
                    }

                    #region  获取值

                    index = 0;
                    foreach (FmsTagCalculation calculation in TagCalculations)
                    {
                        FmsAssetTagSetting tagResult = GetTagSettingById(calculation.RESULT_TAG_PKNO);  //结果

                        if (tagResult == null)
                        {
                            continue;
                        }

                        if (FuncAndParamTagPKNO.Count < index)
                        {
                            break;
                        }

                        string        funcName    = FuncAndParamTagPKNO.Keys.ToList()[index];
                        var           tagParms    = FuncAndParamTagPKNO.Values.ToList()[index];
                        List <object> paramValues = new List <object>(); //参数值

                        foreach (var tagpkno in tagParms)                //参数
                        {
                            object             value    = null;
                            FmsAssetTagSetting tagParam = GetTagSettingById(tagpkno.Key);

                            if (tagParam != null)
                            {
                                value = SafeConverter.SafeToStr(tagParam.CUR_VALUE);
                                //if ((calculation.CALCULATION_TYPE == 2) || (tagParam.VALUE_TYPE > 0 && tagParam.VALUE_TYPE < 20))
                                //{
                                //    value = SafeConverter.SafeToDouble(tagParam.CUR_VALUE);
                                //}
                                //else
                                //{
                                //    value = SafeConverter.SafeToStr(tagParam.CUR_VALUE);
                                //}
                            }
                            else
                            {
                                value = "";
                            }

                            paramValues.Add(value);
                        }

                        object obj = dynamicCode.InvokeMember(funcName,
                                                              BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod,
                                                              System.Type.DefaultBinder, null, paramValues.ToArray());

                        string newValue = "";  //新的计算结果

                        #region 更新结果

                        if (calculation.CALCULATION_TYPE == 1)  //逻辑运算
                        {
                            newValue = SafeConverter.SafeToBool(obj) ? "1" : "0";
                        }
                        else
                        {
                            newValue = SafeConverter.SafeToStr(obj);
                        }

                        SaveData(tagResult.PKNO, newValue);  //保存更新值

                        #endregion

                        index++;
                    }

                    #endregion
                }
                catch (Exception e)
                {
                    NetLog.Error("DeviceMonitor.ThreadAutoCalculation error:", e);
                }

                Thread.Sleep(100);
            }
        }
Exemple #30
0
        public bool StartCurrentProgerss()
        {
            if (curProcess.PROCESS_STATE == 1)                                                         //准备完成,未开始执行
            {
                if (!string.IsNullOrEmpty(startCondition) && LimitConditions.Contains(startCondition)) //如果前面的Job存在需要判断该状态,则不执行当前的
                {
                    string sErrorInfo = $"等待执行";
                    if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                    {
                        mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                        PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));
                    }

                    return(false);
                }

                #region 开始执行工序 共 5 步

                string startCustomParam = ""; //开始执行的参数,增加到同步写入数据后面
                                              /************ !!!工序开始的条件!!!  ************/

                #region 1. 检验当前执行的工序是否可以执行,启动条件

                if (startTag != null)                                                              //启动条件为空则直接执行
                {
                    string   checkValue  = startTag.CUR_VALUE.Split('|')[0];                       //当前执行条件的结果
                    string   startValue  = curAction.START_CONDITION_VALUE;                        //开始条件
                    string[] startValues = startValue.Split('|');                                  //多个开启条件

                    if ((string.IsNullOrEmpty(checkValue)) || (!startValues.Contains(checkValue))) //当前值不是工序开始检测值
                    {
                        #region 条件不符合的 流程分支情况

                        if (curProcess.PROCESS_ACTION_TYPE == 4) //流程分支,不启用,直接往下运行
                        {
                            #region 直接完成当前工序

                            #region 第一道工序处理

                            if (bFirstProcess)                             //第一道工序
                            {
                                mesJobOrder.RUN_STATE      = 20;           //正在执行
                                mesJobOrder.ACT_START_TIME = DateTime.Now; //修改任务开始时间
                                mesJobOrder.PROCESS_INFO   = "正常";         //生产执行信息
                                PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));
                            }

                            #endregion

                            curProcess.PROCESS_STATE    = 10; //直接完成
                            curProcess.PROCESS_END_TYPE = 1;
                            curProcess.PROCESS_END_TIME = DateTime.Now;
                            curProcess.REMARK           = "条件不满足,不启用流程分支,直接执行现有流程。";
                            PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));

                            return(false); //直接执行重新执行

                            #endregion
                        }

                        #endregion

                        #region 判断条件不满足

                        string sErrorInfo =
                            $"生产过程【{ctrolName}】开启条件【{startTag?.TAG_NAME}】不足,当前状态为【{checkValue}】,需要状态【{startValue}】";
                        if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                        {
                            mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                            PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));
                        }

                        if (!LimitConditions.Contains(startCondition))
                        {
                            LimitConditions.Add(startCondition); //起始条件不满足,则添加限制条件
                        }

                        return(false);

                        #endregion
                    }
                }

                #endregion

                /************ !!!工序开始的条件满足,直接执行!!!  ************/
                Console.WriteLine($"========生产过程【{ctrolName}】开始条件【{startTag?.TAG_NAME}】满足,开始执行=======");

                #region 2. 启动流程分支

                if (curProcess.PROCESS_ACTION_TYPE == 4)                              //流程分支
                {
                    string disableProcesses = curProcess.PROCESS_ACTION_PARAM1_VALUE; //禁用的流程
                    string enableProcesses  = curProcess.PROCESS_ACTION_PARAM2_VALUE; //启用的流程

                    string stemp = $"触发流程分支.禁用流程[{disableProcesses}], 启用流程[{enableProcesses}]";
                    mesJobOrder.PROCESS_INFO = stemp; //生产执行信息
                    Console.WriteLine(stemp);

                    #region 启动流程分支

                    if (!string.IsNullOrEmpty(disableProcesses))
                    {
                        foreach (var disableP in disableProcesses.Split(';'))
                        {
                            MesProcessCtrol process = unFinishProcessCtrols.FirstOrDefault(c =>
                                                                                           c.PROCESS_INDEX == SafeConverter.SafeToInt(disableP, -1));
                            process.USE_FLAG = 0; //禁用
                            PServiceEvent?.Invoke(d => d.UpdateMesProcessCtrol(process));
                        }
                    }

                    if (!string.IsNullOrEmpty(enableProcesses))
                    {
                        foreach (var enableP in enableProcesses.Split(';'))
                        {
                            MesProcessCtrol process = unFinishProcessCtrols.FirstOrDefault(c =>
                                                                                           c.PROCESS_INDEX == SafeConverter.SafeToInt(enableP, -1));
                            process.USE_FLAG = 1; //启用
                            PServiceEvent?.Invoke(d => d.UpdateMesProcessCtrol(process));
                        }
                    }

                    #endregion

                    #region 更新数据

                    #region 加工控制

                    curProcess.PROCESS_STATE      = 10; //直接完成
                    curProcess.PROCESS_END_TYPE   = 1;
                    curProcess.PROCESS_START_TIME = DateTime.Now.AddMilliseconds(-100);
                    curProcess.PROCESS_END_TIME   = DateTime.Now;
                    curProcess.REMARK             = $"流程分支条件满足,启用流程分支,禁用流程[{disableProcesses}], 启用流程[{enableProcesses}]";
                    PServiceEvent?.Invoke(d => d.UpdateMesProcessCtrol(curProcess));

                    #endregion

                    #region Job处理

                    if (bFirstProcess)                             //第一道工序
                    {
                        mesJobOrder.RUN_STATE      = 20;           //正在执行
                        mesJobOrder.ACT_START_TIME = DateTime.Now; //修改任务开始时间
                    }

                    PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));
                    #endregion

                    DeviceMonitor.SetTagSettingValueById(curAction.START_CONDITION_TAG_PKNO, ""); //将检测结果置为空

                    //产品处理
                    if (productProcess != null)
                    {
                        productProcess.PRODUCT_STATE    = curProcess.PROCESS_ACTION_TYPE; //当前状态
                        productProcess.LAST_UPDATE_DATE = DateTime.Now;
                        var process = productProcess;
                        PServiceEvent?.Invoke(d => d.UpdateMesProductProcess(process));
                    }

                    #endregion

                    return(false); //直接开启下一次流程
                } //启动流程分支

                #endregion

                //增加限制条件
                if (!string.IsNullOrEmpty(startCondition) &&
                    !LimitConditions.Contains(startCondition)) //未完成的任务需要增加开始条件
                {
                    LimitConditions.Add(startCondition);
                }

                #region 3. 获取产品,第一道工序形成产品

                if (bFirstProcess || (productProcess == null)) //第一道控制,且没有形成
                {
                    string productPKNO = CBaseData.NewGuid();

                    productProcess = new MesProductProcess() //生成新的产品
                    {
                        PKNO             = productPKNO,
                        COMPANY_CODE     = CBaseData.BelongCompPKNO,
                        ITEM_PKNO        = curProcess.ITEM_PKNO,
                        JOB_ORDER_PKNO   = curProcess.JOB_ORDER_PKNO,
                        JOB_ORDER        = curProcess.JOB_ORDER,
                        SUB_JOB_ORDER_NO = curProcess.SUB_JOB_ORDER_NO,

                        PRODUCT_CODE          = TableNOHelper.GetNewNO("MesProductProcess.PRODUCT_CODE", "P"),
                        PRODUCT_POSITION      = "",                       //当前位置
                        CUR_ROCESS_CTROL_PKNO = curProcess.PKNO,          //当前过程
                        RAW_NUMBER            = curProcess.PROCESS_QTY,   //原料数量
                        PRODUCT_NUMBER        = curProcess.COMPLETE_QTY,  //完成数量
                        QUALIFIED_NUMBER      = curProcess.QUALIFIED_QTY, //合格品数量
                        PALLET_NO             = curProcess.PALLET_NO,     //托盘号
                        PRODUCT_STATE         = -1,                       //尚未开始

                        CREATION_DATE    = DateTime.Now,
                        CREATED_BY       = CBaseData.LoginNO,
                        LAST_UPDATE_DATE = DateTime.Now,            //最后修改日期
                        USE_FLAG         = 1,
                        REMARK           = "",                      //备注
                    };                                              //生成新的产品

                    curProcess.CUR_PRODUCT_CODE_PKNO = productPKNO; //新产品编号
                }
                else
                {
                    curProcess.CUR_PRODUCT_CODE_PKNO = firstProcess.CUR_PRODUCT_CODE_PKNO; //将所有的产品
                }

                #endregion

                #region 4. 执行当前工序 => 向设备写入数据 写 3 个值

                int    ret       = 0;
                string error     = "";
                string tagPKNO   = "";
                string sTagValue = "";

                bool bWriteSuccess = true;  //写入设备成功标志

                #region  4.1 写参数1

                tagPKNO   = curAction.EXECUTE_PARAM1_TAG_PKNO;
                sTagValue = GetDynamicValue(curProcess.PROCESS_ACTION_PARAM1_VALUE);

                if ((!string.IsNullOrEmpty(tagPKNO)) && (!string.IsNullOrEmpty(sTagValue)))
                {
                    #region 多次重写

                    int iWrite = 0;
                    while (iWrite < ReWriteCount)
                    {
                        ret = DeviceMonitor.WriteTagToDevice(tagPKNO, sTagValue, out error);
                        if (ret == 0)
                        {
                            Thread.Sleep(100);  //写入成功后暂停
                            break;
                        }
                        iWrite++;
                        Thread.Sleep(100);
                    }

                    #endregion

                    if (ret == 10)                                     //写入设备失败
                    {
                        string sErrorInfo = $"向设备写入参数1失败。错误为:{error}"; //生产执行信息
                        if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                        {
                            mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                            PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));
                        }

                        Console.WriteLine(sErrorInfo);
                        return(false);
                    }

                    if (ret == 0)
                    {
                        bWriteSuccess = true; //写入成功
                    }
                }

                #endregion

                #region  4.2 写参数2

                tagPKNO   = curAction.EXECUTE_PARAM2_TAG_PKNO;
                sTagValue = GetDynamicValue(curProcess.PROCESS_ACTION_PARAM2_VALUE);

                if ((!string.IsNullOrEmpty(tagPKNO)) && (!string.IsNullOrEmpty(sTagValue)))
                {
                    #region 多次重写

                    int iWrite = 0;
                    while (iWrite < ReWriteCount)
                    {
                        ret = DeviceMonitor.WriteTagToDevice(tagPKNO, sTagValue, out error);
                        if (ret == 0)
                        {
                            Thread.Sleep(100);  //写入成功后暂停
                            break;
                        }
                        iWrite++;
                        Thread.Sleep(100);
                    }

                    #endregion

                    if (ret == 10)                                     //写入设备失败
                    {
                        string sErrorInfo = $"向设备写入参数2失败。错误为:{error}"; //生产执行信息
                        if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                        {
                            mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                            PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));
                        }

                        Console.WriteLine(sErrorInfo);
                        return(false);
                    }

                    if (ret == 0)
                    {
                        bWriteSuccess = true;           //写入成功
                    }
                }

                #endregion

                #region  4.3 写执行

                tagPKNO   = curAction.EXECUTE_TAG_PKNO;
                sTagValue = GetDynamicValue(curAction.EXECUTE_WRITE_VALUE) +
                            "|" + (string.IsNullOrEmpty(curProcess.PROCESS_ACTION_PARAM1_VALUE) ? "0" : curProcess.PROCESS_ACTION_PARAM1_VALUE) +
                            "|" + (string.IsNullOrEmpty(curProcess.PROCESS_ACTION_PARAM2_VALUE) ? "0" : curProcess.PROCESS_ACTION_PARAM2_VALUE) +
                            "|" + (string.IsNullOrEmpty(startCustomParam) ? "0" : startCustomParam);

                if ((!string.IsNullOrEmpty(tagPKNO)) && (!string.IsNullOrEmpty(sTagValue.Replace("|", ""))))
                {
                    #region 多次重写

                    int iWrite = 0;
                    while (iWrite < ReWriteCount)
                    {
                        ret = DeviceMonitor.WriteTagToDevice(tagPKNO, sTagValue, out error);
                        if (ret == 0)
                        {
                            //Thread.Sleep(100);  //写入成功后暂停,最后不需要
                            break;
                        }
                        iWrite++;
                        Thread.Sleep(100);
                    }

                    #endregion

                    if (ret == 10)                                       //写入设备失败
                    {
                        string sErrorInfo = $"向设备写入开始动作值失败。错误为:{error}"; //生产执行信息
                        if (mesJobOrder.PROCESS_INFO != sErrorInfo)
                        {
                            mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息
                            PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));
                        }

                        Console.WriteLine(sErrorInfo);
                        return(false);
                    }

                    if (ret == 0)
                    {
                        bWriteSuccess = true;           //写入成功
                    }
                }

                #endregion

                if (bWriteSuccess)
                {
                    Console.WriteLine("给设备发送指令成功.开始进行执行" +
                                      (string.IsNullOrEmpty(curProcess.SUB_JOB_ORDER_NO)
                                          ? curProcess.JOB_ORDER_PKNO
                                          : curProcess.SUB_JOB_ORDER_NO)); //给设备发送动作指令成功
                }

                #endregion

                #region 5. 更新数据 共更新 4 个模块

                #region 5.1 加工控制

                curProcess.PROCESS_STATE      = 2; //正在执行
                curProcess.PROCESS_START_TYPE = 1; //自动开始
                curProcess.PROCESS_START_TIME = DateTime.Now;

                PServiceEvent?.Invoke(d => d.UpdateMesProcessCtrol(curProcess));
                #endregion

                #region 5.2 业务相关处理

                if (curProcess.PROCESS_ACTION_TYPE == 11)            //开始 出库
                {
                    mesJobOrder.ONLINE_QTY = curProcess.PROCESS_QTY; //在线数量
                }

                if (bFirstProcess)  //第一道工序,新增产品信息
                {
                    PServiceEvent?.Invoke(s => s.AddMesProductProcess(productProcess));
                }

                string sError = "";

                string result = DeviceProcessControl.BeginCurBusiness(curProcess, ref sError);  //开始当前控制的业务

                if (result != "OK")
                {
                    mesJobOrder.PROCESS_INFO = $"业务开始执行发生错误,写入数据库错误! 具体:{sError}";
                }

                #endregion

                #region 5.3 Job处理

                if (bFirstProcess)                             //第一道工序
                {
                    mesJobOrder.RUN_STATE      = 20;           //正在执行
                    mesJobOrder.ACT_START_TIME = DateTime.Now; //修改任务开始时间
                }

                PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder));
                #endregion

                #region 5.4 将开始和结束条件 置空

                DeviceMonitor.SetTagSettingValueById(curAction.START_CONDITION_TAG_PKNO, ""); //将检测结果置为空

                FmsAssetTagSetting finishTag = DeviceMonitor.GetTagSettingById(curAction.FINISH_CONDITION_TAG_PKNO);

                if (finishTag != null)
                {
                    if (finishTag.SAMPLING_MODE == 11)
                    {
                        finishTag.SAMPLING_MODE = 10;                                //按照条件开启
                    }
                    DeviceMonitor.SetTagSettingValue(finishTag, "");
                }


                #endregion

                #endregion

                #endregion

                if (startTag != null)
                {
                    FMSControlService.iConditionStartAddPause = 500;  //按条件启动后增加的延时
                }

                FMSControlService.bStart = true;  //本次订单已经启动过了
            }

            return(true);
        }