using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SimensCNC { public class ETHSimensAlarmLib { bool flag=true; public static string cncIP; int receiveData; short alarmMsg =0; byte[] sendCommands; byte[] buffer;//发送报文容器 byte[] datas;//接收报文容器 static IAsyncResult connResult = null; public ETHSimensAlarmLib() { } public Socket AlarmSocket { get; set; } /// /// 链接函数 /// public bool ETH_S7SimensConnect(string adrip, ushort port, int overtime) { cncIP = adrip; IPAddress ip = IPAddress.Parse(adrip); int ports = Convert.ToInt32(port); AlarmSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); connResult = AlarmSocket.BeginConnect(ip, ports, null, null); Thread.Sleep(5000); connResult.AsyncWaitHandle.WaitOne(5, true); //等待2秒 if (connResult.IsCompleted) { HandShark(); // ReceiveAlarmData(); return true; } else { return false; } } /// /// 断开设备连接 /// /// 设备编号 public void ETH_S7SimensDisConnect(string no) { AlarmSocket.Shutdown(SocketShutdown.Both); AlarmSocket.Close(); } /// /// 三次握手 /// void HandShark() { AlarmSocket.Send(ETH_S7SimensCommands.FIRST_HAND_SHANK); buffer = new byte[1024]; receiveData = AlarmSocket.Receive(buffer); AlarmSocket.Send(ETH_S7SimensCommands.SENCOND_HAND_SHARK); buffer = new byte[1024]; receiveData = AlarmSocket.Receive(buffer); AlarmSocket.Send(ETH_S7SimensCommands.THREE_HAND_SHARK); buffer = new byte[1024]; receiveData = AlarmSocket.Receive(buffer); } public void ReceiveAlarmData() { //事件监听线程 Task.Factory.StartNew(new Action(() => { while (true) { byte[] buffer = new byte[1024 * 8]; try { receiveData = AlarmSocket.Receive(buffer); byte[] datas = new byte[receiveData]; //监听到消息 if (receiveData > 0) { Array.Copy(buffer, datas, receiveData); if ((datas[3] == 0xc3))//&& (datas[12] == 0x40)) { if (datas[187] == 0x01) { alarmMsg = BitConverter.ToInt16(datas.Skip(39).Take(2).ToArray(), 0); var sss = String.Format("{0:X2}{0:X2}", datas[54], datas[55]); flag = true; } } else { flag = false ; } } else { Thread.Sleep(100); flag = false; } } catch { } } })); } /// /// 设备报警信息 /// /// public bool AlarmMsg(ref object result) { AlarmSocket.Send(ETH_S7SimensCommands.CNC_ALARM); Thread.Sleep(10); buffer = new byte[1024 * 8]; receiveData = AlarmSocket.Receive(buffer); if (receiveData > 0) { datas = new byte[receiveData]; Array.Copy(buffer, datas, receiveData); if ((datas[3] == 0xc3))//&& (datas[12] == 0x40)) { if (datas[187] == 0x01) { var ss = BitConverter.ToInt16(datas.Skip(39).Take(2).ToArray(), 0); var sss = String.Format("{0:X2}{0:X2}", datas[54], datas[55]); result = sss; } return true; } else { return false; } } else { return false; } } } }