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, "上料检测退出");
}
}
}