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.

232 lines
10 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.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<xl_recipe> allList = Technical.XlRecipe.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 (xl_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
}
}