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 s_lst = new List(); 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); } /// /// 连接服务端 /// /// private bool Connect() { using (SocketAsyncEventArgs args = new SocketAsyncEventArgs()) { try { args.UserToken = this.clientSocket; args.RemoteEndPoint = this.hostEndPoint; args.Completed += new EventHandler(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(this.OnReceive); this.StartListen(); return true; } } catch { } return false; } } /// /// 判断有没有连接上 /// /// /// private void OnConnect(object sender, SocketAsyncEventArgs e) { this.connected = (e.SocketError == SocketError.Success); autoConnectEvent.Set(); } /// /// 发送 /// /// public void Send(Byte[] mes) { if (this.connected) { EventHandler 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; } } /// /// 监听服务端 /// public void Listen() { if (this.connected && this.clientSocket != null) { try { (lisnterSocketAsyncEventArgs.UserToken as Socket).ReceiveAsync(lisnterSocketAsyncEventArgs); } catch (Exception) { } } } /// /// 断开连接 /// /// 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; } /// /// 数据接受 /// /// /// 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(); } } /// /// 接受完成 /// /// 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; } } /// /// 建立连接的方法 /// /// 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; } /// /// 关闭连接的方法 /// /// public int CloseLinkPLC() { return this.Disconnect(); } /// /// 监听的方法 /// private void SimaticSocketClient_StartListen() { this.Listen(); } #region 写入STM数据 private object write_obj = new object(); /// /// 写一个数据 /// /// /// 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 /************************************************************************/ /// /// 写入数据(向AGV写入状态) /// 目标地址+放行+取料/放料状态 /// value_mb:目标地址,isDrop 1是放料,2是取料 /// /// /// 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(); /// /// 读值 /// /// /// /// 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 } }