} = 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(); }
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(); }
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); }
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); }
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); }
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); } }
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(); }
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); // }); //} }
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(); }
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(); }
private void ReportConnectError(Exception ex) { string cmmError = string.Format($"三坐标{CmmSvrConfig.ServerID} 连接异常:{ex.Message}"); _connected = false; ClientUICommon.RefreshCmmEventLog(cmmError); State = ClientState.CS_ConnectError; }
public void CmmConnect(int index) { if (_cmmClients[index].Connected) { return; } _cmmClients[index].InitClient(); ClientUICommon.RefreshCmmViewState(index, _cmmClients[index].State); }
public void ServerInErrorStatus(string message) { _cmmClient.State = ClientState.CS_Error; _cmmClient.ErrorInfo = message; // 刷新三坐标界面显示 string str = "三坐标" + _cmmClient.CmmSvrConfig.ServerID.ToString() + "错误: " + message; ClientUICommon.RefreshCmmEventLog(str); }
/// <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; // }
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); } }
public void ServerWorkStatus(string message) { // todo CSFeedback 测试修改状态 //_cmmClient.State = ClientState.CS_Idle; // 不更新三坐标状态 // 刷新三坐标界面显示 string str = "三坐标" + _cmmClient.CmmSvrConfig.ServerID.ToString() + ": " + message; ClientUICommon.RefreshCmmEventLog(str); }
/// <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); // 初始化是否成功 } }
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; } }
/// <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); }
/// <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); }
private void UpdateRack() { while (true) { if (_plcHbDis) { break; } if (_plcClient.ReadUnloadSlot(15, out _slotNumber)) { IsReadOk = true; ClientUICommon.RefreshRackView(CurPartResult, _slotNumber); break; } Thread.Sleep(1500); } }
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; }
/// <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(); }