using System; using System.Collections.Generic; using System.Text; using ICommLayer; using DBFactory; using System.Data; using Microsoft.VisualBasic; namespace OPCClient { public class CSendDeviceOrder : ISendDeviceOrder { Model.MDevice devinfo; string _commLayerError; StringBuilder sql = new StringBuilder(); StringBuilder sss = new StringBuilder(); public string CommLayerError { get { return _commLayerError; } set { _commLayerError = value; } } DBOperator dbo = CCommonOPCClient.dbo; //Model.MDevice devinfo; public CSendDeviceOrder() { dbo.Open(); } /// /// 禁用货叉 /// /// /// public int getOrderFromMonitor(int monitorIndex,int deviceIndex) { DataView dv = new DataView(); try { //20101124 sql.Remove(0, sql.Length); sql.Append("select F_deviceCommandIndex from T_MONITOR_TASK where F_monitorIndex=").Append(monitorIndex).Append("and F_deviceIndex=").Append(deviceIndex); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (dv[0]["F_deviceCommandIndex"] == DBNull.Value) return -1; return Convert.ToInt32(dv[0]["F_deviceCommandIndex"]); } else { return -1; } } catch (Exception ex) {//20100108 throw ex; } finally {//20100108 dv.Dispose(); } } //新加控制任务号 public int GetFCONTROLTASKTYPEFromManageTask(int taskKindIndex, int Managefid) { //20100108 DataView dv = new DataView(); try { //20101124 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) {//20100108 throw ex; } finally {//20100108 dv.Dispose(); } } /// /// 发送堆垛机命令 堆垛机 单叉堆垛机 多叉堆垛机 堆垛机 堆垛机的发送任务 /// /// 消息编号 /// 任务编号 /// 堆垛机命令字 ///1-复位 ///2-将取 ///3-将送 ///4-取货 ///5-放货 ///6-取放货 /// 设备编号 /// 起始x坐标,排-沿轨道方向 /// 起始y坐标,层-高度方向 /// 起始z坐标,列-面向堆垛机操作面板,1-左侧,2-右侧 /// 目标x坐标,列-沿轨道方向 /// 目标y坐标,层-高度方向 /// 目标z坐标,排-面向堆垛机操作面板,1-左侧,2-右侧 /// 发送堆垛机命令是否成功 public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ) {//20120820 //return false; string barcode = GetBarcodeFromMonitorIndex(TaskIndex); int sn = 0; int UseAwayFork = 0; devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); //山东新华标识是不是同步发送 int sdxhmutitasks = 0; //调试暂时注视 if (devinfo.XCoor == 0) return false;//ceshi try { int[] sendmes = new int[10] { MessageIndex, TaskIndex, Order, DeviceIndex, StartX, StartY, StartZ, EndX, EndY, EndZ }; devinfo.SendMessage = sendmes; Model.CGetInfo.SetDeviceMessage(devinfo); if (devinfo == null) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:在设备表中没找到设备所引!"; return false; } else { if (devinfo.DeviceKind != 1) {//堆垛机使用此方法 _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:堆垛机和RGV以外的设备使用此方法不正确!"; return false; } #region 堆垛机 if (devinfo.DeviceKind == 1) { int[] startz = new int[devinfo.ForkAmount]; int[] endz = new int[devinfo.ForkAmount]; if (devinfo.IfCorrelDoubleFork == "1") { #region 多叉堆垛机 //堆垛机的原点属性 char[] sp = new char[1] { ',' }; string[] yd = devinfo.StackZeroColLayer.Split(sp); int zeroXcoor = 0; if (yd.GetLength(0) > 0) { zeroXcoor = Convert.ToInt32(yd[0]); } else { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:堆垛机的原点坐标没有填写!"; return false; } for (int i = 0; i < devinfo.ForkAmount; i++) { startz[i] = 0; endz[i] = 0; } #region 堆垛机的双叉取货指令,在此决定分配货叉、同步还是异步发送 //堆垛机取货时候分配货叉 if ((Order == 4) || (Order == 2)) { EndX = 0; EndY = 0; EndZ = 0; //获取调度任务类型 int mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex); //任务号 int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex); //控制任务类型 int controlTaskType = GetFCONTROLTASKTYPEFromManageTask(mti, fid); #region 分配货叉,修改路径的双叉自关联站台信息 //如果不是多叉关联任务:ST_CELL的FDoubleFork=0,则奇数列使用近货叉,偶数列使用远货叉;否则货叉按照ST_CELL的FDoubleFork的值 Dictionary rr = Model.CGeneralFunction.GetDoubleForkMonitorInfo(TaskIndex, DeviceIndex); if (rr == null) { #region 无关联任务 //如果F_UseAwayFork='0',分配货叉,否则已经分配好货叉无需再分配 if (Model.CGeneralFunction.GetUseAwayFork(TaskIndex) == "0") { #region 注释qdsr //if (devinfo != null) //{ // //int stackno = 0; // //if (devinfo.VirtualStack > 0) // //{ // // stackno = devinfo.VirtualStack; // //} // //else // //{ // // stackno = DeviceIndex; // //} // ////不关联任务分叉 青岛思锐双叉堆垛机单叉任务分配货叉 青岛思锐写死 // //if ( StartX == 3) // //{ // // UseAwayFork = 1; // //} // //else if ( StartX == 26) // //{ // // UseAwayFork = 2; // //} // //else // //{ // // UseAwayFork = Model.CGeneralFunction.GetDoubleForkFromST_CELL(StartZ, StartX, StartY, Model.CGeneralFunction.GetWAREHOUSEFromSTCELL(stackno)); // //} // int stackno = 0; // if (devinfo.VirtualStack > 0) // { // stackno = devinfo.VirtualStack; // } // else // { // stackno = DeviceIndex; // } // UseAwayFork = Model.CGeneralFunction.GetDoubleForkFromST_CELL(StartZ, StartX, StartY, Model.CGeneralFunction.GetWAREHOUSEFromSTCELL(stackno)); // if (UseAwayFork == 0) // { // #region 巷道货位判断是否为极限列,以极限列为准分配货叉 // sql.Clear(); // sql.Append("SELECT F_ForwardLimitX,F_BackLimitX FROM T_Base_LaneInfo WHERE F_StackIndex = ").Append(stackno).Append(" and F_ForwardLimitX>0 and F_BackLimitX>0"); // DataView dvl = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; // if ((devinfo.IfCorrelDoubleFork == "1") && (dvl.Count > 0)) // { // if (zeroXcoor < Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) // {//如果原点列坐标小于ForwardLimitX,检查ForwardLimitX至ForwardLimitX+(n-2); // if ((StartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) >= 0) && ((StartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) <= (devinfo.ForkAmount - 2)))) // { // UseAwayFork = (StartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1); // } // else if ((EndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) >= 0) && ((EndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) <= (devinfo.ForkAmount - 2)))) // { // UseAwayFork = (EndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1); // } // } // else if (zeroXcoor > Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) // {//如果原点列坐标大于ForwardLimitX,检查ForwardLimitX至ForwardLimitX-(n-2). // if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - StartX >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - StartX <= (devinfo.ForkAmount - 2)))) // { // UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - StartX + 1); // } // else if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - EndX >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - EndX <= (devinfo.ForkAmount - 2)))) // { // UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - EndX + 1); // } // } // if (zeroXcoor < Convert.ToInt32(dvl[0]["F_BackLimitX"])) // {//如果原点列坐标小于F_BackLimitX,检查F_BackLimitX至F_BackLimitX-(n-2); // if ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - StartX >= 0) && ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - StartX <= (devinfo.ForkAmount - 2)))) // { // UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - StartX)); // } // else if ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - EndX >= 0) && ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - EndX <= (devinfo.ForkAmount - 2)))) // { // UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - EndX)); // } // } // else if (zeroXcoor > Convert.ToInt32(dvl[0]["F_BackLimitX"])) // {//如果原点列坐标大于F_BackLimitX,检查F_BackLimitX至F_BackLimitX+(n-2). // if ((StartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) >= 0) && ((StartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) <= (devinfo.ForkAmount - 2)))) // { // UseAwayFork = (devinfo.ForkAmount - (StartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]))); // } // else if ((EndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) >= 0) && ((EndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) <= (devinfo.ForkAmount - 2)))) // { // UseAwayFork = (devinfo.ForkAmount - (EndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]))); // } // } // } // #endregion // } // if (UseAwayFork == 0) // { // //对货叉取余数 // if ((StartX % devinfo.ForkAmount) == 0) // { // UseAwayFork = devinfo.ForkAmount; // } // else // { // UseAwayFork = StartX % devinfo.ForkAmount; // } // } //} #endregion //FDoubleFork 可以在STCELL 表中指定货叉 UseAwayFork = Model.CGeneralFunction.GetDoubleForkFromST_CELL(StartZ, StartX, StartY, Model.CGeneralFunction.GetWAREHOUSEFromSTCELL(DeviceIndex)); if (UseAwayFork == 0) { #region CATL YB2 devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); if (devinfo != null) { int stackno = 0; if (devinfo.VirtualStack > 0) { stackno = devinfo.VirtualStack; } else { stackno = DeviceIndex; } #region 巷道货位判断是否为极限列,以极限列为准分配货叉 sql.Clear(); sql.Append("SELECT F_ForwardLimitX,F_BackLimitX FROM T_Base_LaneInfo WHERE F_StackIndex = ").Append(stackno).Append(" and F_ForwardLimitX>0 and F_BackLimitX>0"); DataView dvl = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if ((devinfo.IfCorrelDoubleFork == "1") && (dvl.Count > 0)) { if (zeroXcoor < Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) {//如果原点列坐标小于ForwardLimitX,检查ForwardLimitX至ForwardLimitX+(n-2); if ((StartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) >= 0) && ((StartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (StartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1); } else if ((EndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) >= 0) && ((EndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (EndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1); } } else if (zeroXcoor > Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) {//如果原点列坐标大于ForwardLimitX,检查ForwardLimitX至ForwardLimitX-(n-2). if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - StartX >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - StartX <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - StartX + 1); } else if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - EndX >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - EndX <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - EndX + 1); } } if (zeroXcoor < Convert.ToInt32(dvl[0]["F_BackLimitX"])) {//如果原点列坐标小于F_BackLimitX,检查F_BackLimitX至F_BackLimitX-(n-2); if ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - StartX >= 0) && ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - StartX <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - StartX)); } else if ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - EndX >= 0) && ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - EndX <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - EndX)); } } else if (zeroXcoor > Convert.ToInt32(dvl[0]["F_BackLimitX"])) {//如果原点列坐标大于F_BackLimitX,检查F_BackLimitX至F_BackLimitX+(n-2). if ((StartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) >= 0) && ((StartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (devinfo.ForkAmount - (StartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]))); } else if ((EndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) >= 0) && ((EndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (devinfo.ForkAmount - (EndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]))); } } } #endregion } if (UseAwayFork == 0) { if ((StartX % devinfo.ForkAmount) == 0) { UseAwayFork = devinfo.ForkAmount; } else { UseAwayFork = StartX % devinfo.ForkAmount; } } #endregion } if (UseAwayFork > devinfo.ForkAmount) { CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送多叉堆垛机命令", DeviceIndex.ToString(), barcode.ToCharArray() + ",分配货叉失败,排:" + StartZ.ToString() + "列:" + StartX.ToString() + "层:" + StartY.ToString() + ",货叉总数" + devinfo.ForkAmount.ToString() + ",分配的实际货叉" + UseAwayFork.ToString()); _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + barcode + ",分配货叉失败,排:" + StartZ.ToString() + "列:" + StartX.ToString() + "层:" + StartY.ToString() + ",货叉总数" + devinfo.ForkAmount.ToString() + ",分配的实际货叉" + UseAwayFork.ToString(); return false; } //2220173-时代吉利 增加堆垛机发送前检测判断堆垛机货叉是否被禁用 禁用时 更改货叉 if (ChangeForkWhenEnableUsed(DeviceIndex) != 0)//说明有禁用货叉 单独走逻辑 { //if (UseAwayFork == ChangeForkWhenEnableUsed(DeviceIndex))//配的叉 == 禁用的货叉 //{ //改叉 改检测条件 //这个位置的货叉 是根据列值刚刚设置的 还没更新给数据库 先进去更新一次 但不一定是可用的货叉 第二次发送时 进入usefork!=0 去那在更新为可用的 //如果在这判断 是否==不可用货叉 需要在此更新数据库中货叉 同时也需要处理提前检测条件 ChangForkForTask(fid, TaskIndex, UseAwayFork, DeviceIndex, mti); return false; //} //else //{ //} } else { // add for CATL YB2 替换提前检测和站台 同时考虑调整路径所选站台和提前检测 bool rp = SetLaneGateReplace(mti, fid, DeviceIndex, TaskIndex, UseAwayFork); sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_UseAwayFork = '").Append(UseAwayFork).Append("' WHERE (F_ManageTaskIndex = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(") AND F_DeviceIndex = ").Append(DeviceIndex); dbo.ExecuteSql(sql.ToString()); sql.Clear(); sql.Append("UPDATE T_Manage_Task SET FUseAwayFork = '").Append(UseAwayFork).Append("' WHERE (FID = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(")"); dbo.ExecuteSql(sql.ToString()); if (rp == true) return false;//20120217 } //// add for CATL YB2 替换提前检测和站台 同时考虑调整路径所选站台和提前检测 //bool rp = SetLaneGateReplace(mti, fid, DeviceIndex, TaskIndex, UseAwayFork); //sql.Clear(); //sql.Append("UPDATE T_Monitor_Task SET F_UseAwayFork = '").Append(UseAwayFork).Append("' WHERE (F_ManageTaskIndex = ") // .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") // .Append(mti).Append(") AND F_DeviceIndex = ").Append(DeviceIndex); //dbo.ExecuteSql(sql.ToString()); //sql.Clear(); //sql.Append("UPDATE T_Manage_Task SET FUseAwayFork = '").Append(UseAwayFork).Append("' WHERE (FID = ") // .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") // .Append(mti).Append(")"); //dbo.ExecuteSql(sql.ToString()); //if (rp == true) return false;//20120217 } else { UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(TaskIndex)); if (UseAwayFork > devinfo.ForkAmount) { CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送多叉堆垛机命令", DeviceIndex.ToString(), barcode.ToCharArray() + ",获取任务时分配的货叉错误,排:" + StartZ.ToString() + "列:" + StartX.ToString() + "层:" + StartY.ToString() + ",货叉总数" + devinfo.ForkAmount.ToString() + ",分配的实际货叉" + UseAwayFork.ToString()); _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + barcode + ",获取任务时分配的货叉错误,排:" + StartZ.ToString() + "列:" + StartX.ToString() + "层:" + StartY.ToString() + ",货叉总数" + devinfo.ForkAmount.ToString() + ",分配的实际货叉" + UseAwayFork.ToString(); return false; } //2220173-时代吉利 增加堆垛机发送前检测判断堆垛机货叉是否被禁用 禁用时 更改货叉 if (ChangeForkWhenEnableUsed(DeviceIndex) != 0)//说明有禁用货叉 单独走逻辑 { if (UseAwayFork == ChangeForkWhenEnableUsed(DeviceIndex))//配的叉 == 禁用的货叉 { //改叉 改检测条件 ChangForkForTask(fid, TaskIndex, UseAwayFork, DeviceIndex, mti); return false; } //else //{ //} } else { // add for CATL YB2 替换提前检测和站台 同时考虑调整路径所选站台和提前检测 bool rp = SetLaneGateReplace(mti, fid, DeviceIndex, TaskIndex, UseAwayFork); sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_UseAwayFork = '").Append(UseAwayFork).Append("' WHERE (F_ManageTaskIndex = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(") AND F_DeviceIndex = ").Append(DeviceIndex); dbo.ExecuteSql(sql.ToString()); sql.Clear(); sql.Append("UPDATE T_Manage_Task SET FUseAwayFork = '").Append(UseAwayFork).Append("' WHERE (FID = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(")"); dbo.ExecuteSql(sql.ToString()); if (rp == true) return false;//20120217 } ////同时考虑调整路径所选站台和提前检测 add for CATL YB2 更换了送货终点站台 //bool rp = SetLaneGateReplace(mti, fid, DeviceIndex, TaskIndex, UseAwayFork);//20120217 //sql.Clear(); //sql.Append("UPDATE T_Monitor_Task SET F_UseAwayFork = '").Append(UseAwayFork).Append("' WHERE (F_ManageTaskIndex = ") // .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") // .Append(mti).Append(") AND F_DeviceIndex = ").Append(DeviceIndex); //dbo.ExecuteSql(sql.ToString()); //sql.Clear(); //sql.Append("UPDATE T_Manage_Task SET FUseAwayFork = '").Append(UseAwayFork).Append("' WHERE (FID = ") // .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") // .Append(mti).Append(")"); //dbo.ExecuteSql(sql.ToString()); //if (rp == true) return false;//20120217 } #endregion } else { #region 有关联任务 Dictionary minzerodis = new Dictionary(); Dictionary rrnew = rr; int mintask = 0; double minDist = 0; int[] tasks; while (rrnew.Keys.Count > 0) { tasks = new int[rrnew.Keys.Count]; rrnew.Keys.CopyTo(tasks, 0); //计算任务离原点的距离由小到大排序 距离原点列小的为1叉 大的为2叉 stcell可也在FDOUBLEFORK 配置 // T_BASE_STACKINFO 配置原点列 Model.CGeneralFunction.GetMinZeroDistanceTask(tasks, devinfo, Order, out mintask, out minDist); minzerodis.Add(mintask, minDist); rrnew.Remove(mintask); } int forkno = 1; int tempStartX = 0, tempEndX = 0; bool Ifreturn = false; foreach (int task in minzerodis.Keys) { UseAwayFork = 0; mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(task); fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(task); if (Model.CGeneralFunction.GetUseAwayFork(task) == "0") { //未分配货叉,判断是否为极限货位,n叉考虑极限货位的n-1列; #region 巷道货位判断是否为极限列,以极限列为准分配货叉 int stackno = 0; if (devinfo.VirtualStack > 0) { stackno = devinfo.VirtualStack; } else { stackno = DeviceIndex; } //出库任务不判断极限货位 add for CATL YB2 不存在极限货位 if (controlTaskType != 2) { sql.Clear(); //判断前后极限货位是否存在并且都是大于0的 sql.Append("SELECT F_ForwardLimitX,F_BackLimitX FROM T_Base_LaneInfo WHERE F_StackIndex = ").Append(stackno).Append(" and F_ForwardLimitX>0 and F_BackLimitX>0"); DataView dvl = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; #region 极限货位分配判断 if ((devinfo.IfCorrelDoubleFork == "1") && (dvl.Count > 0)) { tempStartX = Model.CGeneralFunction.GetXCoorFromMonitor(task, DeviceIndex, 4); tempEndX = Model.CGeneralFunction.GetXCoorFromMonitor(task, DeviceIndex, 5); if (zeroXcoor < Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) {//如果原点列坐标小于ForwardLimitX,检查ForwardLimitX至ForwardLimitX+(n-2); if ((tempStartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) >= 0) && ((tempStartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (tempStartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1); } else if ((tempEndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) >= 0) && ((tempEndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (tempEndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1); } } else if (zeroXcoor > Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) {//如果原点列坐标大于ForwardLimitX,检查ForwardLimitX至ForwardLimitX-(n-2). if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempStartX >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempStartX <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempStartX + 1); } else if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempEndX >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempEndX <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempEndX + 1); } } if (zeroXcoor < Convert.ToInt32(dvl[0]["F_BackLimitX"])) {//如果原点列坐标小于F_BackLimitX,检查F_BackLimitX至F_BackLimitX-(n-2); if ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempStartX >= 0) && ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempStartX <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempStartX)); } else if ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempEndX >= 0) && ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempEndX <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempEndX)); } } else if (zeroXcoor > Convert.ToInt32(dvl[0]["F_BackLimitX"])) {//如果原点列坐标大于F_BackLimitX,检查F_BackLimitX至F_BackLimitX+(n-2). if ((tempStartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) >= 0) && ((tempStartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (devinfo.ForkAmount - (tempStartX - Convert.ToInt32(dvl[0]["F_BackLimitX"]))); } else if ((tempEndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) >= 0) && ((tempEndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]) <= (devinfo.ForkAmount - 2)))) { UseAwayFork = (devinfo.ForkAmount - (tempEndX - Convert.ToInt32(dvl[0]["F_BackLimitX"]))); } } } #endregion } #endregion //和堆垛机原点坐标做差取绝对值,值最小的是1叉,货叉已经分配过的不要重复 //如果分配的 if (UseAwayFork == 0) { //原来分配货叉 //UseAwayFork = forkno; //青岛思锐新的分配货叉 关联任务里面 任务号小的分配到2叉 任务号大的分配到1 //三个参数 第一个参数是调度任务号 这里直接分配了发送的货叉 //如果是出库任务 // UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(task, DeviceIndex, Order)); UseAwayFork = forkno; } } else { UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(task)); } #region 如果货叉已经被关联任务占用,极限列会出现,需要剔除关联关系 if (IfDeleteRelative(mti, fid, task, UseAwayFork) == true) { return false; } #endregion #region 超出数据库表中货叉的数量报警提示 if (UseAwayFork > devinfo.ForkAmount) { CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送多叉堆垛机命令", DeviceIndex.ToString(), barcode.ToCharArray() + ",关联任务分配货叉错误,排:" + StartZ.ToString() + "列:" + StartX.ToString() + "层:" + StartY.ToString() + ",货叉总数" + devinfo.ForkAmount.ToString() + ",分配的实际货叉" + UseAwayFork.ToString()); _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + barcode + ",关联任务分配货叉错误,排:" + StartZ.ToString() + "列:" + StartX.ToString() + "层:" + StartY.ToString() + ",货叉总数" + devinfo.ForkAmount.ToString() + ",分配的实际货叉" + UseAwayFork.ToString(); dbo.ExecuteSql(string.Format("UPDATE T_Manage_Task SET F_RELATIVECONTORLID = - 1 WHERE (F_ManageTaskKindIndex = {0}) AND (FID = {1})", mti, fid)); return false; } #endregion //原程序 因青岛思锐修改 forkno = UseAwayFork; //青岛思锐 //if (controlTaskType != 2) //{ // forkno = UseAwayFork; //} //2220173-时代吉利 增加堆垛机发送前检测判断堆垛机货叉是否被禁用 禁用时 更改货叉 //UseAwayFork = ChangeForkWhenEnableUsed(DeviceIndex, UseAwayFork); //20111226同时考虑调整路径所选站台和提前检测 //20200318这修改了一回提前检测 bool rp = SetLaneGateReplace(mti, fid, DeviceIndex, task, UseAwayFork);//20120217 if (rp == true) Ifreturn = true; // 出库双叉关联任务分叉 sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_UseAwayFork = '").Append(UseAwayFork).Append("' WHERE (F_ManageTaskIndex = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(") AND F_DeviceIndex = ").Append(DeviceIndex); dbo.ExecuteSql(sql.ToString()); sql.Clear(); sql.Append("UPDATE T_Manage_Task SET FUseAwayFork = '").Append(UseAwayFork).Append("' WHERE (Fid = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(") "); dbo.ExecuteSql(sql.ToString()); //原程序的代码 forkno++; } if (Ifreturn == true) return false; #endregion } #endregion #region 同步还是异步发送 int[] mutitasks = Model.CGeneralFunction.MutiForkIfSync(TaskIndex, DeviceIndex, devinfo.DeviceKind); if (mutitasks != null) { #region 注释 //foreach (int temptask in mutitasks) //{ // UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(temptask)); // if (temptask == TaskIndex) // { // //山东新华特殊处理 告诉电气货叉 并且 2叉对应的列不减1 // if (StartX > zeroXcoor) // { // StartX = StartX - (UseAwayFork - 1); // } // else // { // StartX = StartX + (UseAwayFork - 1); // } // } // startz[UseAwayFork - 1] = Model.CGeneralFunction.GetZCoorFromMonitor(temptask, DeviceIndex, Order); // if (startz[UseAwayFork - 1] != 0) // { // if (startz[UseAwayFork - 1] % 2 == 0) // { // startz[UseAwayFork - 1] = 2; // } // else // { // startz[UseAwayFork - 1] = 1; // } // } //} #endregion foreach (int temptask in mutitasks) { UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(temptask)); if (temptask == TaskIndex) { if (StartX > zeroXcoor) { StartX = StartX - (UseAwayFork - 1);//用1叉定位 } else { StartX = StartX + (UseAwayFork - 1); } } startz[UseAwayFork - 1] = Model.CGeneralFunction.GetZCoorFromMonitor(temptask, DeviceIndex, Order); if (startz[UseAwayFork - 1] != 0) { // 2220173-时代吉利 if (DeviceIndex == 10001) { switch (startz[UseAwayFork - 1]) { case 1: startz[UseAwayFork - 1] = 1; break; case 2: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10002) { switch (startz[UseAwayFork - 1]) { case 2: startz[UseAwayFork - 1] = 1; break; case 3: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10003) { switch (startz[UseAwayFork - 1]) { case 3: startz[UseAwayFork - 1] = 1; break; case 4: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10004) { switch (startz[UseAwayFork - 1]) { case 5: startz[UseAwayFork - 1] = 1; break; case 6: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10005) { switch (startz[UseAwayFork - 1]) { case 6: startz[UseAwayFork - 1] = 1; break; case 7: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10006) { switch (startz[UseAwayFork - 1]) { case 7: startz[UseAwayFork - 1] = 1; break; case 8: startz[UseAwayFork - 1] = 2; break; } } //if (startz[UseAwayFork - 1] % 2 == 0) //{ // startz[UseAwayFork - 1] = 2; //} //else //{ // startz[UseAwayFork - 1] = 1; //} } } } else { UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(TaskIndex)); if (StartX > zeroXcoor) { StartX = StartX - (UseAwayFork - 1); } else { StartX = StartX + (UseAwayFork - 1); } startz[UseAwayFork - 1] = StartZ; if (startz[UseAwayFork - 1] != 0) { // 2220173-时代吉利 if (DeviceIndex == 10001) { switch (startz[UseAwayFork - 1]) { case 1: startz[UseAwayFork - 1] = 1; break; case 2: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10002) { switch (startz[UseAwayFork - 1]) { case 2: startz[UseAwayFork - 1] = 1; break; case 3: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10003) { switch (startz[UseAwayFork - 1]) { case 3: startz[UseAwayFork - 1] = 1; break; case 4: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10004) { switch (startz[UseAwayFork - 1]) { case 5: startz[UseAwayFork - 1] = 1; break; case 6: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10005) { switch (startz[UseAwayFork - 1]) { case 6: startz[UseAwayFork - 1] = 1; break; case 7: startz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10006) { switch (startz[UseAwayFork - 1]) { case 7: startz[UseAwayFork - 1] = 1; break; case 8: startz[UseAwayFork - 1] = 2; break; } } //if (startz[UseAwayFork - 1] % 2 == 0) //{ // startz[UseAwayFork - 1] = 2; //} //else //{ // startz[UseAwayFork - 1] = 1; //} } } } #endregion #region 堆垛机的双叉送货指令,在此决定同步还是异步发送 if ((Order == 5) || (Order == 3)) { UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(TaskIndex)); if (UseAwayFork == 0) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:堆垛机货叉未分配!任务号" + TaskIndex; return false; } #region 同步还是异步发送 int[] mutitasks = Model.CGeneralFunction.MutiForkIfSync(TaskIndex, DeviceIndex, devinfo.DeviceKind); if (mutitasks != null) { #region 注释 //foreach (int temptask in mutitasks) //{ // UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(temptask)); // if (temptask == TaskIndex) // { // if (EndX > zeroXcoor) // { // if (EndX == 27 && UseAwayFork == 2) // { // EndX = 27; // } // else // { // EndX = EndX - (UseAwayFork - 1); // } // } // else // { // EndX = EndX + (UseAwayFork - 1); // } // } // endz[UseAwayFork - 1] = Model.CGeneralFunction.GetZCoorFromMonitor(temptask, DeviceIndex, Order); // if (endz[UseAwayFork - 1] != 0) // { // if (endz[UseAwayFork - 1] % 2 == 0) // { // endz[UseAwayFork - 1] = 2; // } // else // { // endz[UseAwayFork - 1] = 1; // } // } //} #endregion //add for CATL YB2 foreach (int temptask in mutitasks) { UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(temptask)); if (temptask == TaskIndex) { if (EndX > zeroXcoor) { EndX = EndX - (UseAwayFork - 1); } else { EndX = EndX + (UseAwayFork - 1); } } endz[UseAwayFork - 1] = Model.CGeneralFunction.GetZCoorFromMonitor(temptask, DeviceIndex, Order); if (endz[UseAwayFork - 1] != 0) { // 2220173-时代吉利 if (DeviceIndex == 10001) { switch (endz[UseAwayFork - 1]) { case 1: endz[UseAwayFork - 1] = 1; break; case 2: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10002) { switch (endz[UseAwayFork - 1]) { case 2: endz[UseAwayFork - 1] = 1; break; case 3: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10003) { switch (endz[UseAwayFork - 1]) { case 3: endz[UseAwayFork - 1] = 1; break; case 4: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10004) { switch (endz[UseAwayFork - 1]) { case 5: endz[UseAwayFork - 1] = 1; break; case 6: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10005) { switch (endz[UseAwayFork - 1]) { case 6: endz[UseAwayFork - 1] = 1; break; case 7: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10006) { switch (endz[UseAwayFork - 1]) { case 7: endz[UseAwayFork - 1] = 1; break; case 8: endz[UseAwayFork - 1] = 2; break; } } //if (endz[UseAwayFork - 1] % 2 == 0) //{ // endz[UseAwayFork - 1] = 2; //} //else //{ // endz[UseAwayFork - 1] = 1; //} } } } else { #region 注释 //if (EndX > zeroXcoor) //{ // if (UseAwayFork == 2 && EndX == 27) // { // EndX = 27; // } // else // { // EndX = EndX - (UseAwayFork - 1); // } //} //else //{ // EndX = EndX + (UseAwayFork - 1); //} //endz[UseAwayFork - 1] = EndZ; //if (endz[UseAwayFork - 1] != 0) //{ // if (endz[UseAwayFork - 1] % 2 == 0) // { // endz[UseAwayFork - 1] = 2; // } // else // { // endz[UseAwayFork - 1] = 1; // } //} #endregion if (EndX > zeroXcoor) { EndX = EndX - (UseAwayFork - 1); } else { EndX = EndX + (UseAwayFork - 1); } endz[UseAwayFork - 1] = EndZ; if (endz[UseAwayFork - 1] != 0) { // 2220173-时代吉利 if (DeviceIndex == 10001) { switch (endz[UseAwayFork - 1]) { case 1: endz[UseAwayFork - 1] = 1; break; case 2: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10002) { switch (endz[UseAwayFork - 1]) { case 2: endz[UseAwayFork - 1] = 1; break; case 3: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10003) { switch (endz[UseAwayFork - 1]) { case 3: endz[UseAwayFork - 1] = 1; break; case 4: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10004) { switch (endz[UseAwayFork - 1]) { case 5: endz[UseAwayFork - 1] = 1; break; case 6: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10005) { switch (endz[UseAwayFork - 1]) { case 6: endz[UseAwayFork - 1] = 1; break; case 7: endz[UseAwayFork - 1] = 2; break; } } else if (DeviceIndex == 10006) { switch (endz[UseAwayFork - 1]) { case 7: endz[UseAwayFork - 1] = 1; break; case 8: endz[UseAwayFork - 1] = 2; break; } } //if (endz[UseAwayFork - 1] % 2 == 0) //{ // endz[UseAwayFork - 1] = 2; //} //else //{ // endz[UseAwayFork - 1] = 1; //} } } #endregion } #endregion //9,11,13 int arrAmout = 9 + (devinfo.ForkAmount - 1) * 2; int arrsn = 0; StringBuilder strap = new StringBuilder(); StringBuilder[] itemnames = new StringBuilder[arrAmout]; StringBuilder[] itemvalues = new StringBuilder[arrAmout]; for (int i = 0; i < arrAmout; i++) { itemnames[i] = new StringBuilder(); itemvalues[i] = new StringBuilder(); } #region 注释 //判断是同步还是不是同步,是同步增加同步标识3 //不是同步判断当前发送任务的货叉 如果是2叉则需要将取货和送货的列加1 则在货叉的字段写2 //如果是1叉 则在货叉的字段写 1 //if (sdxhmutitasks == 1) //{ // //山东辛化 货叉标识位 // sdxhmutitasks = 3; //} //else //{ // //如果是1叉 货叉标识就发1 // if (UseAwayFork == 1) // { // sdxhmutitasks = 1; // } // else if (UseAwayFork == 2) // { // //货叉是2叉的话 取送货列都要加1 // StartX += 1; // EndX += 1; // sdxhmutitasks = 2; // } //} #endregion #endregion //多叉堆垛机 给它发去15列取货 他是近叉停在15列 sn = devinfo.Dbw1Address; //双叉堆垛机 第一字节读写标志位 第一遍先清头和命令字 //itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); //itemvalues[0].Append("0"); ////第二字节 命令字 第一遍先清头和命令字 //itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); //itemvalues[1].Append("0"); //第3、4字节是任务号 使用int 类型 两个字节 不能大于30000 itemnames[2].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2)).Append(",i"); itemvalues[2].Append(TaskIndex.ToString()); //第5字节 取货列X坐标沿轨道方向 itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 4)).Append(",b"); itemvalues[3].Append(StartX.ToString()); //第6字节 取货层 Y 坐标 itemnames[4].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 5)).Append(",b"); itemvalues[4].Append(StartY.ToString()); //第7、8字节 取货排 z[i] 坐标 双叉近叉和远叉排坐标 for (int i = 1; i <= devinfo.ForkAmount; i++) { itemnames[4 + i].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 5 + i)).Append(",b"); itemvalues[4 + i].Append(startz[i - 1].ToString()); strap.Append(i.ToString()).Append("叉取排Z:").Append(startz[i - 1].ToString()).Append(";"); } arrsn = 4 + devinfo.ForkAmount; //第9字节 送货列X坐标 itemnames[arrsn + 1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + arrsn + 2)).Append(",b"); itemvalues[arrsn + 1].Append(EndX.ToString()); //第10字节 送货层Y坐标 itemnames[arrsn + 2].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + arrsn + 3)).Append(",b"); itemvalues[arrsn + 2].Append(EndY.ToString()); //第11、12字节送货位排Z[1] 和 Z[2] for (int i = 1; i <= devinfo.ForkAmount; i++) { itemnames[arrsn + 2 + i].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + arrsn + 3 + i)).Append(",b"); itemvalues[arrsn + 2 + i].Append(endz[i - 1].ToString()); strap.Append(i.ToString()).Append("叉送排Z:").Append(endz[i - 1].ToString()).Append(";"); } //第13字节是货叉标识 1是1叉 2是2叉 3是同步发送 山东辛化 //itemnames[12].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 12 )).Append(",b"); //itemvalues[12].Append(sdxhmutitasks.ToString()); itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[0].Append(MessageIndex.ToString()); itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); itemvalues[1].Append(Order.ToString()); //itemnames[arrsn + 3 + devinfo.ForkAmount].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); //itemvalues[arrsn + 3 + devinfo.ForkAmount].Append(Order.ToString()); //itemnames[arrsn + 3 + devinfo.ForkAmount + 1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); //itemvalues[arrsn + 3 + devinfo.ForkAmount + 1].Append(MessageIndex.ToString()); //OPC Server的机器名称或者IP地址 CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP; //OPC Server的程序标识,例如:OPC.SimaticNET CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID"); // 建立PLC连接的ID,例如:"S7:[S7 connection_1]" CCommonOPCClient.PlcConnectionID = devinfo.S7Connection; // add for CATL YB2 异步发送 AWriteAllItemValue SyncWriteAllItemValue(itemnames, itemvalues) // //去掉原有的"先写入后续字节, 后写入消息头"的写OPC数据逻辑, 修改为"每次通信只写入一次OPC数据" if (CCommonOPCClient.AWriteAllItemValue(itemnames, itemvalues) == false) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + CCommonOPCClient.OpcError; return false; } //itemvalues[0].Remove(0, itemvalues[0].Length); //itemvalues[0].Append(MessageIndex.ToString()); //itemvalues[1].Remove(0, itemvalues[1].Length); //itemvalues[1].Append(Order.ToString()); //// add for CATL YB2 异步发送 AWriteAllItemValue SyncWriteAllItemValue(itemnames, itemvalues) //if (CCommonOPCClient.AWriteAllItemValue(itemnames, itemvalues) == false) //{ // _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + CCommonOPCClient.OpcError; // return false; //} sss.Remove(0, sss.Length); sss.Append("条码:").Append(barcode).Append("**写标志").Append(MessageIndex.ToString()).Append("**命令字" + Order.ToString()).Append("**任务号" + TaskIndex.ToString()) .Append("**起始排" + StartZ.ToString()).Append("**起始列" + StartX.ToString()).Append("**起始层" + StartY.ToString()) .Append("**终止排" + EndZ.ToString()).Append("**终止列" + EndX.ToString()).Append("**终止层" + EndY.ToString()) .Append(";").Append(strap).Append("**货叉" + sdxhmutitasks.ToString()); // add for CATL YB2 控制黑匣子写入量 if (MessageIndex == 0 || MessageIndex == 1 || MessageIndex == 2 || MessageIndex == 4) { CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送堆垛机命令", DeviceIndex.ToString(), sss.ToString()); } // CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送多叉堆垛机命令", DeviceIndex.ToString(), sss.ToString()); #endregion } else { #region 单叉堆垛机 DB1写值 //通知堆垛机托盘类型 StringBuilder[] itemnames = { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; StringBuilder[] itemvalues = { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; #region 转换(Z)排坐标 int a = 2; int Z = 0; //StackReach 表示几进伸 //if (devinfo.StackReach == 2) //{ // a = 4; //} //if (DeviceIndex == 11001) //{ // #region 双伸堆垛机 134排 // if (StartZ != 0) // { // Z = StartZ % a; // if (Z == 0) // { // StartZ = a; // } // else // { // StartZ = Z; // } // } // if (EndZ != 0) // { // Z = EndZ % a; // if (Z == 0) // { // EndZ = a; // } // else // { // EndZ = Z; // } // } // #endregion //} //else if (DeviceIndex == 11002 || DeviceIndex == 11003) //{ // a = 3; // if (StartZ != 0) // { // Z = StartZ % a; // if (Z == 2) // { // StartZ = 1; // } // else if (Z == 0) // { // StartZ = 3; // } // else // { // StartZ = 4; // } // } // if (EndZ != 0) // { // Z = EndZ % a; // if (Z == 2) // { // EndZ = 1; // } // else if (Z == 0) // { // EndZ = 3; // } // else // { // EndZ = 4; // } // } //} #region 单双叉堆垛机的 Z 转换 // 2220173-时代吉利 //10001--1/2 10002--2/3 10003--3/4 //10004--5/6 10005--6/7 10006--7/8 //StartZ if (DeviceIndex == 10001) { if (StartZ != 0) { switch (StartZ) { case 1: StartZ = 1; break; case 2: StartZ = 2; break; } } } else if (DeviceIndex == 10002) { if (StartZ != 0) { switch (StartZ) { case 2: StartZ = 1; break; case 3: StartZ = 2; break; } } } else if (DeviceIndex == 10003) { if (StartZ != 0) { switch (StartZ) { case 3: StartZ = 1; break; case 4: StartZ = 2; break; } } } else if (DeviceIndex == 10004) { if (StartZ != 0) { switch (StartZ) { case 5: StartZ = 1; break; case 6: StartZ = 2; break; } } } else if (DeviceIndex == 10005) { if (StartZ != 0) { switch (StartZ) { case 6: StartZ = 1; break; case 7: StartZ = 2; break; } } } else if (DeviceIndex == 10006) { if (StartZ != 0) { switch (StartZ) { case 7: StartZ = 1; break; case 8: StartZ = 2; break; } } } //EndZ if (DeviceIndex == 10001) { if (EndZ != 0) { switch (EndZ) { case 1: EndZ = 1; break; case 2: EndZ = 2; break; } } } else if (DeviceIndex == 10002) { if (EndZ != 0) { switch (EndZ) { case 2: EndZ = 1; break; case 3: EndZ = 2; break; } } } else if (DeviceIndex == 10003) { if (EndZ != 0) { switch (EndZ) { case 3: EndZ = 1; break; case 4: EndZ = 2; break; } } } else if (DeviceIndex == 10004) { if (EndZ != 0) { switch (EndZ) { case 5: EndZ = 1; break; case 6: EndZ = 2; break; } } } else if (DeviceIndex == 10005) { if (EndZ != 0) { switch (EndZ) { case 6: EndZ = 1; break; case 7: EndZ = 2; break; } } } else if (DeviceIndex == 10006) { if (EndZ != 0) { switch (EndZ) { case 7: EndZ = 1; break; case 8: EndZ = 2; break; } } } //if (StartZ != 0) //{ // //单叉堆垛机对2取余 余数为0 就让Z 等于2 , 余数不为0 就让Z 等于1 // //堆垛机左1 右 2 // Z = StartZ % a; // if (Z == 0) // { // StartZ = 2; // } // else // { // StartZ = 1; // } //} //if (EndZ != 0) //{ // Z = EndZ % a; // if (Z == 0) // { // EndZ = 2; // } // else // { // EndZ = 1; // } //} #endregion #endregion //int Pallettype = GetGoodsTypeFromManageTask(TaskIndex); //sn 获取 Dbw1Address 的起始地址 sn = Convert.ToInt32(devinfo.Dbw1Address); //第三四字节是任务号 B 是字节 D是双字 i 是int R是实数 发给3和4字节 itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2)).Append(",i"); itemvalues[0].Append(TaskIndex.ToString());//任务号 //第5字节 取货位X坐标 itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 4)).Append(",b"); itemvalues[1].Append((StartX).ToString()); //第6字节 取货位 Y 坐标 itemnames[2].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 5)).Append(",b"); itemvalues[2].Append(StartY.ToString()); //第7字节 取货位Z 坐标 itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 6)).Append(",b"); itemvalues[3].Append(StartZ.ToString()); //第8字节 送货位 X 坐标 itemnames[4].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 7)).Append(",b"); itemvalues[4].Append((EndX).ToString()); //第9字节 送货位 Y 坐标 itemnames[5].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 8)).Append(",b"); itemvalues[5].Append(EndY.ToString()); //第10个字节 送货位排 Z 坐标 itemnames[6].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 9)).Append(",b"); itemvalues[6].Append(EndZ.ToString()); //第一字节 读写标志位 0是上位机对 堆垛机报告运行应答 1-下达任务标识 2-上位机对下位机上报完成状态的应答 4- 复位 itemnames[7].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[7].Append("0"); //第二个字节 指令 1 召回 2 3 4 5 6 itemnames[8].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); itemvalues[8].Append("0");//命令字 //托盘类型 //itemnames[9].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 10)).Append(",b"); //itemvalues[9].Append(Pallettype.ToString()); CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP; // OPC Server的程序标识,例如:OPC.SimaticNET CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID"); // 建立PLC连接的ID,例如:"S7:[S7 connection_1]" CCommonOPCClient.PlcConnectionID = devinfo.S7Connection; if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + CCommonOPCClient.OpcError; return false; } //每次向DB1写数的时候先清头和命令 清完之后在写 itemvalues[7].Remove(0, itemvalues[7].Length); itemvalues[7].Append(MessageIndex.ToString()); itemvalues[8].Remove(0, itemvalues[8].Length); itemvalues[8].Append(Order.ToString()); //同步写入所有的项目值 if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + CCommonOPCClient.OpcError; return false; } sss.Remove(0, sss.Length); sss.Append("条码:").Append(barcode).Append("**写标志").Append(MessageIndex.ToString()).Append("**命令字" + Order.ToString()).Append("**任务号" + TaskIndex.ToString()) .Append("**起始排" + StartZ.ToString()).Append("**起始列" + StartX.ToString()).Append("**起始层" + StartY.ToString()) .Append("**终止排" + EndZ.ToString()).Append("**终止列" + EndX.ToString()).Append("**终止层" + EndY.ToString()); //.Append("**终止排" + EndZ.ToString()).Append("**终止列" + EndX.ToString()).Append("**终止层" + EndY.ToString()).Append("**托盘类型" + Pallettype.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送堆垛机命令:", DeviceIndex.ToString(), sss.ToString()); //if (WriteBarcode(DeviceIndex, TaskIndex) == false) //{ // return false; //} #endregion } if (WriteBarcode(DeviceIndex, TaskIndex) == false) { return false; } } #endregion } return true; } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message; return false; } finally { devinfo = null; } } bool IfDeleteRelative(int mti, int fid, int moniTask,int useawayfork) { DataView dv = new DataView(); try { int relfid= Model.CGeneralFunction.GetRelativeControlID(mti, fid); sql.Clear(); sql.Append("SELECT DISTINCT T_Manage_Task.FID FROM T_Manage_Task,T_Monitor_Task where ") .Append(" T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX ") .Append(" AND T_Manage_Task.FID = T_Monitor_Task.F_ManageTaskIndex and ") .Append(" (T_Manage_Task.F_RELATIVECONTORLID = ").Append(relfid).Append(") AND (T_Monitor_Task.F_UseAwayFork = '").Append(useawayfork).Append("') ") .Append(" AND (T_Monitor_Task.F_ManageTASKKINDINDEX = ").Append(mti).Append(") AND (T_Monitor_Task.F_ManageTaskIndex <> ").Append(fid).Append(")"); dv=dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { dbo.ExecuteSql(string .Format("UPDATE T_Manage_Task SET F_RELATIVECONTORLID = - 1 WHERE (F_ManageTaskKindIndex = {0}) AND (FID = {1})",mti,fid)); return true; } else { return false; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } private void GetLaneGateDeviceZXY(int StackIndex, int laneGate, out string DeviceZXY) { DeviceZXY = string.Empty; sql.Clear(); sql.Append(string.Format("SELECT T_Base_Lane_Gate.F_ZXY FROM T_Base_Lane_Gate,T_Base_LaneInfo where T_Base_Lane_Gate.F_LaneIndex = T_Base_LaneInfo.F_LaneDeviceIndex and T_Base_LaneInfo.F_StackIndex={0} and T_Base_Lane_Gate.F_LaneGateDeviceIndex={1}", StackIndex, laneGate)); DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { DeviceZXY = dv[0][0].ToString(); } } /// /// 发送穿梭车、输送机设备命令 输送机 穿梭车 输送机 穿梭车 输送机 穿梭车 输送机 穿梭车 的发送任务DB1 /// /// 消息编号 /// 任务编号 /// 命令字 /// 穿梭车命令字: ///1-复位 ///2-左接货 ///3-左送货 ///4-右接货 ///5-右送货 ///6-停止 ///7-运动(运动到第4、5字节指定的目标设备所引) ///输送机命令字: ///1-入库(朝向库) ///2-出库(背向库) ///3-送货 ///4-接货 ///5-停止 /// 设备编号 ///对于输送机、穿梭车代表目标设备所引, /// 0-代表单一设备控制,无目标设备所引;1…65535代表目标设备所引(终点输送机的设备所引) /// 发送穿梭车、输送机设备命令是否成功 public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int ArrowDeviceIndex) { StringBuilder[] itemnames; StringBuilder[] itemvalues; StringBuilder strTask=new StringBuilder(); devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); if (devinfo.XCoor == 0 && devinfo.YCoor == 0 && devinfo.DeviceKind == 4) return false;//20130510 // 双顶升2叉终点位置 add for CATL YB2 int ArrowDeviceIndex2 = 0; int taskindex1 = 0; int taskindex2 = 0; string barcode = GetBarcodeFromMonitorIndex(TaskIndex); try { #region add for CATL YB2 判断站台是不是双任务站台 分配任务号和终点位置 // add for CATL YB2 增加关联任务判断,判断当前任务是不是关联任务,是关联任务要取两个任务号和两个终点位置 //任务类型 int kindIndex = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex); //任务号 int manageTaskIndexYB = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex); //控制任务类型 int dcontrolTaskType = GetFCONTROLTASKTYPEFromManageTask(kindIndex, manageTaskIndexYB); // add for CATL YB2 获取关联任务号 string doubleRel = "-1"; // 判断关联任务号 出库的任务类型 获取关联任务号 || dcontrolTaskType == 4 // 4类型之前堆垛机导叉 用 现场调试变更为控制任务类型 2 对齐进行双叉出库配对 || dcontrolTaskType == 4 if (dcontrolTaskType == 2 ) { doubleRel = GetRativeControlId(TaskIndex); } // 判断是不是关联任务并且,是不是双叉关联站台 // 需要的条件 两个小任务号 两个终点位置 和对应的货叉 if (Convert.ToInt32(doubleRel) != -1 && devinfo.IfCorrelDoubleFork == "1") { // 此判断里是双叉关联任务并且是双顶升站台的时候 分配任务号和目标设备站台号 // 取出关联任务对用的 两条任务的大任务号和货叉号 int[] taskFork = Model.CGeneralFunction.DoubleMinMonitorIndex(Convert.ToInt32(doubleRel)); // 如果存在双顶升 需要获取两个终点位置 // 取出两个 终点位置 1叉的赋值给 ArrowDeviceIndex,2叉赋值给ArrowDeviceIndex2 2叉先发 // 取出 关联任务的 对应的 终点位置 小任务号 货叉号 的数组 返回值 或者 null int[] station1 = GetDouArrowDeviceIndex(taskFork[0], taskFork[1]); int[] station2 = GetDouArrowDeviceIndex(taskFork[2], taskFork[3]); #region 站台1 对应第一个任务号 if (station1 != null) { if (station1[2] == 2) { // 终点2叉站台 ArrowDeviceIndex2 = station1[0]; taskindex2 = station1[1]; } else //if (station1[2] == 1) { ArrowDeviceIndex = station1[0]; taskindex1 = station1[1]; } } #endregion #region 站台2 对应第二个任务号 if (station2 != null) { if (station2[2] == 2) { // 终点2叉站台 ArrowDeviceIndex2 = station2[0]; taskindex2 = station2[1]; } else //if (station1[2] == 1) { ArrowDeviceIndex = station2[0]; taskindex1 = station2[1]; } } #endregion } // 不是关联任务 但是是双顶升站台 else if (Convert.ToInt32(doubleRel) == -1 && devinfo.IfCorrelDoubleFork == "1") { // 如果不是关联任务 但是是双叉关联站台,也需要判断是哪个货叉和对应位置的任务号 // 是哪个货叉 就发到对应货叉的DB区 // 获取当前任务对应出库的货叉 为哪个叉 int useAwayForksin = Model.CGeneralFunction.GetUseAwayForkFromManagetask(manageTaskIndexYB); // 根据当前货叉号分配 任务号值和终点站台值 if (useAwayForksin == 1) { ArrowDeviceIndex = Convert.ToInt32(ArrowDeviceIndex.ToString().Substring(0, 5)); taskindex1 = TaskIndex; } else if (useAwayForksin == 2) { ArrowDeviceIndex2 = Convert.ToInt32(ArrowDeviceIndex.ToString().Substring(0, 5)); taskindex2 = TaskIndex; // 单独是2叉发送时候 一叉目标地址为 0 add for CATL YB2 ArrowDeviceIndex = 0; } else { // 正常这种情况应该不会出现 _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder终点错误"; return false; } } else // 正常输送机 { // 不是双顶升 正常获取终点位置 发送的DB区也不是双顶升的 为正常的 if (ArrowDeviceIndex.ToString().Length > 5) { ArrowDeviceIndex = Convert.ToInt32(ArrowDeviceIndex.ToString().Substring(0, 5)); } } #endregion int[] sendmes = new int[5] { MessageIndex, TaskIndex, Order, DeviceIndex, ArrowDeviceIndex }; devinfo.SendMessage = sendmes; Model.CGetInfo.SetDeviceMessage(devinfo); int sn = 0; string JPINFO = ""; if (devinfo == null) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:设备索引不存在!"; return false; } else { //if (devinfo.DeviceKind == 7) //{ // return true; //} if (devinfo.DeviceKind == 1) {//堆垛机不允许使用此方法 _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:堆垛机不允许使用此方法!"; return false; } sn = Convert.ToInt32(devinfo.Dbw1Address); strTask.Append(TaskIndex.ToString()); if (devinfo.DeviceKind == 31) { #region 高端输送 int reSendFlag = 0, HMISendDb1Address = 0; GetHMISendInfo(out reSendFlag, out HMISendDb1Address, TaskIndex);//触摸屏申请重新发送20120220 int inworkbench = IfInworkBench(TaskIndex); if (MessageIndex == 2) { barcode = "000000"; inworkbench = 0; } byte[] barbyte = new byte[6]; if (barcode.Length == 6) { barbyte = ASCIIEncoding.ASCII.GetBytes(barcode); } else { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:高端工位输送机条码不合法!"; return false; } if (reSendFlag == 2)//触摸屏申请重新发送20120220devinfo.UseCommonDB == "1" { sn = HMISendDb1Address; itemnames = new StringBuilder[10] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; itemvalues = new StringBuilder[10] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[0].Append("0"); for (int i = 1; i <= 6; i++) { itemnames[i].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + i)).Append(",b"); itemvalues[i].Append(barbyte[i - 1]); } itemnames[7].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 7)).Append(",b"); itemvalues[7].Append(inworkbench); itemnames[8].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 8)).Append(",i"); //20120207 StringBuilder a1 = new StringBuilder(devinfo.DeviceIndex.ToString().Substring(0, 1)); if (devinfo.DeviceIndex > 0) {//托盘所在的当前设备索引 StringBuilder a2 = new StringBuilder(devinfo.DeviceIndex.ToString().Substring(2)); a1.Append(a2); } itemvalues[8].Append(a1.ToString());//托盘所在的当前设备索引 itemnames[9].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 10)).Append(",i"); itemvalues[9].Append(ArrowDeviceIndex.ToString()); } else { itemnames = new StringBuilder[9] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("")}; ; itemvalues = new StringBuilder[9] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[0].Append("0"); for (int i = 1; i <= 6; i++) { itemnames[i].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + i)).Append(",b"); itemvalues[i].Append(barbyte[i - 1]); } itemnames[7].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 7)).Append(",b"); itemvalues[7].Append(inworkbench); itemnames[8].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 8)).Append(",i"); itemvalues[8].Append(ArrowDeviceIndex.ToString()); } #endregion } else if (devinfo.DeviceKind == 40) { //安全急停 服务端增加 联机停车 itemnames = new StringBuilder[1] { new StringBuilder("") }; itemvalues = new StringBuilder[1] { new StringBuilder("") }; itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[0].Append(Order.ToString()); sss.Remove(0, sss.Length); sss.Append("上位机发送紧急停车:").Append(DeviceIndex).Append("***指令").Append(Order.ToString()); } else if (devinfo.DeviceKind == 7) { itemnames = new StringBuilder[1] { new StringBuilder("") }; itemvalues = new StringBuilder[1] { new StringBuilder("") }; itemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b"); itemvalues[0].Append("2"); sss.Remove(0, sss.Length); sss.Append("手动发送扫码器应答").Append(DeviceIndex).Append("***指令").Append("2"); } else { #region 物流输送机 #region devinfo.UseCommonDB == "1" if (devinfo.UseCommonDB == "1") { itemnames = new StringBuilder[5] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; itemvalues = new StringBuilder[5] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; //第1字节:读写标志位 itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[0].Append("0");//输送机头 //第2字节 命令字 itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); itemvalues[1].Append(Order.ToString());//命令 //第3、4字节任务号 itemnames[2].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2)).Append(",i"); itemvalues[2].Append(TaskIndex.ToString());//任务号 //第5、6、7、8 字节表示目标设备编号 itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 4)).Append(",i"); itemvalues[3].Append(DeviceIndex.ToString());//起始设备编号(当前设备编号) //目标终点设备 itemnames[4].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 6)).Append(",i"); itemvalues[4].Append(ArrowDeviceIndex.ToString()); sss.Remove(0, sss.Length); sss.Append("条码:").Append(barcode).Append("**写标志").Append(MessageIndex.ToString()).Append("**命令字" + Order.ToString()).Append("**任务号" + strTask.ToString()) .Append("**目标位置" + ArrowDeviceIndex.ToString()); } #endregion else { #region 双任务顶升站台配对发送任务 // T_Base_Device 表F_IFCORRELDOUBLEFORK 字段为1 多叉关联双顶升站台任务 if (devinfo.IfCorrelDoubleFork == "1") { #region 多叉关联站台任务 #region 注释 // int TaskIndexDB23 = 0; int TaskIndexDB45 = 0; //// int reltaskindex = Model.CGeneralFunction.GetDoubleLiftInfo(TaskIndex, DeviceIndex); // strTask.Clear(); // int devicestrcount = DeviceIndex.ToString().Length; // string row = DeviceIndex.ToString().Substring(devicestrcount - 1, 1); // if (row == "1")//一列近叉 // { // TaskIndexDB23 = TaskIndex; // // TaskIndexDB45 = reltaskindex; // } // else // if (row == "2")//2列远叉 // { // // TaskIndexDB23 = reltaskindex;//1列先离开 // TaskIndexDB45 = TaskIndex; //2列后离开输送机 // } // strTask.Append("1叉任务号:" + TaskIndexDB23.ToString()).Append("一叉条码:").Append(GetBarcodeFromMonitorIndex(TaskIndexDB23)); // strTask.Append(";2叉任务号:" + TaskIndexDB45.ToString()).Append("二叉条码:").Append(GetBarcodeFromMonitorIndex(TaskIndexDB45)); #endregion devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); sn = Convert.ToInt32(devinfo.Dbw1Address); //itemnames = new StringBuilder[6] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; //itemvalues = new StringBuilder[6] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; //itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); //itemvalues[0].Append("0"); //itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); //itemvalues[1].Append(Order.ToString()); #region 中车四方 注释 //int taskindex1 = 0; //int taskindex2 = 0; //int[] mutitasks = Model.CGeneralFunction.MutiForkIfSync(TaskIndex, DeviceIndex, devinfo.DeviceKind); //if (mutitasks != null) //{ // foreach (int temptask in mutitasks) // { // int UseAwayFork = Convert.ToInt32(Model.CGeneralFunction.GetUseAwayFork(temptask)); // if (UseAwayFork == 0) // { // taskindex2 = temptask; // } // else if (UseAwayFork == 1) // { // taskindex2 = temptask; // } // else if (UseAwayFork == 2) // { // taskindex1 = temptask; // } // } //} //else //{ // taskindex2 = TaskIndex; //} #endregion // add for CATL YB2 由于实现了不同终点配对双叉的任务,所以下达任务的终点 写两个终点 双任务站台是14个 字节 // 此处还需要增加逻辑是双顶升上的任务有一个提前检测不通过 另一个也不能发送 devinfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(DeviceIndex.ToString().Substring(0, 5))); sn = Convert.ToInt32(devinfo.Dbw1Address); //增加一个new StringBuilder("") YB2 itemnames = new StringBuilder[6] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; itemvalues = new StringBuilder[6] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; ; // MessageIndex //第1字节: 命令字 itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); itemvalues[0].Append(Order.ToString()); //第2、3字节: 任务号1 对应堆垛机货叉1位置任务号(远叉) itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2)).Append(",i"); itemvalues[1].Append(taskindex1); //第4、5字节; 任务号2 对应堆垛机货叉2位置任务号(近叉) itemnames[2].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 4)).Append(",i"); itemvalues[2].Append(taskindex2); //第6、7、8、9字节 表示目标设备编号1 对应一叉 YB2 itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 6)).Append(",dw"); itemvalues[3].Append(ArrowDeviceIndex.ToString()); //第10、11、12、13字节 表示目标设备编号2 对应二叉 YB2 itemnames[4].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 10)).Append(",dw"); itemvalues[4].Append(ArrowDeviceIndex2.ToString()); //第0字节: 读写标志位 itemnames[5].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[5].Append(MessageIndex); // add for CATL YB2 //增加任务号单独记录 JPINFO = ",一叉(近叉)任务号:" + taskindex1.ToString() + ",二叉(远叉)任务号:" + taskindex2.ToString(); //一叉的托盘条码 string firstBarcode = GetBarcodeFromMonitorIndex(taskindex1); //二叉托盘条码 string secondBarcode = GetBarcodeFromMonitorIndex(taskindex2); string doubleBarcodeInfo = ""; doubleBarcodeInfo = ",一叉(近叉)条码:" + firstBarcode.ToString() + ",二叉(远叉)条码:" + secondBarcode.ToString(); sss.Remove(0, sss.Length); sss.Append("条码:").Append(barcode).Append("**写标志").Append(MessageIndex.ToString()).Append("**命令字" + Order.ToString()).Append("**任务号" + strTask.ToString()) .Append("**目标位置1:" + ArrowDeviceIndex.ToString()).Append("**目标位置2:" + ArrowDeviceIndex2.ToString()).Append("**单独记录双任务顶升近叉远叉任务号" + JPINFO).Append("**关联顶升的双任务号:" + doubleBarcodeInfo); #endregion } #endregion else if (devinfo.DeviceKind == 17) { //在发送拆垛指令前,判断管理任务是否要求回流,如果回流则不发送拆垛指令 int mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex); if (mti == 1) { int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex); int flag = Model.CGeneralFunction.GetBackFlagFromIOControl(fid); if (1 == flag)//回流 { CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "不拆垛等待回流", devinfo.DeviceIndex.ToString(), fid.ToString()); return true; } } //发送条码值 #region 拆垛机器人 string goodsbarcode = GetGoodsBarcodeFromManageTask(TaskIndex); goodsbarcode = goodsbarcode.TrimStart(';').TrimEnd(';').Trim(); int count = goodsbarcode.Length;//字符数 char[] cc = new char[1] { ';' }; string[] code = goodsbarcode.Split(cc); int goodscount = code.Length;//物料数 int length = devinfo.Dbw1SendLength - 1;//写数据区长度//TaskIndex是字,此处减一 itemnames = new StringBuilder[length];//length并不是写数据区中字节的个数,而是数组中的个数 itemvalues = new StringBuilder[length];//TaskIndex是字,此处减一 byte[] barbyte = new byte[count]; barbyte = ASCIIEncoding.ASCII.GetBytes(goodsbarcode); itemnames[0] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[0] = new StringBuilder("0"); itemnames[1] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); itemvalues[1] = new StringBuilder(Order.ToString()); itemnames[2] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2)).Append(",i"); itemvalues[2] = new StringBuilder(TaskIndex.ToString()); itemnames[3] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 4)).Append(",b"); itemvalues[3] = new StringBuilder(ArrowDeviceIndex.ToString());//箱体或内同的类型 itemnames[4] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 5)).Append(",b"); itemvalues[4] = new StringBuilder(goodscount.ToString());//箱体或筒体的数量 //分号的ascII码是59 for (int i = 0, j = 5; j < length; i++) //处理条码 { if (i < count) { if (barbyte[i] != 59)//分号不处理 { itemnames[j] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1 + j)).Append(",b"); itemvalues[j] = new StringBuilder(barbyte[i].ToString()); j++; } } else//其他位置自动填充0 { itemnames[j] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1 + j)).Append(",b"); itemvalues[j] = new StringBuilder("0"); j++; } } sss.Remove(0, sss.Length); sss.Append("条码:").Append(barcode).Append("**写标志").Append(MessageIndex.ToString()).Append("**命令字" + Order.ToString()).Append("**任务号" + strTask.ToString()) .Append("**类型" + ArrowDeviceIndex.ToString()).Append("**数量" + goodscount.ToString()).Append("**物料条码" + goodsbarcode.ToString()); #endregion } else {//普通输送机 if (devinfo.Dbw1SendLength >= 21)//内同或箱体输送机 11000,11001,11025,13001 { #region 内同或箱体输送机 int length = devinfo.Dbw1SendLength - 2;//写数据区长度//TaskIndex和ArrowDeviceIndex是字,此处减二 int type = GetGoodsTypeFromManageTask(TaskIndex); itemnames = new StringBuilder[length];//TaskIndex和ArrowDeviceIndex是字,此处减二 itemvalues = new StringBuilder[length];// int count = barcode.Length;//单个内同或箱体条码的字符数 byte[] barbyte = new byte[count]; barbyte = ASCIIEncoding.ASCII.GetBytes(barcode.Trim()); itemnames[0] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[0] = new StringBuilder("0"); itemnames[1] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); itemvalues[1] = new StringBuilder(Order.ToString()); itemnames[2] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2)).Append(",i"); itemvalues[2] = new StringBuilder(TaskIndex.ToString()); itemnames[3] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 4)).Append(",i"); itemvalues[3] = new StringBuilder(ArrowDeviceIndex.ToString()); itemnames[4] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 6)).Append(",b"); itemvalues[4] = new StringBuilder(type.ToString());//箱体或筒体的类型 //分号的ascII码是59 for (int i = 0, j = 5; j < length; i++) //处理条码 { if (i < count) { itemnames[j] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2 + j)).Append(",b"); itemvalues[j] = new StringBuilder(barbyte[i].ToString()); j++; } else//其他位置自动填充0 { itemnames[j] = new StringBuilder(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2 + j)).Append(",b"); itemvalues[j] = new StringBuilder("0"); j++; } } sss.Remove(0, sss.Length); sss.Append("条码:").Append(barcode).Append("**写标志").Append(MessageIndex.ToString()).Append("**命令字" + Order.ToString()).Append("**任务号" + strTask.ToString()) .Append("**目标位置" + ArrowDeviceIndex.ToString()).Append("**类型" + type.ToString()).Append("**物料条码" + barcode.ToString()); #endregion } else { #region 普通输送机 最新协议 双字 双字 kkkkkkkkk //int Pallettype = GetGoodsTypeFromManageTask(TaskIndex); //plc 中i 即 int 单整数 di 即Dint 双整数 r 即 REAL 浮点数 itemnames = new StringBuilder[4] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; itemvalues = new StringBuilder[4] { new StringBuilder(""), new StringBuilder(""), new StringBuilder(""), new StringBuilder("") }; // 第2字节 命令字 itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 1)).Append(",b"); itemvalues[0].Append(Order.ToString()); //第3、4字节 任务号 itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 2)).Append(",i"); itemvalues[1].Append(TaskIndex.ToString()); //新协议 目标位置是4个字节, 第4、5、6、7字节 双字 itemnames[2].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 4)).Append(",dw"); //itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 4)).Append(",i"); itemvalues[2].Append(ArrowDeviceIndex.ToString()); //itemnames[4].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 8)).Append(",b"); //itemvalues[4].Append(Pallettype.ToString()); //第1字节 头 itemnames[3].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[3].Append(MessageIndex); sss.Remove(0, sss.Length); sss.Append("输送机发送命令**条码:").Append(barcode).Append("**写标志").Append(MessageIndex.ToString()).Append("**命令字" + Order.ToString()).Append("**任务号" + strTask.ToString()) .Append("**目标位置" + ArrowDeviceIndex.ToString()); //.Append("**目标位置" + ArrowDeviceIndex.ToString()).Append("**托盘类型" + Pallettype.ToString()); ; #endregion } } } #endregion } } CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP; CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID"); CCommonOPCClient.PlcConnectionID = devinfo.S7Connection;//20110216 // .SyncWriteAllItemValue(itemnames, itemvalues) == false add for CATL YB2 改为异步发送 if (CCommonOPCClient.AWriteAllItemValue(itemnames, itemvalues) == false) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + CCommonOPCClient.OpcError; return false; } //itemnames[0].Remove(0, itemnames[0].Length); //itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); //itemvalues[0].Remove(0, itemvalues[0].Length); //itemvalues[0].Append(MessageIndex); //if (CCommonOPCClient.AWriteAllItemValue(itemnames, itemvalues) == false) //{ // _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + CCommonOPCClient.OpcError; // return false; //} //sss.Remove(0, sss.Length); //sss.Append("条码:").Append(barcode).Append("**写标志").Append(MessageIndex.ToString()).Append("**命令字" + Order.ToString()).Append("**任务号" + strTask.ToString()) // .Append("**目标位置" + ArrowDeviceIndex.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送指令", devinfo.DeviceIndex.ToString(), sss.ToString()); //if (MessageIndex == 1) //{ // if (WriteBarcode(DeviceIndex, TaskIndex) == false) // { // return false; // } //} return true; } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message; return false; } finally { devinfo = null; itemnames = null; itemvalues = null; } } /// /// //2220173-时代吉利 增加货叉禁用功能 /// 需要修改接口ISendDeviceOrder 同时在各个实现类里面增加这个方法 直接return true /// /// /// /// public bool SendDeviceOrder(int fork, int DeviceIndex) { StringBuilder[] itemnames; StringBuilder[] itemvalues; try { devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); //return true;//ceshi int[] sendmes = new int[2] { fork, DeviceIndex }; devinfo.SendMessage = sendmes; Model.CGetInfo.SetDeviceMessage(devinfo); int sn = 0; if (devinfo == null) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:设备索引不存在!"; return false; } else { if (devinfo.DeviceKind != 1) {//堆垛机不允许使用此方法 _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:只有堆垛机禁用货叉使用此方法!"; return false; } //if (fork == 1 || fork == 2) //{ // fork = 1;//设置禁用 但不告诉电气具体货叉 //} //else //{ // fork = 0;//解除禁用 //} sn = Convert.ToInt32(devinfo.Dbw1Address); itemnames = new StringBuilder[1] { new StringBuilder("") }; itemvalues = new StringBuilder[1] { new StringBuilder("") }; itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 18)).Append(",b"); itemvalues[0].Append(fork.ToString());//暂时给电气只发1 作为标记 不发具体叉号 sss.Remove(0, sss.Length); sss.Append("上位机禁用堆垛机货叉:").Append(DeviceIndex).Append("***货叉").Append(fork.ToString()); } CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName"); CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID"); CCommonOPCClient.PlcConnectionID = devinfo.S7Connection; if (CCommonOPCClient.AWriteAllItemValue(itemnames, itemvalues) == false) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + CCommonOPCClient.OpcError; return false; } CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送指令", devinfo.DeviceIndex.ToString(), sss.ToString()); return true; } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message; return false; } finally { devinfo = null; itemnames = null; itemvalues = null; } } private void GetHMISendInfo(out int reSendFlag, out int HMISendDb1Address, int taskindex) {//20120220 reSendFlag = 0; HMISendDb1Address = 0; try { DataView dv = dbo.ExceSQL(string.Format("SELECT F_NumParam2, F_SendFlag FROM T_Monitor_Task where F_MonitorIndex={0}", taskindex)).Tables[0].DefaultView; if (dv.Count > 0) { reSendFlag = Convert.ToInt32(dv[0]["F_SendFlag"]); HMISendDb1Address = Convert.ToInt32(dv[0]["F_NumParam2"]);//触摸屏F_DBW1Address } } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.GetHMISendInfo发生错误:" + ex.Message; } } /// /// 上位机给下位机发送烟箱按品牌码分道信息共15字节,有数据时写入实际数据,否则全部写零 /// /// 码垛位设备号索引 /// 第3--15字节,烟箱码 /// 第1字节,1-有一号工程码,0-无一号工程码 /// 第2字节,1-异型烟箱,0-正常烟箱 /// 发送烟箱按品牌码分道信息是否成功 public bool SendDeviceOrder(int DeviceIndex, string TobaccoCode, bool HaveFirstProjectCode, bool IfSmallTobacco, int Count) { StringBuilder[] itemnames = new StringBuilder[16]; StringBuilder[] itemvalues = new StringBuilder[16]; devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); try { int sn = 0; if (devinfo == null) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:设备所引不存在!"; return false; } else { sn = Convert.ToInt32(devinfo.Dbw1Address); itemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append((sn + 0).ToString()).Append(",b"); if (HaveFirstProjectCode == true) { itemvalues[0].Append("1"); } else { itemvalues[0].Append("0"); } itemnames[1].Append(Model.CGeneralFunction.DBSend).Append(".").Append((sn + 1).ToString()).Append(",b"); if (IfSmallTobacco == true) { itemvalues[1].Append("1"); } else { itemvalues[1].Append("0"); } for (int i = 2; i <= 14; i++) { itemnames[i].Append(Model.CGeneralFunction.DBSend).Append(".").Append((sn + i).ToString()).Append(",b"); itemvalues[i].Append(Strings.Asc(TobaccoCode.Substring(i - 2, 1)).ToString()); } itemnames[15].Append(Model.CGeneralFunction.DBSend).Append(".").Append((sn + 15).ToString()).Append(",b"); itemvalues[15].Append(Count.ToString()); CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP; CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID"); CCommonOPCClient.PlcConnectionID = devinfo.S7Connection;//20110216 if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false) { return false; } } return true; } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message; return false; } finally { devinfo = null; itemnames = null; itemvalues = null; } } public bool WriteBarcode(int deviceindex, int taskindex) { Model.MDevice devinfo; StringBuilder[] itemnames = new StringBuilder[11]; StringBuilder[] itemvalues = new StringBuilder[11]; int sn = 0; try { devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex); sss.Remove(0, sss.Length); sss.Append("SELECT F_MonitorIndex, F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskindex).Append(")"); DataView dvb = dbo.ExceSQL(sss.ToString()).Tables[0].DefaultView; if (dvb.Count > 0) { sss.Remove(0, sss.Length); sss.Append(dvb[0]["F_TxtParam"].ToString()); if ((sss.ToString() == "-") || (sss.ToString() == "")) return true; } else { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:写入附加条码时在调度任务表内没找到条码!"; return false; } if (devinfo.AppendBarcode > 0) { Model.MDevice devinfo1 = Model.CGetInfo.GetDeviceInfo(devinfo.AppendBarcode); if (devinfo1.DeviceIndex == 0) { _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:写入附加条码时设备索引不存在!"; return false; } else { //byte0,byte1,byte2,byte3,byte4 // int1 int3 //int0(byte0,byte1);int1(byte1,byte2);int2(byte2,byte3);int3(byte3,byte4) sn = Convert.ToInt32(devinfo1.Dbw1Address); devinfo1 = null; for (int i = 0; i <= 9; i++) { itemnames[i].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + i + 1)).Append(",b"); itemvalues[i].Append(Strings.Asc(sss.ToString().Substring((i), 1)).ToString()); } itemnames[10].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(sn + 0)).Append(",b"); itemvalues[10].Append("1"); CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP; CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID"); CCommonOPCClient.PlcConnectionID = devinfo.S7Connection;//20110216 if (CCommonOPCClient.SyncWriteAllItemValue(itemnames, itemvalues) == false) { return false; } CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "SendDeviceOrder", deviceindex.ToString(), sss.ToString()); } return true; } else { return true; ; } } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.WriteBarcode发生错误:" + ex.Message; return false; } finally { devinfo = null; itemnames = null; itemvalues = null; } } /// /// 向PLC的DB区写入数据 /// /// 标签变量名称数组 /// 标签值数组 /// public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues) { try { if (CCommonOPCClient.SyncWriteAllItemValue(ItemNames, ItemValues) == false) { return false; } else { sss.Remove(0, sss.Length); sss.Append("**" + ItemNames[0].ToString() + "**" + ItemValues[0].ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送应答标志", "----", sss.ToString()); return true; } } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.WriteDBData发生错误:" + ex.Message; return false; } finally { ItemNames = null; ItemValues = null; } } public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues, string PLCconnectionID) { try { CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");//20090922 devinfo.RemoteIP; CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID"); CCommonOPCClient.PlcConnectionID = PLCconnectionID; // SyncWriteAllItemValue if (CCommonOPCClient.AWriteAllItemValue(ItemNames, ItemValues) == false) { return false; } else { sss.Remove(0, sss.Length); for (int i = 0; i < ItemNames.Length; i++) { sss.Append("**" + ItemNames[i].ToString() + "**" + ItemValues[i].ToString()); } CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送应答标志", "----", sss.ToString()); return true; } } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.WriteDBData发生错误:" + ex.Message; return false; } finally { ItemNames = null; ItemValues = null; } } string GetBarcodeFromMonitorIndex(int taskindex) { sss.Remove(0, sss.Length); sss.Append("SELECT F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskindex).Append(")"); DataView dvb = dbo.ExceSQL(sss.ToString()).Tables[0].DefaultView; if (dvb.Count > 0) { return dvb[0]["F_TxtParam"].ToString(); } else { return "-"; } } // add for CATL YB2 获取关联任务ID string GetRativeControlId(int taskindex) { int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(taskindex); sss.Remove(0, sss.Length); sss.Append("SELECT F_RELATIVECONTORLID FROM T_MANAGE_TASK WHERE (FID = ").Append(fid).Append(")"); DataView dvb = dbo.ExceSQL(sss.ToString()).Tables[0].DefaultView; if (dvb.Count > 0) { return dvb[0]["F_RELATIVECONTORLID"].ToString(); } else { return "-1"; } } // ArrowDeviceIndex // add for CATL YB2 获取关联任务的终点位置 int[] GetDouArrowDeviceIndex(int Fid, int useAwayFork) { DataView dvb = new DataView(); int[] rr = new int[3]; try { sss.Remove(0, sss.Length); // 例 :SELECT t.F_NUMPARAM4,t.F_MonitorIndex FROM T_MONITOR_TASK t,T_BASE_DEVICE s WHERE t.F_MANAGETASKINDEX = 70013 and t.f_Deviceindex = s.F_DEVICEINDEX AND s.F_IFCORRELDOUBLEFORK = 1 // 查出双顶升任务送出的终点和任务号 没有用排序order by子查询 避免任务多排序时间长 sss.Append("SELECT t.F_NUMPARAM4,t.F_MonitorIndex FROM T_MONITOR_TASK t,T_BASE_DEVICE s WHERE t.F_MANAGETASKINDEX = ").Append(Fid).Append(" and t.f_Deviceindex = s.F_DEVICEINDEX AND s.F_IFCORRELDOUBLEFORK = 1"); dvb = dbo.ExceSQL(sss.ToString()).Tables[0].DefaultView; if (dvb.Count > 0) { // 终点位置 rr[0] = Convert.ToInt32(dvb[0]["F_NUMPARAM4"]); // 小任务号 rr[1] = Convert.ToInt32(dvb[0]["F_MonitorIndex"]); // 货叉号 rr[2] = useAwayFork; return rr; } return null; } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.GetDouArrowDeviceIndex时发生错误:" + ex.Message; return null; } finally { dvb.Dispose(); sql = null; } } //获得物料条码信息 public string GetGoodsBarcodeFromManageTask(int TaskIndex)//20130107 { //20100108 string sql; string goodsbarcode = string.Empty; try { int mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex); int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex); //20100108 sql = string.Format("SELECT GOODS_BARCODE FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex ={1})", fid, mti); object ob = dbo.GetSingle(sql); if (ob != null) { goodsbarcode = Convert.ToString(ob); } return goodsbarcode; } catch (Exception ex) {//20100108 _commLayerError = "OPCClient.CSendDeviceOrder.GetGoodsBarcodeFromManageTask时发生错误:" + ex.Message; return ""; } finally {//20100108 sql = null; } } //获得物料类型 public int GetGoodsTypeFromManageTask(int TaskIndex)//20130107 { //20100108 string sql; int type = 0; try { int mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(TaskIndex); int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex); //20100108 sql = string.Format("SELECT GOODS_NUM FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex ={1})", fid, mti); object ob = dbo.GetSingle(sql); if (ob != null) { type = Convert.ToInt32(ob); } return type; } catch (Exception ex) {//20100108 _commLayerError = "OPCClient.CSendDeviceOrder.GetGoodsTypeFromManageTask时发生错误:" + ex.Message; return 0; } finally {//20100108 sql = null; } } int GetNowDevice(int taskindex) { sss.Remove(0, sss.Length); sss.Append("SELECT F_NumParam1 FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskindex).Append(")"); DataView dvb = dbo.ExceSQL(sss.ToString()).Tables[0].DefaultView; if (dvb.Count > 0) { return Convert.ToInt32(dvb[0]["F_NumParam1"]); } else { return 0; } } int IfInworkBench(int taskindex) { int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(taskindex); int mti = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(taskindex); object ob = dbo.GetSingle(string.Format("SELECT WORK_MODE FROM T_Manage_Task WHERE (F_ManageTaskKindIndex = {0}) AND (FID = {1})", mti, fid)); if (ob != null) { return Convert.ToInt32(ob); } else { return 2; } } List GetNextDevice(int CurRouteIDSub, int CurSerialNumber) { List keyDevice = new List(); DataView dvRoute; try { //然后依次判断后续设备最近的设备 sql.Remove(0, sql.Length); sql.Append("SELECT T_Base_Route_Device.F_DeviceIndex,F_DeviceOrder, T_Base_Route_Device.F_SerialNumber, ").Append( "T_Base_Device_Command.F_DeviceCommandIndex,T_Base_Device.F_DeviceKindIndex FROM T_Base_Device_Command ").Append( ",T_Base_Device,T_Base_Route_Device where T_Base_Device_Command.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex").Append( " and T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and F_RouteIDSub=").Append( CurRouteIDSub).Append(" and F_SerialNumber > ").Append(CurSerialNumber).Append(" order by F_SerialNumber asc "); dvRoute = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvRoute.Count > 0) { keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceIndex"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceKindIndex"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_SerialNumber"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceOrder"])); } return keyDevice; } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.GetNextDevice:" + ex.Message; return null; } finally { keyDevice = null; dvRoute = null; } } int GetNextDeviceFromTaskDevice(int TaskIndex, int DeviceIndex) {//20111226 int RouteIDSub = 0; int sn = 0; DataView dv = dbo.ExceSQL(string.Format("SELECT F_RouteID FROM T_Monitor_Task WHERE (F_MonitorIndex = {0})", TaskIndex)).Tables[0].DefaultView; if (dv.Count > 0) { RouteIDSub = Convert.ToInt32(dv[0][0]); } else { return -1; } try { //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_SerialNumber FROM T_Base_Route_Device WHERE (F_RouteIDSub = ").Append(RouteIDSub).Append(") AND (F_DeviceIndex = ").Append(DeviceIndex).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { sn = (int)dv[0]["F_SerialNumber"]; List nd = GetNextDevice(RouteIDSub, sn); if (nd != null) { return nd[0]; } else { return -1; } } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv = null; } } /// /// 根据堆垛机坐标获得(是双叉对等关联站台的)站台设备索引 /// /// /// /// int GetDeviceLaneGateInfoFromStackCoor(int stackdeviceindex, string stackzxy, out int useawayfork) { devinfo = Model.CGetInfo.GetDeviceInfo(stackdeviceindex); if (devinfo != null) { if (devinfo.VirtualStack > 0) { stackdeviceindex = devinfo.VirtualStack; } } int laneway = 0; useawayfork = 0; DataView dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = {0})", stackdeviceindex)).Tables[0].DefaultView; if (dvl.Count > 0) { laneway = Convert.ToInt32(dvl[0][0]); } else { return -1; } sql.Remove(0, sql.Length); // add for CATL YB2 oracle 修改F_CorrelDeviceIndex<>'' F_LaneGateDeviceIndex 将返回的结果换成 F_CorrelDeviceIndex 字段 而不是 F_LaneGateDeviceIndex sql.Append("SELECT F_CorrelDeviceIndex,F_UseAwayFork FROM T_Base_Lane_Gate where F_CorrelDeviceIndex is not null and (F_LaneIndex=").Append(laneway).Append(" and T_Base_Lane_Gate.F_ZXY = '").Append(stackzxy).Append("')"); DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { useawayfork = Convert.ToInt32(dv[0]["F_UseAwayFork"]); // F_LaneGateDeviceIndex return Convert.ToInt32(dv[0]["F_CorrelDeviceIndex"]); } return -1; } /// /// 根据堆垛机坐标获得(是双叉对等关联站台的)站台设备索引 /// /// /// /// int GetDeviceLaneGateInfoFromStackCoorlanegate(int stackdeviceindex, string stackzxy, out int useawayfork) { devinfo = Model.CGetInfo.GetDeviceInfo(stackdeviceindex); if (devinfo != null) { if (devinfo.VirtualStack > 0) { stackdeviceindex = devinfo.VirtualStack; } } int laneway = 0; useawayfork = 0; DataView dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = {0})", stackdeviceindex)).Tables[0].DefaultView; if (dvl.Count > 0) { laneway = Convert.ToInt32(dvl[0][0]); } else { return -1; } sql.Remove(0, sql.Length); // add for CATL YB2 oracle 修改F_CorrelDeviceIndex<>'' F_LaneGateDeviceIndex 将返回的结果换成 F_CorrelDeviceIndex 字段 而不是 F_LaneGateDeviceIndex sql.Append("SELECT F_LaneGateDeviceIndex,F_UseAwayFork FROM T_Base_Lane_Gate where F_CorrelDeviceIndex is not null and (F_LaneIndex=").Append(laneway).Append(" and T_Base_Lane_Gate.F_ZXY = '").Append(stackzxy).Append("')"); DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { useawayfork = Convert.ToInt32(dv[0]["F_UseAwayFork"]); // F_LaneGateDeviceIndex return Convert.ToInt32(dv[0]["F_LaneGateDeviceIndex"]); } return -1; } /// /// 更新货叉 /// 不能有极限货叉 /// /// /// /// 分配的货叉 /// public void ChangForkForTask(int fid,int monitorIndex,int oldforkIndex,int deviceIndex,int mti) { string checkStr = ""; string checkReplaceStr = ""; int newFork = 0; bool isOutPut = false;//1叉的时候出库 拆出来就是 靠近货架的顶升 发送也是 但是2叉的时候 拆出来坐标是靠近货架的 发送的时候会-1 导致送的位置 不对 在发送输送的时候 任务发的位置不对 //int newFork = oldforkIndex == 1 ? 2 : 1;//前一级判断了只有当禁用货叉和分配的货叉一致 才进来 进来之后直接取反 就是只能使用的货叉 //if (oldforkIndex == 1) //{ // checkStr= deviceIndex.ToString() + ".0"; // checkReplaceStr = deviceIndex.ToString() + ".1"; // newFork = 2; // isOutPut = true; //} //if (oldforkIndex == 2) //{ // checkStr = deviceIndex.ToString() + ".1"; // checkReplaceStr = deviceIndex.ToString() + ".0";//新的检测开关 // newFork = 1; // //isOutPut = true; //} //if (oldforkIndex == 0)//应该是用不上 //{ newFork = ChangeForkWhenEnableUsed(deviceIndex) == 1 ? 2 : 1; if (newFork == 1) { //如果检测是2叉的 改成1叉 checkStr = deviceIndex.ToString() + ".1"; checkReplaceStr = deviceIndex.ToString() + ".0"; } if (newFork == 2) { checkStr = deviceIndex.ToString() + ".0"; checkReplaceStr = deviceIndex.ToString() + ".1"; isOutPut = true; } //} if (isOutPut) { int manageKind = GetFCONTROLTASKTYPEFromManageTask(mti,fid); //int order = getOrderFromMonitor(monitorIndex, deviceIndex); if (manageKind == 2)//&& order==5 { int[] zxy = GetCoordinatesFromMonitorTask(monitorIndex);//获取指令的取货 和送货 坐标 StringBuilder zxystart = new StringBuilder(); StringBuilder zxyend = new StringBuilder(); if (zxy != null) { //zxyend.Append((zxy[3].ToString().Length == 1 ? "0" + zxy[3].ToString() : zxy[3].ToString())).Append("-").Append( // ((zxy[4].ToString().Length == 1) ? ("0" + zxy[4].ToString()) : (zxy[4].ToString()))).Append("-").Append( // ((zxy[5].ToString().Length == 1) ? ("0" + zxy[5].ToString()) : (zxy[5].ToString()))); //zxystart.Append((zxy[1].ToString().Length == 1 ? "0" + zxy[1].ToString() : zxy[1].ToString())).Append("-").Append( // ((zxy[2].ToString().Length == 1) ? ("0" + zxy[2].ToString()) : (zxy[2].ToString()))).Append("-").Append( // ((zxy[3].ToString().Length == 1) ? ("0" + zxy[3].ToString()) : (zxy[3].ToString()))); int n5 = zxy[4] + 1;//加1之后再发送时候减1 时代吉利 就单侧出库 且坐标是大列 只处理了2叉送货的坐标 //判断送货终点是不是站台 //修改堆垛机送货坐标 sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_NumParam5=").Append(n5).Append(" WHERE (F_ManageTaskIndex = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(")").Append(" AND F_DeviceIndex = ").Append(deviceIndex);//.Append(" and F_deviceCommandIndex=5") dbo.ExecuteSql(sql.ToString()); } } } //如果是入库 通过坐标取货叉 //if (controlTaskType == 1 || controlTaskType == 3) //{ //申请点都是靠近货架位置 这个时候 站台的检测条件是不需要改变的 只需要改堆垛机探货条件 sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_AheadDetect=Replace(F_AheadDetect,'") .Append(checkStr).Append("','").Append(checkReplaceStr).Append("') WHERE F_ManageTaskIndex = ") .Append(fid).Append(" AND F_DeviceIndex = ").Append(deviceIndex); dbo.ExecuteSql(sql.ToString()); sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_UseAwayFork = '").Append(newFork).Append("' WHERE (F_ManageTaskIndex = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(") AND F_DeviceIndex = ").Append(deviceIndex); dbo.ExecuteSql(sql.ToString()); sql.Clear(); sql.Append("UPDATE T_Manage_Task SET FUseAwayFork = '").Append(newFork).Append("' WHERE (FID = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(")"); dbo.ExecuteSql(sql.ToString()); //} //如果是出库 送货位 坐标 //if (controlTaskType == 2) //{ //} //倒库 //if (controlTaskType == 3) //{ //} } /// /// 判断是否有禁用货叉 /// /// /// /// public int ChangeForkWhenEnableUsed(int deviceIndex) { int returnFork = 0; sql.Remove(0, sql.Length); sql.Append("select F_stackindex,F_ENABLEUSED from T_BASE_STACKINFO where F_stackindex=").Append(deviceIndex); DataView dw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dw.Count > 0) { if (Convert.ToInt32(dw[0]["F_ENABLEUSED"]) != 0) { //if (Convert.ToInt32(dw[0]["F_ENABLEUSED"]) == 1)//1叉禁用 //{ // returnFork = 2; //} //if (Convert.ToInt32(dw[0]["F_ENABLEUSED"]) == 2)//2叉禁用 //{ // returnFork = 1; //} returnFork = Convert.ToInt32(dw[0]["F_ENABLEUSED"]); } } return returnFork; } //每次发送任务前执行路径调整 T_Base_Lane_Gate 修改lane gate 表 的提前检测 add for CATL YB2 替换提前检测 public bool SetLaneGateReplace(int mti, int fid, int DeviceIndex, int TaskIndex, int UseAwayFork) {//20120820 //201112231同时考虑调整路径所选站台和提前检测有问题 if (UseAwayFork > 0) { int[] zxy = GetCoordinatesFromMonitorTask(TaskIndex); StringBuilder zxystr = new StringBuilder(); if (zxy != null) { zxystr.Append((zxy[3].ToString().Length == 1 ? "0" + zxy[3].ToString() : zxy[3].ToString())).Append("-").Append( ((zxy[4].ToString().Length == 1) ? ("0" + zxy[4].ToString()) : (zxy[4].ToString()))).Append("-").Append( ((zxy[5].ToString().Length == 1) ? ("0" + zxy[5].ToString()) : (zxy[5].ToString()))); } int LaneGateDevice = 0; int oldawayfork = 0; int LaneGateDevicetrue = 0; //oNextDevice 路径中已经拆分出的出库站台编号(1列或2列对应的设备编号) oldawayfork 查出值永远是1 2叉值列值加1 int oNextDevice = GetDeviceLaneGateInfoFromStackCoor(DeviceIndex, zxystr.ToString(), out oldawayfork); // add for CATL YB2 返回真实的F_LaneGateDeviceIndex int oNextDevicetrue = GetDeviceLaneGateInfoFromStackCoorlanegate(DeviceIndex, zxystr.ToString(), out oldawayfork); if (oNextDevice > 0) { // 送货列值CATL int n5 = zxy[4]; //Convert.ToInt32(sp[1]); if (UseAwayFork == oldawayfork || oldawayfork==0)//不需要指定货叉 { //不调整 return false;//20120217 } else//将oldawayfork替换为UseAwayFork { //堆垛机的原点属性 char[] cc = new char[1] { ',' }; string[] lc = devinfo.StackZeroColLayer.Split(cc); // add for CATL YB2 在stackinfo 表里的 F_ZeroColLayer 字段配置堆垛机方向 0,1 原点为0,1 ,如果配置成40,1原点就是从 // 40,1 递减 确定堆垛机货叉出库方向 是递增的1,2 还是递减的2,1 if (Convert.ToInt32(lc[0]) < n5)//正常情况,货叉顺序号和列顺序号相同 { n5 = n5 + (UseAwayFork - oldawayfork); } else {//双堆垛机的原点在最大列的货叉顺序号和列顺序号相反 n5 = n5 - (UseAwayFork - oldawayfork); } zxystr.Clear(); zxystr.Append((zxy[3].ToString().Length == 1 ? "0" + zxy[3].ToString() : zxy[3].ToString())).Append("-").Append( ((n5.ToString().Length == 1) ? ("0" + n5.ToString()) : (n5.ToString()))).Append("-").Append( ((zxy[5].ToString().Length == 1) ? ("0" + zxy[5].ToString()) : (zxy[5].ToString()))); LaneGateDevice = GetDeviceLaneGateInfoFromStackCoor(DeviceIndex, zxystr.ToString(), out oldawayfork); // add for CATL YB2 LaneGateDevicetrue = GetDeviceLaneGateInfoFromStackCoorlanegate(DeviceIndex, zxystr.ToString(), out oldawayfork); //替换路径 add for CATL YB2 增加更换当前货叉送货时候 是哪个货叉的提前检测更换 // 送出的送货站台没有区分远近 需要要求电气将近远双顶升 的高位和有货 分别上报在.2 和 .0 上 //修改堆垛机提前检测,RunLock sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_RunningLock='").Append(LaneGateDevice).Append("', F_AheadDetect=Replace(F_AheadDetect,'") .Append(oNextDevice).Append("','").Append(LaneGateDevice).Append("') WHERE (F_ManageTaskIndex = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(") AND F_DeviceIndex = ").Append(DeviceIndex); dbo.ExecuteSql(sql.ToString()); //修改堆垛机送货坐标 sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_NumParam5=").Append(n5).Append(" WHERE (F_ManageTaskIndex = ") .Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(")").Append(" AND F_DeviceIndex = ").Append(DeviceIndex); dbo.ExecuteSql(sql.ToString()); //修改输送机,提前检测,RunLock,F_NumParam1 //add for CATL YB2 修改堆垛机货叉的提前检测 配置在 lane_gate 表的 F_NearDetect 字段 是数组第5个 string[] cdiold = GetLanewayDeviceInfoFromStackDev(DeviceIndex, oNextDevicetrue); string[] cdinew = GetLanewayDeviceInfoFromStackDev(DeviceIndex, LaneGateDevicetrue); if (cdiold != null && cdinew != null) { //add for CATL YB2 修改堆垛机送出和取货的货叉检测 配置在Lange_Gate 表的 F_NearDetect 字段 sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET F_AheadDetect=Replace(F_AheadDetect,'").Append(cdiold[5]).Append("','").Append(cdinew[5]) .Append("') WHERE (F_ManageTaskIndex = ").Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(mti).Append(") AND F_DeviceIndex = ").Append(DeviceIndex); dbo.ExecuteSql(sql.ToString()); } #region 不通用写法 注释 //if (UseAwayFork == 1) //{ // sql.Clear(); // sql.Append("UPDATE T_Monitor_Task SET F_AheadDetect=Replace(F_AheadDetect,'").Append(oNextDevice.ToString().Substring(0, 5) + ".1").Append("','").Append(LaneGateDevice.ToString().Substring(0, 5) + ".0") // .Append("') WHERE (F_ManageTaskIndex = ").Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") // .Append(mti).Append(") AND F_DeviceIndex = ").Append(oNextDevice); // dbo.ExecuteSql(sql.ToString()); //} //if (UseAwayFork == 2) //{ // sql.Clear(); // sql.Append("UPDATE T_Monitor_Task SET F_AheadDetect=Replace(F_AheadDetect,'").Append(oNextDevice.ToString().Substring(0, 5) + ".0").Append("','").Append(LaneGateDevice.ToString().Substring(0, 5) + ".1") // .Append("') WHERE (F_ManageTaskIndex = ").Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") // .Append(mti).Append(") AND F_DeviceIndex = ").Append(oNextDevice); // dbo.ExecuteSql(sql.ToString()); //} #endregion // add for CATL YB2 注释 // sql.Clear(); //sql.Append("UPDATE T_Monitor_Task SET F_RouteID=").Append(GetRouteIDsub(LaneGateDevice)) // .Append(",F_DeviceIndex=").Append(LaneGateDevice).Append(", F_NumParam1=").Append(LaneGateDevice) // .Append(", F_AheadDetect=Replace(F_AheadDetect,'").Append(oNextDevice).Append("','").Append(LaneGateDevice) // .Append("') WHERE (F_ManageTaskIndex = ").Append(fid).Append(") AND (F_ManageTASKKINDINDEX = ") // .Append(mti).Append(") AND F_DeviceIndex = ").Append(oNextDevice); //dbo.ExecuteSql(sql.ToString()); return true; } } else { return false; } } else { return false;//20120217 } } 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) { 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; } return gh; } else { return 1; } } int MinRouteID(int startdevice, int enddevice, int nowdevice, object useAwayfork) { try { StringBuilder dff = new StringBuilder(); if (useAwayfork.ToString() == "-") { dff.Append("F_UseAwayFork<>'n'"); } else { dff.Append("(F_UseAwayFork='").Append(useAwayfork).Append("' or F_UseAwayFork='-' )");//20101028 } //选择最短调度路径并且判断此路径上是否有设备发生故障 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT distinct(T_Base_Route_Device.F_RouteIDSub) FROM T_Base_Device,T_Base_Route_Device,").Append( "T_Base_Route where T_Base_Route_Device.F_RouteID = T_Base_Route.F_RouteID and ").Append( " T_Base_Route_Device.F_DeviceIndex = T_Base_Device.F_DeviceIndex and ").Append( " F_StartDevice=").Append(startdevice).Append(" and F_EndDevice=").Append(enddevice).Append(" and F_Status=1 and T_Base_Device.F_DeviceIndex =").Append(nowdevice).Append(" and ").Append(dff.ToString()); DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; List minroute = new List();//0,routIDSub;1,路径最小值 if (dv.Count == 0) { //RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); //OnRefreshMonitor(rme); return -1; } for (int i = 0; i < dv.Count; i++) { //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_RouteIDSub, F_LockedState FROM T_Base_Device,T_Base_Route_Device WHERE ").Append( " T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and (T_Base_Route_Device.F_RouteIDSub = ").Append( dv[i]["F_RouteIDSub"]).Append(") AND (T_Base_Device.F_LockedState = - 1)"); DataView dvd = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvd.Count > 0) { continue; } List route = new List();//0,routIDSub;1,步长;2,路径使用频率;3,路径设备任务数 //路径步长(设备总数)最短(权重0.3),路径使用频率最小(权重0.3)的路径,路径设备任务数(权重0.3) route.Add(Convert.ToDouble(dv[i]["F_RouteIDSub"]));//RouteIDSub //20101124 sql.Remove(0, sql.Length); sql.Append("select count(F_DeviceIndex) as steps from T_Base_Route_Device where F_RouteIDSub=" ).Append(dv[i]["F_RouteIDSub"]); DataView dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { route.Add(Convert.ToDouble(dv1[0]["steps"]));//步长 //route.Add(0); } else { continue; } //路径使用频率:路径执行调度任务的数量 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(DISTINCT F_ManageTaskIndex) AS ManCount FROM T_Monitor_Task GROUP BY F_RouteID HAVING (F_RouteID = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); DataView dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { double a = 0; if (double.TryParse(dv2[0]["ManCount"].ToString(), out a) == true) { route.Add(Convert.ToDouble(dv2[0]["ManCount"]));//路径使用频率 } else { route.Add(0);//路径使用频率 } } else { route.Add(0);//路径使用频率 } //路径设备任务数 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(T_Monitor_Task.F_MonitorIndex) AS mtask FROM T_Monitor_Task ,T_Base_Route_Device where (T_Monitor_Task.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex) and (T_Base_Route_Device.F_RouteIDSub = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { double a = 0; if (double.TryParse(dv2[0]["mtask"].ToString(), out a) == true) { route.Add(Convert.ToDouble(dv2[0]["mtask"]));//路径设备任务数 } else { route.Add(0);//路径设备任务数 } } else { route.Add(0);//路径设备任务数 } //求最短路径((路径步长*0.3+路径使用频率*0.3+设备占有数*0.3)的最小值) if (minroute.Count == 0) { minroute.Add(route[0]); minroute.Add(route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } else { if (minroute[1] > (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3)) { minroute[0] = route[0]; minroute[1] = (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } } } if (minroute.Count > 0) { return Convert.ToInt32(minroute[0]); } else { return -1; } } catch (Exception ex) { _commLayerError = "OPCClient.CSendDeviceOrder.MinRouteID时发生错误:" + ex.Message; return -1; } } int GetRouteIDsub(int device) { DataView dv = dbo.ExceSQL("SELECT F_RouteIDSub, F_DeviceIndex, F_RouteID FROM T_Base_Route_Device where F_DeviceIndex=" + device + "").Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_RouteIDSub"]); } else { return -1; } } int[] GetCoordinatesFromMonitorTask(int TaskIdx) { //20100108 DataView dv; int[] gc; try { //20101124 sql.Remove(0, sql.Length); sql.Append("select F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 from T_Monitor_Task where F_MonitorIndex=").Append(TaskIdx); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; gc = new int[6]; //F_NumParam1--z,x--2,y--3;F_NumParam4--z,5--x,6--y if (dv.Count > 0) { gc[0] = Convert.ToInt32(dv[0]["F_NumParam1"]); gc[1] = Convert.ToInt32(dv[0]["F_NumParam2"]); gc[2] = Convert.ToInt32(dv[0]["F_NumParam3"]); gc[3] = Convert.ToInt32(dv[0]["F_NumParam4"]); gc[4] = Convert.ToInt32(dv[0]["F_NumParam5"]); gc[5] = Convert.ToInt32(dv[0]["F_NumParam6"]); return gc; } return null; } catch (Exception ex) { throw ex; } finally { dv = null; gc = null; } } string GetUseAwayForkFromLaneGate(int device) { DataView dv = dbo.ExceSQL(string.Format("SELECT F_UseAwayFork FROM T_Base_Lane_Gate where F_LaneGateDeviceIndex={0}", device)).Tables[0].DefaultView; if (dv.Count > 0) { return dv[0][0].ToString(); } else { return "-"; } } /// /// 根据堆垛机和设备索引获得设备巷道出入口信息:【0】设备索引【1】顶升高位检测【2】顶升低位检测 /// 【3】有物检测【4】运行监测【5】近巷道有物检测【6】远巷道有物检测【7】是否使用远货叉【8】关联设备索引【9】货位编码 /// /// /// /// public string[] GetLanewayDeviceInfoFromStackDev(int stack, int device) { DataView dvl = new DataView(); DataView dv = new DataView(); try { devinfo = Model.CGetInfo.GetDeviceInfo(stack); if (devinfo!=null) { if (devinfo.VirtualStack > 0) { stack = devinfo.VirtualStack; } } int laneway = 0; dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = {0})", stack)).Tables[0].DefaultView; if (dvl.Count > 0) { laneway = Convert.ToInt32(dvl[0][0]); } else { return null; } string[] rr = new string[10]; //20101124 sql.Remove(0, sql.Length); //add for CATL YB2 sql.Append("SELECT * FROM T_Base_Lane_Gate where F_CorrelDeviceIndex is not null and (F_LaneIndex=").Append(laneway).Append(" and T_Base_Lane_Gate.F_LaneGateDeviceIndex = ").Append(device).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { rr[0] = dv[0]["F_LaneGateDeviceIndex"].ToString(); rr[1] = dv[0]["F_HighDetect"].ToString(); rr[2] = dv[0]["F_LowDetect"].ToString(); rr[3] = dv[0]["F_HavingDetect"].ToString(); rr[4] = dv[0]["F_RunDetect"].ToString(); rr[5] = dv[0]["F_NearDetect"].ToString(); rr[6] = dv[0]["F_FarDetect"].ToString(); rr[7] = dv[0]["F_UseAwayFork"].ToString(); rr[8] = dv[0]["F_CorrelDeviceIndex"].ToString(); rr[9] = dv[0]["F_zxy"].ToString(); return rr; } else return null; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dvl.Dispose(); } } } }