using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using XImageSystem.Service.Exceptions; using XImaging.Automation.Library.HxDriverLib; namespace HxDriverService.Runtime.Peripheral { public class ConveyerControl { /// /// 网络是否连接 /// private bool m_bIsNetConnect = false; /// /// 接收线程 /// private Thread tRevTcp; /// /// 读写输入输出的流 /// private NetworkStream m_nsClient; /// /// 客户端 /// private TcpClient m_tcpClient; /// /// ip地址 /// private string m_strIPAddress = "192.168.0.7"; /// /// 端口号 /// private int m_nPortNumber = 2022; /// /// 当前命令 /// public string m_strCommand = ""; /// /// 是否做完(error或正常做完皆认为做完) /// private bool m_bDone; public ConveyerControl(string strIP, int nPort) { m_strIPAddress = strIP; m_nPortNumber = nPort; } public bool Start() { try { if (!m_bIsNetConnect) { m_tcpClient = new TcpClient(); m_tcpClient.Connect(m_strIPAddress, m_nPortNumber); m_bIsNetConnect = true; m_nsClient = m_tcpClient.GetStream(); LogConstant.logger.Print("Connect to conveyer"); tRevTcp = new Thread(RevTcp); tRevTcp.IsBackground = true; tRevTcp.Start(); } } catch (Exception ex) { throw new ConveyerException(ex.Message); } return m_bIsNetConnect && (m_tcpClient != null); } public void Close() { if (m_tcpClient != null) { m_tcpClient.Close(); m_tcpClient = null; } m_bIsNetConnect = false; LogConstant.logger.Print("Disconnected to the conveyer"); } public bool SendCommand(string strMsg) { if (m_nsClient == null) { return false; } try { LogConstant.logger.Print("SendCommand: " + strMsg); byte[] dataSend = Encoding.ASCII.GetBytes(strMsg); m_nsClient.Write(dataSend, 0, dataSend.Length); return true; } catch (Exception ex) { Close(); LogConstant.logger.Print("Send:" + strMsg + " failed"); return false; } } public void RevTcp() { while (true) { if (!m_bIsNetConnect) break; if (m_tcpClient == null || m_nsClient == null) break; byte[] byteRev = new byte[1024]; int byteRead = m_nsClient.Read(byteRev, 0, 1024); byte[] byText = new byte[byteRead]; Array.Copy(byteRev, 0, byText, 0, byteRead); string strMsg = Encoding.ASCII.GetString(byText); LogConstant.logger.Print("Received resp:" + strMsg); if (strMsg.Contains("ERROR")) { m_bDone = true; throw new ConveyerException("Command: " + m_strCommand + " failed"); } else if (strMsg == m_strCommand) { m_bDone = true; } } //避免接收不全 Thread.Sleep(200); } public void STOP() { m_strCommand = "STOP\r\n"; try { SendCommand(m_strCommand); //等待做完 while (!m_bDone) { Thread.Sleep(500); } //置回false m_bDone = false; } catch (Exception ex) { throw new ConveyerException(ex.Message); } } public void HOME() { m_strCommand = "HOME\r\n"; try { SendCommand(m_strCommand); //等待做完 while (!m_bDone) { Thread.Sleep(500); } //置回false m_bDone = false; } catch (Exception ex) { //置回false m_bDone = false; throw new ConveyerException(ex.Message); } } public void STEPS(int x = 329500) { m_strCommand = "STEPS" + x.ToString() + "\r\n"; try { SendCommand(m_strCommand); //等待做完 while (!m_bDone) { Thread.Sleep(500); } //置回false m_bDone = false; } catch (Exception ex) { //置回false m_bDone = false; throw new ConveyerException(ex.Message); } } } }