506 lines
17 KiB
C#
506 lines
17 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Net.Sockets;
|
|
using System.Threading;
|
|
using System.Net;
|
|
using System.Globalization;
|
|
|
|
namespace AGVSystem
|
|
{
|
|
public class Soc_Client
|
|
{
|
|
public string IPAdress;
|
|
public bool connected = false;
|
|
public Socket clientSocket;
|
|
private IPEndPoint hostEndPoint;
|
|
private AutoResetEvent autoConnectEvent = new AutoResetEvent(false);
|
|
private SocketAsyncEventArgs lisnterSocketAsyncEventArgs;
|
|
|
|
public delegate void StartListeHandler();
|
|
public event StartListeHandler StartListen;
|
|
|
|
public delegate void ReceiveMsgHandler(byte[] info);
|
|
public event ReceiveMsgHandler OnMsgReceived;
|
|
|
|
private List<SocketAsyncEventArgs> s_lst = new List<SocketAsyncEventArgs>();
|
|
|
|
public Soc_Client(string hostName, int port)
|
|
{
|
|
IPAdress = hostName;
|
|
IPAddress[] hostAddresses = Dns.GetHostAddresses(hostName);
|
|
this.hostEndPoint = new IPEndPoint(hostAddresses[hostAddresses.Length - 1], port);
|
|
this.clientSocket = new Socket(this.hostEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
|
}
|
|
/// <summary>
|
|
/// 连接服务端
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
private bool Connect()
|
|
{
|
|
using (SocketAsyncEventArgs args = new SocketAsyncEventArgs())
|
|
{
|
|
try
|
|
{
|
|
args.UserToken = this.clientSocket;
|
|
args.RemoteEndPoint = this.hostEndPoint;
|
|
args.Completed += new EventHandler<SocketAsyncEventArgs>(this.OnConnect);
|
|
this.clientSocket.ConnectAsync(args);
|
|
bool flag = autoConnectEvent.WaitOne(1000);
|
|
//SocketError err = args.SocketError;
|
|
if (this.connected)
|
|
{
|
|
this.lisnterSocketAsyncEventArgs = new SocketAsyncEventArgs();
|
|
byte[] buffer = new byte[50];
|
|
this.lisnterSocketAsyncEventArgs.UserToken = this.clientSocket;
|
|
this.lisnterSocketAsyncEventArgs.SetBuffer(buffer, 0, buffer.Length);
|
|
this.lisnterSocketAsyncEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(this.OnReceive);
|
|
this.StartListen();
|
|
return true;
|
|
}
|
|
}
|
|
catch
|
|
{ }
|
|
|
|
return false;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 判断有没有连接上
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void OnConnect(object sender, SocketAsyncEventArgs e)
|
|
{
|
|
this.connected = (e.SocketError == SocketError.Success);
|
|
autoConnectEvent.Set();
|
|
}
|
|
/// <summary>
|
|
/// 发送
|
|
/// </summary>
|
|
/// <param name="mes"></param>
|
|
public void Send(Byte[] mes)
|
|
{
|
|
if (this.connected)
|
|
{
|
|
EventHandler<SocketAsyncEventArgs> handler = null;
|
|
byte[] buffer = mes;
|
|
SocketAsyncEventArgs senderSocketAsyncEventArgs = null;
|
|
lock (s_lst)
|
|
{
|
|
if (s_lst.Count > 0)
|
|
{
|
|
senderSocketAsyncEventArgs = s_lst[s_lst.Count - 1];
|
|
s_lst.RemoveAt(s_lst.Count - 1);
|
|
}
|
|
}
|
|
if (senderSocketAsyncEventArgs == null)
|
|
{
|
|
senderSocketAsyncEventArgs = new SocketAsyncEventArgs();
|
|
senderSocketAsyncEventArgs.UserToken = this.clientSocket;
|
|
senderSocketAsyncEventArgs.RemoteEndPoint = this.clientSocket.RemoteEndPoint;
|
|
if (handler == null)
|
|
{
|
|
handler = delegate (object sender, SocketAsyncEventArgs _e)
|
|
{
|
|
lock (s_lst)
|
|
{
|
|
s_lst.Add(senderSocketAsyncEventArgs);
|
|
}
|
|
};
|
|
}
|
|
senderSocketAsyncEventArgs.Completed += handler;
|
|
}
|
|
senderSocketAsyncEventArgs.SetBuffer(buffer, 0, buffer.Length);
|
|
this.clientSocket.SendAsync(senderSocketAsyncEventArgs);
|
|
}
|
|
else
|
|
{
|
|
this.connected = false;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 监听服务端
|
|
/// </summary>
|
|
public void Listen()
|
|
{
|
|
if (this.connected && this.clientSocket != null)
|
|
{
|
|
try
|
|
{
|
|
(lisnterSocketAsyncEventArgs.UserToken as Socket).ReceiveAsync(lisnterSocketAsyncEventArgs);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 断开连接
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
private int Disconnect()
|
|
{
|
|
int res = 0;
|
|
try
|
|
{
|
|
this.clientSocket.Shutdown(SocketShutdown.Both);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
try
|
|
{
|
|
this.clientSocket.Close();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
this.connected = false;
|
|
return res;
|
|
}
|
|
/// <summary>
|
|
/// 数据接受
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void OnReceive(object sender, SocketAsyncEventArgs e)
|
|
{
|
|
if (e.BytesTransferred == 0)
|
|
{
|
|
try
|
|
{
|
|
this.clientSocket.Shutdown(SocketShutdown.Both);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
finally
|
|
{
|
|
if (this.clientSocket.Connected)
|
|
{
|
|
this.clientSocket.Close();
|
|
}
|
|
}
|
|
byte[] info = new Byte[] { 0 };
|
|
this.OnMsgReceived(info);
|
|
}
|
|
else
|
|
{
|
|
byte[] buffer = new byte[e.BytesTransferred];
|
|
for (int i = 0; i < e.BytesTransferred; i++)
|
|
{
|
|
buffer[i] = e.Buffer[i];
|
|
}
|
|
this.OnMsgReceived(buffer);
|
|
Listen();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 接受完成
|
|
/// </summary>
|
|
/// <param name="info"></param>
|
|
private void SimaticSocketClient_OnMsgReceived(byte[] info)
|
|
{
|
|
if (info[0] != 0)
|
|
{
|
|
for (byte len = 0; len < info.Length; len++)
|
|
{
|
|
if (Offset < 24)
|
|
{
|
|
RecvData_Temp[Offset] = info[len];
|
|
Offset++;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (byte i = 0; i < 24; i++)
|
|
{
|
|
RecvData_Temp[i] = 0;
|
|
}
|
|
Offset = 0;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 建立连接的方法
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public bool OpenLinkPLC()
|
|
{
|
|
bool flag = false;
|
|
this.StartListen += new StartListeHandler(SimaticSocketClient_StartListen);
|
|
this.OnMsgReceived += new ReceiveMsgHandler(SimaticSocketClient_OnMsgReceived);
|
|
flag = this.Connect();
|
|
if (!flag)
|
|
{
|
|
return flag;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关闭连接的方法
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public int CloseLinkPLC()
|
|
{
|
|
return this.Disconnect();
|
|
}
|
|
/// <summary>
|
|
/// 监听的方法
|
|
/// </summary>
|
|
private void SimaticSocketClient_StartListen()
|
|
{
|
|
this.Listen();
|
|
}
|
|
|
|
|
|
#region 写入STM数据
|
|
private object write_obj = new object();
|
|
/// <summary>
|
|
/// 写一个数据
|
|
/// </summary>
|
|
/// <param name="value"></param>
|
|
/// <returns></returns>
|
|
public int WriteInfo(int value_fx, int value_mb, int value_control)
|
|
{
|
|
lock (write_obj)
|
|
{
|
|
int flag = -1;
|
|
byte[] data = new byte[15];
|
|
data[0] = 0xF3;
|
|
data[1] = 0x01;
|
|
data[2] = Convert.ToByte(value_fx);
|
|
data[3] = 0x00;
|
|
data[4] = Convert.ToByte(value_mb % 256);
|
|
data[5] = Convert.ToByte(value_mb / 256);
|
|
data[6] = 0x00;
|
|
data[7] = 0x00;
|
|
data[8] = Convert.ToByte(value_control);
|
|
data[9] = 0x00;
|
|
data[10] = 0x00;
|
|
data[11] = 0x00;
|
|
data[12] = 0x00;
|
|
data[13] = 0x00;
|
|
data[14] = 0xCF;
|
|
data[13] = (FCS(data))[0];
|
|
|
|
int numPro = 0;
|
|
Offset = 0;
|
|
RecvData_Temp[0] = 0;
|
|
RecvData_Temp[1] = 0;
|
|
RecvData_Temp[22] = 0;
|
|
RecvData_Temp[23] = 0;
|
|
this.Send(data);
|
|
while ((RecvData_Temp[0] == 0 || RecvData_Temp[23] == 0) && numPro < 350)
|
|
{
|
|
Thread.Sleep(2);
|
|
numPro++;
|
|
}
|
|
if (numPro < 350)
|
|
{
|
|
if (RecvData_Temp[0] == 0xF3 && RecvData_Temp[1] == 0x02 && RecvData_Temp[23] == 0xCF)
|
|
{
|
|
flag = 0;//成功
|
|
}
|
|
}
|
|
Offset = 0;
|
|
RecvData_Temp[0] = 0;
|
|
RecvData_Temp[1] = 0;
|
|
RecvData_Temp[22] = 0;
|
|
RecvData_Temp[23] = 0;
|
|
return flag;
|
|
}
|
|
}
|
|
#endregion
|
|
/************************************************************************/
|
|
/* Description: 写入数据(向AGV写入状态)
|
|
/* Time:2018/04/10 13时50分20秒
|
|
/* Author:WANGZHEN
|
|
/************************************************************************/
|
|
/// <summary>
|
|
/// 写入数据(向AGV写入状态)
|
|
/// 目标地址+放行+取料/放料状态
|
|
/// value_mb:目标地址,isDrop 1是放料,2是取料
|
|
/// </summary>
|
|
/// <param name="results"></param>
|
|
/// <returns></returns>
|
|
public int WriteInfo(int value_mb, int isDrop, out byte[] results)
|
|
{
|
|
lock (write_obj)
|
|
{
|
|
int flag = -1;
|
|
byte[] data = new byte[15];
|
|
data[0] = 0xF3;
|
|
data[1] = 0x01;
|
|
data[2] = 0x01;
|
|
data[3] = 0x00;
|
|
data[4] = Convert.ToByte(value_mb % 256);
|
|
data[5] = Convert.ToByte(value_mb / 256);
|
|
data[6] = 0x00;
|
|
data[7] = 0x00;
|
|
data[8] = 0x00;
|
|
data[9] = Convert.ToByte(isDrop);
|
|
data[10] = 0x00;
|
|
data[11] = 0x00;
|
|
data[12] = 0x00;
|
|
data[13] = 0x00;
|
|
data[14] = 0xCF;
|
|
data[13] = (FCS(data))[0];
|
|
|
|
results = new byte[24];
|
|
for (byte i = 0; i < 24; i++)
|
|
results[i] = 0;
|
|
|
|
int numPro = 0;
|
|
Offset = 0;
|
|
RecvData_Temp[0] = 0;
|
|
RecvData_Temp[1] = 0;
|
|
RecvData_Temp[22] = 0;
|
|
RecvData_Temp[23] = 0;
|
|
this.Send(data);
|
|
while ((RecvData_Temp[0] == 0 || RecvData_Temp[23] == 0) && numPro < 350)
|
|
{
|
|
Thread.Sleep(2);
|
|
numPro++;
|
|
}
|
|
if (numPro < 350)
|
|
{
|
|
if (RecvData_Temp[0] == 0xF3 && RecvData_Temp[1] == 0x02 && RecvData_Temp[23] == 0xCF)
|
|
{
|
|
flag = 0;//成功
|
|
for (byte i = 0; i < 23; i++)
|
|
{
|
|
results[i] = RecvData_Temp[i];
|
|
}
|
|
}
|
|
}
|
|
Offset = 0;
|
|
RecvData_Temp[0] = 0;
|
|
RecvData_Temp[1] = 0;
|
|
RecvData_Temp[22] = 0;
|
|
RecvData_Temp[23] = 0;
|
|
return flag;
|
|
}
|
|
}
|
|
private byte[] FCS(byte[] b)
|
|
{
|
|
int num2 = 0;
|
|
byte[] recValue = new byte[2];
|
|
//byte[]b=new byte[30] {0x46, 0x39, 0x30, 0x30, 0x30, 0x30, 0x46, 0x46, 0x30, 0x30, 0x30, 0x34, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x44, 0x2A , 0x30 , 0x30 , 0x31 , 0x36, 0x31 , 0x36 , 0x30 , 0x30 , 0x30 , 0x31};
|
|
for (int i = 0; i < b.Length - 1; i++)
|
|
{
|
|
num2 += b[i];
|
|
}
|
|
string s = num2.ToString("X2").Substring(num2.ToString("X2").Length - 2, 2);
|
|
//recValue = Encoding.ASCII.GetBytes(s);
|
|
recValue = strToToHexByte(s);
|
|
return recValue;
|
|
}
|
|
|
|
private static byte[] strToToHexByte(string hexString)
|
|
{
|
|
hexString = hexString.Replace(" ", "");
|
|
if ((hexString.Length % 2) != 0)
|
|
hexString += " ";
|
|
byte[] returnBytes = new byte[hexString.Length / 2];
|
|
for (int i = 0; i < returnBytes.Length; i++)
|
|
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
|
|
return returnBytes;
|
|
}
|
|
|
|
int Offset = 0;
|
|
private byte[] RecvData_Temp = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
|
|
#region 读取STM值
|
|
private object read_obj = new object();
|
|
/// <summary>
|
|
/// 读值
|
|
/// </summary>
|
|
/// <param name="alarmvalue"></param>
|
|
/// <param name="posvalue"></param>
|
|
/// <returns></returns>
|
|
public int ReadInfo(out int[] results)
|
|
{
|
|
lock (read_obj)
|
|
{
|
|
int flag = -1;
|
|
Byte[] data = new Byte[15];
|
|
results = new int[24];
|
|
for (byte i = 0; i < results.Length; i++)
|
|
{
|
|
results[i] = 0;
|
|
}
|
|
|
|
data[0] = 0xF3;
|
|
data[1] = 0x0A;
|
|
data[2] = 0x00;
|
|
data[3] = 0x00;
|
|
data[4] = 0x00;
|
|
data[5] = 0x00;
|
|
data[6] = 0x00;
|
|
data[7] = 0x00;
|
|
data[8] = 0x00;
|
|
data[9] = 0x00;
|
|
data[10] = 0x00;
|
|
data[11] = 0x00;
|
|
data[12] = 0x00;
|
|
data[13] = 0x00;
|
|
data[14] = 0xCF;
|
|
data[13] = (FCS(data))[0];
|
|
int numPro = 0;
|
|
Offset = 0;
|
|
RecvData_Temp[0] = 0;
|
|
RecvData_Temp[1] = 0;
|
|
RecvData_Temp[23] = 0;
|
|
this.Send(data);
|
|
while ((RecvData_Temp[0] == 0 || RecvData_Temp[23] == 0) && numPro < 350)
|
|
{
|
|
Thread.Sleep(2);
|
|
numPro++;
|
|
}
|
|
if (numPro < 350)
|
|
{
|
|
if (RecvData_Temp[0] == 0xF3 && RecvData_Temp[1] == 0x0B && RecvData_Temp[23] == 0xCF)
|
|
{
|
|
flag = 0;
|
|
for (byte i = 0; i < 23; i++)
|
|
{
|
|
results[i] = RecvData_Temp[i];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (RecvData_Temp[23] == 0)
|
|
{
|
|
flag = -3;
|
|
}
|
|
}
|
|
}
|
|
Offset = 0;
|
|
RecvData_Temp[0] = 0;
|
|
RecvData_Temp[1] = 0;
|
|
RecvData_Temp[22] = 0;
|
|
RecvData_Temp[23] = 0;
|
|
return flag;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
|
|
#region IDispose member
|
|
public void Dispose()
|
|
{
|
|
if (this.clientSocket.Connected)
|
|
{
|
|
this.clientSocket.Close();
|
|
}
|
|
}
|
|
#endregion
|
|
}
|
|
}
|