SCLS/SSWCS_JXDL(2019)/ControlSystem/CCommonFunction.cs

3367 lines
142 KiB
C#
Raw Normal View History

2025-05-19 09:45:29 +08:00
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using DBFactory;
using CommLayerFactory;
using ICommLayer;
namespace ControlSystem
{
/// <summary>
/// Creator:Richard.liu
/// 通用函数类库
/// </summary>
public class CCommonFunction
{
string _DisassembleTaskError="";
public string DisassembleTaskError
{
get { return _DisassembleTaskError; }
set { _DisassembleTaskError = value; }
}
DBOperator dboM = CStaticClass.dboM;
DBOperator dbo = CStaticClass.dbo;
Model.MDevice devinfo;
public CCommonFunction()
{
}
#region
/// <summary>
/// 创建设备指令是否成功
///
/// 生成设备指令单信息:由F_AssociateDeviceIndex分解预先执行任务;由F_Orders分解当前任务
/// F_AssociateDeviceIndex的内容"8-6;7-1"表示先执行设备8的6命令,然后执行设备7的1命令
/// F_Orders的内容"5;2;6"表示先执行当前设备的5命令,然后2命令,然后6命令
/// </summary>
/// <param name="drv">指定F_RouteKindIndex的T_Base_Route_Detail表的行视图</param>
/// <param name="managerTaskIndex">管理索引</param>
/// <param name="managerTaskKindIndex">管理类型</param>
/// <returns></returns>
public bool CreateMonitorTask(DataRowView drv, int managerTaskIndex, int managerTaskKindIndex)
{
try
{
char[] cc = new char[1];
cc[0] = ';';
char[] ccc = new char[1] { '-'};
string[] Orders = drv["F_Orders"].ToString().Split(cc);
int MonitorIndex = 0;
DataView dv;
DataView dvM;
int[] coo = new int[6];
int[] Agvcoo = new int[6];
string strparm,sql;
int _endnode, _iotype;
string strIn;
string[] bdevorder;
#region
string bo = GetBlockDevice(Convert.ToInt32(drv["F_DetailIndex"]));
if ((bo != null) && (bo!= ""))
{
//判断同一个managerTaskIndex, managerTaskKindIndex不可能有一个以上的相同的设备和命令
sql = "SELECT F_ManageTaskIndex, F_ManageTaskKindIndex, F_DetailIndex FROM T_Monitor_Task Where F_ManageTaskIndex=" + managerTaskIndex + " and F_ManageTaskKindIndex=" + managerTaskKindIndex + " and F_DeviceIndex=" + Convert.ToInt32(bo[0]) + " and F_DeviceCommandIndex=" + Convert.ToInt32(bo[1]);
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
bdevorder = bo.Split(ccc);
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt32(bdevorder[0])
+ "," + Convert.ToInt32(bdevorder[1]) + ",0,0,0,'" + DateTime.Now + "')";
dbo.ExceSQL(strIn);
}
else
{
this._DisassembleTaskError = "分解设备指令时,无法获得设备指令索引!";
return false;
}
}
#endregion
#region
bo = GetAheadTriggerDevice(Convert.ToInt32(drv["F_DetailIndex"]));
if ((bo != null) && (bo != ""))
{
//判断同一个managerTaskIndex, managerTaskKindIndex不可能有一个以上的相同的设备和命令
sql = "SELECT F_ManageTaskIndex, F_ManageTaskKindIndex, F_DetailIndex FROM T_Monitor_Task Where F_ManageTaskIndex=" + managerTaskIndex + " and F_ManageTaskKindIndex=" + managerTaskKindIndex + " and F_DeviceIndex=" + Convert.ToInt32(bo[0]) + " and F_DeviceCommandIndex=" + Convert.ToInt32(bo[1]);
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
bdevorder = bo.Split(ccc);
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt32(bdevorder[0])
+ "," + Convert.ToInt32(bdevorder[1]) + ",0,0,0,'" + DateTime.Now + "')";
dbo.ExceSQL(strIn);
}
else
{
this._DisassembleTaskError = "分解设备指令时,无法获得设备指令索引!";
return false;
}
}
#endregion
#region
string ao = this.GetAssociateDevice(Convert.ToInt32( drv["F_DetailIndex"]));
if ((ao != null) && (ao!= ""))
{
//判断同一个managerTaskIndex, managerTaskKindIndex不可能有一个以上的相同的设备和命令
sql = "SELECT F_ManageTaskIndex, F_ManageTaskKindIndex, F_DetailIndex FROM T_Monitor_Task Where F_ManageTaskIndex=" + managerTaskIndex + " and F_ManageTaskKindIndex=" + managerTaskKindIndex + " and F_DeviceIndex=" + Convert.ToInt32(ao[0]) + " and F_DeviceCommandIndex=" + Convert.ToInt32(ao[1]);
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
bdevorder = ao.Split(ccc);
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt32(bdevorder[0])
+ "," + Convert.ToInt32(bdevorder[1]) + ",0,0,0,'" + DateTime.Now + "')";
dbo.ExceSQL(strIn);
}
else
{
this._DisassembleTaskError = "分解设备指令时,无法获得设备指令索引!";
return false;
}
}
#endregion
#region
for (int i = Orders.GetLowerBound(0); i <= Orders.GetUpperBound(0); i++)
{
//判断同一个managerTaskIndex, managerTaskKindIndex不可能有一个以上的相同的设备和命令
sql = "SELECT F_ManageTaskIndex, F_ManageTaskKindIndex, F_DetailIndex FROM T_Monitor_Task Where F_ManageTaskIndex=" + managerTaskIndex + " and F_ManageTaskKindIndex=" + managerTaskKindIndex + " and F_DeviceIndex=" + Convert.ToInt32(drv["F_DeviceIndex"]) + " and F_DeviceCommandIndex=" + Convert.ToInt32(Orders[i]);
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
//根据堆垛机设备索引和出入库类型查询出取货和送货x、y、z坐标
if (GetDeviceKindIdx(Convert.ToInt32(drv["F_DeviceIndex"])) == 1)
{
//在T_Base_StackInfo表判断货叉是单叉还是双叉单进伸还是双进伸
//
coo = GetCoordinate(drv, managerTaskIndex, managerTaskKindIndex);
////////
if (coo == null)
{
this._DisassembleTaskError = "分解堆垛机任务时,无法获得堆垛机设备的取、送地址坐标!";
//dbo.TransRollback();
return false;
}
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime,F_NumParam1,F_NumParam2," +
"F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt16(drv["F_DeviceIndex"])
+ "," + Convert.ToInt16(Orders[i]) + "," + Convert.ToInt16(drv["F_DetailIndex"]) + ",0,0,'" + DateTime.Now +
"'," + coo[0] + "," + coo[1] + "," + coo[2] + "," + coo[3] + "," + coo[4] + "," + coo[5] + ")";
dbo.ExceSQL(strIn);
}
else
{
//dbo.TransRollback();
this._DisassembleTaskError = "分解堆垛机任务时,无法获得设备指令索引!";
return false;
}
}
else if (GetDeviceKindIdx(Convert.ToInt32(drv["F_DeviceIndex"])) == 6)
{//取得起始地址和结束位置分别写到F_NumParam2F_NumParam5
Agvcoo = GetAGVCoordinate(drv, managerTaskIndex, managerTaskKindIndex);
//////
if (Agvcoo == null)
{
this._DisassembleTaskError = "分解AGV任务时无法获得AGV设备的取、送地址坐标";
//dbo.TransRollback();
return false;
}
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime,F_NumParam1,F_NumParam2," +
"F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt16(drv["F_DeviceIndex"])
+ "," + Convert.ToInt16(Orders[i]) + "," + Convert.ToInt16(drv["F_DetailIndex"]) + ",0,0,'" + DateTime.Now +
"'," + Agvcoo[0] + "," + Agvcoo[1] + "," + Agvcoo[2] + "," + Agvcoo[3] + "," + Agvcoo[4] + "," + Agvcoo[5] + ")";
dbo.ExceSQL(strIn);
}
else
{
this._DisassembleTaskError = "分解AGV任务时,无法获得设备指令索引!";
//dbo.TransRollback();
return false;
}
}
else if (GetDeviceKindIdx(Convert.ToInt32(drv["F_DeviceIndex"])) == 4)
{//RGV取得起始地址和结束位置分别写到F_NumParam2F_NumParam5
Agvcoo = GetRGVCoordinate(drv, managerTaskIndex, managerTaskKindIndex);
//////
if (Agvcoo == null)
{
this._DisassembleTaskError = "分解RGV任务时无法获得RGV设备的取、送地址坐标";
//dbo.TransRollback();
return false;
}
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime,F_NumParam1,F_NumParam2," +
"F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt16(drv["F_DeviceIndex"])
+ "," + Convert.ToInt16(Orders[i]) + "," + Convert.ToInt16(drv["F_DetailIndex"]) + ",0,0,'" + DateTime.Now +
"'," + Agvcoo[0] + "," + Agvcoo[1] + "," + Agvcoo[2] + "," + Agvcoo[3] + "," + Agvcoo[4] + "," + Agvcoo[5] + ")";
dbo.ExceSQL(strIn);
}
else
{
this._DisassembleTaskError = "分解RGV任务时无法获得设备指令索引";
//dbo.TransRollback();
return false;
}
}
else if (GetDeviceKindIdx(Convert.ToInt32(drv["F_DeviceIndex"])) == 7)
{//条码比对003在IO_CONTROLDETAIL表读取条码到F_TxtParam字段
strparm = GetStringParm(managerTaskIndex, managerTaskKindIndex, "003");
if (strparm == "")
{
this._DisassembleTaskError = "调度任务没有给条码设备下达条码比对信息!";
//dbo.TransRollback();
return false;
}
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime,F_TxtParam) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt16(drv["F_DeviceIndex"])
+ "," + Convert.ToInt16(Orders[i]) + "," + Convert.ToInt16(drv["F_DetailIndex"]) + ",0,0,'" + DateTime.Now + "','" + strparm + "')";
dbo.ExceSQL(strIn);
}
else
{
//dbo.TransRollback();
this._DisassembleTaskError = "分解条码比对任务时,无法获得设备指令索引!";
return false;
}
}
else if (GetDeviceKindIdx(Convert.ToInt32(drv["F_DeviceIndex"])) == 17)
{//码盘机器人
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt16(drv["F_DeviceIndex"])
+ "," + Convert.ToInt16(Orders[i]) + "," + Convert.ToInt16(drv["F_DetailIndex"]) + ",0,0,'" + DateTime.Now + "')";
dbo.ExceSQL(strIn);
}
else
{
this._DisassembleTaskError = "分解设备指令时,无法获得设备指令索引!";
return false;
}
////判断是否为最后一个货物码盘任务,如果是就追加一个Orders[i].Substring(0,1)+"2"的任务
//if (IFLastStackPalletTask(managerTaskKindIndex, managerTaskIndex) == true)
//{
// MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
// if (MonitorIndex > 0)
// {
// strIn = "INSERT INTO T_Monitor_Task " +
// "(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
// " F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime) VALUES " +
// "(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt16(drv["F_DeviceIndex"])
// + "," + Convert.ToInt16(Orders[i].Substring(0, 1) + "2") + "," + Convert.ToInt16(drv["F_DetailIndex"]) + ",0,0,'" + DateTime.Now + "')";
// dbo.ExceSQL(strIn);
// }
// else
// {
// this._DisassembleTaskError = "分解设备指令时,无法获得设备指令索引!";
// return false;
// }
//}
}
else
{
//获得指定调度任务的设备指令索引
//命令字为“-1”的是虚命令,不生成设备指令
if (Convert.ToInt16(Orders[i]) == -1)
{
if (CStaticClass.RouteSearchMode == "1")
{
dvM = dbo.ExceSQL("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE, FENDDEVICE FROM T_Manage_Task where FID=" + managerTaskIndex + " and F_ManageTaskKindIndex=" + managerTaskKindIndex).Tables[0].DefaultView;
if (dvM.Count > 0)
{
dbo.ExceSQL("update T_Manage_Task set FIntoStepOK='1' where FID=" + managerTaskIndex
+ " and F_ManageTaskKindIndex=" + managerTaskKindIndex);
_endnode = Convert.ToInt32(dvM[0]["FENDDEVICE"]);
_iotype = Convert.ToInt32(GetIOType(dvM[0]["FCONTROLTASKTYPE"].ToString()));
StepsRouteSearch(false, managerTaskIndex, managerTaskKindIndex, _iotype, Convert.ToInt32(drv["F_DeviceIndex"]), _endnode);
}
}
continue;
}
MonitorIndex = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
if (MonitorIndex > 0)
{
strIn = "INSERT INTO T_Monitor_Task " +
"(F_ManageTaskIndex, F_ManageTaskKindIndex, F_MonitorIndex, F_MonitorTaskLevel, F_DeviceIndex," +
" F_DeviceCommandIndex,F_DetailIndex,F_Status, F_DeviceStateIndex, F_StartTime) VALUES " +
"(" + managerTaskIndex + "," + managerTaskKindIndex + "," + MonitorIndex + ",1," + Convert.ToInt16(drv["F_DeviceIndex"])
+ "," + Convert.ToInt16(Orders[i]) + "," + Convert.ToInt16(drv["F_DetailIndex"]) + ",0,0,'" + DateTime.Now + "')";
dbo.ExceSQL(strIn);
}
else
{
//dbo.TransRollback();
this._DisassembleTaskError = "分解设备指令时,无法获得设备指令索引!";
return false;
}
}
}
return true;
#endregion
}
catch (Exception ex)
{
_DisassembleTaskError = "创建设备指令失败!" + ex.Message;
//dbo.TransRollback();
throw ex;
//return false;
}
}
/// <summary>
/// 获得绑定在主设备的探物光电设备索引
/// </summary>
/// <param name="devinx">主设备索引</param>
/// <returns></returns>
public string GetBindingDeviceIndex(int devinx)
{
//20101118
devinfo = Model.CGetInfo.GetDeviceInfo(devinx);
if (devinfo.BindingDevice == null) return "";
return devinfo.BindingDevice;
}
/// <summary>
/// 获得输送机设备的出库口探物光电的设备索引值
/// </summary>
/// <param name="devinx">设备索引</param>
/// <returns></returns>
public string GetBindingDeviceIndexOut(int devinx)
{
//20101118
devinfo = Model.CGetInfo.GetDeviceInfo(devinx);
if (devinfo.BindingDeviceOut == null) return "";
return devinfo.BindingDeviceOut;
}
/// <summary>
/// 发送设备的送出指令时,需要检测的光电开关设备索引
/// </summary>
/// <param name="devinx">输送设备索引</param>
/// <returns></returns>
public string GetSendOutDetect(int devinx)
{
//20101118
devinfo = Model.CGetInfo.GetDeviceInfo(devinx);
if (devinfo.SendOutDetect==null) return "";
return devinfo.SendOutDetect;
}
public string GetBeDetectedDevices(int devinx)
{
devinfo= Model.CGetInfo.GetDeviceInfo(devinx);
return devinfo.BeDetected;
//string sql = "SELECT F_BeDetected FROM T_Base_Device WHERE (F_DeviceIndex = " + devinx + ") and F_BeDetected is not null";
//DataView db = dbo.ExceSQL(sql).Tables[0].DefaultView;
//if (db.Count > 0)
//{
// return db[0]["F_BeDetected"].ToString();
//}
//else
// return "";
}
public int GetUpAndDownDevices(int devinx,int DB1Address)//20101220
{
string sql =string.Format( "SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_DeviceIndex != {0}) and F_DBW1Address ={1}",devinx,DB1Address);
object ob = dbo.GetSingle(sql);
if (ob != null)
{
return Convert.ToInt32(ob);
}
else
{
return -1;
}
}
public string GetIfCorrelDoubleFork(int devinx)//20101220
{
devinfo = Model.CGetInfo.GetDeviceInfo(devinx);
if (devinfo == null)
{
return "0";
}
else
{
return devinfo.IfCorrelDoubleFork;
}
}
/// <summary>
/// //获得指定调度任务的设备指令索引
/// </summary>
/// <param name="managerTaskIndex"></param>
/// <param name="managerTaskKindIndex"></param>
/// <returns>设备指令索引值32000</returns>
public int GetMonitorIndex(int managerTaskIndex, int managerTaskKindIndex)
{
//20100108
DataView dvMt;
try
{
int maxIdx = 0;
string sql = "SELECT F_MonitorIndex FROM T_Base_Monitor_Task_Index";
//20100108
dvMt = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dvMt.Count > 0 && dvMt[0]["F_MonitorIndex"] != DBNull.Value)
{
maxIdx = (Convert.ToInt32(dvMt[0]["F_MonitorIndex"]) + 1);
if (maxIdx >= 32000)//预留2000个给接近上限的拆分任务
{
maxIdx = 1;
}
}
else//现在没有该管理的设备指令记录
{
maxIdx = 1;
}
//判断调度任务表是否有重复值
if (IFExitMonitorIndex(maxIdx) == true)
{
UpdateMonitorIndex(maxIdx);
maxIdx = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);
}
UpdateMonitorIndex(maxIdx);
return maxIdx;
}
catch (Exception ex)
{
_DisassembleTaskError = "获得指定调度任务的设备指令索引失败!" + ex.Message;
throw ex;
//return 0;
}
finally
{//20100108
dvMt = null;
}
}
public void UpdateMonitorIndex(int MonitorIndex)
{
dbo.ExceSQL("update T_Base_Monitor_Task_Index set F_MonitorIndex=" + MonitorIndex );
}
/// <summary>
/// 计算该路径的设备占用情况和路径和
/// [0]路径索引[1]设备被占用数量[2]路径和
/// </summary>
/// <param name="dv"></param>
/// <returns>[0]路径索引[1]设备被占用数量[2]路径和</returns>
public int[] SearchRoute(DataRow dr)
{
int[] sr = new int[3] { 0, 0, 0 };
//找到被停用的设备
string sql1 = "SELECT T_Base_Device.F_DeviceIndex " +
" FROM T_Base_Device,T_Base_Route_Detail where T_Base_Device.F_DeviceIndex = T_Base_Route_Detail.F_DeviceIndex " +
" and T_Base_Device.F_LockedState =-1 AND T_Base_Route_Detail.F_RouteKindIndex = " + Convert.ToInt32(dr["F_RouteKindIndex"]);
DataSet ds1 = dbo.ExceSQL(sql1);
DataView dv1 = ds1.Tables[0].DefaultView;
if (dv1.Count > 0)
{
sr[1] = -1;
return sr;
}
string sql = "SELECT COUNT(T_Base_Device.F_DeviceIndex) AS Expr1" +
" FROM T_Base_Device,T_Base_Route_Detail where T_Base_Device.F_DeviceIndex = T_Base_Route_Detail.F_DeviceIndex " +
" and T_Base_Device.F_LockedState > 0 AND T_Base_Route_Detail.F_RouteKindIndex = " + Convert.ToInt32(dr["F_RouteKindIndex"]) +
" GROUP BY T_Base_Device.F_LockedState,T_Base_Route_Detail.F_RouteKindIndex";
DataSet ds = dbo.ExceSQL(sql);
DataView dv = ds.Tables[0].DefaultView;
sr[0] = Convert.ToInt32(dr["F_RouteKindIndex"]);
if (dv.Count > 0)
{
sr[1] = Convert.ToInt32(dv[0]["Expr1"]);
}
else
{
sr[1] = 0;
}
//路径和
sr[2] = 0;
return sr;
}
public int GetLaneWay(int StackDeviceIndex)
{
DataView dv = dbo.ExceSQL("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = " + StackDeviceIndex + ")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0][0]);
}
else
{
return -1;
}
}
public string GetStackCoordinateFromLaneGate(int Laneway, int device)
{
DataView dv = dbo.ExceSQL("SELECT F_ZXY FROM T_Base_Lane_Gate WHERE (F_LaneGateDeviceIndex = "+device+") AND (F_LaneIndex = "+Laneway +")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return dv[0][0].ToString();
}
else
{
return "-";
}
}
/// <summary>
/// 在调度任务中根据堆垛机设备索引和出入库类型查询出取货和送货z--y坐标
/// 出库或者入库在T_Base_Lane_Gate表中获得一部分盘库直接在调度任务获得全部
/// </summary>
/// <param name="drv">调度任务行视图</param>
/// <param name="managerTaskIndex">调度任务索引</param>
/// <param name="managerTaskKindIndex">调度任务类型</param>
/// <returns>取货和送货z--y坐标</returns>
public int[] GetCoordinate(DataRowView drv, int managerTaskIndex, int managerTaskKindIndex)
{
string FIntoStepOK;
if (CStaticClass.RouteSearchMode == "0")
{
FIntoStepOK = "FIntoStepOK=0";
}
else if (CStaticClass.RouteSearchMode == "1")
{
FIntoStepOK = "FIntoStepOK=1";
}
else
{
FIntoStepOK = "FIntoStepOK=0";
}
string sql = "select * from T_Manage_Task WHERE " +
" (FID=" + managerTaskIndex + ") and ("+FIntoStepOK+") and (F_ManageTaskKindIndex=" + managerTaskKindIndex + ")";
DataSet ds = dbo.ExceSQL(sql);
DataView dv = ds.Tables[0].DefaultView;
DataSet dsm;
DataSet dsl;
DataSet dsdev;
int[] rt = new int[6];
if (dv.Count > 0)
{
int IOtype = 0;
string iot = GetIOType(dv[0]["FCONTROLTASKTYPE"].ToString());
if (iot == "")
{
_DisassembleTaskError = "调度任务中的搬运任务类型在监控搬运任务类型表中没有记忆!";
return null;
}
if (iot.Length == 2)
{
iot = iot.Substring(1);
}
IOtype = Convert.ToInt32(iot);
//20100305
char[] cc = new char[1] { '-' };
string[] split;
switch (IOtype)
{
case 1 ://入库找堆垛机上一个设备索引F_RouteDetailIndex值小于它之中最大的那个
dsm = dbo.ExceSQL("select max(F_RouteDetailIndex) as maxx from t_base_route_detail,T_Base_Device,T_Base_Device_Kind " +
" where T_Base_Route_Detail.F_DeviceIndex = T_Base_Device.F_DeviceIndex and F_RouteDetailIndex <" +
Convert.ToInt32(drv["F_RouteDetailIndex"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]) +
" and T_Base_Device.F_DeviceKindIndex = T_Base_Device_Kind.F_DeviceKindIndex and F_GoodsMoveKindIndex = 1");
if (dsm.Tables[0].DefaultView.Count > 0)
{
dsdev = dbo.ExceSQL("select F_DeviceIndex from t_base_route_detail" +
" where F_RouteDetailIndex =" + Convert.ToInt32(dsm.Tables[0].DefaultView[0]["maxx"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]));
if (dsdev.Tables[0].DefaultView.Count > 0)
{
//T_Base_Lane_Gate中找到取货地址坐标
dsl = dbo.ExceSQL("select * from T_Base_Lane_Gate where F_LaneGateDeviceIndex=" + Convert.ToInt32(dsdev.Tables[0].DefaultView[0]["F_DeviceIndex"]));
if (dsl.Tables[0].DefaultView.Count > 0)
{
//20100305
split = dsl.Tables[0].DefaultView[0]["F_ZXY"].ToString().Split(cc);
rt[0] = Convert.ToInt32(split[0]);//排Z
rt[1] = Convert.ToInt32(split[1]);//列X
rt[2] = Convert.ToInt32(split[2]);//层Y
//20100305
}
else
return null;
}
else
return null;
}
else
return null;
//FENDCELL送货坐标
cc[0] = '-';
split = dv[0]["FENDCELL"].ToString().Split(cc);
for (int i = 0; i <= 2; i++)
{
rt[i + 3] = Convert.ToInt32(split[i]);
}
break;
case 2 ://出库找堆垛机下一个设备索引F_RouteDetailIndex值大于它之中最小的那个
dsm = dbo.ExceSQL("select min(F_RouteDetailIndex) as mmin from t_base_route_detail,T_Base_Device,T_Base_Device_Kind " +
" where T_Base_Route_Detail.F_DeviceIndex = T_Base_Device.F_DeviceIndex and F_RouteDetailIndex >" +
Convert.ToInt32(drv["F_RouteDetailIndex"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]) +
" and T_Base_Device.F_DeviceKindIndex = T_Base_Device_Kind.F_DeviceKindIndex and F_GoodsMoveKindIndex = 1");
if (dsm.Tables[0].DefaultView.Count > 0)
{
dsdev = dbo.ExceSQL("select F_DeviceIndex from t_base_route_detail" +
" where F_RouteDetailIndex =" + Convert.ToInt32(dsm.Tables[0].DefaultView[0]["mmin"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]));
if (dsdev.Tables[0].DefaultView.Count > 0)
{
//T_Base_Lane_Gate中找到送货地址坐标
dsl = dbo.ExceSQL("select * from T_Base_Lane_Gate where F_LaneGateDeviceIndex=" + Convert.ToInt32(dsdev.Tables[0].DefaultView[0]["F_DeviceIndex"]));
if (dsl.Tables[0].DefaultView.Count > 0)
{
//20100305
split = dsl.Tables[0].DefaultView[0]["F_ZXY"].ToString().Split(cc);
rt[3] = Convert.ToInt32(split[0]);//排Z
rt[4] = Convert.ToInt32(split[1]);//列X
rt[5] = Convert.ToInt32(split[2]);//层Y
//20100305
}
else
return null;
}
else
{
return null;
}
}
else
return null;
//FSTARTCELL取货坐标
cc[0] = '-';
split = dv[0]["FSTARTCELL"].ToString().Split(cc);
for (int i = 0; i <= 2; i++)
{
rt[i] = Convert.ToInt32(split[i]);
}
break;
case 3://倒库直接获得FSTARTCELL取货坐标FENDCELL送货坐标
//FSTARTCELL取货坐标
cc[0] = '-';
split = dv[0]["FSTARTCELL"].ToString().Split(cc);
for (int i = 0; i <= 2; i++)
{
rt[i] = Convert.ToInt32(split[i]);
}
//FENDCELL送货坐标
cc[0] = '-';
split = dv[0]["FENDCELL"].ToString().Split(cc);
for (int i = 0; i <= 2; i++)
{
rt[i + 3] = Convert.ToInt32(split[i]);
}
break;
default://其它
break;
}
//
return rt;
}
else
return null;
}
public int GetAGVChannelsIndex(int AGVGateDeviceIndex)
{
DataView dv = dbo.ExceSQL("SELECT F_ChannelsIndex FROM T_Base_AGV_Gate where F_AGVGateDeviceIndex="+AGVGateDeviceIndex+"").Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0][0]);
}
else
{
return 0;
}
}
/// <summary>
/// 获得AGV坐标
/// </summary>
/// <param name="drv"></param>
/// <param name="managerTaskIndex"></param>
/// <param name="managerTaskKindIndex"></param>
/// <returns></returns>
public int[] GetAGVCoordinate(DataRowView drv, int managerTaskIndex, int managerTaskKindIndex)
{
try
{
string FIntoStepOK;
if (CStaticClass.RouteSearchMode == "0")
{
FIntoStepOK = "FIntoStepOK=0";
}
else if (CStaticClass.RouteSearchMode == "1")
{
FIntoStepOK = "FIntoStepOK=1";
}
else
{
FIntoStepOK = "FIntoStepOK=0";
}
string sql = "select * from T_Manage_Task WHERE " +
" (FID=" + managerTaskIndex + ") and ("+FIntoStepOK +") and (F_ManageTaskKindIndex=" + managerTaskKindIndex + ")";
DataSet ds = dbo.ExceSQL(sql);
DataView dv = ds.Tables[0].DefaultView;
DataSet dsm;
DataSet dsl;
DataSet dsdev;
int[] rt = new int[6] { 1, 1, 1, 1, 1, 1 };
string[] addr = null; char[] cc = new char[1] { ';'};
if (dv.Count > 0)
{
//取货坐标找AGV上一个设备索引F_RouteDetailIndex值小于它之中最大的那个
dsm = dbo.ExceSQL("select max(F_RouteDetailIndex) as maxx from t_base_route_detail,T_Base_Device,T_Base_Device_Kind " +
" where T_Base_Route_Detail.F_DeviceIndex = T_Base_Device.F_DeviceIndex and F_RouteDetailIndex <" +
Convert.ToInt32(drv["F_RouteDetailIndex"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]) +
" and T_Base_Device.F_DeviceKindIndex = T_Base_Device_Kind.F_DeviceKindIndex and F_GoodsMoveKindIndex = 1");
if (dsm.Tables[0].DefaultView.Count > 0)
{
dsdev = dbo.ExceSQL("select F_DeviceIndex from t_base_route_detail" +
" where F_RouteDetailIndex =" + Convert.ToInt32(dsm.Tables[0].DefaultView[0]["maxx"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]));
if (dsdev.Tables[0].DefaultView.Count > 0)
{
//T_Base__Gate中找到取货地址坐标
dsl = dbo.ExceSQL("select * from T_Base_AGV_Gate where F_AGVGateDeviceIndex=" + Convert.ToInt32(dsdev.Tables[0].DefaultView[0]["F_DeviceIndex"]));
if (dsl.Tables[0].DefaultView.Count > 0)
{
addr = dsl.Tables[0].DefaultView[0]["F_Address"].ToString().Split(cc);
rt[0] = Convert.ToInt32(addr[0]);
rt[1] = Convert.ToInt32(addr[1]);
rt[2] = Convert.ToInt32(addr[2]);
}
else
return null;
}
else
return null;
}
else
return null;
//送货地址坐标:找AGV下一个设备索引F_RouteDetailIndex值大于它之中最小的那个
dsm = dbo.ExceSQL("select min(F_RouteDetailIndex) as mmin from t_base_route_detail,T_Base_Device,T_Base_Device_Kind " +
" where T_Base_Route_Detail.F_DeviceIndex = T_Base_Device.F_DeviceIndex and F_RouteDetailIndex >" +
Convert.ToInt32(drv["F_RouteDetailIndex"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]) +
" and T_Base_Device.F_DeviceKindIndex = T_Base_Device_Kind.F_DeviceKindIndex and F_GoodsMoveKindIndex = 1");
if (dsm.Tables[0].DefaultView.Count > 0)
{
dsdev = dbo.ExceSQL("select F_DeviceIndex from t_base_route_detail" +
" where F_RouteDetailIndex =" + Convert.ToInt32(dsm.Tables[0].DefaultView[0]["mmin"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]));
if (dsdev.Tables[0].DefaultView.Count > 0)
{
//T_Base_AGV_Gate中找到送货地址坐标
dsl = dbo.ExceSQL("select * from T_Base_AGV_Gate where F_AGVGateDeviceIndex=" + Convert.ToInt32(dsdev.Tables[0].DefaultView[0]["F_DeviceIndex"]));
if (dsl.Tables[0].DefaultView.Count > 0)
{
addr = dsl.Tables[0].DefaultView[0]["F_Address"].ToString().Split(cc);
rt[3] = Convert.ToInt32(addr[0]);
rt[4] = Convert.ToInt32(addr[1]);
rt[5] = Convert.ToInt32(addr[2]);
}
else
return null;
}
else
{
return null;
}
}
else
return null;
return rt;
}
else
{
return null;
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 获取AGV控制台分配的任务号
/// </summary>
/// <param name="monitor">调度任务号</param>
/// <returns></returns>
public int GetAGVTask(int monitor)
{
DataView dv = dbo.ExceSQL("SELECT F_AgvNo, F_AgvTask FROM T_Monitor_Task WHERE (F_MonitorIndex = "+monitor +")").Tables[0].DefaultView;
if (dv.Count > 0)
{
if (dv[0]["F_AgvTask"] == DBNull.Value) return -1;
return Convert.ToInt32(dv[0]["F_AgvTask"]);
}
else
{
return -1;
}
}
/// <summary>
/// 获得RGV坐标
/// </summary>
/// <param name="drv"></param>
/// <param name="managerTaskIndex"></param>
/// <param name="managerTaskKindIndex"></param>
/// <returns></returns>
public int[] GetRGVCoordinate(DataRowView drv, int managerTaskIndex, int managerTaskKindIndex)
{
try
{
string FIntoStepOK;
if (CStaticClass.RouteSearchMode == "0")
{
FIntoStepOK = "FIntoStepOK=0";
}
else if (CStaticClass.RouteSearchMode == "1")
{
FIntoStepOK = "FIntoStepOK=1";
}
else
{
FIntoStepOK = "FIntoStepOK=0";
}
string sql = "select * from T_Manage_Task WHERE " +
" (FID=" + managerTaskIndex + ") and (" + FIntoStepOK + ") and (F_ManageTaskKindIndex=" + managerTaskKindIndex + ")";
DataSet ds = dbo.ExceSQL(sql);
DataView dv = ds.Tables[0].DefaultView;
DataSet dsm;
DataSet dsl;
DataSet dsdev;
int[] rt = new int[6] { 0, 0, 0, 0, 0, 0 };
if (dv.Count > 0)
{
//取货坐标找RGV上一个设备索引F_RouteDetailIndex值小于它之中最大的那个
dsm = dbo.ExceSQL("select max(F_RouteDetailIndex) as maxx from t_base_route_detail,T_Base_Device,T_Base_Device_Kind " +
" where T_Base_Route_Detail.F_DeviceIndex = T_Base_Device.F_DeviceIndex and F_RouteDetailIndex <" +
Convert.ToInt32(drv["F_RouteDetailIndex"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]) +
" and T_Base_Device.F_DeviceKindIndex = T_Base_Device_Kind.F_DeviceKindIndex and F_GoodsMoveKindIndex = 1");
if (dsm.Tables[0].DefaultView.Count > 0)
{
dsdev = dbo.ExceSQL("select F_DeviceIndex from t_base_route_detail" +
" where F_RouteDetailIndex =" + Convert.ToInt32(dsm.Tables[0].DefaultView[0]["maxx"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]));
if (dsdev.Tables[0].DefaultView.Count > 0)
{
//T_Base_RGV_Gate中找到取货地址坐标
dsl = dbo.ExceSQL("select * from T_Base_RGV_Gate where F_RGVGateDeviceIndex=" + Convert.ToInt32(dsdev.Tables[0].DefaultView[0]["F_DeviceIndex"]));
if (dsl.Tables[0].DefaultView.Count > 0)
{
rt[1] = Convert.ToInt32(dsl.Tables[0].DefaultView[0]["F_Address"]);
}
else
return null;
}
else
return null;
}
else
return null;
//送货地址坐标:找RGV下一个设备索引F_RouteDetailIndex值大于它之中最小的那个
dsm = dbo.ExceSQL("select min(F_RouteDetailIndex) as mmin from t_base_route_detail,T_Base_Device,T_Base_Device_Kind " +
" where T_Base_Route_Detail.F_DeviceIndex = T_Base_Device.F_DeviceIndex and F_RouteDetailIndex >" +
Convert.ToInt32(drv["F_RouteDetailIndex"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]) +
" and T_Base_Device.F_DeviceKindIndex = T_Base_Device_Kind.F_DeviceKindIndex and F_GoodsMoveKindIndex = 1");
if (dsm.Tables[0].DefaultView.Count > 0)
{
dsdev = dbo.ExceSQL("select F_DeviceIndex from t_base_route_detail" +
" where F_RouteDetailIndex =" + Convert.ToInt32(dsm.Tables[0].DefaultView[0]["mmin"]) + " and F_RouteKindIndex=" + Convert.ToInt32(drv["F_RouteKindIndex"]));
if (dsdev.Tables[0].DefaultView.Count > 0)
{
//T_Base_RGV_Gate中找到送货地址坐标
dsl = dbo.ExceSQL("select * from T_Base_RGV_Gate where F_RGVGateDeviceIndex=" + Convert.ToInt32(dsdev.Tables[0].DefaultView[0]["F_DeviceIndex"]));
if (dsl.Tables[0].DefaultView.Count > 0)
{
rt[4] = Convert.ToInt32(dsl.Tables[0].DefaultView[0]["F_Address"]);
}
else
return null;
}
else
{
return null;
}
}
else
return null;
return rt;
}
else
{
return null;
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 获得附加信息:取、送坐标;条码比对,承重等
/// </summary>
/// <param name="managerTaskIndex"></param>
/// <param name="managerTaskKindIndex"></param>
/// <param name="Order"></param>
/// <returns></returns>
public string GetStringParm(int managerTaskIndex, int managerTaskKindIndex, string Order)
{
try
{
DataSet ds = dbo.ExceSQL("select * from IO_CONTROLDETAIL where F_ManageTaskKindIndex="
+ managerTaskKindIndex + " and FCONTROLID=" + managerTaskIndex + " and FKIND='" + Order + "'");
DataView dv = ds.Tables[0].DefaultView;
if (dv.Count > 0)
{
if (dv[0]["FVALUE"] != DBNull.Value)
return dv[0]["FVALUE"].ToString();
}
return "";
}
catch (Exception ex)
{
throw ex;
//return "";
}
}
/// <summary>
/// 获得搬运路径类型
/// </summary>
/// <param name="FCONTROLTASKTYPE">调度任务下发的搬运任务类型</param>
/// <returns></returns>
public string GetIOType(string FCONTROLTASKTYPE)
{
//20100108
DataSet ds;
try
{
//20100108
ds = dbo.ExceSQL("SELECT FCODE, FINTERCODE FROM T_ITEMTASKTYPE where FCODE='" + FCONTROLTASKTYPE + "'");
if (ds.Tables[0].DefaultView.Count > 0)
{
return ds.Tables[0].DefaultView[0]["FINTERCODE"].ToString();
}
else
return "";
}
catch (Exception ex)
{
throw ex;
}
finally
{
ds = null;
}
}
/// <summary>
/// 固定路径搜索
/// </summary>
/// <param name="dr">一行管理记录数据</param>
/// <param name="IOtype">搬运类型</param>
/// <returns>拆分的记录数</returns>
public int SettledRouteSearch(DataRowView dr, int IOtype)
{
try
{
//0按照最优路径选择固定路线
//FSTARTDEVICE起点FENDDEVICE终点
int RecCount = 0;
int managerTaskIndex = Convert.ToInt32(dr["FID"]);
int managerTaskKindIndex = Convert.ToInt32(dr["F_ManageTaskKindIndex"]);
string strDetail1 = "select * from V_RouteDetail where F_routeKind=" + IOtype + " and F_DeviceIndex=" + Convert.ToInt32(dr["FSTARTDEVICE"]) + " and F_EndNode='1' order by F_RouteKindIndex asc ";
DataSet dsDetail1 = dbo.ExceSQL(strDetail1);
DataView dvDetail1 = dsDetail1.Tables[0].DefaultView;
string strDetail2 = "";
DataSet dsDetail2 = new DataSet();
DataView dvDetail2 = new DataView();
int[] Isearch = new int[3] { 0, 0, 0 };//Isearch[0]代表F_RouteKindIndexIsearch[1]代表设备组被占用的个数Isearch[2]代表设备组路径和
List<int[]> mlist = new List<int[]>();
int min = 0;
int stationidx;
if (dvDetail1.Count > 0)
{
#region
//找到多条路径根据当前设备占用状态和优化路径选择一条最优路径F_RouteKindIndex的唯一值
for (int i = 0; i < dvDetail1.Count; i++)
{
strDetail2 = "select * from V_RouteDetail where F_routeKind=" + IOtype +
" and F_RouteKindIndex=" + Convert.ToInt32(dvDetail1[i]["F_RouteKindIndex"])
+ " and F_DeviceIndex=" + Convert.ToInt32(dr["FENDDEVICE"]) + " and F_EndNode='1' order by F_RouteKindIndex asc ";
dsDetail2 = dbo.ExceSQL(strDetail2);
dvDetail2 = dsDetail2.Tables[0].DefaultView;
if (dvDetail2.Count > 0)
{
for (int j = 0; j < dvDetail2.Count; j++)
{
//返回该路径的设备占用情况和路径和
Isearch = SearchRoute(dvDetail2[j].Row);
if (Isearch[1] == -1) continue;
//如果FSTARTDEVICE起点或者FENDDEVICE终点是巷道
//需要根据FSTARTCELL起点或者FENDCELL计算采用或者站台
if ((GetDeviceKindIdx(Convert.ToInt32(dr["FENDDEVICE"])) == 10) && ((Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 3) || (Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 4) || (Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 7) || (Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 8)))
{
stationidx = GetStationIdx(dr["FENDCELL"].ToString());
if (IFContainStation(stationidx, Isearch[0]) == true)
{
mlist.Add(Isearch);
}
}
//else if ((GetDeviceKindIdx(Convert.ToInt32(dr["FSTARTDEVICE"])) == 10) && (Convert.ToInt32(dr["FENDDEVICE"]) == 12))
//{
// stationidx = GetStationIdx(dr["FSTARTCELL"].ToString());
// if (IFContainStation(stationidx, Isearch[0]) == true)
// {
// mlist.Add(Isearch);
// }
//}
else
{
mlist.Add(Isearch);
}
}
}
else
{
continue;
}
}
//计算mlist里的设备占有数最小值
if (mlist.Count == 0)
{
_DisassembleTaskError = "在路径明细表中没有检索到终点记录!";
return 0;
}
int oo = mlist[0][1];//设备被用数量
min = mlist[0][0];//路径索引
foreach (int[] a in mlist)
{
if (a[1] == -1) continue;
if (a[1] < oo)
{
min = a[0];
}
}
#endregion
#region
//根据F_RouteKindIndex的值在T_Base_Route_Detail表中分解任务
DataSet dsRK = dbo.ExceSQL("select * from T_Base_Route_Detail where F_RouteKindIndex=" + min + " order by F_RouteDetailIndex asc ");
DataView dvRK = dsRK.Tables[0].DefaultView;
if (dvRK.Count > 0)
{
dbo.TransBegin();
try
{
for (int k = 0; k < dvRK.Count; k++)
{
//生成设备指令单信息:由F_AssociateDeviceIndex分解预先执行任务;由F_Orders分解当前任务
//F_AssociateDeviceIndex的内容"8-6;7-1"表示先执行设备8的6命令,然后执行设备7的1命令
//F_Orders的内容"5;2;6"表示先执行当前设备的5命令,然后2命令,然后6命令
if (CreateMonitorTask(dvRK[k], managerTaskIndex, managerTaskKindIndex) == true)
{
RecCount++;
}
else
{
dbo.TransRollback();
return 0;
}
}
//分解完成修改T_Manage_Task表FIntoStepOK=1
dbo.ExceSQL("update T_Manage_Task set FIntoStepOK='1' where FID=" + managerTaskIndex
+ " and F_ManageTaskKindIndex=" + managerTaskKindIndex);
dbo.TransCommit();
//刷新监控显示列表RefreshControlMonitor
if (CStaticClass.RealRefresh == true)
{
FrmControlMonitor.FormInstance.MonitorRefresh(
dbo.ExceSQL("select * from V_Monitor_Task where "+CStaticClass.Monstatus).Tables[0].DefaultView);
}
}
catch (Exception ex)
{
dbo.TransRollback();
throw ex;
}
}
#endregion
return RecCount;
}
else
{
_DisassembleTaskError = "在路径明细表中没有检索到起点记录!";
return 0;
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 查看用户指定的任务优先级原则0按照调度任务优先级1入库优先携带符合执行条件的出库任务
/// 2出库优先携带符合执行条件的入库任务3单纯入库优先执行完所有入库任务后再执行出库任务
/// 4单纯出库优先执行完所有出库任务后再执行入库任务。
/// </summary>
/// <returns>优先级索引值0--4</returns>
public int SelectTaskPriPrecept()
{
//20100108
DataView dv;
try
{
string sql = "SELECT F_PRINo , F_PRIName , F_IfChecked FROM T_Base_PRI WHERE (F_IfChecked = '1')";
//20100108
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_PRINo"]);
}
else
{
return 0;//默认值0按照调度任务优先级
}
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
dv=null;
}
}
public int GetLaneWayFromLaneInfo(int stackIndex)
{
DataView dv = dbo.ExceSQL("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = "+stackIndex+")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0][0]);
}
else
{
return -1;
}
}
/// <summary>
/// 每个正在工作的节点作为起始点,向末端节点重新搜索下一个最优路径的节点
/// </summary>
/// <param name="IfStartNode">是否是起始节点设备</param>
/// <param name="manageFid">调度任务索引</param>
/// <param name="manageKindIndex">调度任务类型索引</param>
/// <param name="ioType">搬运路径类型</param>
/// <param name="nowDevice">正在工作的节点设备</param>
/// <param name="endDevice">路径末端节点设备</param>
/// <returns>拆分记录数</returns>
public int StepsRouteSearch(bool IfStartNode, int manageFid,int manageKindIndex,int ioType,int nowDevice,int endDevice)
{
//1每个正在工作的节点作为起始点向末端节点重新搜索下一个最优路径的节点
//FSTARTDEVICE起点FENDDEVICE终点
int RecCount = 0;
int managerTaskIndex = manageFid;
int managerTaskKindIndex = manageKindIndex;
string sql11 = "select * from T_Manage_Task WHERE " +
" (FID=" + managerTaskIndex + ") " +
" and (F_ManageTaskKindIndex=" + managerTaskKindIndex + ") order by F_ManageTaskKindIndex desc,FID asc";
DataView dv11 = dbo.ExceSQL(sql11).Tables[0].DefaultView;
DataRow dr;
if (dv11.Count > 0)
{
dr = dv11[0].Row ;
}
else
{
return 0;
}
string strDetail1 = "select * from V_RouteDetail where F_routeKind=" + ioType + " and F_DeviceIndex=" + nowDevice + " order by F_RouteKindIndex asc ";
DataSet dsDetail1 = dbo.ExceSQL(strDetail1);
DataView dvDetail1 = dsDetail1.Tables[0].DefaultView;
string strDetail2 = "";
DataSet dsDetail2 = new DataSet();
DataView dvDetail2 = new DataView();
int[] Isearch = new int[3] { 0, 0, 0 };//Isearch[0]代表F_RouteKindIndexIsearch[1]代表设备组被占用的个数Isearch[2]代表设备组路径和
List<int[]> mlist = new List<int[]>();
int min = 0;
int stationidx;
if (dvDetail1.Count > 0)
{
#region
//找到多条路径根据当前设备占用状态和优化路径选择一条最优路径F_RouteKindIndex的唯一值
for (int i = 0; i < dvDetail1.Count; i++)
{
strDetail2 = "select * from V_RouteDetail where F_routeKind=" + ioType +
" and F_RouteKindIndex=" + Convert.ToInt32(dvDetail1[i]["F_RouteKindIndex"])
+ " and F_DeviceIndex=" + endDevice + " and F_EndNode='1' order by F_RouteKindIndex asc";
dsDetail2 = dbo.ExceSQL(strDetail2);
dvDetail2 = dsDetail2.Tables[0].DefaultView;
if (dvDetail2.Count > 0)
{
for (int j = 0; j < dvDetail2.Count; j++)
{
//返回该路径的设备占用情况和路径和
Isearch = SearchRoute(dvDetail2[j].Row);
if (Isearch[1] == -1) continue;
//如果FSTARTDEVICE起点或者FENDDEVICE终点是巷道
//需要根据FSTARTCELL起点或者FENDCELL计算采用或者站台
if ((GetDeviceKindIdx(Convert.ToInt32(dr["FENDDEVICE"])) == 10) && ((Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 3) || (Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 4) || (Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 5) || (Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 6) || (Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 7) || (Convert.ToInt32(dvDetail2[0]["F_RouteKindIndex"]) == 8)))
{
stationidx = GetStationIdx(dr["FENDCELL"].ToString());
if (IFContainStation(stationidx, Isearch[0]) == true)
{
mlist.Add(Isearch);
}
}
else if ((GetDeviceKindIdx(Convert.ToInt32(dr["FSTARTDEVICE"])) == 10) && (Convert.ToInt32(dr["FENDDEVICE"]) == 12))
{
stationidx = GetStationIdx(dr["FSTARTCELL"].ToString());
if (IFContainStation(stationidx, Isearch[0]) == true)
{
mlist.Add(Isearch);
}
}
else
{
mlist.Add(Isearch);
}
}
}
else
{
continue;
}
}
//计算mlist里的设备占有数最小值
if (mlist.Count == 0)
{
_DisassembleTaskError = "在路径明细表中没有检索到终点记录!";
return 0;
}
int oo = mlist[0][1];//设备被用数量
min = mlist[0][0];//路径索引
foreach (int[] a in mlist)
{
if (a[1] == -1) continue;
if (a[1] < oo)
{
min = a[0];
}
}
#endregion
#region
string sql, strsql;
if (IfStartNode == true)
{//是起始节点设备
sql = "select * from T_Base_Route_Detail where F_RouteKindIndex=" + min + " order by F_RouteDetailIndex asc ";
}
else
{//正在执行的中间环节设备,需要找到此路径的下一个设备
//找到F_RouteDetailIndex值比当前值大的之中最小的那一个设备
strsql = "select F_RouteKindIndex,F_RouteDetailIndex,F_DeviceIndex from T_Base_Route_Detail where F_RouteKindIndex=" + min + " and F_DeviceIndex=" + nowDevice + " order by F_RouteDetailIndex asc ";
DataSet dss = dbo.ExceSQL(strsql);
DataView dvv = dss.Tables[0].DefaultView;
if (dvv.Count > 0)
{
sql = "select * from T_Base_Route_Detail where F_Orders<>'-1' and F_RouteKindIndex=" + min + " and F_RouteDetailIndex>" + Convert.ToInt32(dvv[0]["F_RouteDetailIndex"]) + " order by F_RouteDetailIndex asc ";
}
else//如何判断路径结束????
{
return 9999;
}
}
//根据F_RouteKindIndex的值在T_Base_Route_Detail表中分解任务
DataSet dsRK = dbo.ExceSQL(sql);
DataView dvRK = dsRK.Tables[0].DefaultView;
if (dvRK.Count > 0)
{
//dbo.TransBegin();
try
{
//生成设备指令单信息:由F_AssociateDeviceIndex分解预先执行任务;由F_Orders分解当前任务
//F_AssociateDeviceIndex的内容"8-6;7-1"表示先执行设备8的6命令,然后执行设备7的1命令
//F_Orders的内容"5;2;6"表示先执行当前设备的5命令,然后2命令,然后6命令
if (CreateMonitorTask(dvRK[0], managerTaskIndex, managerTaskKindIndex) == true)
{
RecCount++;
}
else
{
//dbo.TransRollback();
return 0;
}
//分解完成修改T_Manage_Task表FIntoStepOK=1
dbo.ExceSQL("update T_Manage_Task set FIntoStepOK='1' where FID=" + managerTaskIndex
+ " and F_ManageTaskKindIndex=" + managerTaskKindIndex);
//dbo.TransCommit();
//刷新监控显示列表RefreshControlMonitor
if (CStaticClass.RealRefresh == true)
{
FrmControlMonitor.FormInstance.MonitorRefresh(
dbo.ExceSQL("select * from V_Monitor_Task where "+CStaticClass.Monstatus).Tables[0].DefaultView);
}
}
catch (Exception ex)
{
//dbo.TransRollback();
throw ex;
}
if ((Convert.ToInt32(dvRK[0]["F_DeviceIndex"]) == endDevice) && (dvRK[0]["F_EndNode"].ToString() == "1"))
{
return 9999;
}
}
else
{
return 9999;
}
#endregion
return RecCount;
}
else
{
_DisassembleTaskError = "在路径明细表中没有检索到起点记录!";
return 0;
}
}
/// <summary>
/// 根据货架编号获得入库站台信息
/// </summary>
/// <param name="site"></param>
/// <returns></returns>
public int GetStationIdx(string site)
{
char[] cc = new char[1] { '-' };
string[] split = site.Split(cc);
int ll = Convert.ToInt32(split[1]);
DataView dv = dbo.ExceSQL("SELECT F_StationIndex, F_StartSite, F_EndSite FROM T_Base_Station_Site where F_StartSite<=" + ll + " and F_EndSite>=" + ll ).Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_StationIndex"]);
}
else
{
return -1;
}
}
/// <summary>
/// rkindIdx的所有详细路径信息记录中是否包含stationDevIdx
/// </summary>
/// <param name="stationDevIdx"></param>
/// <param name="rkindIdx"></param>
/// <returns></returns>
public bool IFContainStation(int stationDevIdx, int rkindIdx)
{
return dbo.Exists("SELECT F_DeviceIndex, F_RouteKindIndex FROM T_Base_Route_Detail where F_DeviceIndex=" + stationDevIdx + " and F_RouteKindIndex="+rkindIdx);
}
/// <summary>
/// 判断调度任务号在队列中是否存在true已经存在false不存在
/// </summary>
/// <param name="Monitorindex"></param>
/// <returns></returns>
public bool IFExitMonitorIndex(int Monitorindex)
{
//20100108
DataView dv;
try
{
//20100108
dv = dbo.ExceSQL("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " + Monitorindex + ")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
dv = null;
}
}
/// <summary>
/// 20101220 是否存在该设备指令
/// </summary>
/// <param name="deviceindex">设备索引</param>
/// <param name="Monitorindex">设备指令</param>
/// <returns></returns>
public int GetEndTransDevice(int deviceindex, int Monitorindex)
{
object ob = dbo.GetSingle("SELECT F_NumParam4 FROM T_Monitor_Task WHERE (F_MonitorIndex = " + Monitorindex + ") And (F_DeviceIndex = " + deviceindex + ")");
if (ob != null)
{
return Convert.ToInt32(ob);
}
else
{
return 0;
}
}
//20101220
public string GetBarCodeFromMonitor(int Monitorindex)
{
object ob = dbo.GetSingle("SELECT F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = " + Monitorindex + ")");
if (ob != null)
{
return ob.ToString();
}
else
{
return "0";
}
}
public bool IFExitTempManageIndex(int fid)
{
//20100108
DataView dv;
try
{
//20100108
dv = dbo.ExceSQL("SELECT fid FROM T_Manage_Task WHERE (F_ManageTaskKindIndex=2 and fid = " + fid + ")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
dv = null;
}
}
/// <summary>
/// 查找需要关联的辅助设备指令索引
/// </summary>
/// <param name="mankind">任务类型</param>
/// <param name="fid">主调度任务索引</param>
/// <param name="devIdx">设备索引</param>
/// <param name="devOrder">设备指令</param>
/// <returns></returns>
public int GetBeRelativeMonitorIndex(int mankind, int fid,int devIdx,int devOrder)
{
DataView dv;
try
{
string sql = "SELECT F_MonitorIndex FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.F_RELATIVECONTORLID = T_Monitor_Task.F_ManageTaskIndex " +
" AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( T_Monitor_Task.F_ManageTaskKindIndex = " + mankind + ") AND (FID = " +
fid + ") and (F_DeviceIndex=" + devIdx + " and F_DeviceCommandIndex=" + devOrder + ")";
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
}
else
{
return -1;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
dv = null;
}
}
/// <summary>
/// 查找关联自己的主设备指令索引
/// </summary>
/// <param name="mankind">任务类型</param>
/// <param name="fid">辅助调度任务索引</param>
/// <param name="devIdx">设备索引</param>
/// <param name="devOrder">设备指令</param>
/// <returns></returns>
public int GetRelativeMainMonitorIndex(int mankind, int fid, int devIdx, int devOrder)
{
DataView dv;
try
{
string sql = "SELECT F_MonitorIndex FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.FID = T_Monitor_Task.F_ManageTaskIndex " +
" AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( F_ManageTaskKindIndex = " + mankind + ") AND (F_RELATIVECONTORLID = " +
fid + ") and (F_DeviceIndex=" + devIdx + " and F_DeviceCommandIndex=" + devOrder + ")";
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
}
else
{
return -1;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
dv = null;
}
}
#endregion
#region
/// <summary>
/// 根据前面得到的F_MonitorIndex值获得被锁定的设备索引
/// </summary>
/// <returns>以“;”隔开的设备索引组字符串</returns>
public string GetLockedDeviceIndex(int MonitorIndex)
{
//20100108
DataSet ds;
try
{
string sql = "select F_RunningLock from T_Monitor_Task where F_MonitorIndex=" + MonitorIndex;
//20100108
ds = dbo.ExceSQL(sql);
if (ds.Tables[0].DefaultView.Count > 0)
{
return ds.Tables[0].DefaultView[0]["F_RunningLock"].ToString();
}
else
return "";
}
catch (Exception ex)
{
throw ex;
}
finally
{//20100108
ds = null;
}
}
/// <summary>
/// 根据前面得到的MonitorIndex值取得"关联设备索引-命令"
/// </summary>
/// <returns>关联设备索引-命令null表示没有</returns>
public string GetAssociateDevice(int MonitorIndex)
{
//20100108
DataView dv;
DataView dvv;
try
{
string sql = "select F_Associate from T_Monitor_Task where (F_Associate IS NOT NULL) and F_MonitorIndex=" + MonitorIndex;
//20100108
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
string sql1 = "select F_DeviceIndex,F_DeviceCommandIndex from T_Monitor_Task where F_MonitorIndex=" + dv[0]["F_Associate"];
//20100108
dvv = dbo.ExceSQL(sql1).Tables[0].DefaultView;
if (dvv.Count > 0)
{
return dvv[0]["F_DeviceIndex"].ToString() + "-" + dvv[0]["F_DeviceCommandIndex"].ToString();
}
else
{
return null;
}
}
else
{
return null;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
dv = null;
dvv = null;
}
}
/// <summary>
/// 根据前面得到的MonitorIndex值取得"关联调度任务"
/// </summary>
/// <returns>关联调度任务索引0表示没有</returns>
public int GetAssociateMonitor(int MonitorIndex)
{
//20100108
DataView dv;
DataView dvv;
try
{
string sql = "select F_Associate from T_Monitor_Task where (F_Associate IS NOT NULL) and F_MonitorIndex=" + MonitorIndex;
//20100108
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
string sql1 = "select F_MonitorIndex from T_Monitor_Task where F_MonitorIndex=" + dv[0]["F_Associate"];
//20100108
dvv = dbo.ExceSQL(sql1).Tables[0].DefaultView;
if (dvv.Count > 0)
{
return Convert.ToInt32(dvv[0]["F_MonitorIndex"].ToString());
}
else
{
return 0;
}
}
else
{
return 0;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//20100108
dv = null;
dvv = null;
}
}
/// <summary>
/// 根据前面得到的关联调度任务值取得"调度任务索引"
/// </summary>
/// <returns>调度任务索引0表示没有</returns>
public int GetMonitorFromAssociate(int AssociateMonitor)
{
//20100108
DataView dv;
try
{
string sql = "select F_MonitorIndex from T_Monitor_Task where F_Associate=" + AssociateMonitor;
//20100108
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
}
else
{
return 0;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
dv = null;
}
}
/// <summary>
/// 根据前面得到的_DetailIndex值取得"阻挡设备索引"-"命令"
/// </summary>
/// <returns>阻挡设备索引和命令null表示没有</returns>
public string GetBlockDevice(int detailIndex)
{
//20100108
DataSet ds;
try
{
string sql = "select F_BlockDevice from T_Base_Route_Detail where (F_BlockDevice IS NOT NULL) and F_DetailIndex=" + detailIndex;
//20100108
ds = dbo.ExceSQL(sql);
if (ds.Tables[0].DefaultView.Count > 0)
{
return ds.Tables[0].DefaultView[0]["F_BlockDevice"].ToString();
}
else
{
return null;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
ds = null;
}
}
/// <summary>
/// 根据前面得到的_DetailIndex值取得"提前触发设备索引"-"命令"
/// </summary>
/// <returns>提前触发设备索引和命令null表示没有</returns>
public string GetAheadTriggerDevice(int detailIndex)
{
//20100108
DataSet ds;
try
{
string sql = "select F_AheadTrigger from T_Base_Route_Detail where (F_AheadTrigger IS NOT NULL) and (F_AheadTrigger <> '') and F_DetailIndex=" + detailIndex;
//20100108
ds = dbo.ExceSQL(sql);
if (ds.Tables[0].DefaultView.Count > 0)
{
return ds.Tables[0].DefaultView[0]["F_AheadTrigger"].ToString();
}
else
{
return null;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
ds = null;
}
}
/// <summary>
/// 在设备指令信息中获得堆垛机的
/// 取货点Z坐标站在堆垛机上面向操作面板左侧-1右侧-2
/// 取货点X坐标沿轨道方向
/// 取货点Y坐标沿高度方向
/// 送货点Z坐标站在堆垛机上面向操作面板左侧-1右侧-2
/// 送货点X坐标沿轨道方向
/// 送货点Y坐标沿高度方向
/// </summary>
/// <param name="TaskIdx">设备指令索引</param>
/// <returns>0--5六个数组分别依次代表个坐标</returns>
public int[] GetCoordinatesFromMonitorTask(int TaskIdx)
{
//20100108
DataView dv;
int[] gc;
try
{
//20100108
dv = dbo.ExceSQL("select * from T_Monitor_Task where F_MonitorIndex=" + TaskIdx).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;
}
}
/// <summary>
/// 获得设备类型索引
/// </summary>
/// <param name="devIdx">设备索引</param>
/// <returns>设备类型索引</returns>
public int GetDeviceKindIdx(int devIdx)
{
try
{
devinfo = Model.CGetInfo.GetDeviceInfo(devIdx);
return devinfo.DeviceKind;
//string strSql = "SELECT F_DeviceIndex, F_DeviceKindIndex FROM T_Base_Device WHERE F_DeviceIndex=" + devIdx;
//DataSet ds = dbo.ExceSQL(strSql);
//DataView dv = ds.Tables[0].DefaultView;
//if (dv.Count > 0)
//{
// return Convert.ToInt32(dv[0]["F_DeviceKindIndex"]);
//}
//else
// return 0;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 在调度队列中找到设备命令
/// </summary>
/// <param name="MonitorIndex">调度所引</param>
/// <returns></returns>
public int GetDeviceOrderFromMonitor(int MonitorIndex)
{
//20100108
DataView dv;
try
{
string sql = "select F_DeviceCommandIndex from T_Monitor_Task where (F_DeviceCommandIndex IS NOT NULL) and F_MonitorIndex=" + MonitorIndex;
//20100108
dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]);
}
else
{
return -1;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
dv = null;
}
}
/// <summary>
/// 码盘区请求空托盘
/// </summary>
/// <param name="DeviceIndex">码盘区工位设备索引</param>
public void AskBlankPallet(int DeviceIndex)
{
}
/// <summary>
/// 成功发送命令后的处理信息
/// </summary>
/// <param name="taskKindIndex">调度任务类型</param>
/// <param name="Managefid">调度任务索引</param>
/// <param name="MonirotIdx">设备指令索引</param>
/// <param name="deviceidx">设备索引</param>
/// <param name="detailidx">详细路径步骤索引</param>
public void SendOrderSuccess(int taskKindIndex, int Managefid, int MonirotIdx, int deviceidx, int detailidx)
{
string AssociateDevice = "";//关联设备
string LockedDeviceIndex = "";//被锁定的设备索引组,以“;”分隔
char[] sep = new char[1];
string[] split;
DataView dvs;
try
{
int devKind = GetDeviceKindIdx(deviceidx);
int order = GetDeviceOrderFromMonitor(MonirotIdx);
//8更改作业记录的状态F_Status为1,更改设备为占用状态T_Base_device的F_LockedState=设备指令单)
string dtime = DateTime.Now.ToString("u");//20110603
dtime = dtime.Substring(0, dtime.Length - 1);
dbo.ExceSQL("update T_Monitor_Task set F_StartTime='" + dtime + "',F_Status=1,F_SendCount=F_SendCount+1 where F_Status=0 and F_MonitorIndex=" + MonirotIdx);//20100905
if (taskKindIndex != 4)//20100610
{
//20101220AGV和输送机送出指令不需要锁定设备
if (devKind != 5 && devKind != 6 && (devKind != 2 && order != 6))
{
dbo.ExceSQL("update T_Base_device set F_LockedState=" + MonirotIdx +
" where F_DeviceIndex=" + deviceidx + "");
}
#region 20101220
//else
//{
// //完成应答3
// if (order == 3)
// {
// string[] df = Model.CGeneralFunction.GetDoubleForkMonitorInfo(MonirotIdx, 1001);
// //bool snyc = Model.CGeneralFunction.DoubleForkIfSync(MonirotIdx, 1001, 6);
// Model.CGeneralFunction.ActionComplete(1001, MonirotIdx, 0);
// #region 双叉关联任务,能同步的同时报告完成;异步的直接执行关联的命令
// //20100323
// devinfo = Model.CGetInfo.GetDeviceInfo(1001);
// if ((devinfo.IfCorrelDoubleFork == "1") && (df != null))//20100702
// {
// //if (snyc == true)//20100702
// //{
// Model.CGeneralFunction.ActionComplete(1001, Convert.ToInt32(df[0]), 0);
// //}
// }
// #endregion
// }
// else
// {
// dvs = dbo.ExceSQL("SELECT F_AgvNo FROM T_Monitor_Task WHERE (F_AgvNo IS NOT NULL) AND (F_MonitorIndex = " + MonirotIdx + ")").Tables[0].DefaultView;
// if (dvs.Count > 0)
// {
// dbo.ExceSQL("update T_Base_device set F_LockedState=" + MonirotIdx +
// " where F_DeviceIndex=" + dvs[0][0] + "");
// }
// }
//}
#endregion
}
if (devKind == 1)
{
//修改T_Manage_Task的FLANEWAYFSTACK
//20100108
dvs = dbo.ExceSQL("SELECT F_LaneDeviceIndex,F_StackIndex FROM T_Base_LaneInfo where F_StackIndex=" + deviceidx + "").Tables[0].DefaultView;
int laneway = 0;
if (dvs.Count > 0)
{
laneway = Convert.ToInt32(dvs[0]["F_LaneDeviceIndex"]);
}
dbo.ExceSQL("update T_Manage_Task set FLANEWAY=" + laneway + ",FSTACK=" + deviceidx + " where F_ManageTaskKindIndex=" + taskKindIndex + " and FID=" + Managefid);
}
if (taskKindIndex != 4)
{
//如果是RGV、堆垛机的将取运行命令需要增加调度任务预约锁F_ManTaskReserve && (order == 7)) && ((order == 2) || (order == 4))
if ((devKind == 4) || (devKind == 1) )//20100610
{////RGV运到到输送机//堆垛机将取
dbo.ExceSQL("UPDATE T_Base_Device SET F_ManTaskReserve = " + (taskKindIndex.ToString() + Managefid.ToString()) + " WHERE (F_DeviceIndex = " + deviceidx + ")");
}
}
//9给调度任务表回写调度任务IO_Control的正在执行状态FSTATUS=1;T_Manage_Task的正在执行状态FSTATUS=1
dbo.ExceSQL("update T_Manage_Task set FSTATUS='1' where F_ManageTaskKindIndex=" + taskKindIndex + " and FID=" + Managefid);
if (taskKindIndex == 1)//调度任务
{
//20100905聊城RFID比对发送时不修改调度任务状态
if ((devinfo.DeviceIndex == 1605) || (devinfo.DeviceIndex == 1606) || (devinfo.DeviceIndex == 1607) || (devinfo.DeviceIndex == 1608))
{
}
else
{
dboM.ExceSQL("update IO_Control set Control_STATUS=" + Model.CGeneralFunction.TASKRUN + " where Control_ID=" + Managefid + " and Control_STATUS<>" + Model.CGeneralFunction.TASKRUN + " and Control_STATUS<>" + Model.CGeneralFunction.TASKSINGLEFORKRUN + " ");//20110504
}
}
//10:调度任务表里的F_RunningLock所有对应设备索引加锁但是F_AssociateDeviceIndex关联设备不加锁
AssociateDevice = GetAssociateDevice(MonirotIdx);
if (AssociateDevice == "") AssociateDevice = null;
if (AssociateDevice != null)
{
sep[0] = '-';
split = AssociateDevice.Split(sep);
AssociateDevice = split[0];
}
sep[0] = ';';
LockedDeviceIndex = GetLockedDeviceIndex(MonirotIdx);
if (LockedDeviceIndex != "")
{
split = LockedDeviceIndex.Split(sep);
for (int m = split.GetLowerBound(0); m <= split.GetUpperBound(0); m++)
{
dbo.ExceSQL("update T_Base_device set F_LockedState=" + MonirotIdx +
" where F_DeviceIndex=" + Convert.ToInt32(split[m]) + "and F_DeviceIndex<>" + Convert.ToInt32(AssociateDevice));
}
}
//20110416
//叠盘申请离开的任务在发送成功后立即完成
if (deviceidx == 34002 || deviceidx == 24001)
{
Model.CGeneralFunction.ActionComplete(deviceidx, MonirotIdx, 0);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
sep =null;
split=null;
dvs=null ;
}
}
public int GetManageTaskIndexfromMonitor(int monitorIdx)
{
//20100108
DataView dv;
try
{
//20100108
dv = dbo.ExceSQL("SELECT F_ManageTaskIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " + monitorIdx + ")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_ManageTaskIndex"]);
}
else
{
return -1;
}
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
dv = null;
}
}
public int GetManageTaskKindIndexFromMonitor(int monitorIdx)
{//20100108
DataView dv;
try
{
//20100108
dv = dbo.ExceSQL("SELECT F_ManageTaskKindIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " + monitorIdx + ")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]);
}
else
{
return -1;
}
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
dv = null;
}
}
public int GetManageIDFromManageTask(int taskKindIndex, int Managefid)
{
//20100108
DataView dv;
try
{
//20100108
dv = dbo.ExceSQL("SELECT FMANAGEID FROM T_Manage_Task WHERE (FID = " + Managefid + ") AND (F_ManageTaskKindIndex = " + taskKindIndex + ")").Tables[0].DefaultView;
if (dv.Count > 0)
{
if (dv[0]["FMANAGEID"] == DBNull.Value) return -1;
return Convert.ToInt32(dv[0]["FMANAGEID"]);
}
else
{
return -1;
}
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
dv = null;
}
}
public int GetFCONTROLTASKTYPEFromManageTask(int taskKindIndex, int Managefid)
{
//20100108
DataView dv;
try
{
//20100108
dv = dbo.ExceSQL("SELECT FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FID = " + Managefid + ") AND (F_ManageTaskKindIndex = " + taskKindIndex + ")").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 = null;
}
}
/// <summary>
/// 在调度任务表获得最大码盘数量
/// </summary>
/// <param name="taskKindIndex">调度任务类型</param>
/// <param name="Managefid">调度任务索引</param>
/// <param name="ManageID">ManageID</param>
/// <returns></returns>
public int GetMaxGoodsAmountFromManageTask(int taskKindIndex, int Managefid, int ManageID)
{
DataView dv = dbo.ExceSQL("SELECT FREMARK FROM T_Manage_Task WHERE (FID = " + Managefid + ") AND (F_ManageTaskKindIndex = "+taskKindIndex+") AND (FMANAGEID = "+ManageID+")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["FREMARK"]);
}
else
{
return 0;
}
}
public bool IFCanStackPallet(int ManageID,int DeviceOrder)
{
DataView dv = dbo.ExceSQL("SELECT * FROM T_BASE_STACK_ROBOT WHERE ((F_ManageID IS NULL) or (F_ManageID=" + ManageID + ") or (F_ManageID=0)) and F_DeviceOrder=" + DeviceOrder + "").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
{
return false;
}
}
public bool IFLastStackPalletTask(int taskKindIndex, int Managefid)
{
DataView dv = dbo.ExceSQL("SELECT FREMARK FROM T_Manage_Task WHERE (FID = "+ Managefid +") AND (F_ManageTaskKindIndex = "+taskKindIndex +") AND (FREMARK = '1')").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 是否需要优化调度
/// </summary>
/// <param name="DeviceIdx"></param>
/// <returns></returns>
public bool NeedOptimize(int DeviceIdx)
{
//20100108
DataView dv;
try
{
//20100108
dv = dbo.ExceSQL("SELECT F_DeviceIndex, F_NeedOptimize FROM T_Base_Device where F_DeviceIndex=" + DeviceIdx + " and F_NeedOptimize='1'").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
return false;
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
dv = null;
}
}
/// <summary>
/// 根据设备指令索引MonitorIndex检索出需要向T_Monitor_Task_Child插入的纪录并且完成插入工作
/// </summary>
/// <param name="MonitorIndex"></param>
public void InsertMonitorOptimizeChildTask(int MonitorIndex)
{
try
{//20100108
//起始x坐标列-沿轨道方向
// 起始y坐标层-高度方向
// 起始z坐标排-面向堆垛机操作面板1-左侧2-右侧
//F_NumParam1--z,x--2,y--3;F_NumParam4--z,5--x,6--y
string sql;
int[] childInfo = GetMonitorChildIndex(MonitorIndex);
sql = "INSERT INTO T_Monitor_Task_Child(F_Child_Index, F_TargetX, F_TargetY, F_TargetZ, F_OriginX, F_OriginY, F_OriginZ, F_Order,F_DeviceKindIndex,F_DummyDeviceIndex,F_MonitorIndex, F_Status)" +
"VALUES (" + childInfo[0] + "," + childInfo[2] + "," + childInfo[3] + "," + childInfo[1] + "," + childInfo[5] + "," + childInfo[6] + "," + childInfo[4] + "," + childInfo[7] + "," + childInfo[8] + "," + childInfo[9] + "," + MonitorIndex + ",0,)";
dbo.ExceSQL(sql);
}
catch (Exception ex)
{//20100108
throw ex;
}
}
/// <summary>
/// //获得需要优化调度设备指令的子任务索引
///conInfo[9]=设备索引 ;
///conInfo[8]=设备种类索引 ;
///conInfo[7]=命令 ;
///conInfo[1] = ["F_NumParam1"];
///conInfo[2] = ["F_NumParam2"];
///conInfo[3] = ["F_NumParam3"];
///conInfo[4] = ["F_NumParam4"];
///conInfo[5] = ["F_NumParam5"];
///conInfo[6] = ["F_NumParam6"];
/// </summary>
/// <param name="monitorTaskIndex"></param>
/// <returns>子任务索引值1--65535</returns>
public int[] GetMonitorChildIndex(int monitorTaskIndex)
{
//20100108
DataView dvMt;
int[] conInfo = new int[10];
DataView dv;
try
{
int devKindIndex;
//20100108
dv = dbo.ExceSQL("SELECT T_Base_Device.F_DeviceIndex,T_Base_Device.F_DeviceKindIndex,T_Monitor_Task.F_DeviceCommandIndex," +
"F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task" +
" WHERE (T_Monitor_Task.F_MonitorIndex = " + monitorTaskIndex + ") and " +
" (T_Monitor_Task.F_DeviceIndex = T_Base_Device.F_DeviceIndex)").Tables[0].DefaultView;
if (dv.Count > 0)
{
devKindIndex = Convert.ToInt32(dv[0]["F_DeviceKindIndex"]);
conInfo[9] = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
conInfo[8] = devKindIndex;
conInfo[7] = Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]);
conInfo[1] = Convert.ToInt32(dv[0]["F_NumParam1"]);
conInfo[2] = Convert.ToInt32(dv[0]["F_NumParam2"]);
conInfo[3] = Convert.ToInt32(dv[0]["F_NumParam3"]);
conInfo[4] = Convert.ToInt32(dv[0]["F_NumParam4"]);
conInfo[5] = Convert.ToInt32(dv[0]["F_NumParam5"]);
conInfo[6] = Convert.ToInt32(dv[0]["F_NumParam6"]);
}
else
{
return null;
}
string sql = "SELECT F_Child_Index FROM T_Monitor_Task_Child_Index";
//20100108
dvMt = dbo.ExceSQL(sql).Tables[0].DefaultView;
if (dvMt.Count > 0 && dvMt[0]["F_Child_Index"] != DBNull.Value)
{
int maxIdx;
maxIdx = (Convert.ToInt32(dvMt[0]["F_Child_Index"]) + 1);
if (maxIdx >= 64000)
{
UpdateMonitorChildIndex(Convert.ToInt32(devKindIndex.ToString() + "0" + "1"));
conInfo[0] = Convert.ToInt32(devKindIndex.ToString() + "0" + "1");
return conInfo;
}
else
{
UpdateMonitorChildIndex(maxIdx);
conInfo[0] = maxIdx;
return conInfo;
}
}
else//现在没有该设备指令子任务记录
{
UpdateMonitorIndex(Convert.ToInt32(devKindIndex.ToString() + "0" + "1"));
conInfo[0] = Convert.ToInt32(devKindIndex.ToString() + "0" + "1");
return conInfo;
}
}
catch (Exception ex)
{
_DisassembleTaskError = "获得指定调度任务的设备指令索引失败!" + ex.Message;
throw ex;
//return 0;
}
finally
{//20100108
dv = null;
dvMt = null;
conInfo = null;
}
}
public void UpdateMonitorChildIndex(int MonitorChildIndex)
{
dbo.ExceSQL("update T_Monitor_Task_Child_Index set F_Child_Index=" + MonitorChildIndex);
}
/// <summary>
/// 增加对表T_Monitor_Task_Child的监控产生不同设备优选算法完成优化调度
/// 优化原则:调度路径和最小者(空闲设备的当前位置与起始位置的“路径模差”的绝对值
/// 加上 起始位置与终点位置的“路径模差”的绝对值
/// 路径模差此路径上总共有n个站点如果n1-n2的绝对值大于或等于(n/2),则
/// 路径模差=Math.Abs(n1-n2-n否则路径模差=Math.Absn1-n2
/// </summary>
public void OptimizeControlDevice()
{
}
/// <summary>
/// 获得设备指令任务的关联对等设备索引:堆垛机的取货指令任务的取货站台的双叉对等关联站台
/// 返回值“-1”表示无关联站台“0”表示自关联站台其它值表示关联站台设备索引
/// </summary>
/// <param name="MonitorTask">设备指令索引</param>
/// <param name="DeviceIndex">设备索引</param>
/// <returns></returns>
public int GetCorrel_DeviceIndex(int MonitorTask)
{
int[] zxy = GetCoordinatesFromMonitorTask(MonitorTask);
string zxystr = "";
if (zxy != null)
{
zxystr = (zxy[0].ToString().Length == 1 ? "0" + zxy[0].ToString() : zxy[0].ToString()) + "-" +
((zxy[1].ToString().Length == 1) ? ("0" + zxy[1].ToString()) : (zxy[1].ToString())) + "-" +
((zxy[2].ToString().Length == 1) ? ("0" + zxy[2].ToString()) : (zxy[2].ToString()));
DataView dv = dbo.ExceSQL("SELECT F_LaneGateDeviceIndex,F_CorrelDeviceIndex FROM T_Base_Lane_Gate where (T_Base_Lane_Gate.F_ZXY = '" + zxystr + "')").Tables[0].DefaultView;
if (dv.Count > 0)
{
if (dv[0]["F_LaneGateDeviceIndex"].ToString() == dv[0]["F_CorrelDeviceIndex"].ToString())
{
return 0;
}
else
{
return int.Parse(dv[0]["F_CorrelDeviceIndex"].ToString());
}
}
}
return -1;
}
/// <summary>
/// 根据设备指令索引获得设备信息【0】设备索引【1】顶升高位检测【2】顶升低位检测
/// 【3】有物检测【4】运行监测【5】近巷道2列有物检测【6】远巷道1列有物检测【7】是否使用远货叉【8】关联设备索引
/// </summary>
/// <param name="MonitorTask"></param>
/// <returns></returns>
public string[] GetCorrel_DeviceInfo(int MonitorTask)
{
string[] rr = new string[9];
int[] zxy = GetCoordinatesFromMonitorTask(MonitorTask);
string zxystr = "";
if (zxy != null)
{
zxystr = (zxy[0].ToString().Length == 1 ? "0" + zxy[0].ToString() : zxy[0].ToString()) + "-" +
((zxy[1].ToString().Length == 1) ? ("0" + zxy[1].ToString()) : (zxy[1].ToString())) + "-" +
((zxy[2].ToString().Length == 1) ? ("0" + zxy[2].ToString()) : (zxy[2].ToString()));
DataView dv = dbo.ExceSQL("SELECT * FROM T_Base_Lane_Gate where (T_Base_Lane_Gate.F_ZXY = '" + zxystr + "')").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();
return rr;
}
}
return null;
}
public string[] GetCorrelOther_DeviceInfo(int device)
{
string[] rr = new string[9];
DataView dv = dbo.ExceSQL("SELECT * FROM T_Base_Lane_Gate where (F_LaneIndex=1801 and T_Base_Lane_Gate.F_LaneGateDeviceIndex = " + device + ")").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();
return rr;
}
else
return null;
}
/// <summary>
/// 获得设备索引的关联对等设备索引:堆垛机的取货指令任务的取货站台的双叉对等关联站台或者顶升
/// 返回值“-1”表示无关联站台“0”表示自关联站台其它值表示关联站台设备索引
/// </summary>
/// <param name="DeviceIndex"></param>
/// <returns></returns>
public int GetCorrel_DeviceIndex(int DeviceIndex, bool ownCorrel)
{
return -1;
DataView dv = dbo.ExceSQL("SELECT F_LaneGateDeviceIndex,F_CorrelDeviceIndex FROM T_Base_Lane_Gate where F_LaneGateDeviceIndex = " + DeviceIndex).Tables[0].DefaultView;
if (dv.Count > 0)
{
if (dv[0]["F_LaneGateDeviceIndex"].ToString() == dv[0]["F_CorrelDeviceIndex"].ToString())
{
return 0;
}
else
{
return int.Parse(dv[0]["F_CorrelDeviceIndex"].ToString());
}
}
return -1;
}
/// <summary>
/// 根据设备索引获得关联设备信息【0】设备索引【1】顶升高位检测【2】顶升低位检测
/// 【3】有物检测【4】运行监测【5】近巷道2列有物检测【6】远巷道1列有物检测【7】是否使用远货叉【8】关联设备索引【9】顶升中位检测
/// </summary>
/// <param name="DeviceIndex">设备索引</param>
/// <param name="ownCorrel">是否自关联</param>
/// <returns></returns>
public string[] GetCorrel_DeviceInfo(int DeviceIndex, bool ownCorrel)
{
string[] rr = new string[4];
// 顶升设备是为普通的输送机处理 2011//11/16
DataView dv = dbo.ExceSQL("SELECT * FROM T_Base_Lane_Gate where F_CorrelDeviceIndex = " + DeviceIndex).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_MiddleDetect"].ToString();//20101220 升降站台中位检测
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_CorrelDeviceIndex"].ToString();
// rr[4] = dv[0]["F_RunDetect"].ToString();
if (ownCorrel == true)
{
if (dv[0]["F_LaneGateDeviceIndex"].ToString() == DeviceIndex.ToString())
{
return rr;
}
else
{
return null;
}
}
else
{
return rr;
}
}
return null;
}
/// <summary>
/// 根据设备指令索引反馈堆垛机的送货坐标是否为极限货位
/// </summary>
/// <param name="TaskIdx"></param>
/// <returns></returns>
public bool IfLimitCellCode(int TaskIdx)
{
int[] zxy = GetCoordinatesFromMonitorTask(TaskIdx);
//if (zxy != null)
//{
// object ob = dbo.GetSingle("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_ForwardLimitX = " + zxy[4] + ") OR (F_BackLimitX = " + zxy[4] + ")");
// if (ob != null)
// {
// return true;
// }
//}
return false;
}
#endregion
#region
public string ShowConveyorError(int ConveyorNo)
{
int DeviceIdx;
IGetDeviceState gds;
int[] States;
DataView dv1 = dbo.ExceSQL("SELECT * FROM T_Base_ConveyorError where F_ConveyorNo=" + ConveyorNo ).Tables[0].DefaultView;
if (dv1.Count > 0)
{
DeviceIdx = Convert.ToInt32(dv1[0]["F_DeviceIndex"]);
}
else
{
return null;
}
gds = CommModeCreate.CreateGetDeviceState(DeviceIdx);
States = gds.GetDeviceState(DeviceIdx, 64777);//1完成,2任务号,5设备号
if (States == null)
{
return null;
}
if ((States[2] != 64777) || (States[5] != DeviceIdx))
{
return null;
}
DataView dv = dbo.ExceSQL("SELECT * FROM T_Base_ConveyorError where F_ConveyorNo=" + ConveyorNo + " and F_ErrorIndex="+States[1] ).Tables[0].DefaultView;
if (dv.Count > 0)
{
return dv[0]["F_ErrorName"].ToString();
}
else
{
return null;
}
}
/// <summary>
/// 根据ManageID的值把F_GoodsAmount减一F_GoodsAmount如果大于“
/// </summary>
/// <param name="ManageID"></param>
/// <returns>F_GoodsAmount减一的结果</returns>
public int GetLeftGoodsAmount(int ManageID)
{
dbo.ExceSQL("update T_BASE_STACK_ROBOT set F_GoodsAmount=F_GoodsAmount-1 where F_GoodsAmount>0 and F_ManageID="+ManageID+"");
DataView dv = dbo.ExceSQL("SELECT F_GoodsAmount FROM T_BASE_STACK_ROBOT WHERE (F_ManageID = " + ManageID + ")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_GoodsAmount"]);
}
else
{
return -1;
}
}
public int GetStackPalletOrderOver(int ManageID)
{
DataView dv = dbo.ExceSQL("SELECT F_DeviceOrder FROM T_BASE_STACK_ROBOT WHERE (F_ManageID = "+ManageID+")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return Convert.ToInt32(dv[0]["F_DeviceOrder"].ToString().Substring(0, 1) + "2");
}
else
return 0;
}
public int GetExceptionNOFromManageTask(int FID,int ManTaskKind)
{
//20100108
DataTable dt;
try
{
string sql = "SELECT FID, F_ManageTaskKindIndex, FExceptionNO FROM T_Manage_Task WHERE (FID = " + FID + ") AND (F_ManageTaskKindIndex = " + ManTaskKind + ") ";
//20100108
dt = dbo.ExceSQL(sql).Tables[0];
if (dt.Rows.Count > 0)
{
if (dt.Rows[0]["FExceptionNO"] == DBNull.Value)
{
return -1;
}
else
{
return Convert.ToInt32(dt.Rows[0]["FExceptionNO"]);
}
}
else
{
return -1;
}
}
catch (Exception ex)
{
_DisassembleTaskError = "获得指定调度任务的异常代码:" + ex.Message;
throw ex;
//return 0;
}
finally
{//20100108
dt = null;
}
}
#endregion
#region
/// <summary>
/// 获取调度生成的调度任务的索引
/// </summary>
/// <returns></returns>
public int GetTempManageIdx()
{
//20100108
DataSet ds;
try
{
int maxIdx = 10001;
//20100108
ds = dbo.ExceSQL("SELECT F_ManageTaskIndex FROM T_Base_Manage_Task_Index_Temp_Task");
if (ds.Tables[0].DefaultView.Count > 0)
{
if ((Convert.ToInt32(ds.Tables[0].DefaultView[0]["F_ManageTaskIndex"]) + 1) >= 19998)
{
maxIdx = 10001;
}
else
{
maxIdx = (Convert.ToInt32(ds.Tables[0].DefaultView[0]["F_ManageTaskIndex"]) + 1);
}
}
else
{
maxIdx = 10001;
}
//判断临时调度任务表是否有重复值
if (IFExitTempManageIndex(maxIdx) == true)
{
RecordMaxTempManageTaskFID(maxIdx);
maxIdx = GetTempManageIdx();
return maxIdx;
}
RecordMaxTempManageTaskFID(maxIdx);
return maxIdx;
}
catch (Exception ex)
{//20100108
_DisassembleTaskError = "获得指定调度任务的临时任务索引失败," + ex.Message;
throw ex;
//return 0;
}
finally
{//20100108
ds= null;
}
}
/// <summary>
/// 获得库房索引
/// </summary>
/// <returns></returns>
public string GetWarehouseIndex()
{
//20100108
DataView dv;
try
{
//20100108
dv = dbo.ExceSQL("select F_WarehouseIndex from T_Warehouse").Tables[0].DefaultView;
if (dv.Count > 0)
{
return dv[0]["F_WarehouseIndex"].ToString();
}
else
{
return "1";
}
}
catch (Exception ex)
{//20100108
_DisassembleTaskError = "获得指定库房索引失败," + ex.Message;
throw ex;
//return 0;
}
finally
{//20100108
dv = null;
}
}
/// <summary>
/// 记录调度生成的调度任务的索引的最大值
/// </summary>
/// <param name="fid">调度生成的调度任务的索引</param>
public void RecordMaxTempManageTaskFID(int fid)
{//20100108
DataView dv;
try
{//20100108
dv = dbo.ExceSQL("select F_ManageTaskIndex from T_Base_Manage_Task_Index_Temp_Task").Tables[0].DefaultView;
if (dv.Count > 0)
{
//if (fid == 19998)
//{
// dbo.ExceSQL("UPDATE T_Base_Manage_Task_Index_Temp_Task SET F_ManageTaskIndex =10001");
// return;
//}
//if (fid > Convert.ToInt32(dv[0]["F_ManageTaskIndex"]))
//{
dbo.ExceSQL("UPDATE T_Base_Manage_Task_Index_Temp_Task SET F_ManageTaskIndex =" + fid);
return;
//}
}
else
{
dbo.ExceSQL("INSERT INTO T_Base_Manage_Task_Index_Temp_Task (F_ManageTaskIndex)VALUES (" + fid + ")");
return;
}
}
catch (Exception ex)
{//20100108
_DisassembleTaskError = "获得记录调度任务最大任务索引失败," + ex.Message;
throw ex;
//return 0;
}
finally
{//20100108
dv = null;
}
}
/// <summary>
/// 判断这个货位在ST_CELL是否存在
/// </summary>
/// <param name="FWAREHOUSE"></param>
/// <param name="FLaneWay"></param>
/// <param name="FCELLCODE"></param>
/// <returns></returns>
public bool QueryCellIfExit(string FWAREHOUSE, int FLaneWay, string FCELLCODE)
{
char[] cc = new char[1] { '-' };
string[] fcc = FCELLCODE.Split(cc);
if (fcc.GetUpperBound(0) < 2) return false;
int[] fcci = new int[fcc.GetUpperBound(0) + 1];
//20100108
DataView dv;
try
{
for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
{
fcci[i] = Convert.ToInt32(fcc[i]);
}
//20100108
dv = dbo.ExceSQL("SELECT FWAREHOUSE, FCELLCODE, FCELLSTATUS " +
" FROM ST_CELL Where FWAREHOUSE='" + FWAREHOUSE + "' and FLaneWay=" + FLaneWay + " and F_Z=" +
fcci[0] + " and F_X=" + fcci[1] + " and F_Y=" + fcci[2] + " ").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{//20100108
_DisassembleTaskError = "查询货位是否存在失败," + ex.Message;
throw ex;
//return 0;
}
finally
{//20100108
dv = null;
cc =null ;
fcc =null ;
fcci = null;
}
}
/// <summary>
/// 查询货位状态是否满足入库或者出库条件
/// </summary>
/// <param name="FWAREHOUSE">库房编号</param>
/// <param name="FCELLCODE">货位编号</param>
/// <param name="IOType">"1":入库(放货);"2":出库(取货)</param>
/// <returns></returns>
public bool QueryCellStatusIfAccord(string FWAREHOUSE,int FLaneWay, string FCELLCODE, string IOType)
{
char[] cc = new char[1] { '-' };
string[] fcc = FCELLCODE.Split(cc);
if (fcc.GetUpperBound(0) < 2) return false;
int[] fcci = new int[fcc.GetUpperBound(0) + 1];
//20100108
DataView dv;
try
{
for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
{
fcci[i] = Convert.ToInt32(fcc[i]);
}
if (IOType == "1")//入库(放货)
{
//20100108
dv = dbo.ExceSQL("SELECT FWAREHOUSE, FCELLCODE, FCELLSTATUS " +
" FROM ST_CELL Where FWAREHOUSE='" + FWAREHOUSE + "' and FLaneWay=" + FLaneWay + " and F_Z=" +
fcci[0] + " and F_X=" + fcci[1] + " and F_Y=" + fcci[2] + " and FCELLSTATUS='0'").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
{
return false;
}
}
else//if (IOType == "2")//出库(取货)
{
//20100108
dv = dbo.ExceSQL("SELECT FWAREHOUSE, FCELLCODE, FCELLSTATUS " +
" FROM ST_CELL Where FWAREHOUSE='" + FWAREHOUSE + "' and FLaneWay=" + FLaneWay + " and F_Z='" +
fcci[0] + "' and F_X='" + fcci[1] + "' and F_Y='" + fcci[2] + "' and FCELLSTATUS='1'").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
{
return false;
}
}
}
catch (Exception ex)
{//20100108
_DisassembleTaskError = "查询货位状态失败," + ex.Message;
throw ex;
//return 0;
}
finally
{//20100108
dv = null;
cc = null;
fcc = null;
fcci = null;
}
}
/// <summary>
/// 设置货位状态
/// </summary>
/// <param name="FWAREHOUSE"></param>
/// <param name="FCELLCODE"></param>
/// <param name="FCELLSTATUS"></param>
public void SetCellStatus(string FWAREHOUSE, int FLaneWay, string FCELLCODE, string FCELLSTATUS)
{
char[] cc = new char[1] { '-' };
string[] fcc = FCELLCODE.Split(cc);
int[] fcci = new int[fcc.GetUpperBound(0) + 1];
try
{//20100108
for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
{
fcci[i] = Convert.ToInt32(fcc[i]);
}
dbo.ExceSQL("UPDATE ST_CELL SET FCELLSTATUS ='" + FCELLSTATUS + "' where FWAREHOUSE='" + FWAREHOUSE + "' and FLaneWay=" + FLaneWay + " and F_Z='" +
fcci[0] + "' and F_X='" + fcci[1] + "' and F_Y='" + fcci[2] + "' ");
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
cc = null;
fcc = null;
fcci = null;
}
}
/// <summary>
/// 查询运行状态是否符合条件
/// </summary>
/// <param name="FWAREHOUSE"></param>
/// <param name="FCELLCODE"></param>
/// <returns></returns>
public bool QueryRunStatusIfAccord(string FWAREHOUSE, int FLaneWay, string FCELLCODE)
{
char[] cc = new char[1] { '-' };
string[] fcc = FCELLCODE.Split(cc);
int[] fcci = new int[fcc.GetUpperBound(0) + 1];
DataView dv;//20100108
try
{//20100108
for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
{
fcci[i] = Convert.ToInt32(fcc[i]);
}
//20100108
dv = dbo.ExceSQL("SELECT FWAREHOUSE, FCELLCODE, FCELLSTATUS " +
" FROM ST_CELL Where FWAREHOUSE='" + FWAREHOUSE + "' and FLaneWay=" + FLaneWay + " and F_Z='" +
fcci[0] + "' and F_X='" + fcci[1] + "' and F_Y='" + fcci[2] + "' and FRUNSTATUS='0'").Tables[0].DefaultView;
if (dv.Count > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
cc = null;
fcc = null;
fcci = null;
dv = null;
}
}
/// <summary>
/// 设置货位运行状态
/// </summary>
/// <param name="FWAREHOUSE"></param>
/// <param name="FCELLCODE"></param>
/// <param name="FRUNSTATUS"></param>
public void SetRunStatus(string FWAREHOUSE, int FLaneWay, string FCELLCODE, string FRUNSTATUS)
{
char[] cc = new char[1] { '-' };
string[] fcc = FCELLCODE.Split(cc);
int[] fcci = new int[fcc.GetUpperBound(0) + 1];
try
{//20100108
for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
{
//20121009
return;
fcci[i] = Convert.ToInt32(fcc[i]);
}
dbo.ExceSQL("UPDATE ST_CELL SET FRUNSTATUS ='" + FRUNSTATUS + "' where FWAREHOUSE='" + FWAREHOUSE + "' and FLaneWay=" + FLaneWay + " and F_Z='" +
fcci[0] + "' and F_X='" + fcci[1] + "' and F_Y='" + fcci[2] + "'");
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
cc = null;
fcc = null;
fcci = null;
}
}
public int GetSerialNumberFromRouteDevice(int RouteIDSub, int DeviceIndex)
{
DataView dv;//20100108
try
{
//20100108
dv = dbo.ExceSQL("SELECT F_SerialNumber FROM T_Base_Route_Device WHERE (F_RouteIDSub = " + RouteIDSub + ") AND (F_DeviceIndex = " + DeviceIndex + ")").Tables[0].DefaultView;
if (dv.Count > 0)
{
return (int)dv[0]["F_SerialNumber"];
}
else
{
return -1;
}
}
catch (Exception ex)
{//20100108
throw ex;
}
finally
{//20100108
dv = null;
}
}
#endregion
public string GetAvailableCellCode(int StartDeviceIndex)
{
string strCellCode = string.Empty;
DataView dvTask = new DataView();
DataView dvCell = new DataView();
int iShortOfEmptyCell = 0;
int iBusyLevel = 0;
DataView dvRoute = dbo.ExceSQL("SELECT * FROM T_Base_Route WHERE (F_EndDevice LIKE '1800%') AND (F_RouteKind = 1) AND (F_Status = 1) AND (F_StartDevice = " + StartDeviceIndex.ToString() + ")").Tables[0].DefaultView;
if ((dvRoute != null) && (dvRoute.Count > 0))//可到达的路径
{
do
{
for (int i = 0; i < dvRoute.Count; i++)
{
dvTask = dbo.ExceSQL("SELECT * FROM T_Manage_Task WHERE (FENDDEVICE = " + Convert.ToInt32(dvRoute[i]["F_EndDevice"]).ToString() + ")").Tables[0].DefaultView;
if (dvTask != null && dvTask.Count > iBusyLevel)//此路径已有任务
{
continue;
}
else
{
if (StartDeviceIndex == 12100)
{
//dvCell = dbo.ExceSQL("SELECT top 1 * FROM ST_CELL WHERE (FLaneWay = " + Convert.ToInt32(dvRoute[i]["F_EndDevice"]).ToString() + ") AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND(F_Y = 1) AND(F_X > 9) ORDER BY F_Z, F_Y, F_X").Tables[0].DefaultView;
dvCell = dbo.ExceSQL("SELECT top 1 * FROM ST_CELL WHERE (FLaneWay = " + Convert.ToInt32(dvRoute[i]["F_EndDevice"]).ToString() + ") AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND(F_Y = 2)AND(F_X > 3) ORDER BY F_Z, F_Y, F_X").Tables[0].DefaultView;
}
else
{
dvCell = dbo.ExceSQL("SELECT top 1 * FROM ST_CELL WHERE (FLaneWay = " + Convert.ToInt32(dvRoute[i]["F_EndDevice"]).ToString() + ") AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND(F_Y = 2)AND(F_X > 3) ORDER BY F_Z, F_Y, F_X").Tables[0].DefaultView;
}
if (dvCell != null && dvCell.Count > 0)
{
strCellCode = dvCell[0]["fcellcode"].ToString().Trim();
//将货位置为选中状态
dbo.ExceSQL("update ST_CELL set FRunStatus = 1 where fcellcode = '" + strCellCode + "'");
break;
}
else
{
iShortOfEmptyCell++;
continue;
}
}
}
if (strCellCode == string.Empty)//有可用路径且没有分配到货位
{
if (iShortOfEmptyCell == dvRoute.Count)//No empty Cell
{
//System.Windows.Forms.MessageBox.Show("No empty Cell");
break;
}
}
iBusyLevel++;
} while (strCellCode == string.Empty);
}
return strCellCode;
}
public string GetBarCode(string strHead)
{
string strBarCode = string.Empty;
int iCode = -1;
string strBase = "00000000";
DataView dv = dbo.ExceSQL("SELECT TOP 1 F_BarCode FROM T_Base_BarCode").Tables[0].DefaultView;
if (dv != null && dv.Count > 0)
{
iCode = Convert.ToInt32(dv[0]["F_BarCode"]);
System.Diagnostics.Trace.Assert(iCode > 0 && iCode < 30001);//1到30000
strBase = strBase.Substring(dv[0]["F_BarCode"].ToString().Trim().Length);
strBarCode = strHead + strBase + iCode.ToString().Trim();
}
dbo.ExceSQL("update T_Base_BarCode set F_BarCode =" + ((iCode % 30000 + 1)).ToString());
return strBarCode;
}
public int GetLanewayFromCellCode(string strCellCode)
{
int iLaneway = -1;
if (strCellCode != string.Empty)
{
DataView dv = dbo.ExceSQL("SELECT FLaneWay FROM ST_CELL WHERE (FCELLCODE = '"+ strCellCode +"')").Tables[0].DefaultView;
if (dv != null && dv.Count > 0)
{
iLaneway = Convert.ToInt32(dv[0]["FLaneWay"].ToString());
}
}
return iLaneway;
}
public void ReportDeviceState()
{
foreach (Model.MDevice devinfo in Model.CGetInfo.DeviceInfo.Values)
{
if (devinfo.DeviceKind == 1 || devinfo.DeviceKind == 2 || devinfo.DeviceKind == 3 || devinfo.DeviceKind==5)
{
int CurRunState=0;
if (devinfo.RunState == 0 || devinfo.RunState == 5)
{
CurRunState = 0;
}
else
if (devinfo.RunState == 4)
{
CurRunState = 3;
}
else
{
CurRunState = devinfo.RunState;
}
if (devinfo.LastRunState != CurRunState)
{
try
{
//上报设备状态和当前时间
string dtime = DateTime.Now.ToString("u");
dtime = dtime.Substring(0, dtime.Length - 1);
// int CurRunState= devinfo.RunState==
//string sql = string.Format("Update DEVICE_MONITOR set DEVICE_CUR_STATUS={0}, DEVICE_PRE_STATUS={1},UPDATE_TIME='{2}' where DEVICE_CODE ={3}", CurRunState,devinfo.LastRunState,dtime, devinfo.DeviceIndex);
// string sql = string.Format("Update DEVICE_MONITOR set DEVICE_CUR_STATUS={0},UPDATE_TIME='{1}' where DEVICE_CODE ={2}", CurRunState, dtime, devinfo.DeviceIndex);
devinfo.LastRunState = CurRunState;
Model.CGetInfo.SetDeviceLastRunState(devinfo);
// dboM.ExceSQL(sql);
//更新LastRunState
}
catch (Exception ex)
{
_DisassembleTaskError = string.Format("上报设备{0}的设备状态时发生错误:{1}",devinfo.DeviceIndex, ex.Message);
}
}
}
}
}
/// <summary>
/// 返回设备所在路径
/// </summary>
/// <param name="device"></param>
/// <returns></returns>
public int GetRouteIDsub(int device)
{
DataView dv = dbo.ExceSQL("SELECT TOP 1 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;
}
}
public void GetApplyID(out int ApplyID, out int ControlID)
{
ApplyID =0 ;
ControlID =0;
DataView dvApplyID = dboM.ExceSQL("select IO_CONTROL_APPLY_SEQ.NEXTVAL as apply_id FROM DUAL").Tables[0].DefaultView;
DataView dvControlID =dboM.ExceSQL("select IO_CONTROL_SEQ.NEXTVAL as CONTROL_ID FROM DUAL").Tables[0].DefaultView ;
ApplyID =Convert .ToInt32 (dvApplyID [0]["apply_id"]);
ControlID = Convert.ToInt32(dvControlID[0]["CONTROL_ID"]);
}
public int GetTransDeviceGoodsCounts(string Devices)//20190712
{
int goodscount = 0;//货物数量
if (Devices == "")
{ return goodscount; }
try
{
char[] cc = new char[1] { ';' };
string[] sp;
sp = Devices.Split(cc);
int count = sp.Length;//设备数量
for (int i = 0; i < count; i++)
{
int deviceindex = Convert.ToInt32(sp[i]);
devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
if (devinfo != null)
{
goodscount += devinfo.SplitByte_0;
goodscount += devinfo.SplitByte_1;
if (devinfo.SplitByte_0 == 0 && devinfo.SplitByte_1 == 0)//20191221
{
if (devinfo.RunState != 0)
{
goodscount += 1;
}
}
}
}
return goodscount;
}
catch (Exception ex)
{
return goodscount;
}
}
}
}