コード例 #1
0
        } = 3;                                            //
        #region 客户端管理器初始化
        public void Initialize()
        {
            // 导入client
            string path = Path.Combine(PathManager.Instance.GetSettingsPath(), ClientConfigFileName);

            if (File.Exists(path))
            {
                LoadClientFromXmlFile(path);
            }
            else
            {
                _cmmSvrConfigs = new List <CmmServerConfig>();
            }
            // 循环初始化client
            foreach (var config in CmmSvrConfigs)
            {
                CmmClient client = new CmmClient(config);
                client.IsActived = true;
                //client.InitClient(); //
                // 更新UI界面
                ClientUICommon.AddCmmToView(config, client.State);

                _cmmClients.Add(client);
            }
            // 设置心跳信号
            PlcClient.Instance.DisconnectEvent += Plc_DisconnectEvent;
            PlcClient.Instance.ReconnectEvent  += Plc_ReconnectEvent;
            _heartbeatTimer.Start();
        }
コード例 #2
0
        protected override void PerformAction()
        {
            ClientUICommon.RefreshPlcLog("PLC-等待抓取完成");
            Stopwatch sw = new Stopwatch();

            sw.Start();
            while (true)
            {
                if (!_heartbeat)
                {
                    // 更新界面 PLC断开连接
                    break;
                }
                else if (sw.Elapsed > TimeSpan.FromMinutes(10))
                {
                    // 更新界面, PLC发送抓料响应失败
                    break;
                }
                else
                {
                    if (_plcClient.VerifyGripCompleted(_client.CmmSvrConfig.ServerID)) // 抓料完成,调用完成事件
                    {
                        CompletedEventInvoker(this, null);
                        break;
                    }
                }
                Thread.Sleep(1000);
            }
            CompletedEvent -= _client.OnGripCompleted;
            base.PerformAction();
        }
コード例 #3
0
        private bool VerifyCompleted()
        {
            ClientUICommon.RefreshPlcLog("PLC-等待上料完成");
            bool      result = false;
            Stopwatch sw     = new Stopwatch();

            sw.Start();
            while (true)
            {
                if (sw.Elapsed > TimeSpan.FromMinutes(10) || !_heartbeat)
                {
                    // 超时或中断连接跳出
                    result = false;
                    break;
                }
                result = _plcClient.VerifyPlaceCompleted(_client.CmmSvrConfig.ServerID);
                if (result)
                {
                    break;
                }
                Thread.Sleep(1000);
            }
            sw.Stop();
            return(result);
        }
コード例 #4
0
ファイル: PlcClient.cs プロジェクト: AByte-L/hrswauto
        public bool Initialize()
        {
            // 连接时效15s
            //_initTimer = new Timer(new TimerCallback(InitPlcConnect), null, 1000, 2000);
            _hbTimer.Stop();
            _initPlcConnect = false;
            CancellationTokenSource cs = new CancellationTokenSource();

            Task.Factory.StartNew(InitPlcConnect, cs.Token, cs.Token);

            bool result = _initEvent.WaitOne((int)TimeSpan.FromSeconds(15).TotalMilliseconds);

            if (!result)
            {
                ClientUICommon.RefreshPlcConnectState("PLC连接失败");
                _isConnected = false;
                return(false);
            }
            _isConnected = true;
            cs.Cancel();
            ClientUICommon.RefreshPlcConnectState("PLC连接成功");
            //连接成功开启心跳信号
            _hbTimer.Start();
            return(result);
        }
コード例 #5
0
        private bool ReadPartID(out string rfid)
        {
            bool      result = false;
            Stopwatch sw     = new Stopwatch();

            sw.Start();
            while (true)
            {
                if (sw.Elapsed > TimeSpan.FromMinutes(1) || !_heartbeat)
                {
                    // 超时或中断连接跳出
                    result = false;
                    rfid   = string.Empty;
                    break;
                }
                result = _plcClient.VerifyDuringPlacement(_client.CmmSvrConfig.ServerID, out rfid);
                if (result)
                {
                    ClientUICommon.RefreshPlcLog($"PLC-读取RFID : {rfid}");
                    break;
                }
                Thread.Sleep(1000);
            }
            sw.Stop();
            return(result);
        }
コード例 #6
0
 public void InitClient()
 {
     try
     {
         _proxyFactory      = null;
         _proxyFactory      = new ProxyFactory(this);
         _cmmCtrl           = _proxyFactory.GetCmmControl(CmmSvrConfig);
         _partConfigService = _proxyFactory.GetPartConfigService(CmmSvrConfig);
         _IsInitialed       = _cmmCtrl.IsInitialed(); // 返回服务器端是否初始化
         _connected         = true;
         if (_IsInitialed)
         {
             State = ClientState.CS_Idle;
             string cmmError = string.Format($"三坐标{CmmSvrConfig.ServerID} 初始化成功");
             ClientUICommon.RefreshCmmEventLog(cmmError);
         }
         else
         {
             State = ClientState.CS_InitError;  //
             string cmmError = string.Format($"三坐标{CmmSvrConfig.ServerID}没有初始化");
             ClientUICommon.RefreshCmmEventLog(cmmError);
         }
     }
     catch (Exception ex)
     {
         _IsInitialed = false; // 初始化不成功
                               //string cmmError = string.Format($"三坐标{CmmSvrConfig.ServerID} 连接错误");
                               //_connected = false;
                               //ClientUICommon.RefreshCmmEventLog(cmmError);
                               //State = ClientState.CS_ConnectError;
         ReportConnectError(ex);
     }
 }
コード例 #7
0
        protected override void PerformAction()
        {
            ClientUICommon.RefreshPlcLog("PLC-三坐标准备就绪");
            Stopwatch sw = new Stopwatch();

            sw.Start();
            while (true)
            {
                if (!_heartbeat)
                {
                    // 更新界面 PLC断开连接
                    break;
                }
                else if (sw.Elapsed > TimeSpan.FromMinutes(10))
                {
                    // 更新界面, PLC发送准备就绪信号失败
                    break;
                }
                else
                {
                    if (_plcClient.SendCmmReadySignal(_client.CmmSvrConfig.ServerID))
                    {
                        // 等待PLC准备就绪
                        Thread.Sleep(5000);
                        // 开始等待抓料响应
                        ChangeAction(new RobotPlaceRequest(_client));
                        _client.OnPerformPlcRequest();
                        break;
                    }
                }
                Thread.Sleep(1000);
            }
            sw.Stop();
            base.PerformAction();
        }
コード例 #8
0
 public void ClearCmmError(int index)
 {
     if (_cmmClients[index].State == ClientState.CS_InitError)
     {
         if (_cmmClients[index].CmmIsInitialed())
         {
             _cmmClients[index].State = ClientState.CS_Idle;
             string str = "三坐标" + _cmmClients[index].CmmSvrConfig.ServerID.ToString() + "错误恢复";
             ClientUICommon.RefreshCmmEventLog(str);
         }
     }
     if (_cmmClients[index].State == ClientState.CS_Error)
     {
         _cmmClients[index].State = ClientState.CS_Idle;
         string str = "三坐标" + _cmmClients[index].CmmSvrConfig.ServerID.ToString() + "错误恢复";
         ClientUICommon.RefreshCmmEventLog(str);
     }
     // PLC连接错误
     //if (!_plcHeartbeat)
     //{
     //    _cmmClients.ForEach(client =>
     //    {
     //        client.State = ClientState.CS_Idle;
     //        string str = "三坐标服务器" + "复位";
     //        ClientUICommon.RefreshCmmEventLog(str);
     //    });
     //}
 }
コード例 #9
0
        protected override void PerformAction()
        {
            ClientUICommon.RefreshPlcLog("PLC-抓取请求");
            Stopwatch sw = new Stopwatch();

            sw.Start();
            while (true)
            {
                if (!_heartbeat)
                {
                    // 更新界面 PLC断开连接
                    break;
                }
                else if (sw.Elapsed > TimeSpan.FromMinutes(10))
                {
                    // 更新界面, PLC发送抓料响应失败
                    break;
                }
                else
                {
                    if (_plcClient.SendGripRequest(_client.CmmSvrConfig.ServerID, _isPass))
                    {
                        // 开始等待抓料响应
                        ChangeAction(new RobotGripResponse(_client));
                        _client.OnPerformPlcRequest();
                        break;
                    }
                }
                Thread.Sleep(1000);
            }
            base.PerformAction();
        }
コード例 #10
0
        protected override void PerformAction()
        {
            //Stopwatch sw = new Stopwatch();
            //sw.Start();
            //while (true)
            //{
            //    if (!_heartbeat)
            //    {
            //        // 更新界面 PLC断开连接
            //        break;
            //    }
            //    else if (sw.Elapsed > TimeSpan.FromMinutes(10))
            //    {
            //        // 更新界面, PLC发送抓料响应失败
            //        break;
            //    }
            //    else
            //    {
            //        string partID = string.Empty;
            //        //if (_plcClient.VerifyPlaceCompleted(_client.CmmSvrConfig.ServerID, out partID)) // 抓料完成,调用完成事件
            //        //{
            //        //    CompletedEventArgs ce = new CompletedEventArgs(partID);
            //        //    CompletedEventInvoker(this, ce);
            //        //    // 关闭心跳事件
            //        //    break;
            //        //}
            //        if (_plcClient.VerifyDuringPlacement(_client.CmmSvrConfig.ServerID, out partID))
            //        {

            //        }
            //    }
            //    Thread.Sleep(1000);
            //}
            //ClientUICommon.RefreshPlcLog("PLC-等待上料完成");
            string partId = string.Empty;
            var    rdtask = Task.Run(() => ReadPartID(out partId));

            if (rdtask.Result)
            {
                var vftask = Task.Run(() => VerifyCompleted());
                if (vftask.Result)
                {
                    CompletedEventArgs ce = new CompletedEventArgs(partId);
                    CompletedEventInvoker(this, ce);
                }
                else
                {
                    // 报告放置工作出错
                    ClientUICommon.RefreshPlcLog("PLC-上料出错");
                }
            }
            else
            {
                // 报告放置时读取RFID错误
                ClientUICommon.RefreshPlcLog("PLC-读取RFID出错");
            }
            CompletedEvent -= _client.OnGripCompleted;
            base.PerformAction();
        }
コード例 #11
0
        private void ReportConnectError(Exception ex)
        {
            string cmmError = string.Format($"三坐标{CmmSvrConfig.ServerID} 连接异常:{ex.Message}");

            _connected = false;
            ClientUICommon.RefreshCmmEventLog(cmmError);
            State = ClientState.CS_ConnectError;
        }
コード例 #12
0
 public void CmmConnect(int index)
 {
     if (_cmmClients[index].Connected)
     {
         return;
     }
     _cmmClients[index].InitClient();
     ClientUICommon.RefreshCmmViewState(index, _cmmClients[index].State);
 }
コード例 #13
0
        public void ServerInErrorStatus(string message)
        {
            _cmmClient.State     = ClientState.CS_Error;
            _cmmClient.ErrorInfo = message;
            // 刷新三坐标界面显示
            string str = "三坐标" + _cmmClient.CmmSvrConfig.ServerID.ToString() + "错误: " + message;

            ClientUICommon.RefreshCmmEventLog(str);
        }
コード例 #14
0
 /// <summary>
 /// 响应下料完成
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 internal void OnGripCompleted(object sender, EventArgs e)
 {
     // todo 返回料架的事件不定,需要一直监控料架
     PartRack.Instance.RefreshSlots(_resultRecord);
     // 更新总体报告列表
     ClientUICommon.AddCommonReport(_resultRecord);
     // 继续上料
     // todo 定义标志可以停止流程, 比如改变State为Stop状态
     State = ClientState.CS_GripCompleted; //
 }
コード例 #15
0
 public void ClearCmmServerError()
 {
     // 恢复到初始状态
     if (_cmmClient.State == ClientState.CS_InitError || _cmmClient.State == ClientState.CS_Error)
     {
         _cmmClient.State = ClientState.CS_Idle;
         string str = "三坐标" + _cmmClient.CmmSvrConfig.ServerID.ToString() + "错误恢复";
         ClientUICommon.RefreshCmmEventLog(str);
     }
 }
コード例 #16
0
        public void ServerWorkStatus(string message)
        {
            // todo CSFeedback 测试修改状态
            //_cmmClient.State = ClientState.CS_Idle;
            // 不更新三坐标状态
            // 刷新三坐标界面显示
            string str = "三坐标" + _cmmClient.CmmSvrConfig.ServerID.ToString() + ": " + message;

            ClientUICommon.RefreshCmmEventLog(str);
        }
コード例 #17
0
 /// <summary>
 /// 连接三坐标服务器
 /// </summary>
 public void InitClients()
 {
     //foreach (CmmClient client in _cmmClients)
     for (int i = 0; i < _cmmClients.Count; i++)
     {
         if (_cmmClients[i].Connected)
         {
             continue;
         }
         _cmmClients[i].InitClient();
         ClientUICommon.RefreshCmmViewState(i, _cmmClients[i].State); // 初始化是否成功
     }
 }
コード例 #18
0
        private async void cmmConnButton_Click(object sender, EventArgs e)
        {
            int index = comboBox1.SelectedIndex;

            if (!ClientManager.Instance.CmmConnected(index))
            {
                toolStripProgressBar1.Style = ProgressBarStyle.Marquee;
                deleteCmmTsb.Enabled        = false;
                InitClientTsb.Enabled       = false;
                cmmConnButton.Enabled       = false;
                cmmConnButton.Text          = "正在连接";
                bool result = await Task.Run(() =>
                {
                    Stopwatch sw   = new Stopwatch();
                    bool connected = false;
                    sw.Start();
                    while (true)
                    {
                        ClientManager.Instance.CmmConnect(index);
                        connected = ClientManager.Instance.CmmConnected(index);
                        if (connected)
                        {
                            break;
                        }
                        if (sw.Elapsed > TimeSpan.FromSeconds(15))
                        {
                            break;
                        }
                        Thread.Sleep(2000);
                    }
                    sw.Stop();
                    return(connected);
                });

                if (!result)
                {
                    ClientUICommon.RefreshCmmEventLog("连接三坐标服务器失败");
                    cmmConnButton.Enabled = true;
                }
                else
                {
                    comboBox1.Refresh();
                }
                cmmConnButton.Text          = "连接";
                InitClientTsb.Enabled       = true;
                deleteCmmTsb.Enabled        = true;
                toolStripProgressBar1.Style = ProgressBarStyle.Blocks;
            }
        }
コード例 #19
0
 /// <summary>
 /// 响应上料完成
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 internal void OnPlaceCompleted(object sender, CompletedEventArgs e)
 {
     if (!FindPart(e.PartID))
     {
         //SendPartIDErrorSign(e.ClientID);
         //Trace.Write("工件标识错误");
         string str = "三坐标" + CmmSvrConfig.ServerID.ToString() + ":" + "读取工件标识错误";
         ClientUICommon.RefreshCmmEventLog(str);
         State = ClientState.CS_Error; // 设置客户端为错误状态
         return;
     }
     CurPartId = e.PartID;
     State     = ClientState.CS_PlaceCompleted;
     //StartMeasureWorkFlow(e.PartID);
 }
コード例 #20
0
 /// <summary>
 /// 添加客户端
 /// </summary>
 /// <param name="csConf"></param>
 /// <returns>返回false表示客户端已存在,返回true添加成功</returns>
 public bool AddClient(CmmServerConfig csConf)
 {
     // 判断机器是否已经存在
     if (_cmmSvrConfigs.Where(cl => cl.HostIPAddress.Equals(csConf.HostIPAddress)).Count() == 0 && _cmmSvrConfigs.Where(cl => cl.ServerID == csConf.ServerID).Count() == 0)
     {
         _cmmSvrConfigs.Add(csConf); //  添加机器配置信息
         CmmClient client = new CmmClient(csConf);
         client.IsActived = true;
         //client.InitClient(); // 添加client时不做初始化
         _cmmClients.Add(client);
         //
         ClientUICommon.AddCmmToView(csConf, client.State);
         return(true);
     }
     return(false);
 }
コード例 #21
0
 private void UpdateRack()
 {
     while (true)
     {
         if (_plcHbDis)
         {
             break;
         }
         if (_plcClient.ReadUnloadSlot(15, out _slotNumber))
         {
             IsReadOk = true;
             ClientUICommon.RefreshRackView(CurPartResult, _slotNumber);
             break;
         }
         Thread.Sleep(1500);
     }
 }
コード例 #22
0
        public void PullReport()
        {
            //State = ClientState.CS_Busy;
            // 获取当前的cmm和rpt报告文件
            int partCount;

            _resultRecord = null;
            _resultRecord = new ResultRecord();
            lock (syncObj)
            {
                partCount = _partNbSet[CurPartId]; // 获得标识的工件个数
                _resultRecord.PartNumber = ++partCount;
            }
            _resultRecord.PartID       = CurPartId;
            _resultRecord.IsPass       = IsPass;
            _resultRecord.ServerID     = CmmSvrConfig.ServerID;
            _resultRecord.MeasDateTime = DateTime.Now;
            _resultRecord.MeasProgram  = PartConfigManager.Instance.GetPartConfig(CurPartId).ProgFileName;
            bool ok = DownFileFromServer("cmm");

            if (!ok)
            {
                // 更新用户界面
                State = ClientState.CS_Error;
                //ClientUICommon.RefreshCmmViewState(CmmSvrConfig.ServerID, State);
                ClientUICommon.RefreshCmmEventLog("下载结果文件出错");
                return;
            }
            ok = DownFileFromServer("rpt");
            if (!ok)
            {
                // 更新用户界面
                State = ClientState.CS_Error;
                //ClientUICommon.RefreshCmmViewState(CmmSvrConfig.ServerID, State);
                ClientUICommon.RefreshCmmEventLog("下载结果文件出错");
                return;
            }
            // 添加报告记录,并且更改成可继续测量状态
            resultRecords.Add(_resultRecord);
            //ClientUICommon.AddPartResult(_resultRecord);
            State = ClientState.CS_Grip;
        }
コード例 #23
0
        /// <summary>
        /// 三坐标连接心跳信号
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _heartbeatTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            _heartbeatTimer.Stop();
            // 没有三坐标
            //if (_cmmClients.Count == 0)
            //{
            //    return;
            //}
            try
            {
                for (int i = 0; i < _cmmClients.Count; i++)
                {
                    bool oldConnected = _cmmClients[i].Connected;
                    _cmmClients[i].QueryCmmServer();
                    if (!_cmmClients[i].Connected)
                    {
                        _cmmClients[i].State = ClientState.CS_ConnectError;
                        //ClientUICommon.RefreshCmmStatus(i);
                        if (oldConnected)
                        {
                            ClientUICommon.RefreshCmmViewState(i, _cmmClients[i].State);
                            ClientUICommon.RefreshCmmEventLog($"三坐标{_cmmClients[i].CmmSvrConfig.ServerID} 连接错误。");
                            oldConnected = false;
                        }
                        // todo 这里有调试错误
                    }
                }
            }
            catch (Exception)
            {
                // todo 主界面退出后可能还会启动几轮心跳信号
            }

            //_cmmClients.ForEach(cmm =>
            //{
            //});
            _heartbeatTimer.Start();
        }