110 lines
5.4 KiB
C#
110 lines
5.4 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Text;
|
||
using System.Data;
|
||
using DBFactory;
|
||
using CommLayerFactory;
|
||
using ICommLayer;
|
||
namespace ControlSystem
|
||
{
|
||
/// <summary>
|
||
/// Creator:Richard.liu
|
||
/// 如果正在运行的设备有AheadTrigger信息,则在T_Base_Route_Detail表找到AheadTrigger
|
||
/// 的设备索引和命令字;根据调度任务类型和调度任务索引找到T_Monitor_Task表对应的
|
||
/// 设备指令索引是否存在,存在而且处于等待执行状态那就发送提前触发命令(发送前检查是否符合发送命令条件)。
|
||
/// </summary>
|
||
public class CAheadTriggerMoveDevice
|
||
{
|
||
DBOperator dbo =CStaticClass.dbo;
|
||
string _CControlError = "";//监控调度类错误说明
|
||
public string CControlError
|
||
{
|
||
get { return _CControlError; }
|
||
set { _CControlError = value; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送设备的提前触发移动设备和命令
|
||
/// </summary>
|
||
/// <param name="manKindIdx">调度任务类型索引</param>
|
||
/// <param name="manIdx">调度任务索引</param>
|
||
/// <param name="AheadTrigger">提前触发移动设备-命令</param>
|
||
public CAheadTriggerMoveDevice()
|
||
{
|
||
int manKindIdx; int manIdx; int DetailIndex; string AheadTrigger;
|
||
int devIdx, devOrder;
|
||
char[] cc = new char[1] {'-' };
|
||
string[] spl;
|
||
|
||
DataView dvm,dv;
|
||
dv = dbo.ExceSQL("SELECT F_ManageTaskKindIndex,F_ManageTaskIndex,T_Base_Route_Detail.F_DetailIndex, T_Base_Route_Detail.F_AheadTrigger FROM T_Base_Route_Detail,T_Monitor_Task WHERE T_Base_Route_Detail.F_DetailIndex = T_Monitor_Task.F_DetailIndex AND (T_Base_Route_Detail.F_AheadTrigger IS NOT NULL) AND (T_Base_Route_Detail.F_AheadTrigger <> '') AND (T_Monitor_Task.F_Status = 1)").Tables[0].DefaultView;
|
||
if (dv.Count <= 0) return;
|
||
for(int i=0;i<dv.Count ;i++)
|
||
{
|
||
manKindIdx = Convert.ToInt32(dv[i]["F_ManageTaskKindIndex"]);
|
||
manIdx = Convert.ToInt32(dv[i]["F_ManageTaskIndex"]);
|
||
DetailIndex = Convert.ToInt32(dv[i]["F_DetailIndex"]);
|
||
AheadTrigger = dv[i]["F_AheadTrigger"].ToString();
|
||
spl = AheadTrigger.Split(cc);
|
||
devIdx = Convert.ToInt32(spl[0]);
|
||
devOrder = Convert.ToInt32(spl[1]);
|
||
dvm = dbo.ExceSQL("SELECT F_ManageTaskIndex, F_ManageTaskKindIndex,F_MonitorIndex, F_DeviceIndex, F_DeviceCommandIndex," +
|
||
" F_Status FROM T_Monitor_Task WHERE F_ManageTaskKindIndex=" +
|
||
manKindIdx + " AND F_ManageTaskIndex=" + manIdx + " AND F_DeviceIndex=" + devIdx +
|
||
" AND F_DeviceCommandIndex=" + devOrder + " AND F_Status=0").Tables[0].DefaultView;
|
||
|
||
if (dvm.Count > 0)
|
||
{
|
||
CControl cct = new CControl();
|
||
CCommonFunction ccf = new CCommonFunction();
|
||
bool sendok = false;
|
||
if (cct.GetFirstDeviceIFLocked(Convert.ToInt32(dvm[0]["F_MonitorIndex"]),true ) == false)
|
||
{
|
||
int[] gc = ccf.GetCoordinatesFromMonitorTask(Convert.ToInt32(dvm[0]["F_MonitorIndex"]));//获得坐标
|
||
if (gc != null)
|
||
{
|
||
//发送此设备命令
|
||
ISendDeviceOrder sdo;
|
||
//CStaticClass.MessageIndex++;
|
||
CStaticClass.MessageIndex = 1;
|
||
int msgIdx = (CStaticClass.MessageIndex);
|
||
sdo = CommModeCreate.CreateSendDeviceOrder(devIdx);
|
||
//1:堆垛机;4:RGV;6:AGV如果需要优化调度(设备表的F_NeedOptimize='1')
|
||
//直接写入表:T_Monitor_Task_Child,不发送命令
|
||
if (ccf.NeedOptimize(devIdx) == true)
|
||
{
|
||
ccf.InsertMonitorOptimizeChildTask(Convert.ToInt32(dvm[0]["F_MonitorIndex"]));
|
||
sendok = true;
|
||
}
|
||
else
|
||
{
|
||
sendok = sdo.SendDeviceOrder(msgIdx, Convert.ToInt32(dvm[0]["F_MonitorIndex"]), devOrder,
|
||
devIdx, gc[0], gc[1], gc[2], gc[3], gc[4], gc[5]);
|
||
}
|
||
if (sendok == false)
|
||
{
|
||
if (FrmControlMonitor.FormInstance.GetObjectText("tsStatus").IndexOf(sdo.CommLayerError) < 0)
|
||
{
|
||
FrmControlMonitor.FormInstance.FlashPanit("tsStatus", sdo.CommLayerError, true);
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
ccf.SendOrderSuccess(manKindIdx, manIdx, Convert.ToInt32(dvm[0]["F_MonitorIndex"]), devIdx, DetailIndex);
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
this._CControlError += "发送命令时不能取得设备坐标!";
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|