using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Threading; using Microsoft.VisualBasic; using ICommLayer; using System.Security.Cryptography; using DBFactory; namespace MidDataTable { /// /// 20200430中间表接口 /// 发送设备命令类 /// 创建者:zhangbo /// public class CSendDeviceOrder: ISendDeviceOrder { string _commLayerError; public string CommLayerError { get { return _commLayerError; } set { _commLayerError = value; } } public static DBOperator dbo = CommonClassLib.AppSettings.dbo; //20130510 public CSendDeviceOrder() { } //~CSendDeviceOrder() //{ // //} /// /// 发送AGV命令 /// /// 消息编号 /// 任务编号 /// AGV命令字 /// 默认取送货 /// 设备编号 /// 0 /// 0 /// 环穿取货站台(或区域) /// /// /// 环穿送货站台(或区域) /// 发送AGV命令是否成功 public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ) { StringBuilder sss = new StringBuilder(); DataView valist = dbo.ExceSQL(string.Format("select * from t_monitor_task where F_MonitorIndex={0} and F_Status=0 ", TaskIndex)).Tables[0].DefaultView; if (valist.Count == 0) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:不存在"+ TaskIndex +" 对应的空闲指令!"; return false; } try { int fid = Convert.ToInt32(valist[0]["F_ManageTaskIndex"]); int mti = Convert.ToInt32(valist[0]["F_ManageTASKKINDINDEX"]); var dv = dbo.ExceSQL(string.Format("select * from agv_task where fid = {0} and agv_task_id = {1}", fid, TaskIndex)).Tables[0].DefaultView; if (dv.Count > 0) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:中间表已存在该指令:"+ TaskIndex; return false; } object ob = new object[11] { fid, TaskIndex, Convert.ToInt32(valist[0]["F_MonitorTaskLevel"]), 0, 0, StartX, EndX, 0,0, "", DateTime.Now.ToString("u")}; dbo.ExceSQL(string.Format("INSERT INTO agv_task(FID, AGV_TASK_ID,AGV_TASK_LEVEL,PALLET_BARCODE,PALLET_TYPE, START_DEVICE_CODE, FINISH_DEVICE_CODE,AGV_TASK_STATUS, AGV_CODE, ERROR_TEXT, INSERT_TIME,WCS_FLAG) " + "VALUES({0},{1},'{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','0')", fid, TaskIndex, Convert.ToInt32(valist[0]["F_MonitorTaskLevel"]), 0, 0, StartX, EndX, 0, 0, "", DateTime.Now.ToString("u")));//ob sss.Remove(0, sss.Length); sss.Append("条码:").Append(0).Append("**写标志1").Append("**任务号" + TaskIndex.ToString()) .Append("**起始站台" + StartX.ToString()).Append("**终止站台" + EndX.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送AGV命令","", sss.ToString()); if (EndX == 22024 || EndX == 22023 || EndX == 22046 || EndX == 22049) { //站台逻辑有货 dbo.ExceSQL(string.Format("update t_base_device set F_HaveGoods = {0} where F_DeviceIndex = {1}", Convert.ToInt32(mti.ToString() + fid.ToString()), EndX)); } { #region 衢州华友入库AGV任务,发送时,生成拆盘任务 int newTaskEnd = EndX; //拆盘任务终点 int newTaskStart = GetPilerLocat(newTaskEnd);//拆盘任务起点 if (newTaskStart != -1) { Model.MDevice conveyor = Model.CGetInfo.GetDeviceInfo(newTaskEnd); if (conveyor.SplitByte_0 == 0) { var dv2 = dbo.ExceSQL(string.Format("select * from agv_task where fid = {0} and agv_task_id = {1}", fid, TaskIndex)).Tables[0].DefaultView; if ( dv2[0]["WCS_FLAG"] == null || dv2[0]["WCS_FLAG"].ToString() == "0" ) { if (GetManageTaskCountForStartAndEndDevice(newTaskStart, newTaskEnd) == 0) { object obb = new object[15] { CGetDeviceState.GetTempManageIdx(), 2, "S-" + valist[0]["F_TxtParam"], 1, 4, 1, 1, 1, "-", newTaskStart, newTaskEnd, "-", 0, DateTime.Now.ToString("u"), 0 }; string strs = string.Format("INSERT INTO T_Manage_Task(FID, F_ManageTaskKindIndex,FPALLETBARCODE,FMANAGETASKTYPE,FCONTROLTASKTYPE, FTASKLEVEL, FSTARTWAREHOUSE,FENDWAREHOUSE, FSTARTCELL, FSTARTDEVICE, FENDDEVICE, FENDCELL, FSTATUS, FBEGTIME, FIntoStepOK)" + "VALUES({0},{1},'{2}',{3},{4},{5},{6},'{7}','{8}','{9}',{10},'{11}','{12}','{13}','{14}')", CGetDeviceState.GetTempManageIdx(), 2, "S-" + valist[0]["F_TxtParam"], 1, 4, 1, 1, 1, "-", newTaskStart, newTaskEnd, "-", 0, DateTime.Now.ToString("u"), 0); dbo.ExceSQL(strs); } dbo.ExceSQL(string.Format("update AGV_TASK set WCS_FLAG = 1 where AGV_TASK_ID = {0}", TaskIndex)); CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "AGV取货同时,生成拆盘任务。", newTaskStart.ToString(), TaskIndex.ToString()); } } } #endregion } return true; } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message; return false; } } public int GetManageTaskCountForStartAndEndDevice(int start, int end) { DataView dv = new DataView(); string sql = string.Empty; try { { sql = string.Format("SELECT * FROM T_Manage_Task WHERE FSTARTDEVICE = '{0}' and FENDDEVICE = '{1}' ", start, end); } dv = dbo.ExceSQL(sql).Tables[0].DefaultView; return dv.Count; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } //根据输送线,返回拆叠盘机所在输送线的位置 public int GetPilerLocat(int device) { DataView valist = dbo.ExceSQL(string.Format("select * from T_Base_PLC_Ask where F_DeviceIndex = {0} and F_Askkind = 9", device)).Tables[0].DefaultView; if (valist.Count > 0) { return Convert.ToInt32(valist[0]["F_TempFirstProject"]); } else { return -1; } } 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; } } }