SCLS/SSWCS_JXDL(2019)/CommonLibrary/CGetState.cs
2025-05-19 09:45:29 +08:00

358 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Resources;
using DBFactory;
using ICommLayer;
using CommLayerFactory;
namespace CommonLibrary
{
/// <summary>
/// 获得设备状态
/// </summary>
public class CGetState
{
DBOperator dbo1 = new DBOperator();
DBOperator dbo = new DBOperator();
DBOperator dboM = new DBOperator("ManConnString", "ManDBFactory");
string _CGetStateError = "";//监控调度类错误说明
public string CGetStateError
{
get { return _CGetStateError; }
set { _CGetStateError = value; }
}
public int[] _States;
int _fid;
int _mti;
int _iotype=0;
int _endnode=0;
/// <summary>
/// 获得所有正在执行设备的状态
/// </summary>
public CGetState()
{
dbo.Open();
if (dboM.Open() == false)
{
//if (FrmControlMonitor.FormInstance.GetObjectText("tsStatus").IndexOf("连接管理数据库失败!!!") < 0)
//{
// FrmControlMonitor.FormInstance.FlashPanit("tsStatus", "连接管理数据库失败!!!", true);
//}
}
}
/// <summary>
/// 报告完成
///电器反馈该设备的"完成"时 删除监控任务 , 解除设备表占用状态F_LockedState=0
///路径明细表F_LockedDeviceIndex里的所有对应设备索引解锁
///
///判断是最后一个监控任务吗? 是,回写管理任务IO_Control的FSTATUS=2即"搬运完成";
/// T_Base_Manage_Task的正在执行状态FSTATUS=2
/// </summary>
/// <param name="DeviceIdx">设备索引</param>
/// <param name="TaskIdx">监控任务索引</param>
public void ActionComplete(int DeviceIdx,int TaskIdx)
{
int ccfreturn;
dbo.TransBegin();
try
{
string retu=GetDetailIndexFromMonitor(TaskIdx);
GetManage_Kind(TaskIdx);
int fid = _fid ;
int mti = _mti ;
string cap;
DataSet ds = dbo.ExceSQL("select count(F_MonitorIndex) as counts from T_Base_Monitor_Task "+
" where F_ManageTaskIndex =" + fid + " and F_ManageTaskKindIndex= "+mti);
if (ds.Tables[0].DefaultView.Count > 0)
{
if ((Convert.ToInt32(ds.Tables[0].DefaultView[0]["counts"]) == 1) && (CStaticClass.RouteSearchMode == "0"))
{
//管理任务的fid的最后一个监控分解任务完成
//回写管理任务IO_Control的FSTATUS=2即"搬运完成";T_Base_Manage_Task的正在执行状态FSTATUS=2
if (mti == 1)
{
cap = "管理任务";
//判断是否为软确认任务是就改为FSTATUS=4
dboM.ExceSQL("update IO_Control set FSTATUS='4' where FID=" + fid);
}
else if (mti == 4)
{
cap = "手工任务";
}
else
{
cap = "临时任务";
}
//回写管理表
ReturnManageInfo(fid, mti,cap,true);
}
}
if ((CStaticClass.RouteSearchMode == "1"))
{
if (mti == 4)
{
//回写管理表
cap = "手工任务";
ReturnManageInfo(fid, mti,cap,true);
}
else
{
cap = "临时任务";
//根据路径索引,在详细路径中找到设备和命令,判断是否为该设备的最后一个命令
//判断命令是否包含“;”,没有此字符就是最后一个命令;如果有此字符就判断是否为最后一个
if (retu == "") return;
char[] cc = new char[1] { '-' };
string[] split=retu.Split(cc);
if (IFDeviceLastOrder(Convert.ToInt32(split[0]),DeviceIdx,Convert.ToInt32(split[1]) ) == true)
{
ccfreturn = ccf.StepsRouteSearch(false, fid, mti, _iotype, DeviceIdx, _endnode);
if (ccfreturn == 9999)
{
if (mti == 1)
{
//判断是否为软确认任务是就改为FSTATUS=4
dboM.ExceSQL("update IO_Control set FSTATUS='4' where FID=" + fid);
}
//回写管理表
ReturnManageInfo(fid, mti,cap,true);
}
}
}
}
//判断此设备是否为码盘机器人码盘完成后的任务在表T_BASE_STACK_ROBOT查找DeviceIdx
dbo.ExceSQL("UPDATE T_BASE_STACK_ROBOT SET F_ManageID = NULL WHERE F_StackPositionDeviceIndex = " + DeviceIdx);
//解除设备表占用状态F_LockedState=0路径明细表F_LockedDeviceIndex里的所有对应设备索引解锁 ,删除监控任务
dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + DeviceIdx);
dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_LockedState=" + TaskIdx);
dbo.ExceSQL("delete from T_Base_Monitor_Task where F_MonitorIndex=" + TaskIdx);
dbo.TransCommit();
//刷新监控中心显示
//显示监控任务
RefreshControlMonitor(DeviceIdx);
}
catch (Exception ex)
{
dbo.TransRollback();
if (FrmControlMonitor.FormInstance.GetObjectText("tsStatus").IndexOf("报告完成时:" + ex.Message) < 0)
{
FrmControlMonitor.FormInstance.FlashPanit("tsStatus", "报告完成时:" + ex.Message, true);
}
//throw ex;
}
}
/// <summary>
/// 回写设备错误状态字IO_Control,T_Base_Manage_task,T_Monitor_task
/// </summary>
/// <param name="DeviceIdx">设备索引</param>
/// <param name="TaskIdx">监控任务索引</param>
/// <param name="ErrId">错误编号</param>
public void ActionError(int DeviceIdx, int TaskIdx,int ErrId)
{
dbo.TransBegin();
try
{
GetManage_Kind(TaskIdx);
int fid = _fid;
int mti = _mti;
DataSet ds = dbo.ExceSQL("SELECT F_ErrorIndex,F_ErrorName,T_Base_Device_State.F_DeviceKindIndex," +
" F_DeviceErrorIndex,F_ManageStatus,F_DeviceIndex,F_DeviceName FROM T_Base_Device_State,T_Base_Device Where " +
" T_Base_Device_State.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex and F_DeviceIndex="
+ DeviceIdx + " and F_DeviceErrorIndex= " + ErrId);
DataView dv = ds.Tables[0].DefaultView;
if (dv.Count > 0)
{
FrmMain.FormInstance.notifyIcon1.ShowBalloonTip(10000, "警告", dv[0]["F_DeviceName"].ToString()+"发生故障:" + dv[0]["F_ErrorName"].ToString(), System.Windows.Forms.ToolTipIcon.Warning);
if (mti == 1)
{
if (dv[0]["F_ManageStatus"] == DBNull.Value)
{
dboM.ExceSQL("update IO_Control set FSTATUS=" + ErrId + " where FID=" + fid);
}
else
{
dboM.ExceSQL("update IO_Control set FSTATUS=" + Convert.ToInt32(dv[0]["F_ManageStatus"]) + " where FID=" + fid);
}
}
ds = dbo.ExceSQL("SELECT F_DeviceIndex, F_ErrorIndex FROM T_Base_Device_Error_Log Where F_DeviceIndex=" + DeviceIdx + " and F_ErrorIndex=" + Convert.ToInt32(dv[0]["F_ErrorIndex"]));
if (ds.Tables[0].DefaultView.Count > 0)
{
dbo.ExceSQL("UPDATE T_Base_Device_Error_Log SET F_DateTime ='" + DateTime.Now.ToString("u") + "' Where F_DeviceIndex=" + DeviceIdx + " and F_ErrorIndex=" + Convert.ToInt32(dv[0]["F_ErrorIndex"]));
}
else
{
dbo.ExceSQL("INSERT INTO T_Base_Device_Error_Log (F_DeviceIndex, F_ErrorIndex, F_DateTime) VALUES ("+ DeviceIdx +","+ Convert.ToInt32( dv[0]["F_ErrorIndex"])+",'"+DateTime.Now.ToString("u") +"')");
}
}
dbo.ExceSQL("update T_Base_Monitor_Task set F_Status= " + ErrId + " where F_MonitorIndex= " + TaskIdx);
dbo.ExceSQL("update T_Base_Manage_task set FSTATUS='" + ErrId.ToString() + "' where FID=" + fid + " and F_ManageTaskKindIndex= " + mti);
dbo.TransCommit();
//根据设备类型判断错误编号
ISendDeviceOrder sdo;
CCommonFunction ccf = new CCommonFunction();
if (ccf.GetDeviceKindIdx(DeviceIdx) == 2)
{//输送机故障清零
sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
sdo.SendDeviceOrder(0, 0, 0, DeviceIdx);
}
if (ccf.GetDeviceKindIdx(DeviceIdx) == 1) //堆垛机
{
sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
sdo.SendDeviceOrder(0, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0);
}
//刷新监控中心显示
RefreshControlMonitor(DeviceIdx);
}
catch (Exception ex)
{
dbo.TransRollback();
if (FrmControlMonitor.FormInstance.GetObjectText("tsStatus").IndexOf("向管理反馈设备错误时:" + ex.Message) < 0)
{
FrmControlMonitor.FormInstance.FlashPanit("tsStatus", "向管理反馈设备错误时:" + ex.Message, true);
}
//throw ex;
}
}
/// <summary>
/// 删除监控任务。如果是最后一个监控任务回写管理任务IO_Control的FSTATUS=-1。
/// </summary>
/// <param name="DeviceIdx">设备索引</param>
/// <param name="TaskIdx">监控任务索引</param>
public void ActionDelete(int DeviceIdx, int TaskIdx)
{
CCommonFunction ccf = new CCommonFunction();
DataView dvstate = dbo.ExceSQL("SELECT F_MonitorIndex, F_Status FROM " +
"T_Base_Monitor_Task where F_MonitorIndex=" + TaskIdx + " and F_Status>=1").Tables[0].DefaultView;
if (dvstate.Count > 0) //正在运行
{
ISendDeviceOrder sdo;
sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
sdo.SendDeviceOrder(0, 0, 0, DeviceIdx);
}
dbo.TransBegin();
try
{
string retu = GetDetailIndexFromMonitor(TaskIdx);
GetManage_Kind(TaskIdx);
int fid = _fid;
int mti = _mti;
string cap;
DataSet ds = dbo.ExceSQL("select count(F_MonitorIndex) as counts from T_Base_Monitor_Task " +
" where F_ManageTaskIndex =" + fid + " and F_ManageTaskKindIndex= " + mti);
if (ds.Tables[0].DefaultView.Count > 0)
{
if ((Convert.ToInt32(ds.Tables[0].DefaultView[0]["counts"]) == 1) && (CStaticClass.RouteSearchMode == "0"))
{
//管理任务的fid的最后一个监控分解任务完成
//回写管理任务IO_Control的FSTATUS=-1
if (mti == 1)
{
cap = "管理任务";
dboM.ExceSQL("update IO_Control set FSTATUS='-1' where FID=" + fid);
}
else if (mti == 4)
{
cap = "手工任务";
}
else
{
cap = "临时任务";
}
//回写管理表
ReturnManageInfo(fid, mti, cap, false);
}
}
if ((CStaticClass.RouteSearchMode == "1"))
{
if (mti == 4)
{
//回写管理表
cap = "手工任务";
ReturnManageInfo(fid, mti, cap, false);
}
else
{
cap = "临时任务";
//根据路径索引,在详细路径中找到设备和命令,判断是否为该设备的最后一个命令
//判断命令是否包含“;”,没有此字符就是最后一个命令;如果有此字符就判断是否为最后一个
if (retu == "") return;
char[] cc = new char[1] { '-' };
string[] split = retu.Split(cc);
if (IFDeviceLastOrder(Convert.ToInt32(split[0]), DeviceIdx, Convert.ToInt32(split[1])) == true)
{
//ccfreturn = ccf.StepsRouteSearch(false, fid, mti, _iotype, DeviceIdx, _endnode);
//if (ccfreturn == 9999)
//{
if (mti == 1)
{
dboM.ExceSQL("update IO_Control set FSTATUS='-1' where FID=" + fid);
}
//回写管理表
ReturnManageInfo(fid, mti, cap, false);
//}
}
}
}
//20080728
//修改货位表的货架执行状态和货架是否有盘状态;
//判断此设备是否为码盘机器人码盘完成后的任务在表T_BASE_STACK_ROBOT查找DeviceIdx
dbo.ExceSQL("UPDATE T_BASE_STACK_ROBOT SET F_ManageID = NULL WHERE F_StackPositionDeviceIndex = " + DeviceIdx);
//解除设备表占用状态F_LockedState=0路径明细表F_LockedDeviceIndex里的所有对应设备索引解锁 ,删除监控任务
dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + DeviceIdx);
dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_LockedState=" + TaskIdx);
dbo.ExceSQL("delete from T_Base_Monitor_Task where F_MonitorIndex=" + TaskIdx);
dbo.TransCommit();
//刷新监控中心显示
//显示监控任务
RefreshControlMonitor(DeviceIdx);
}
catch (Exception ex)
{
dbo.TransRollback();
if (FrmControlMonitor.FormInstance.GetObjectText("tsStatus").IndexOf("报告完成时:" + ex.Message) < 0)
{
FrmControlMonitor.FormInstance.FlashPanit("tsStatus", "报告完成时:" + ex.Message, true);
}
//throw ex;
}
}
}
}