using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Threading; using Microsoft.VisualBasic; using DBFactory; using ICommLayer; namespace AGVDataTable { /// /// 20200430中间表接口 /// 发送设备命令类 /// /// public class CSendDeviceOrder: ISendDeviceOrder { string _commLayerError; public string CommLayerError { get { return _commLayerError; } set { _commLayerError = value; } } DBOperator dbo = CommonClassLib.AppSettings.dbo;//20130510 public CSendDeviceOrder() { dbo.Open(); } //~CSendDeviceOrder() //{ // dbo.Close(); //} /// /// 发送AGV车命令 /// /// 消息编号 /// 任务编号 /// AGV命令字 ///1-取送货 ///2.3... 待扩展 /// 设备编号 /// AGV取货站台(或区域) /// 0 /// 0 /// AGV送货站台(或区域) /// /// 0 /// 发送命令是否成功 public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ) { //return true; StringBuilder sql = new StringBuilder(); StringBuilder sss = new StringBuilder(); DataView dv = new DataView(); sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Monitor_Task WHERE F_MonitorIndex = ").Append(TaskIndex).Append(" AND F_Status = 0"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count == 0) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:不存在"+ TaskIndex +" 对应的空闲指令!"; return false; } try { int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex); sql.Remove(0, sql.Length); sql.Append("SELECT * FROM AGV_TASK WHERE FID = ").Append(fid).Append(" AND AGV_TASK_ID = ") .Append(TaskIndex); if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:中间表已存在该指令:"+ TaskIndex; return false; } StringBuilder dtime = new StringBuilder(DateTime.Now.ToString("u")); dtime.Remove(dtime.Length - 1, 1); int TaskLevel = Convert.ToInt32(dv[0]["F_MonitorTaskLevel"]); string PalletBarcode = dv[0]["F_TxtParam"].ToString(); sql.Clear(); sql.Append("select * from T_Manage_Task where FID = ").Append(fid); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count == 0) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:找不到对应的管理任务!"; return false; } int TaskType = Convert.ToInt32(dv[0]["FCONTROLTASKTYPE"]); // 20201027 双鹿 增加得到STACK_TYPE\STACK_QTY字段方法 int COMPOSITE_TAG = GetManageInfo(TaskIndex, "MULTIPLEX_FLAG"); //20210322 双鹿电池,给AGV复合任务增加两个字段 string START_DEVICE_CODE2 = ""; string END_DEVICE_CODE2 = ""; if (COMPOSITE_TAG == 2) { START_DEVICE_CODE2 = GetManageInfo(TaskIndex, "START_DEVICE_CODE2").ToString(); END_DEVICE_CODE2 = GetManageInfo(TaskIndex, "END_DEVICE_CODE2").ToString(); } //LHDF 增加托盘类型 int type = 0; GetAGVGatePalletType(StartX, out type); if (type == 0) { GetAGVGatePalletType (EndX ,out type); if (type == 0) { type = GetGoodsHigh(TaskIndex); if (type == 0) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:找不到对应的托盘类型!"; return false; } } } string command = string.Format( "INSERT INTO AGV_TASK(AGV_TASK_ID, AGV_TASK_TYPE, AGV_TASK_LEVEL, PALLET_BARCODE, START_DEVICE_CODE, FINISH_DEVICE_CODE, COMPOSITE_TAG, AGV_TASK_BEGINTIME,FID,START_DEVICE_CODE2,FINISH_DEVICE_CODE2,PALLET_TYPE)" + " VALUES({0}, {1}, {2}, '{3}', '{4}', '{5}', '{6}', '{7}',{8}, '{9}', '{10}',{11})", TaskIndex, TaskType, TaskLevel, PalletBarcode, StartX, EndX, COMPOSITE_TAG, dtime.ToString(), fid, START_DEVICE_CODE2, END_DEVICE_CODE2,type); dbo.ExecuteSql(command); sss.Remove(0, sss.Length); sss.Append("条码:").Append(PalletBarcode).Append("**写标志1").Append("**任务号" + TaskIndex.ToString()) .Append("**起始站台" + StartX.ToString()).Append("**终止站台" + EndX.ToString()).Append("**托盘类型" + type.ToString()); if (COMPOSITE_TAG == 2) { sss.Append("**起始站台2 " + START_DEVICE_CODE2).Append("**终止站台2 " + END_DEVICE_CODE2); } //20210322 双鹿电池,给AGV复合任务增加两个字段 CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送AGV命令","", sss.ToString()); return true; } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message; return false; } } /// /// 发送堆垛机以外的其它设备命令 /// /// 消息编号 /// 任务编号 /// 命令字 /// 穿梭车命令字: ///1-复位 ///2-左接货 ///3-左送货 ///4-右接货 ///5-右送货 ///6-停止 ///7-运动到1#位置 ///8-运动到2#位置 /// … ///输送机、台车命令字: ///1-入库(朝向库) /// 2-出库(背向库) /// 3-送货 /// 4-停止 /// 设备编号 /// 发送其它设备命令是否成功 public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int ArrowDeviceIndex) { return true; } public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ, string DoubleFork) { return true; } public bool SendDeviceOrder(int DeviceIndex, string TobaccoCode, bool HaveFirstProjectCode, bool IfSmallTobacco, int Count) { return true; } public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues) { return true; } public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues, string PLCconnectionID) { return true; } /// /// LHDF /// /// /// private void GetAGVGatePalletType(int deviceindex, out int type) { StringBuilder sql = new StringBuilder(); sql.Clear(); sql.Append(string.Format("SELECT F_TYPE FROM T_Base_AGV_Gate where F_AGVGateDeviceIndex={0}", deviceindex)); DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { type = Convert.ToInt32(dv[0][0].ToString()); } else { type = 0; } } int GetGoodsHigh(int taskindex) { DataView dv = dbo.ExceSQL(string.Format("SELECT CELL_MODEL FROM T_Manage_Task WHERE (F_ManageTaskKindIndex = {0}) AND (FID = {1})", Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(taskindex), Model.CGeneralFunction.GetManageTaskIndexfromMonitor(taskindex))).Tables[0].DefaultView; if (dv.Count > 0) { #region //int gh = 1; ////P工装板,B标准,G高货位,D大货位 //switch (dv[0][0].ToString().ToUpper()) //{ // case "P": // gh = 3; // break; // case "B": // gh = 2; // break; // case "G": // gh = 1; // break; // //case "D": // // gh = 4; // // break; // default: // gh = 1; // break; //} #endregion int gh = 0; //1小2大 switch (dv[0][0].ToString().ToUpper()) { case "1": gh = 1; break; case "2": gh = 2; break; default: gh = 0; break; } return gh; } else { return 0; } } /// /// 根据设备命令,PALLET_SIZE,STACK_TYPE\STACK_QTY /// /// /// private int GetManageInfo(int TaskIndx, string Field) { DataView dv = new DataView(); try { StringBuilder sql = new StringBuilder(); sql.Clear(); sql.Append(string.Format("select {0} from T_Manage_Task where FID in(select F_ManageTaskIndex from T_Monitor_Task where F_MonitorIndex = {1})", Field, TaskIndx)); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0 && dv[0][Field].ToString().Trim()!= "")//dv[0][Field]!= DBNull.Value,int.Parse(dv[0][Field].ToString().Trim())> 0 { return Convert.ToInt32(dv[0][Field]); } return -1; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } } }