You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

406 lines
18 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Text;
using System.Linq;
using System.Data;
using System.Threading;
using Mesnac.Controls.Base;
using System.Windows.Forms;
using Mesnac.Codd.Session;
using System.IO;
using Mesnac.Action.Feeding.Qingquan.BasicInfo;
using Mesnac.Action.Base;
namespace Mesnac.Action.Feeding.Qingquan.FeedingPlc
{
/// <summary>
/// 暂停计划,不能作为命令使用,因为要用到当班计划中的控件
/// </summary>
public class PausePlan : FeedingAction, IAction
{
#region 事件定义
/// <summary>
/// 刷新计划事件
/// </summary>
public static event EventHandler OnRefreshPlan;
#endregion
public void Run(RuntimeParameter runtime)
{
base.RunIni(runtime);
try
{
base.LogDebug("暂停计划...");
string msg = String.Empty;
string currentPlanID = String.Empty; //保存当前计划
#region 检验执行暂停计划的条件
#region 判断当班计划界面是否打开
if (PlanCommon.IsInit == false)
{
msg = "当班计划还为初始化,请先打开当班计划,再进行此操作!";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
#endregion
#region 检验本地数据连接
DbHelper localHelper = base.NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Local);
if (localHelper == null)
{
base.LogError("获取本地数据连接失败...");
msg = base.Language(140); //"本地数据库连接异常,不能终止计划\r\n请在数据库连接正常后再进行“终止”操作。";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
#endregion
#region 检验网络数据连接
//判断是单机版还是网络版
if (base.NetType == NetTypes.Net)
{
//网络版
//bool isConnect = PlanCommon.PingIpOrDomainName(base.GetConfigValue("ServerIP", "127.0.0.1"));
bool isConnect = PlanCommon.IsCanConnectServer();
if (!isConnect)
{
//连接服务器数据库失败...
ShowMsg(Language(33), Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
DbHelper serverHelper = base.NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Server);
if (serverHelper == null)
{
base.LogError("获取网络数据连接失败...");
msg = base.Language(141); //"网络数据库连接异常,不能终止计划\r\n请在数据库连接正常后再进行“终止”操作。";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
serverHelper.ClearParameter();
serverHelper.CommandType = CommandType.Text;
}
}
#endregion
#region 检验PLC连接状态与密炼机中有无料标志
int mixerHasRub = this.ReadMixAutoAndRubExists(); //判断密炼机中有无料
if (mixerHasRub == -1)
{
msg = base.Language(142); //"PLC连接异常不能终止计划\r\n请在PLC连接正常后再进行“终止”操作。";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else if (mixerHasRub == 1)
{
msg = base.Language(143); //"密炼机内有料,不能暂停计划!";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
#endregion
#region 检验班次、日期是否合法
DbMCControl shiftControl = this.GetDbMCControlByKey(Mesnac.Basic.DataSourceFactory.MCDbType.Local, "PptShift").FirstOrDefault();
DbMCControl planDateControl = this.GetDbMCControlByKey(Mesnac.Basic.DataSourceFactory.MCDbType.Local, "[ppt_plan].[down_date]").FirstOrDefault();
if (shiftControl == null)
{
base.LogError("缺少班次控件...班次控件为组合框数据源要绑定PptShift");
return;
}
if (planDateControl == null)
{
base.LogError("缺少日期控件...日期控件为日历数据源要绑定down_date");
return;
}
PlanLog log = PlanCommon.PlanLog;
if (log != null)
{
if (log.LastSelectShiftID != Convert.ToInt32(shiftControl.BaseControl.MCValue) || String.Format("{0:yyyyMMdd}", log.LastSelectDate) != String.Format("{0:yyyyMMdd}", Convert.ToDateTime(planDateControl.BaseControl.MCValue)))
{
msg = base.Language(144); //"请把计划调整到正确的日期和班组后再进行终止!";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
currentPlanID = log.LastPlanID; //记录当前计划
}
else
{
msg = base.Language(145); //"还没有正在执行的计划,无法暂停!";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
#endregion
#endregion
#region 暂停执行业务
PlanStates planStates = PlanCommon.GetPlanState(currentPlanID);
if (planStates != PlanStates.Producting)
{
msg = "当前计划未处于生产状态,不能暂停!";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
msg = Language(146); //"当前计划{0}设定{1}车,\r\n您确认暂停?";
DataRow planDataRow = PlanCommon.GetPlanData(Basic.DataSourceFactory.MCDbType.Local, currentPlanID); //获取当前计划数据行
msg = String.Format(msg, currentPlanID, planDataRow["PlanNum"]);
DialogResult result = MessageBox.Show(msg, Language(1), MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
//LogData('基本操作','暂停计划','配方名称'+MemName[nowplan]);
string recipeMaterialName = planDataRow["RecipeMaterialName"] as string;
recipeMaterialName = String.IsNullOrEmpty(recipeMaterialName) ? String.Empty : recipeMaterialName;
base.DBLog("基本操作", "暂停计划", "配方名称" + recipeMaterialName);
DbMCControl clientGridControl = this.GetDbMCControlByKey(Mesnac.Basic.DataSourceFactory.MCDbType.Local, "ppt_plan").FirstOrDefault(); //获取本机台计划网格控件
if (clientGridControl == null)
{
base.LogError("{当班计划——“修改”本机台计划}缺少本机台计划网格控件...");
return;
}
DataGridView clientGridView = clientGridControl.BaseControl as DataGridView;
if (clientGridView == null)
{
base.LogError("{当班计划——“修改”本机台计划}网格控件类型错误...");
return;
}
foreach (DataGridViewRow rowView in clientGridView.Rows)
{
if (currentPlanID == rowView.Cells["PlanID"].Value as string)
{
//rowView.Cells["RealNum"].Value = rowView.Cells["RealNum"].Value + "终止";
break;
}
}
int result1 = this.DownLoadAbortMixing();
if (result1 == -1)
{
msg = base.Language(147); //"终止密炼失败PLC读取失败。";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (result1 == 0)
{
msg = base.Language(148); //"终止密炼失败PLC写入失败。";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
int result2 = this.DownLoadAbortWeight();
if (result1 == -1)
{
msg = base.Language(149); //"终止称量失败PLC读取失败。";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (result1 == 0)
{
msg = base.Language(150); //"终止称量失败PLC写入失败。";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
//如果有胶料称客户端
if (base.FarControlType == 1)
{
this.DownLoadFlagStopPlan(1);
}
PlanCommon.SendPlanId(base.NetType, currentPlanID); //增加计划非正常终止时刻计算
#region 如果合并一次法计划标志为1则更新一次法本地库计划状态终止计划把一次法计划状态改为4
if (base.GetConfigValue("IsCombinedOne", "0") == "1")
{
PlanCommon.UpdatePlanOne(currentPlanID.Trim(), 0, 4, false);
}
#endregion
if (base.NetType == NetTypes.Net)
{
PlanCommon.FlushShiftConfig(Basic.DataSourceFactory.MCDbType.Server, Global.PublicVar.Instance.FirstLotBarCode, Global.PublicVar.Instance.FirstLotSerialId, Global.PublicVar.Instance.LastLotNum); //增加计划非正常终止时刻计算
if (base.FarControlType == 1)
{
string netMsg = "{0}:1/";
netMsg = String.Format(netMsg, Global.ProtocalHeader.ReceivePlanExecInfo);
Mesnac.Communication.TcpService.Instance.NetSendMsg(netMsg);
}
}
PlanCommon.StopChanYongPlan();
msg = base.Language(151); //"当前计划已经终止,需要运行请重新调整计划!";
ShowMsg(msg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
}
#endregion
//触发事件
if (PausePlan.OnRefreshPlan != null)
{
PausePlan.OnRefreshPlan(null, System.EventArgs.Empty);
}
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("暂停计划失败:" + ex.Message, ex);
ShowMsg(ex.Message, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
/// <summary>
/// 计划暂停简化业务负责处理胶料称客户端的Socket指令
/// </summary>
public void ExecPause()
{
string currentPlanID = String.Empty;
string msg = String.Empty;
PlanLog planLog = PlanCommon.PlanLog;
if (planLog == null)
{
return;
}
try
{
currentPlanID = planLog.LastPlanID;
PlanStates planStates = PlanCommon.GetPlanState(currentPlanID);
if (planStates != PlanStates.Producting)
{
msg = "当前计划未处于生产状态,不能暂停!";
ICSharpCode.Core.LoggingService.Info(msg);
return;
}
DataRow planDataRow = PlanCommon.GetPlanData(Basic.DataSourceFactory.MCDbType.Local, currentPlanID); //获取当前计划数据行
//LogData('基本操作','暂停计划','配方名称'+MemName[nowplan]);
string recipeMaterialName = planDataRow["RecipeMaterialName"] as string;
recipeMaterialName = String.IsNullOrEmpty(recipeMaterialName) ? String.Empty : recipeMaterialName;
base.DBLog("基本操作", "暂停计划", "配方名称" + recipeMaterialName);
int result1 = this.DownLoadAbortMixing();
if (result1 == -1)
{
msg = base.Language(147); //"终止密炼失败PLC读取失败。";
ICSharpCode.Core.LoggingService.Error(msg);
return;
}
if (result1 == 0)
{
msg = base.Language(148); //"终止密炼失败PLC写入失败。";
ICSharpCode.Core.LoggingService.Error(msg);
return;
}
int result2 = this.DownLoadAbortWeight();
if (result1 == -1)
{
msg = base.Language(149); //"终止称量失败PLC读取失败。";
ICSharpCode.Core.LoggingService.Error(msg);
return;
}
if (result1 == 0)
{
msg = base.Language(150); //"终止称量失败PLC写入失败。";
ICSharpCode.Core.LoggingService.Error(msg);
return;
}
//如果有胶料称客户端
if (base.FarControlType == 1)
{
this.DownLoadFlagStopPlan(1);
}
PlanCommon.SendPlanId(base.NetType, currentPlanID); //增加计划非正常终止时刻计算
if (base.NetType == NetTypes.Net)
{
PlanCommon.FlushShiftConfig(Basic.DataSourceFactory.MCDbType.Server, Global.PublicVar.Instance.FirstLotBarCode, Global.PublicVar.Instance.FirstLotSerialId, Global.PublicVar.Instance.LastLotNum); //增加计划非正常终止时刻计算
if (base.FarControlType == 1)
{
string netMsg = "{0}:1/";
netMsg = String.Format(netMsg, Global.ProtocalHeader.ReceivePlanExecInfo);
Mesnac.Communication.TcpService.Instance.NetSendMsg(netMsg);
}
}
PlanCommon.StopChanYongPlan();
msg = base.Language(151); //"当前计划已经终止,需要运行请重新调整计划!";
ICSharpCode.Core.LoggingService.Info(msg);
//触发事件
if (PausePlan.OnRefreshPlan != null)
{
PausePlan.OnRefreshPlan(null, System.EventArgs.Empty);
}
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("计划暂停失败:" + ex.Message, ex);
}
}
/// <summary>
/// 判断密炼机中有无料
/// </summary>
/// <returns>如果PLC连接失败返回-1否则返回密炼机中有料标志1-有料0-无料)</returns>
public int ReadMixAutoAndRubExists()
{
int iExistsMaterial = PlcData.Instance.HasMaterial.LastValue.ToInt();
iExistsMaterial = iExistsMaterial & 0x0001; //取最低位
return iExistsMaterial;
}
/// <summary>
/// 终止密炼
/// </summary>
/// <returns>PLC读取失败返回-1PLC写入失败返回0,成功返回1</returns>
public int DownLoadAbortMixing()
{
if (StopMixing.ExecStopMixing())
{
return 1;
}
else
{
return 0;
}
}
/// <summary>
/// 终止称量
/// </summary>
/// <returns>PLC读取失败返回-1PLC写入失败返回0,成功返回1</returns>
public int DownLoadAbortWeight()
{
if (StopWeight.ExecStopWeight())
{
return 1;
}
else
{
return 0;
}
}
/// <summary>
/// 更新停止计划标志
/// </summary>
/// <param name="flag">标志值</param>
/// <returns>成功返回true否则返回false</returns>
public bool DownLoadFlagStopPlan(int flag)
{
return (PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.StopPlan, new object[] { flag }));
}
}
}