115 lines
4.5 KiB
C#
115 lines
4.5 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Text;
|
||
using System.Data;
|
||
using ICommLayer;
|
||
using DBFactory;
|
||
using System.Net;
|
||
namespace SocketsUDP
|
||
{
|
||
/// <summary>
|
||
/// 使用SocketsUDP的客户端进行通讯
|
||
/// 获得设备状态
|
||
/// 创建者:Richard.Liu
|
||
/// </summary>
|
||
public class CGetDeviceState:IGetDeviceState
|
||
{
|
||
string _commLayerError;
|
||
|
||
public string CommLayerError
|
||
{
|
||
get { return _commLayerError; }
|
||
set { _commLayerError = value; }
|
||
}
|
||
|
||
//CClientUDP ccuR = new CClientUDP();
|
||
DBOperator dbo = new DBOperator();
|
||
public CGetDeviceState()
|
||
{
|
||
dbo.Open();
|
||
|
||
}
|
||
|
||
public int [] GetDeviceState(int DeviceIndex,int TaskIndex)
|
||
{
|
||
try
|
||
{
|
||
|
||
//根据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 null;
|
||
}
|
||
int[] _IntData = new int[14];
|
||
byte[] _GetData = new byte[16];
|
||
int[] _sIntdata = new int[8];
|
||
int wIntXor = 0;
|
||
byte[] _temp = new byte[2];
|
||
//对接收到的数据进行检查核实处理,考虑循环接收
|
||
CClientUDP.ReceiveUdp();
|
||
System.Threading.Thread.Sleep(300);
|
||
_GetData = CClientUDP.ByteData;
|
||
if (_GetData != null)
|
||
{
|
||
//对接收到的数据进行检查核实处理,考虑循环接收
|
||
//把两个字节转换成一个字
|
||
for (int i = 0; i <= 6; i++)
|
||
{
|
||
_temp[0] = _GetData[(2 * i)];
|
||
_temp[1] = _GetData[(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 = wIntXor ^ _sIntdata[i];
|
||
}
|
||
_sIntdata[7] = wIntXor;
|
||
|
||
_temp[0] =_GetData[14] ;
|
||
_temp[1]=_GetData[15] ;
|
||
wIntXor=CommonClassLib.CCarryConvert.GetInt16FromBytes(_temp);
|
||
if (wIntXor != _sIntdata[7])//检验不对,等于没收到
|
||
{
|
||
CClientUDP.CloseUDP();
|
||
_commLayerError = this.ToString() + ":GetDeviceState---" + CClientUDP.UdpError;
|
||
return null;
|
||
|
||
}
|
||
_IntData[0] = Convert.ToInt16(_GetData[6]);//实际值
|
||
_IntData[1] = Convert.ToInt16(_GetData[4]);//消息:1-任务完成 2-报告坐标(对于堆垛机) 3-检测开关状态 其它值故障代码
|
||
_IntData[2] = Convert.ToUInt16(_GetData[3] + (_GetData[2] * 256)); ;//任务号TaskIndex
|
||
_IntData[3] = Convert.ToInt16(_GetData[6]);//堆垛机x坐标
|
||
_IntData[4] = Convert.ToInt16(_GetData[7]);//堆垛机y坐标
|
||
_IntData[5] = DeviceIndex;// 设备号
|
||
CClientUDP.CloseUDP();
|
||
return _IntData;
|
||
}
|
||
else
|
||
{
|
||
CClientUDP.CloseUDP();
|
||
_commLayerError = this.ToString() + ":GetDeviceState---" + CClientUDP.UdpError;
|
||
return null;
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
CClientUDP.CloseUDP();
|
||
_commLayerError = this.ToString() + ":GetDeviceState---" + ex.Message;
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
}
|