using System; using System.Collections.Generic; using System.Text; using DBFactory; using CommonLib; using System.Data; using System.Runtime.InteropServices;//20151120 namespace FINSTCPIP { using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; using CommonClassLib; public static class CClientTCPIP {//20130111 private static Object thisLock = new Object(); public static event CDataSourceChangeEventHandler DataChange; public static event CUpdateDBEventHandler UpdateDB; public static event CWriteDarkCasketEventHandler WriteDarkCasket; public static event CSendDeviceOrderEventHandler SendDeviceOrder; private static bool IsConnectionSuccessful = false;//20170722 private static Exception socketexception; private static ManualResetEvent TimeoutObject = new ManualResetEvent(false); public static void OnSendDeviceOrder(CSendDeviceOrderEventArgs e) { if (SendDeviceOrder != null) { SendDeviceOrder(null, e); } } public static void OnWriteDarkCasket(CWriteDarkCasketEventArgs e) { if (WriteDarkCasket != null) { WriteDarkCasket(null, e); } } public static void OnDataChange(CDataChangeEventArgs e) { if (DataChange != null) { DataChange(null, e); } } public static void OnUpdateDB(CUpdateDBChangeEventArgs e) { if (UpdateDB != null) { UpdateDB(null, e); } } public static event RefreshMonitorEventHandler RefreshMonitor; public static void OnRefreshMonitor(RefreshMonitorEventArgs e) { if (RefreshMonitor != null) { RefreshMonitor(e); } } public static DBOperator dbo =new DBOperator();//20130926 public static DBOperator dboM = CommonClassLib.AppSettings.dboM;//20130926 static StringBuilder sql = new StringBuilder(); private static Dictionary _initCount = new Dictionary(); public static Dictionary FINSTcpIPInitCount { get { return CClientTCPIP._initCount; } set { DataView dv = dbo.ExceSQL("SELECT F_RemoteIP,F_RemotePort FROM T_Base_Device WHERE (F_DeviceKindIndex = 44 and F_RemoteIP is not null)").Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { if (value.ContainsKey(dv[i][0].ToString()) == false) { value.Add(dv[i][0].ToString(), 0); } } CClientTCPIP._initCount = value; } } static Dictionary _ifInit = new Dictionary(); public static Dictionary IfInit { get { return CClientTCPIP._ifInit; } set { DataView dv = dbo.ExceSQL("SELECT F_RemoteIP,F_RemotePort FROM T_Base_Device WHERE (F_DeviceKindIndex = 6 and F_RemoteIP is not null)").Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { if (_ifConnect.ContainsKey(dv[i][0].ToString()) == false) { _ifConnect.Add(dv[i][0].ToString(), false); } if (value.ContainsKey(dv[i][0].ToString()) == false) { value.Add(dv[i][0].ToString(), false); } if (value[dv[i][0].ToString()] == false) { _ifConnect[dv[i][0].ToString()] = false; } } CClientTCPIP._ifInit = value; } } static Dictionary _ifConnect = new Dictionary(); static string _remoteIP; static int _remotePort; static Socket clientSocket = null; static EndPoint epServer; static byte[] _byteData = new byte[6]; static string _tcpError; static Dictionary clientSockets = new Dictionary(); public static string TcpError { get { return _tcpError; } set { _tcpError = value; RefreshMonitorEventArgs rea = new RefreshMonitorEventArgs("tsStatus", string.Format("SocketsTCPIP:{0}", _tcpError)); OnRefreshMonitor(rea); } } public static byte[] ByteData { get { return _byteData; } set { _byteData = value; } } public static Socket ClientSocket { get { return CClientTCPIP.clientSocket; } set { CClientTCPIP.clientSocket = value; } } private static byte[] GetSocketIOControl()//设置Socket的 {//20151120张磊调整,设置检测对方网线断开等硬件故障的时间间隔 uint dummy = 0; byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3]; BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);//启用 BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));//多长时间后开始第一次探测ms BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);//探测时间间隔ms return inOptionValues; } public static bool IfConnectServer(string remoteIP)//20170710判断是否连接到AGV控制台 { try { if (IfInit.ContainsKey(remoteIP) == false) { return false; } if (IfInit[remoteIP] == false) { return false; } else { return true; } } catch (Exception) { return false; } } // 查看指定IP是否连接 public static bool CheckConnect(string IP) { if (_ifConnect.ContainsKey(IP)) { return true; } else { return false; } } public static int GetDeviceKindIdx(int devIdx) { try { sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_DeviceKindIndex FROM T_Base_Device WHERE F_DeviceIndex=" + devIdx); DataSet ds = dbo.ExceSQL(sql.ToString()); DataView dv = ds.Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_DeviceKindIndex"]); } else return 0; } catch (Exception ex) { TcpError = "SocketsTCPIP:GetDeviceKindIdx," + ex.StackTrace + ex.Message; return 0; //throw ex; } } public static int GetManageTaskIndexfromMonitor(int monitorIdx) { //20100127 DataView dv; try {//20100127 sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTaskIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(monitorIdx).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_ManageTaskIndex"]); } else { return -1; } } catch (Exception ex) {//20100127 //throw ex; TcpError = "SocketsTCPIP:GetDeviceKindIdx," + ex.StackTrace + ex.Message; return -1; } finally {//20100127 dv = null; } } public static int GetManageTaskKindIndexFromMonitor(int monitorIdx) { //20100127 DataView dv; try {//20100127 sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTaskKindIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(monitorIdx).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]); } else { return -1; } } catch (Exception ex) { TcpError = "SocketsTCPIP:GetDeviceKindIdx," + ex.StackTrace + ex.Message; return -1; //throw ex; } finally {//20100127 dv = null; } } public static int GetDeviceOrderFromMonitor(int MonitorIndex) { //20100127 DataView dv; try { sql.Remove(0, sql.Length); sql.Append("select F_DeviceCommandIndex from T_Monitor_Task where (F_DeviceCommandIndex IS NOT NULL) and F_MonitorIndex=").Append(MonitorIndex); //20100127 dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]); } else { return -1; } } catch (Exception ex) { TcpError = "SocketsTCPIP:GetDeviceKindIdx," + ex.StackTrace + ex.Message; return -1; //throw ex; } finally {//20100127 dv = null; } } public static int GetExceptionNOFromManageTask(int FID, int ManTaskKind) { //20100127 DataTable dt; try { sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FExceptionNO FROM T_Manage_Task WHERE (FID = ").Append(FID).Append(") AND (F_ManageTaskKindIndex = ").Append(ManTaskKind).Append(") "); ; //20100127 dt = dbo.ExceSQL(sql.ToString()).Tables[0]; if (dt.Rows.Count > 0) { if (dt.Rows[0]["FExceptionNO"] == DBNull.Value) { return -1; } else { return Convert.ToInt32(dt.Rows[0]["FExceptionNO"]); } } else { return -1; } } catch (Exception ex) {//20100127 //throw ex; TcpError = "SocketsTCPIP:GetDeviceKindIdx," + ex.StackTrace + ex.Message; return -1; } finally {//20100127 dt = null; } } static int GetDeviceIndexFromAgvActive(int AgvActive) { //20100127AGV DataView dva; try { //20100127 sql.Remove(0, sql.Length); sql.Append("SELECT F_AGVGateDeviceIndex, F_Address FROM T_Base_AGV_Gate WHERE (F_Active = ").Append(AgvActive).Append(") "); dva = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dva.Count > 0) { return Convert.ToInt32(dva[0]["F_AGVGateDeviceIndex"]); } else { return 0; } } catch (Exception ex) {//20100127 //throw ex; TcpError = "SocketsTCPIP:GetDeviceKindIdx," + ex.StackTrace + ex.Message; return -1; } finally {//20100127 dva = null; } } /// /// /// /// /// 1,前叉;2后叉;3双叉 /// static int GetDeviceIndexFromAgvAddress(int AgvAddress, int ForkIndex) { //20110110AGV DataView dva; try { string F_UseAwayFork = string.Empty; if (ForkIndex == 1)//前叉,远叉 { F_UseAwayFork = " and F_UseAwayFork = '1' "; } else if (ForkIndex == 2) { F_UseAwayFork = " and F_UseAwayFork = '0' "; } else//3 { F_UseAwayFork = " and F_UseAwayFork <> '-' "; } //20100127 sql.Remove(0, sql.Length); sql.Append("SELECT F_AGVGateDeviceIndex, F_Address FROM T_Base_AGV_Gate WHERE (F_Address = ").Append(AgvAddress).Append(") ").Append(F_UseAwayFork); dva = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dva.Count > 0) { return Convert.ToInt32(dva[0]["F_AGVGateDeviceIndex"]); } else { return 0; } } catch (Exception ex) {//20100127 //throw ex; TcpError = "SocketsTCPIP:GetDeviceKindIdx," + ex.StackTrace + ex.Message; return -1; } finally {//20100127 dva = null; } } /// /// 是否逻辑有物 /// /// /// static bool IfHaveLogicGoods(int deviceindex) { DataView dv = dbo.ExceSQL("SELECT F_HaveGoods FROM T_Base_Device where F_HaveGoods=1 and F_DeviceIndex=" + deviceindex).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } static int GetCorrDeviceIndex(int device) {//20110412 int deviceCorr = 0; if ((device % 2) == 1) { deviceCorr = device - 1; } else { deviceCorr = device + 1; } return deviceCorr; } static string GetDeviceS7Connection(int deviceindex) { DataView dv = dbo.ExceSQL("SELECT F_S7Connection FROM T_Base_Device WHERE (F_DeviceIndex = " + deviceindex + ")").Tables[0].DefaultView; if (dv.Count > 0) { return dv[0]["F_S7Connection"].ToString(); } else { return null; } } /// /// 20110405数据视图更新 /// public static void DataSourceChange() { //sql.Remove(0, sql.Length); //sql.Append("select * from V_Monitor_Task where ").Append(CStaticClass.Monstatus).Append(" order by 设备指令索引 asc "); //DataView dvmon = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //sql.Remove(0, sql.Length); //sql.Append("select * from V_Manage_Task where ").Append(CStaticClass.Manstatus); //DataView dvman = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; CDataChangeEventArgs e = new CDataChangeEventArgs(null, null); OnDataChange(e); } /// /// 20110608执行SQL语句数组 /// /// public static void SQLString(DBOperator dbo, StringBuilder sql) { CUpdateDBChangeEventArgs e = new CUpdateDBChangeEventArgs(dbo, sql); OnUpdateDB(e); } /// /// 20110608报告完成 /// /// /// /// public static void ActionChange(int device, int task, int taskstate) { CUpdateDBChangeEventArgs e = new CUpdateDBChangeEventArgs(device, task, taskstate); OnUpdateDB(e); } /// /// 20150724报告AGV错误 /// /// /// /// public static void ActionError(int device, byte[] splitbyteValue, byte[] deviceState) { CUpdateDBChangeEventArgs e = new CUpdateDBChangeEventArgs(device, splitbyteValue, deviceState); OnUpdateDB(e); } /// /// 判断调度表T_Monitor_Task是否存在调度任务的设备和命令 /// /// 调度任务类型 /// 调度任务索引 /// 设备所引 /// 设备命令 /// public static bool DeviceAndOrderExitInMonitor(int Mankind, int ManFID, int DeviceIndex, int Order, int ArrowAddress) { DataView dv; try { if (Order == -1) return true; sql.Remove(0, sql.Length); switch (GetDeviceKindIdx(DeviceIndex)) { case 1://堆垛机 sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(ManFID).Append(")").Append( " AND (F_ManageTASKKINDINDEX = ").Append(Mankind).Append(") AND (F_DeviceIndex = ").Append(DeviceIndex).Append(")").Append( " AND (F_DeviceCommandIndex = ").Append(Order).Append(")"); break; case 2://输送机 sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(ManFID).Append(")").Append( " AND (F_ManageTASKKINDINDEX = ").Append(Mankind).Append(") AND (F_DeviceIndex = ").Append(DeviceIndex).Append(")").Append( " AND (F_DeviceCommandIndex = ").Append(Order).Append(")"); break; case 4://RGV sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(ManFID).Append(")").Append( " AND (F_ManageTASKKINDINDEX = ").Append(Mankind).Append(") AND (F_DeviceIndex = ").Append(DeviceIndex).Append(")").Append( " AND (F_DeviceCommandIndex = ").Append(Order).Append(") and F_NumParam1=").Append(ArrowAddress); break; case 6://AGV sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(ManFID).Append(")").Append( " AND (F_ManageTASKKINDINDEX = ").Append(Mankind).Append(") AND (F_DeviceIndex = ").Append(DeviceIndex).Append(")").Append( " AND (F_DeviceCommandIndex = ").Append(Order).Append(")"); break; default: sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(ManFID).Append(")").Append( " AND (F_ManageTASKKINDINDEX = ").Append(Mankind).Append(") AND (F_DeviceIndex = ").Append(DeviceIndex).Append(")").Append( " AND (F_DeviceCommandIndex = ").Append(Order).Append(")"); break; } dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } catch (Exception ex) { TcpError = "DeviceAndOrderExitInMonitor:" + ex.StackTrace + ex.Message; return false; } finally { dv = null; } } #region 将BYTE数组转换为UInt16数组 /// /// 将BYTE数组转换为UInt16数组 /// /// 需要处理的byte数组 /// /// 处理的数据是大端 /// 返回UInt16数组 public static UInt16[] ConvertByteToUInt16(byte[] srcData, bool bigEndian = false) { byte[] chat = null; //判断srcData数组的维数是否为奇数,如果为奇数则补齐最后一位 if (srcData.Length % 2 == 1) { chat = new byte[srcData.Length + 1]; Array.Copy(srcData, 0, chat, 0, srcData.Length); } else { chat = new byte[srcData.Length]; Array.Copy(srcData, 0, chat, 0, srcData.Length); } UInt16[] newData = new UInt16[chat.Length / 2]; int temp = 0; for (int i = 0; i < newData.Length; i++) { if (bigEndian) { newData[i] = (UInt16)((chat[temp] << 8) + chat[temp + 1]); } else { newData[i] = (UInt16)((chat[temp + 1] << 8) + chat[temp]);//C#版:0是低位,1是高位;VC++版:1是低位,0是高位; } temp += 2; } return newData; } #endregion public static int GetDeviceIndexFromMonitor(int MonitorIndex) { //20100108 DataView dv; try { sql.Remove(0, sql.Length); sql.Append("select F_DeviceIndex from T_Monitor_Task where (F_DeviceIndex IS NOT NULL) and F_MonitorIndex=").Append(MonitorIndex); //20100108 dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_DeviceIndex"]); } else { int []chatnew = new int[1]; chatnew[0] = MonitorIndex; CWriteDarkCasketEventArgs e = new CWriteDarkCasketEventArgs("SocketsTCPIP.CConnectTCPIP", "Receive", MonitorIndex.ToString(), "接受AGV信息处理失败,无该任务!", chatnew); OnWriteDarkCasket(e); return -1; // -1 修改bba20160622 } } catch (Exception ex) { throw ex; } finally { dv = null; } } public static int[] ConvertByteToInt32(byte[] srcData) { byte[] chat = null; if (srcData.Length % 4 != 0) { int arrlen = srcData.Length - (srcData.Length % 4); chat = new byte[arrlen]; Array.Copy(srcData, 0, chat, 0, arrlen); } else { chat = new byte[srcData.Length]; Array.Copy(srcData, 0, chat, 0, srcData.Length); } int[] newData = new int[chat.Length / 4]; int temp = 0; for (int i = 0; i < newData.Length; i++) { newData[i] = (int)((chat[temp + 3] << 24) + (chat[temp + 2] << 16) + (chat[temp + 1] << 8) + chat[temp]);//C#版:0是低位,1是高位;VC++版:1是低位,0是高位; temp += 4; } return newData; } public static int GetAgvSquence(int agvGate) { sql.Remove(0, sql.Length); sql.Append("SELECT F_Sequence FROM T_Base_AGV_Gate WHERE (F_AGVGateDeviceIndex = ").Append(agvGate).Append(")"); object ob = dbo.GetSingle(sql.ToString()); if (ob != null) { return Convert.ToInt32(ob); } else { return -1; } } public static int GetFCONTROLTASKTYPEFromManageTask(int taskKindIndex, int Managefid) { DataView dv; try { sql.Remove(0, sql.Length); sql.Append("SELECT FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FID = ").Append(Managefid).Append(") AND (F_ManageTaskKindIndex = ").Append(taskKindIndex).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (dv[0]["FCONTROLTASKTYPE"] == DBNull.Value) return -1; return Convert.ToInt32(dv[0]["FCONTROLTASKTYPE"]); } else { return -1; } } catch (Exception ex) { //throw ex; TcpError = "SocketsTCPIP:GetDeviceKindIdx," + ex.StackTrace + ex.Message; return -1; } finally { dv = null; } } public static int GetAGVServer(string ipaddress) { //sql.Remove(0, sql.Length); //sql.Append("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_RemoteIP = '").Append(ipaddress).Append("')"); string obj = dbo.GetSingle(string.Format("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_RemoteIP = '{0}')", ipaddress)).ToString(); if (obj == null) { return 0; } else { return Convert.ToInt32(obj); } } /// /// [0]:F_BindingDevice,[1]:F_ManageAskkind,[2]:F_WareHouse,[3]:F_Time,[4]:F_BarCode /// /// /// public static string[] GetDeviceInfoFromPLCAsk(string devIdx) { //20100108 DataView dv; string[] _Rstr = new string[5]; try { sql.Remove(0, sql.Length); sql.Append("select * from T_Base_PLC_Ask where F_BindingDevice=").Append(Convert.ToInt32( devIdx)); ; //20100108 dv = dbo.ExceSQL(string.Format("select * from T_Base_PLC_Ask where F_BindingDevice=", devIdx)).Tables[0].DefaultView; if (dv.Count > 0) { _Rstr[0] = Convert.ToString(dv[0]["F_BindingDevice"]); _Rstr[1] = Convert.ToString(dv[0]["F_ManageAskkind"]); _Rstr[2] = Convert.ToString(dv[0]["F_WareHouse"]); _Rstr[3] = Convert.ToString(dv[0]["F_Time"]); _Rstr[4] = Convert.ToString(dv[0]["F_BarCode"]); return _Rstr; } else { return null; } } catch (Exception ) { return null; //throw ex; } finally { dv = null; } } } }