using System; using System.Collections.Generic; using System.Drawing.Text; using System.Linq; using System.Net; using System.Text; using System.Net.Sockets; using System.Threading; using System.Windows.Forms.VisualStyles; using HalconDotNet; namespace M423project { public class ProductDeltaPosition { public string[] deltaloadRowStr = new string[2]; public string[] deltaloadColumnStr = new string[2]; public string[] deltaloadAngleStr = new string[2]; public double[] deltaloadRow = new double[2]; public double[] deltaloadColumn = new double[2]; public double[] deltaloadAngle = new double[2]; } //上料检测类 public class UpLoadDetection { #region 上料检测相关私有成员 private ConfigStruct opcConfig; private TcpListener robotServer; private ImageProcess ipImage; private Thread loadProcesser; private VisionDetect vd = new VisionDetect(); #endregion /// /// 上料检类构造函数 /// /// OPC配置对象引用 /// 图象处理对象引用 public UpLoadDetection(ConfigStruct _opcConfig, ImageProcess _ipImage) { opcConfig = _opcConfig; ipImage = _ipImage; robotServer = new TcpListener(IPAddress.Parse(opcConfig.loadRobotConfig.localIpAddress), opcConfig.loadRobotConfig.port); } /// /// 启动检测线程 /// public void Start() { loadProcesser = new Thread(Execute); loadProcesser.Start(); } public void Stop() { if (loadProcesser != null && loadProcesser.IsAlive) { loadProcesser.Abort(); loadProcesser.Join(); } loadProcesser = null; } /// /// 启动对机械手臂监听 /// /// 是否正常启动 public bool OpenListener() { try { robotServer.Start(); CommonUtil.WriteLog(LogType.Inf, string.Format("上料机械手臂监听服务已启动,绑定地址:{0},端口:{1}", opcConfig.loadRobotConfig.localIpAddress, opcConfig.loadRobotConfig.port)); return true; } catch (Exception e) { CommonUtil.WriteLog(LogType.Exc, string.Format("上料机械手臂监听服务启动失败:{0}", e.Message)); return false; } } public void CloseListener() { robotServer.Stop(); CommonUtil.WriteLog(LogType.Inf, string.Format("上料机械手臂机械手臂监听服务已关闭")); } /// /// 执行和机械手臂会话,处理上料检测结果。 /// 连结是否需要多次建立还 是只建立一次? /// public void Execute() { TcpClient robortClient = null; NetworkStream netStream = null; byte[] recvBuf = new byte[1024]; byte[] sendBuf; // //int batteryStatus = 10; //int batteryNumber = 0; InitPosition initPosition = default(InitPosition); HObject imageIntrest = new HObject(); ProductDeltaPosition productDeltaPosition = new ProductDeltaPosition(); HTuple ScoreTriRects = new HTuple(), ScoreTriAngles = new HTuple(); // while (true) { try { while (!robotServer.Pending()) Thread.Sleep(10); robortClient = robotServer.AcceptTcpClient(); string timeStr = DateTime.Now.ToString("hh:mm:ss fff"); CommonUtil.WriteLog(LogType.Inf, string.Format("上料机械手臂已连接:{0}, {1}, {2}", robortClient.Client.RemoteEndPoint, timeStr, CommonUtil.StepControl.ToString())); netStream = robortClient.GetStream(); while ( robortClient.Connected && !netStream.DataAvailable) Thread.Sleep(10); if (!robortClient.Connected) continue; //每次一个,完成断开 int n = 0; n = netStream.Read(recvBuf, 0, 1024); while (n > 0) { #region 接收处理 string receivedMsg = System.Text.Encoding.ASCII.GetString(recvBuf, 0, n); string sendMsg = string.Empty; // 处理接收到的数据。 if (receivedMsg.Contains("slgrab")) { sendMsg = "ok"; } if (receivedMsg.Contains("num")) { sendMsg = "2";//batteryStatus.ToString(); } if (receivedMsg.Contains("slrate")) { sendMsg = opcConfig.loadRbtSpeed.ToString(); } if (receivedMsg.Contains("sldata")) { sendMsg = productDeltaPosition.deltaloadColumnStr[0] + "," + productDeltaPosition.deltaloadRowStr[0] + "," + "+000.000" + "," + productDeltaPosition.deltaloadColumnStr[1] + "," + productDeltaPosition.deltaloadRowStr[1] + "," + "+000.000"; sendMsg = "+000.000,+000.000,+000.000,+000.000,+000.000,+000.000"; } if (receivedMsg.Contains("1")) { initPosition.x1 = opcConfig.loadPosition11.x; initPosition.y1 = opcConfig.loadPosition11.y; initPosition.a1 = opcConfig.loadPosition11.angle; initPosition.x2 = opcConfig.loadPosition12.x; initPosition.y2 = opcConfig.loadPosition12.y; initPosition.a2 = opcConfig.loadPosition12.angle; sendMsg = "1"; } if (receivedMsg.Contains("2")) { initPosition.x1 = opcConfig.loadPosition21.x; initPosition.y1 = opcConfig.loadPosition21.y; initPosition.a1 = opcConfig.loadPosition21.angle; initPosition.x2 = opcConfig.loadPosition22.x; initPosition.y2 = opcConfig.loadPosition22.y; initPosition.a2 = opcConfig.loadPosition22.angle; sendMsg = "2"; } if (receivedMsg.Contains("3")) { initPosition.x1 = opcConfig.loadPosition31.x; initPosition.y1 = opcConfig.loadPosition31.y; initPosition.a1 = opcConfig.loadPosition31.angle; initPosition.x2 = opcConfig.loadPosition32.x; initPosition.y2 = opcConfig.loadPosition32.y; initPosition.a2 = opcConfig.loadPosition32.angle; sendMsg = "3"; } if (receivedMsg.Contains("4")) { initPosition.x1 = opcConfig.loadPosition41.x; initPosition.y1 = opcConfig.loadPosition41.y; initPosition.a1 = opcConfig.loadPosition41.angle; initPosition.x2 = opcConfig.loadPosition42.x; initPosition.y2 = opcConfig.loadPosition42.y; initPosition.a2 = opcConfig.loadPosition42.angle; sendMsg = "4"; } if (receivedMsg.Contains("5")) { initPosition.x1 = opcConfig.loadPosition51.x; initPosition.y1 = opcConfig.loadPosition51.y; initPosition.a1 = opcConfig.loadPosition51.angle; initPosition.x2 = opcConfig.loadPosition52.x; initPosition.y2 = opcConfig.loadPosition52.y; initPosition.a2 = opcConfig.loadPosition52.angle; sendMsg = "5"; } if (receivedMsg.Contains("6")) { initPosition.x1 = opcConfig.loadPosition61.x; initPosition.y1 = opcConfig.loadPosition61.y; initPosition.a1 = opcConfig.loadPosition61.angle; initPosition.x2 = opcConfig.loadPosition62.x; initPosition.y2 = opcConfig.loadPosition62.y; initPosition.a2 = opcConfig.loadPosition62.angle; sendMsg = "6"; } if (receivedMsg.Contains("7")) { initPosition.x1 = opcConfig.loadPosition71.x; initPosition.y1 = opcConfig.loadPosition71.y; initPosition.a1 = opcConfig.loadPosition71.angle; initPosition.x2 = opcConfig.loadPosition72.x; initPosition.y2 = opcConfig.loadPosition72.y; initPosition.a2 = opcConfig.loadPosition72.angle; sendMsg = "7"; } if (receivedMsg.Contains("8")) { initPosition.x1 = opcConfig.loadPosition81.x; initPosition.y1 = opcConfig.loadPosition81.y; initPosition.a1 = opcConfig.loadPosition81.angle; initPosition.x2 = opcConfig.loadPosition82.x; initPosition.y2 = opcConfig.loadPosition82.y; initPosition.a2 = opcConfig.loadPosition82.angle; sendMsg = "8"; } if (receivedMsg.Contains("9")) { initPosition.x1 = opcConfig.loadPosition91.x; initPosition.y1 = opcConfig.loadPosition91.y; initPosition.a1 = opcConfig.loadPosition91.angle; initPosition.x2 = opcConfig.loadPosition92.x; initPosition.y2 = opcConfig.loadPosition92.y; initPosition.a2 = opcConfig.loadPosition92.angle; sendMsg = "9"; } if (receivedMsg.Contains("10")) { initPosition.x1 = opcConfig.loadPosition101.x; initPosition.y1 = opcConfig.loadPosition101.y; initPosition.a1 = opcConfig.loadPosition101.angle; initPosition.x2 = opcConfig.loadPosition102.x; initPosition.y2 = opcConfig.loadPosition102.y; initPosition.a2 = opcConfig.loadPosition102.angle; sendMsg = "10"; }// 结束 if (sendMsg != string.Empty) { sendBuf = System.Text.Encoding.ASCII.GetBytes(sendMsg); netStream.Write(sendBuf, 0, sendBuf.Length); } Thread.Sleep(20); n = netStream.Read(recvBuf, 0, 1024); #endregion } Thread.Sleep(10); } catch (Exception) { break; } finally { if (netStream != null) netStream.Close(); if (robortClient != null) robortClient.Close(); } Thread.Sleep(10); } CommonUtil.WriteLog(LogType.Inf, "上料检测退出"); } } }