东风铸造热芯库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
14 KiB

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Threading;
using Microsoft.VisualBasic;
using DBFactory;
using ICommLayer;
using Model;
namespace AGVDataTable
{
/// <summary>
/// 20200430中间表接口
/// 发送设备命令类
///
/// </summary>
public class CSendDeviceOrder: ISendDeviceOrder
{
string _commLayerError;
public string CommLayerError
{
get { return _commLayerError; }
set { _commLayerError = value; }
}
DBOperator dbo = CommonClassLib.AppSettings.dbo;//20130510
public CSendDeviceOrder()
{
dbo.Open();
}
//~CSendDeviceOrder()
//{
// dbo.Close();
//}
/// <summary>
/// 发送AGV车命令
/// </summary>
/// <param name="MessageIndex">消息编号</param>
/// <param name="TaskIndex">任务编号</param>
/// <param name="Order">AGV命令字</param>
///1-取送货
///2.3... 待扩展
/// <param name="DeviceIndex">设备编号</param>
/// <param name="StartX">AGV取货站台(或区域)</param>
/// <param name="StartY">0</param>
/// <param name="StartZ">0</param>
/// <param name="EndX">AGV送货站台(或区域)</param>
/// <param name="EndY"></param>
/// <param name="EndZ">0</param>
/// <returns>发送命令是否成功</returns>
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ)
{
//return true;
StringBuilder sql = new StringBuilder();
StringBuilder sss = new StringBuilder();
DataView dv = new DataView();
sql.Remove(0, sql.Length);
sql.Append("SELECT * FROM T_Monitor_Task WHERE F_MonitorIndex = ").Append(TaskIndex).Append(" AND F_Status = 0");
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
if (dv.Count == 0)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:不存在"+ TaskIndex +" 对应的空闲指令!";
return false;
}
try
{
int checkDeviceCode = 12236;
if (StartX == 12113 || EndX == 12229)
{
sql.Clear();
sql.AppendFormat("select * from T_Monitor_Task where F_Status > 0 and {0}", StartX == 12113 ? "F_NumParam5 = 12229" : "F_NumParam2 = 12113");
var checkTask = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
if(checkTask.Count > 0)
{
_commLayerError = "等待其他AGV任务路线避让中";
return false;
}
}
sql.Clear();
sql.AppendFormat("select * from T_Monitor_Task where F_Status > 0 and F_NumParam5 = {0}", EndX);
var task = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
if (task.Count > 0)
{
switch (EndX)
{
case 12235:
checkDeviceCode = 12236;
break;
case 12219:
checkDeviceCode = 12502;
break;
case 12229:
checkDeviceCode = 12230;
break;
case 12232:
checkDeviceCode = 12233;
break;
case 12111:
checkDeviceCode = 12405;
break;
case 12103:
checkDeviceCode = 12401;
break;
}
MDevice checkDeviceModel = CGetInfo.GetDeviceInfo(checkDeviceCode);
if (checkDeviceModel.SplitByte_0 == 1)
{
_commLayerError = StartX + "到" + EndX + "有正在执行的任务,且" + checkDeviceCode + "位置有货";
return false;
}
}
int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex);
sql.Remove(0, sql.Length);
sql.Append("SELECT * FROM t_agvTask WHERE ID = ").Append(fid).Append(" AND Main_Tk_ID = ")
.Append(TaskIndex);
if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:中间表已存在该指令:"+ TaskIndex;
return false;
}
StringBuilder dtime = new StringBuilder(DateTime.Now.ToString("u"));
dtime.Remove(dtime.Length - 1, 1);
int TaskLevel = Convert.ToInt32(dv[0]["F_MonitorTaskLevel"]);
string PalletBarcode = dv[0]["F_TxtParam"].ToString();
sql.Clear();
sql.Append("select * from T_Manage_Task where FID = ").Append(fid);
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
if (dv.Count == 0)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:找不到对应的管理任务!";
return false;
}
//int TaskType = Convert.ToInt32(dv[0]["FCONTROLTASKTYPE"]);
int COMPOSITE_TAG = 0;
string START_DEVICE_CODE2 = "";
string END_DEVICE_CODE2 = "";
sql.Remove(0, sql.Length);
sql.Append($"select * from [dbo].[T_AgvTask] where Tk_Out_Pos=(select F_Top from T_Base_AGV_Gate where F_AGVGateDeviceIndex='{StartX}') " +
$" and ((Is_GetOrSend=0 and battery_status=1) or Is_GetOrSend in(5,8)) ");// and battery_status=1
var dvs = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
if (dvs.Count > 0)
{
sql.Remove(0, sql.Length);
sql.Append("update T_Monitor_Task set F_IfSync='2' WHERE F_MonitorIndex = ").Append(TaskIndex).Append(" AND F_Status = 0");
dbo.ExecuteSql(sql.ToString());
return false;
}
sql.Clear();
sql.Append("select * from T_Base_AGV_Gate where F_AGVGateDeviceIndex= ").Append(StartX);
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
var StartXs = dv[0]["F_Left"];
int TaskType= Convert.ToInt32( dv[0]["F_Input"]);
int palletType = Convert.ToInt32(dv[0]["F_Output"]);
sql.Clear();
sql.Append("select * from T_Base_AGV_Gate where F_AGVGateDeviceIndex= ").Append(EndX);
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
var EndXs = dv[0]["F_Left"];
var TaskTypes = TaskType == 1 ? 1 : 3;
//INSERT INTO t_agvTask(MAIN_TK_ID,Agv_Tk_Type,pallet_no,Tk_In_Pos,Tk_Out_Pos,tk_sts,Tk_Ins_UserID,Tk_Ins_TM)VALUES()
string command = string.Format(
"INSERT INTO t_agvTask(MAIN_TK_ID,Agv_Tk_Type,pallet_no,Tk_In_Pos,Tk_Out_Pos,tk_sts,Tk_Ins_UserID,Tk_Ins_TM,pallet_Type,Is_FinishFlag,Is_GetOrSend)" +
" VALUES('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}','{8}','{9}','{10}')",
TaskIndex,"2",PalletBarcode,StartXs, EndXs, COMPOSITE_TAG,"WCS", dtime.ToString(), palletType,"1", TaskTypes);
//TaskIndex, TaskType, TaskLevel, PalletBarcode, StartXs, EndXs, COMPOSITE_TAG, dtime.ToString(), fid, START_DEVICE_CODE2, END_DEVICE_CODE2
MDevice device = CGetInfo.GetDeviceInfo(EndX);
dbo.ExecuteSql(command);
sss.Remove(0, sss.Length);
sss.Append("条码:").Append(PalletBarcode).Append("**写标志1").Append("**任务号" + TaskIndex.ToString())
.Append("**起始站台" + StartX.ToString()).Append("**终止站台" + EndX.ToString()).Append("**托盘条码" + PalletBarcode)
.Append("**送货站台**" + EndX + ":有货状态码:" + device.SplitByte_0 + "," + device.HaveGoods);
CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送AGV命令","", sss.ToString());
return true;
}
catch (Exception ex)
{
_commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message;
return false;
}
}
/// <summary>
/// 发送堆垛机以外的其它设备命令
/// </summary>
/// <param name="MessageIndex">消息编号</param>
/// <param name="TaskIndex">任务编号</param>
/// <param name="Order">命令字</param>
/// 穿梭车命令字:
///1-复位
///2-左接货
///3-左送货
///4-右接货
///5-右送货
///6-停止
///7-运动到1#位置
///8-运动到2#位置
/// …
///输送机、台车命令字:
///1-入库(朝向库)
/// 2-出库(背向库)
/// 3-送货
/// 4-停止
/// <param name="DeviceIndex">设备编号</param>
/// <returns>发送其它设备命令是否成功</returns>
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int ArrowDeviceIndex)
{
return true;
}
public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ, string DoubleFork)
{
return true;
}
public bool SendDeviceOrder(int DeviceIndex, string TobaccoCode, bool HaveFirstProjectCode, bool IfSmallTobacco, int Count)
{
return true;
}
public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues)
{
return true;
}
public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues, string PLCconnectionID)
{
return true;
}
/// <summary>
/// LHDF
/// </summary>
/// <param name="deviceindex"></param>
/// <param name="type"></param>
private void GetAGVGatePalletType(int deviceindex, out int type)
{
StringBuilder sql = new StringBuilder();
sql.Clear();
sql.Append(string.Format("SELECT F_TYPE FROM T_Base_AGV_Gate where F_AGVGateDeviceIndex={0}", deviceindex));
DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
if (dv.Count > 0)
{
type = Convert.ToInt32(dv[0][0].ToString());
}
else
{
type = 0;
}
}
int GetGoodsHigh(int taskindex)
{
DataView dv = dbo.ExceSQL(string.Format("SELECT CELL_MODEL FROM T_Manage_Task WHERE (F_ManageTaskKindIndex = {0}) AND (FID = {1})", Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(taskindex), Model.CGeneralFunction.GetManageTaskIndexfromMonitor(taskindex))).Tables[0].DefaultView;
if (dv.Count > 0)
{
#region
//int gh = 1;
////P工装板,B标准,G高货位,D大货位
//switch (dv[0][0].ToString().ToUpper())
//{
// case "P":
// gh = 3;
// break;
// case "B":
// gh = 2;
// break;
// case "G":
// gh = 1;
// break;
// //case "D":
// // gh = 4;
// // break;
// default:
// gh = 1;
// break;
//}
#endregion
int gh = 0;
//1小2大
switch (dv[0][0].ToString().ToUpper())
{
case "1":
gh = 1;
break;
case "2":
gh = 2;
break;
default:
gh = 0;
break;
}
return gh;
}
else
{
return 0;
}
}
/// <summary>
/// 根据设备命令,PALLET_SIZE,STACK_TYPE\STACK_QTY
/// </summary>
/// <param name="TaskIndx"></param>
/// <returns></returns>
private int GetManageInfo(int TaskIndx, string Field)
{
DataView dv = new DataView();
try
{
StringBuilder sql = new StringBuilder();
sql.Clear();
sql.Append(string.Format("select {0} from T_Manage_Task where FID in(select F_ManageTaskIndex from T_Monitor_Task where F_MonitorIndex = {1})", Field, TaskIndx));
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
if (dv.Count > 0 && dv[0][Field].ToString().Trim()!= "")//dv[0][Field]!= DBNull.Value,int.Parse(dv[0][Field].ToString().Trim())> 0
{
return Convert.ToInt32(dv[0][Field]);
}
return -1;
}
catch (Exception ex)
{
throw ex;
}
finally
{
dv.Dispose();
}
}
}
}