using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Threading;
using Microsoft.VisualBasic;
using DBFactory;
using ICommLayer;
using System.Net;
namespace SocketsUDP
{
///
/// 使用SocketsUDP的客户端进行通讯
/// 发送设备命令类
/// 创建者:Richard.Liu
///
public class CSendDeviceOrder: ISendDeviceOrder
{
string _commLayerError;
public string CommLayerError
{
get { return _commLayerError; }
set { _commLayerError = value; }
}
DBOperator dbo = new DBOperator();
//CClientUDP ccuR = new CClientUDP();
public CSendDeviceOrder()
{
dbo.Open();
}
//~CSendDeviceOrder()
//{
// dbo.Close();
//}
///
/// 发送堆垛机命令
///
/// 消息编号
/// 任务编号
/// 堆垛机命令字
///单叉单进伸:
///1-复位
///2-将取
///3-将送
///4-取货
///5-放货
///6-取放货
///双叉单进伸:
///1-复位
///2-将取
///3-将送
///4-左叉取货
///5-左叉放货
///6-左叉取放货
///14-右叉取货
///15-右叉放货
///16-右叉取放货
///24-双叉取货
///25-双叉放货
///26-双叉取放货
///单叉双进伸:
///1-复位
///2-将取
///3-将送
///4-近位取货
///5-近位放货
///6-近位取放货
///14-远位取货
///15-远位放货
///16-远位取放货
/// 设备编号
/// 起始x坐标,列-沿轨道方向
/// 起始y坐标,层-高度方向
/// 起始z坐标,排-面向堆垛机操作面板,1-左侧,2-右侧
/// 目标x坐标,列-沿轨道方向
/// 目标y坐标,层-高度方向
/// 目标z坐标,排-面向堆垛机操作面板,1-左侧,2-右侧
/// 发送堆垛机命令是否成功
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ)
{
try
{
byte[] _Sdata = new byte[16];
ushort[] _sIntdata = new ushort[8];
ushort wIntXor = 0;
byte[] _temp = new byte[2];
_Sdata[0] = 16;
_Sdata[1] = Convert.ToByte(MessageIndex);
_temp=CommonClassLib.CCarryConvert.GetByteFromInt16(Convert.ToUInt16( TaskIndex));
_Sdata[2] = _temp[0];//高八位
_Sdata[3] = _temp[1];//低八位
_Sdata[4] = Convert.ToByte(Order);
_Sdata[5] = Convert.ToByte(DeviceIndex);
_Sdata[6] = Convert.ToByte(StartX);
_Sdata[7] = Convert.ToByte(StartY);
_Sdata[8] = Convert.ToByte(StartZ);
_Sdata[9] = Convert.ToByte(EndX);
_Sdata[10] = Convert.ToByte(EndY);
_Sdata[11] = Convert.ToByte(EndZ);
_Sdata[12] = 0;
_Sdata[13] = 0;
_Sdata[14] = 0;
//把两个字节转换成一个字
for (int i = 0; i <= 6; i++)
{
_temp[0] = _Sdata[(2 * i)];
_temp[1] = _Sdata[(2 * i+1)];
_sIntdata[i] = CommonClassLib.CCarryConvert.GetInt16FromBytes(_temp);
}
//0字到5字(0--11字节)异或值放入第7个字(14和15字节);第六字(12和13字节)默认值0不参与异或
wIntXor = _sIntdata[0];
for (int i = 1; i <= 5; i++)
{
wIntXor =(ushort)( wIntXor ^ _sIntdata[i]);
}
_sIntdata[7] = wIntXor;
_temp=CommonClassLib.CCarryConvert.GetByteFromInt16(_sIntdata[7]);
_Sdata[14] =_temp[0];
_Sdata[15] = _temp[1];
//根据DeviceIndex,得到Sockets通讯的初始设置
DataSet ds = dbo.ExceSQL("SELECT F_DeviceIndex,F_DeviceKindIndex, F_LocalIP, F_LocalPort, F_RemoteIP, F_RemotePort FROM T_Base_Device where F_DeviceIndex=" + DeviceIndex);
DataView dv = ds.Tables[0].DefaultView;
if (ds.Tables[0].DefaultView.Count > 0)
{
CClientUDP.RemoteServer = (EndPoint)new IPEndPoint(IPAddress.Parse(dv[0]["F_RemoteIP"].ToString()), Convert.ToInt32(dv[0]["F_RemotePort"]));
CClientUDP.LocalServer = (EndPoint)new IPEndPoint(IPAddress.Parse(dv[0]["F_LocalIP"].ToString()), Convert.ToInt32(dv[0]["F_LocalPort"]));
CClientUDP.ReceiveUdp(dv[0]["F_LocalIP"].ToString(), Convert.ToInt32(dv[0]["F_LocalPort"]));
}
else
{
return false;
}
//////////////////////////////////////考虑重发
if (CClientUDP.SendUdp(_Sdata) == true)
{
Thread.Sleep(300);
CClientUDP.ReceiveUdp();
byte[] _GetData = CClientUDP.ByteData;
if (_GetData != null)
{
//if ((_GetData[0] == 8) && (_GetData[1] == 240) && (_GetData[2] == MessageIndex) &&
// ((_GetData[3] * Math.Pow(2, 8) + _GetData[4]) == TaskIndex) &&
// (_GetData[5] == DeviceIndex) && (_GetData[6] == 170))
//{
// //////////////////////////////////////考虑重发
// byte GXor = 0;
// GXor = _GetData[0];
// for (int i = 1; i <= 6; i++)
// {
// GXor = Convert.ToByte(Convert.ToInt16(GXor) ^ Convert.ToInt16(_GetData[i]));
// }
// if (GXor == _GetData[7])
// {
CClientUDP.CloseUDP();
return true;
// }
// else
// {
// ccu.CloseUDP();
// return false;
// }
//}
//else
//{
// ccu.CloseUDP();
// return false;
//}
}
else
{
CClientUDP.CloseUDP();
return false;
}
}
else
{
CClientUDP.CloseUDP();
_commLayerError = this.ToString() + ":SendDeviceOrder---" + CClientUDP.UdpError;
return false;
}
}
catch (Exception ex)
{
CClientUDP.CloseUDP();
_commLayerError = this.ToString() + ":SendDeviceOrder---" + ex.Message;
return false;
}
}
///
/// 发送堆垛机以外的其它设备命令
///
/// 消息编号
/// 任务编号
/// 命令字
/// 穿梭车命令字:
///1-复位
///2-左接货
///3-左送货
///4-右接货
///5-右送货
///6-停止
///7-运动到1#位置
///8-运动到2#位置
/// …
///输送机、台车命令字:
///1-入库(朝向库)
/// 2-出库(背向库)
/// 3-送货
/// 4-停止
/// 设备编号
/// 发送其它设备命令是否成功
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex)
{
try
{
byte[] _Sdata = new byte[16];
byte WXor = 0;
_Sdata[0] = 16;
_Sdata[1] = Convert.ToByte(MessageIndex);
_Sdata[2] = Convert.ToByte(TaskIndex >> 8);//高八位
_Sdata[3] = Convert.ToByte(TaskIndex & 255);//低八位
_Sdata[4] = Convert.ToByte(Order);
_Sdata[5] = Convert.ToByte(DeviceIndex);
_Sdata[6] = 0;
_Sdata[7] = 0;
_Sdata[8] = 0;
_Sdata[9] = 0;
_Sdata[10] = 0;
_Sdata[11] = 0;
_Sdata[12] = 0;
_Sdata[13] = 0;
_Sdata[14] = 0;
WXor = _Sdata[0];
for (int i = 1; i <= 14; i++)
{
WXor = Convert.ToByte(Convert.ToInt16(WXor) ^ Convert.ToInt16(_Sdata[i]));
}
_Sdata[15] = WXor;
//根据DeviceIndex,得到Sockets通讯的初始设置
DataSet ds = dbo.ExceSQL("SELECT F_DeviceIndex,F_DeviceKindIndex, F_LocalIP, F_LocalPort, F_RemoteIP, F_RemotePort FROM T_Base_Device where F_DeviceIndex=" + DeviceIndex);
DataView dv = ds.Tables[0].DefaultView;
if (ds.Tables[0].DefaultView.Count > 0)
{
CClientUDP.RemoteServer = (EndPoint)new IPEndPoint(IPAddress.Parse(dv[0]["F_RemoteIP"].ToString()), Convert.ToInt32(dv[0]["F_RemotePort"]));
CClientUDP.LocalServer = (EndPoint)new IPEndPoint(IPAddress.Parse(dv[0]["F_LocalIP"].ToString()), Convert.ToInt32(dv[0]["F_LocalPort"]));
CClientUDP.ReceiveUdp(dv[0]["F_LocalIP"].ToString(), Convert.ToInt32(dv[0]["F_LocalPort"]));
}
else
{
return false;
}
//////////////////////////////////////考虑重发
if (CClientUDP.SendUdp(_Sdata) == true)
{
Thread.Sleep(300);
byte[] _GetData = CClientUDP.ByteData;
if (_GetData != null)
{
if ((_GetData[0] == 8) && (_GetData[1] == 240) && (_GetData[2] == MessageIndex) &&
((_GetData[3] * Math.Pow(2, 8) + _GetData[4]) == TaskIndex) &&
(_GetData[5] == DeviceIndex) && (_GetData[6] == 170))
{
//////////////////////////////////////考虑重发
byte GXor = 0;
GXor = _GetData[0];
for (int i = 1; i <= 6; i++)
{
GXor = Convert.ToByte(Convert.ToInt16(GXor) ^ Convert.ToInt16(_GetData[i]));
}
if (GXor == _GetData[7])
return true;
else
return false;
}
else
return false;
}
else
{
_commLayerError = this.ToString() + ":SendDeviceOrder---" + CClientUDP.UdpError;
return false;
}
}
else
{
_commLayerError = this.ToString() + ":SendDeviceOrder---" + CClientUDP.UdpError;
return false;
}
}
catch (Exception ex)
{
_commLayerError = this.ToString() + ":SendDeviceOrder---" + ex.Message;
return false;
}
}
}
}