|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Net.NetworkInformation;
|
|
|
using System.Text;
|
|
|
using System.Linq;
|
|
|
using System.Data;
|
|
|
using System.Threading;
|
|
|
using Mesnac.Action.Base;
|
|
|
using Mesnac.Controls.Base;
|
|
|
using System.Windows.Forms;
|
|
|
using Mesnac.Codd.Session;
|
|
|
using System.IO;
|
|
|
using Mesnac.Action.Feeding.BasicInfo;
|
|
|
using Mesnac.Action.Feeding.FeedingPlc;
|
|
|
using Mesnac.Basic;
|
|
|
|
|
|
namespace Mesnac.Action.Feeding.FinishBatch
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 自动执行下一个计划
|
|
|
/// </summary>
|
|
|
public class AutuExecuteNextPlan
|
|
|
{
|
|
|
private bool hasWeightType(List<RecipeData.RecipeWeightInfo> weightList, RecipeData.WeightType weightType)
|
|
|
{
|
|
|
foreach (RecipeData.RecipeWeightInfo w in weightList)
|
|
|
{
|
|
|
if (w.WeightType == (int)weightType)
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 自动下传下一个计划的称量信息
|
|
|
/// </summary>
|
|
|
public void Run()
|
|
|
{
|
|
|
//判断是否连续执行
|
|
|
if (Mesnac.Basic.RunSchema.Instance.GetConfigValue("PlanExecuteType", "0").Trim() == "0")
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
RecipeData recipe = new RecipeData();
|
|
|
//当前计划设定数量
|
|
|
int allche = PlcData.Instance.RecipeSetNumber.LastValue.ToInt();
|
|
|
//当前计划称量信息
|
|
|
List<RecipeData.RecipeWeightInfo> weightList = recipe.GetCurrentRecipeWeightInfo();
|
|
|
if (PlcData.Instance.MixingFinishedCount.NowValue.ToInt() >= allche)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
if (PlcData.Instance.PloyFinishedCount.NowValue.ToInt() < allche
|
|
|
&& hasWeightType(weightList, RecipeData.WeightType.胶料))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
if (PlcData.Instance.CarbonFinishedCount.NowValue.ToInt() < allche
|
|
|
&& hasWeightType(weightList, RecipeData.WeightType.炭黑))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
if (PlcData.Instance.OilFinishedCount.NowValue.ToInt() < allche
|
|
|
&& hasWeightType(weightList, RecipeData.WeightType.油))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
string planid = recipe.GetNextPlanID();
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(planid))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (new BaseAction().NetType == BaseAction.NetTypes.Net)
|
|
|
{
|
|
|
new NetRecipe().GetRecipeByPlanID(planid);
|
|
|
}
|
|
|
|
|
|
string recipeid = recipe.GetRecipeID(planid);
|
|
|
|
|
|
#region 下传称量信息
|
|
|
try
|
|
|
{
|
|
|
//1、获取配方称量信息
|
|
|
DataTable dt = recipe.GetRecipeWeigthData(recipeid);
|
|
|
dt.TableName = planid;
|
|
|
RecipeToDatabase recipeToDatabase = new RecipeToDatabase();
|
|
|
//2、清空PLCData表数据,防止多下传信息
|
|
|
//recipeToDatabase.TruncatePlcData(); //现在不用PLCData表了
|
|
|
//2、
|
|
|
List<string> errorList = null;
|
|
|
RecipeData recipeData = new RecipeData();
|
|
|
List<RecipeData.RecipeWeightInfo> nextWeightList = recipeData.FillRecipeWeightInfo(dt);
|
|
|
if (!recipeToDatabase.ValidateJarSerial(nextWeightList, out errorList))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
//3、把配方称量信息写入PLCData表
|
|
|
if (recipeToDatabase.DownloadRecipeWeightInfo(dt, true) == 1)
|
|
|
{
|
|
|
//4、把称量设定数写入PLCData表
|
|
|
//if (!PlcData.Instance.DataWrite(PlcData.Instance.WeightSetNumber, new object[] { new BasicInfo.RecipeData().GetPlanLotCount(planid) }))
|
|
|
//{
|
|
|
// ICSharpCode.Core.LoggingService.Warn("下传称量信息:把称量设定数写入PLCData表失败!");
|
|
|
// return;
|
|
|
//}
|
|
|
//4、改为把称量设定数直接写入PLC设备
|
|
|
if (!PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.WeightSetNumber, new object[] { new BasicInfo.RecipeData().GetPlanLotCount(planid) }))
|
|
|
{
|
|
|
ICSharpCode.Core.LoggingService.Warn("下传称量信息:把称量信息下传至PLC失败!");
|
|
|
return;
|
|
|
}
|
|
|
//5、把PLCData表中的数据写入PLC,现不存PLCData表,直接写入PLC设备
|
|
|
//if (!new BasicInfo.DatabaseToPlc().Run())
|
|
|
//{
|
|
|
// ICSharpCode.Core.LoggingService.Warn("下传称量信息:把称量信息下传至PLC失败!");
|
|
|
// return;
|
|
|
//}
|
|
|
//6、把开始称量信息下传至PLC
|
|
|
if (!new StartWeightToPlc().DownLoadStartWeight())
|
|
|
{
|
|
|
ICSharpCode.Core.LoggingService.Warn("下传称量信息:把开始称量信号下传至PLC失败!");
|
|
|
return;
|
|
|
}
|
|
|
//7、缓存称量信息
|
|
|
this.CacheRecipeWeigh(recipe);
|
|
|
}
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
ICSharpCode.Core.LoggingService.Warn("执行下一个计划提前下传称量信息失败:" + ex.Message);
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 缓存配方称量信息 并保存提前称量缓存信息至SysKeyValue表
|
|
|
/// </summary>
|
|
|
/// <param name="recipeData">配方数据对象</param>
|
|
|
public void CacheRecipeWeigh(RecipeData recipeData)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
RecipeWeighCache.Instance.CacheFlag = true;
|
|
|
RecipeWeighCache.Instance.CacheAllWeightInfo(recipeData.GetCurrentRecipeWeightInfo());
|
|
|
|
|
|
FeedingAction action = new FeedingAction();
|
|
|
string xmlRecipeWeightCache = SerializeHandler.SerializeObject<List<RecipeData.RecipeWeightInfo>>(RecipeWeighCache.Instance.AllWeightInfo);
|
|
|
action.UpdateSysValue("RecipeWeightCache", xmlRecipeWeightCache);
|
|
|
action.UpdateSysValue("RecipeWeightCache_CacheFlag", RecipeWeighCache.Instance.CacheFlag.ToString());
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
ICSharpCode.Core.LoggingService.Error("保存提前称量缓存信息至SysKeyValue表失败:" + ex.Message, ex);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|