using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Data;
using DBFactory;
namespace CommonLibrary
{
public static class CConnectTCPIP
{
static bool _exitThread = false;
static string _tcpServerError;
static int[] _plcValues;
public static int[] PlcValues
{
get { return CConnectTCPIP._plcValues; }
set { CConnectTCPIP._plcValues = value; }
}
///
/// 监听接收AGV发送的数据时发生的故障
///
public static string TcpServerError
{
get { return CConnectTCPIP._tcpServerError; }
set { CConnectTCPIP._tcpServerError = value; }
}
static string _receiveOK=null;
///
/// 监听到该AGV车的所有队列完成
///
public static string ReceiveOK
{
get { return CConnectTCPIP._receiveOK; }
set { CConnectTCPIP._receiveOK = value; }
}
static Thread mythread;
static Socket Localsocket;
static bool ConnectedServer = false;
static byte[] _GetData = new byte[6];
static CGetState agvstate = new CGetState();
static DBOperator dbo = new DBOperator();
static DBOperator dboM = new DBOperator("ManConnString", "ManDBFactory");
///
/// 开始监听接收到的数据
///
private static void BeginListen()
{
while (true)
{
if (_exitThread == true)
{
mythread.Abort();
return;
}
try
{
if (ConnectedServer == false)
{
if (ConnectTcpIPServer() == false) continue;
}
Localsocket.Listen(1);
try
{
SocketsTCPIP.CClientTCPIP.ClientSocket.Receive(_GetData);
if (_GetData[0] == 0) continue;
CommonClassLib.CCarryConvert.WriteDarkCasket("ReceiveAGV", "SocketsTCPIP.CConnectTCPIP", "Receive", "1000", _GetData);
}
catch
{
continue;
}
//处理接收到数据
if (_GetData != null)
{
if ((_GetData[0] == 70))
{
////管理任务与AGV车号绑定
//int AgvNo, taskindex, MonitorIndex, taskkind;
//MonitorIndex = Convert.ToInt32(_GetData[3] * Math.Pow(2, 8) + _GetData[2]);
//AgvNo = Convert.ToInt32(_GetData[5] * Math.Pow(2, 8) + _GetData[4]);
//taskindex = ccf.GetAgvTaskIndex(MonitorIndex);
//taskkind = ccf.GetManageTaskKindIndex(MonitorIndex);
//dbo.ExceSQL("update t_base_monitor_task set f_agvno=" + AgvNo + " where f_managetaskindex=" + taskindex + " and f_managetaskkindindex=" + taskkind);
//dbo.ExceSQL("update t_base_monitor_task set f_deviceindex =" + AgvNo + " where f_managetaskindex=" + taskindex + " and f_deviceindex<=12 and f_managetaskkindindex=" + taskkind);
//任务完成
agvstate.ActionComplete(Convert.ToInt32(_GetData[5] * Math.Pow(2, 8) + _GetData[4]), Convert.ToInt32(_GetData[3] * Math.Pow(2, 8) + _GetData[2]));
}
if ((_GetData[0] == 81))
{
//AGV已经完成“删除监控下达的任务”(81+任务号),是否在此向PCS反馈AGV状态readystatus把3改为0
}
if ((_GetData[0] == 86))
{
////AGV下线(86+任务号+AGV车号),监控把AGV正在执行的任务自动复位
//dbo.ExceSQL("update t_base_monitor_task set F_STATUS=0 where F_STATUS>0 and F_DEVICEINDEX=" + Convert.ToInt32(_GetData[5] * Math.Pow(2, 8) + _GetData[4]));
//dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(_GetData[5] * Math.Pow(2, 8) + _GetData[4]));
}
if ((_GetData[0] == 87))
{
////AGV上报地标点(87+任务号+AGV车号+地标点)地标点==284时上报PCS离开称料区(PCS地址251)
////if (Convert.ToInt32(_GetData[7] * Math.Pow(2, 8) + _GetData[6]) == 284)
////{
//int fid = ccf.GetAgvTaskIndex(Convert.ToInt32(_GetData[3] * Math.Pow(2, 8) + _GetData[2]));
//dboM.ExceSQL("update agvtask set CurrentLocation=251 where taskindex=" + fid);
////}
}
else if ((_GetData[0] == 71))//任务开始
{//报告小车号
//ccf.ActionRecordAgvNo(0, Convert.ToInt32(_GetData[3] * Math.Pow(2, 8) + _GetData[2]), Convert.ToInt32(_GetData[5] * Math.Pow(2, 8) + _GetData[4]));
}
//82 是否接受任务:1拒绝;0接受;
else if ((_GetData[4] == 1) && (_GetData[0] == 82))//AGV是否接受任务:0接受;1拒绝;
{
agvstate.ActionError(0, Convert.ToInt32(_GetData[3] * Math.Pow(2, 8) + _GetData[2]), 82);
}
//77 上报输送机完成的小车号是否正确:1错误;0正确;
else if ((_GetData[4] == 0) && (_GetData[0] == 77))//0车号正确;
{
//agvstate.ActionComplete(Convert.ToInt32(_GetData[5] * Math.Pow(2, 8) + _GetData[4]), Convert.ToInt32(_GetData[3] * Math.Pow(2, 8) + _GetData[2]));
//_receiveOK = agvstate.ActionOK;
//agvstate.ActionOK = null;
}
else if ((_GetData[4] == 1) && (_GetData[0] == 77))//1车号错误;
{
//agvstate.ActionError(0, Convert.ToInt32(_GetData[3] * Math.Pow(2, 8) + _GetData[2]), 77);
}
}
}
catch (SocketException ex)
{
//SocketsTCPIP.CClientTCPIP.IfInit = false;
ConnectedServer = false;
_tcpServerError = "CConnectTCPIP.BeginListen:" + ex.Message;
}
}
}
///
/// 连接远程主机和绑定本地主机端口
///
///
public static bool ConnectTcpIPServer()
{
string remoteIP; int remotePort; string localIP; int localPort;
try
{
//根据DeviceIndex,得到Sockets通讯的初始设置
DataView dv = dbo.ExceSQL("SELECT F_DeviceIndex,F_DeviceKindIndex, F_LocalIP, F_LocalPort, F_RemoteIP, F_RemotePort FROM T_Base_Device where F_DeviceIndex=0 and F_DeviceKindIndex=6").Tables[0].DefaultView;
if (dv.Count == 0)
{
return false;
}
else
{
remoteIP = (dv[0]["F_RemoteIP"]).ToString();
localIP = (dv[0]["F_LocalIP"]).ToString();
remotePort =Convert.ToInt32 (dv[0]["F_RemotePort"]);
localPort =Convert.ToInt32 (dv[0]["F_LocalPort"]);
}
IPAddress ipAddress = IPAddress.Parse(localIP);
IPEndPoint EPlocal = new IPEndPoint(ipAddress, localPort);
// Create a TCP/IP socket.
if (Localsocket == null)
{
Localsocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
Localsocket.Bind((EndPoint)EPlocal);
}
if (SocketsTCPIP.CClientTCPIP.IfInit == false)
{
if (SocketsTCPIP.CClientTCPIP.InitClientTCPIP(remoteIP,remotePort) == false)
{
_tcpServerError = SocketsTCPIP.CClientTCPIP.TcpError;
return false;
}
}
ConnectedServer = true;
return ConnectedServer;
}
catch (Exception ex)
{
_tcpServerError = "CConnectTCPIP.ConnectTcpIPServer:" + ex.Message;
return false;
}
}
public static void EndListen()
{
_exitThread = true;
if (SocketsTCPIP.CClientTCPIP.ClientSocket != null)
{
SocketsTCPIP.CClientTCPIP.ClientSocket.Close();
}
if (mythread != null)
{
mythread.Abort();
}
}
public static void StartListen()
{
mythread = new Thread(new ThreadStart(BeginListen));
mythread.Start();
}
}
}