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
|
/// <summary>
|
/// 上料检类构造函数
|
/// </summary>
|
/// <param name="_opcConfig">OPC配置对象引用</param>
|
/// <param name="_ipImage">图象处理对象引用</param>
|
public UpLoadDetection(ConfigStruct _opcConfig, ImageProcess _ipImage)
|
{
|
opcConfig = _opcConfig;
|
ipImage = _ipImage;
|
robotServer = new TcpListener(IPAddress.Parse(opcConfig.loadRobotConfig.localIpAddress), opcConfig.loadRobotConfig.port);
|
}
|
|
/// <summary>
|
/// 启动检测线程
|
/// </summary>
|
public void Start()
|
{
|
loadProcesser = new Thread(Execute);
|
loadProcesser.Start();
|
}
|
|
public void Stop()
|
{
|
if (loadProcesser != null && loadProcesser.IsAlive)
|
{
|
loadProcesser.Abort();
|
loadProcesser.Join();
|
}
|
loadProcesser = null;
|
}
|
|
/// <summary>
|
/// 启动对机械手臂监听
|
/// </summary>
|
/// <returns>是否正常启动</returns>
|
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("上料机械手臂机械手臂监听服务已关闭"));
|
}
|
|
/// <summary>
|
/// 执行和机械手臂会话,处理上料检测结果。
|
/// 连结是否需要多次建立还 是只建立一次?
|
/// </summary>
|
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, "上料检测退出");
|
}
|
}
|
}
|