|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Reflection;
|
|
|
|
|
using System.Xml.Serialization;
|
|
|
|
|
using ICSharpCode.Core;
|
|
|
|
|
using Mesnac.Basic;
|
|
|
|
|
using Mesnac.Codd.Session;
|
|
|
|
|
using Mesnac.Action.ChemicalWeighing.Entity;
|
|
|
|
|
|
|
|
|
|
namespace Mesnac.Action.ChemicalWeighing.ChemicalWeighingPlc
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 配方下传PLC辅助类
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class PlcRecipeHelper
|
|
|
|
|
{
|
|
|
|
|
#region 读取HMI配方查询请求,并将配方列表写入到PLC
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 读取HMI配方查询请求,并将配方列表写入到PLC
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static void DownloadRecipeNameListToPLC()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
bool flag = false;
|
|
|
|
|
List<Int16> writeDataList = new List<Int16>();
|
|
|
|
|
|
|
|
|
|
#region 读取并处理配方查询请求,并写入。
|
|
|
|
|
|
|
|
|
|
if (BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Name_ShakeHand.NowValue.ToInt() == 1 && (BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Name_FeedBack.NowValue.ToInt() <= 0 || BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Name_FeedBack.NowValue.ToInt() == 65535))
|
|
|
|
|
{
|
|
|
|
|
#region 从PLC中获取筛选条件:机台号和配方名称
|
|
|
|
|
|
|
|
|
|
int[] NamedData;
|
|
|
|
|
BasePlcHelper.Instance.PlcRead(BasePlcHelper.Instance.ChemicalWeighing_Plan_Code, out NamedData);
|
|
|
|
|
string recipeName = Mesnac.Basic.DataProcessor.ToString1(NamedData);
|
|
|
|
|
|
|
|
|
|
List<string> recipeNameList = new List<string>();
|
|
|
|
|
|
|
|
|
|
if (recipeName != null && recipeName != "")
|
|
|
|
|
{
|
|
|
|
|
#region 从数据库中查询配方名称List
|
|
|
|
|
|
|
|
|
|
List<Pmt_recipe> allList = Technical.TechnicalHelper.GetPmt_recipeList();
|
|
|
|
|
if (allList == null || allList.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcRecipeHelper_Mix_msg2")); //HMI请求配方列表:配方数据表为空!
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Error(msg);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
foreach (Pmt_recipe pmtRecipe in allList)
|
|
|
|
|
{
|
|
|
|
|
if (pmtRecipe.Recipe_Name.Contains(recipeName))
|
|
|
|
|
{
|
|
|
|
|
recipeNameList.Add(pmtRecipe.Recipe_Name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 数据整理
|
|
|
|
|
if (recipeNameList != null && recipeNameList.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
#region 待写入PLC项整理
|
|
|
|
|
|
|
|
|
|
List<PlcWriter> writerList = PlcSchemaHelper.Instance.GetPlcWriter("RecipeNameDataList"); //配方名称数据列表项
|
|
|
|
|
if (writerList == null || writerList.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcRecipeHelper_Mix_msg4")); //HMI请求配方列表:获取PLC配方名称列表项时出错!
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Error(msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 数据组成及下传业务处理
|
|
|
|
|
|
|
|
|
|
foreach (PlcWriter writer in writerList)
|
|
|
|
|
{
|
|
|
|
|
writeDataList.Clear();
|
|
|
|
|
|
|
|
|
|
#region 验证处理
|
|
|
|
|
|
|
|
|
|
if (writer.EquipRunName != "RecipeNameList_Info")
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 获取PLC品牌名称,处理西门子与其他PLC差异
|
|
|
|
|
|
|
|
|
|
string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName);
|
|
|
|
|
writer.EquipBrand = equipBrand;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 整理数据
|
|
|
|
|
|
|
|
|
|
if (writer.EquipRunName == "RecipeNameList_Info")
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < writer.ThisCount; i++)
|
|
|
|
|
{
|
|
|
|
|
if (recipeNameList != null && i < recipeNameList.Count)
|
|
|
|
|
{
|
|
|
|
|
foreach (PlcWriteItem item in writer.SchemaList)
|
|
|
|
|
{
|
|
|
|
|
item.ClearData();
|
|
|
|
|
item.EquipBrand = equipBrand; //设置PLC设备品牌
|
|
|
|
|
|
|
|
|
|
if (item.EquipRunName == "DownLoad_PlanCode")
|
|
|
|
|
{
|
|
|
|
|
if (recipeNameList[i] != null)
|
|
|
|
|
{
|
|
|
|
|
item.SetValue = recipeNameList[i];
|
|
|
|
|
writeDataList.AddRange(item.WriteData());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
if (writeDataList.Count < 400)
|
|
|
|
|
{
|
|
|
|
|
int fillNum = 400 - writeDataList.Count;
|
|
|
|
|
for (int i = 0; i < fillNum; i++)
|
|
|
|
|
{
|
|
|
|
|
writeDataList.AddRange(new short[]{0});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 下传数据
|
|
|
|
|
|
|
|
|
|
object[] buff = new object[writeDataList.Count];
|
|
|
|
|
Array.Copy(writeDataList.ToArray(), buff, buff.Length);
|
|
|
|
|
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Debug(String.Format("[{0}]开始下传计划信息...", writer.EquipRunName));
|
|
|
|
|
if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff))
|
|
|
|
|
{
|
|
|
|
|
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcRecipeHelper_Mix_msg5")); //HMI请求配方列表:配方名称列表数据下传失败!
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Error(msg);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
flag = true;
|
|
|
|
|
}
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Debug(String.Format("[{0}]计划信息下传完毕...", writer.EquipRunName));
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
#region 下传异常反馈信号
|
|
|
|
|
|
|
|
|
|
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Name_FeedBack, new object[] { 3 });
|
|
|
|
|
if (!result)
|
|
|
|
|
{
|
|
|
|
|
string msg1 = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg30")); //小料-计划信息下传PLC:向PLC下传计划状态请求信号失败!
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Error(msg1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcRecipeHelper_Mix_msg3")); //HMI请求配方列表:没有相关的配方数据!
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Error(msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcRecipeHelper_Mix_msg1")); //HMI请求配方列表时关键字为空!
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Error(msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 请求交互
|
|
|
|
|
|
|
|
|
|
if (flag)
|
|
|
|
|
{
|
|
|
|
|
#region 下传请求信号
|
|
|
|
|
|
|
|
|
|
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Name_FeedBack, new object[] { 1 });
|
|
|
|
|
if (!result)
|
|
|
|
|
{
|
|
|
|
|
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg30")); //小料-计划信息下传PLC:向PLC下传计划状态请求信号失败!
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Error(msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
ICSharpCode.Core.LoggingService<PlcPlanHelper>.Error("把PLC的计划状态更新至数据库异常:" + ex.Message, ex);
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Global.PublicVar.Instance.LocalPlanIsRefresh = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|