using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using ICSharpCode.Core;
using System.Data;
using Mesnac.Action.ChemicalWeighing.Entity;
using System.Threading;
using System.Configuration;
using Mesnac.Action.ChemicalWeighing.Entity.PptPlan;
using Mesnac.Action.ChemicalWeighing.Entity.station;
using Mesnac.Action.ChemicalWeighing.Product.PptPlan;
using Mesnac.Action.ChemicalWeighing.Report;
using DevExpress.XtraRichEdit.Fields.Expression;
namespace Mesnac.Action.ChemicalWeighing.ChemicalWeighingPlc
{
///
/// 计划列表下传PLC辅助类
///
public class PlcPlanHelper
{
static bool flag1=false;//扫码枪是否初始化 ——小料
static bool flag2 = false;//扫码枪是否初始化 ——投料
static bool flag3 = false;//扫码枪是否初始化 ——溶剂称量
#region 事件定义
public static object sender = null;
public static event EventHandler OnUpdatePlanStateFromPlc;
public static event EventHandler AutoDownloadPlan;
public static event EventHandler OnAutoAddPlan;
public static event EventHandler OnChangePlan;
#endregion
#region 字段定义
private static string originalMixPlcPlanTableName = String.Empty;
private static string originalMillPlcPlanTableName = String.Empty;
#endregion
#region 下传计划列表至PLC
///
/// 下传计划列表至PLC
///
/// 输出消息列表
/// 成功返回true,失败返回false
public static bool DownloadPlanData(List msgList)
{
bool result = true;
List list = null;
//if (Global.PublicVar.Instance.ChemicalWeighingPlcOnlineFlag) //|| Global.PublicVar.Instance.IsLocalTest)
if (true)
{
if (result)
{
if (list == null)
{
list = Product.PptPlan.PlanHelper.GetUnExePlanEntityList(1);
}
result = DownloadPlanDataToChe(list, msgList);
}
}
return result;
}
///
/// 下传计划列表至PLC(自动)
///
/// 输出消息列表
/// 成功返回true,失败返回false
public static bool AutoDownloadPlanData(List msgList)
{
bool result = true;
List list = null;
#region 读取应答信号
if (!(BasePlcHelper.Instance.ChemicalWeighing_PLC_LoadingStatus.NowValue.ToInt() == 1 && BasePlcHelper.Instance.ChemicalWeighing_PC_LoadingStatus.NowValue.ToInt() == 0))
{
return false;
}
#endregion
if (result)
{
if (list == null)
{
list = Product.PptPlan.PlanHelper.GetUnExePlanEntityList(1);
}
result = DownloadPlanDataToChe(list, msgList);
}
return result;
}
#region 下传计划列表至小料PLC
///
/// 下传计划列表至小料PLC
///
/// 计划列表
/// 输出的消息列表
/// 成功返回true,失败返回flase
public static bool DownloadPlanDataToChe(List list, List msgList)
{
try
{
#region 定义变量
//int cnt = 0; //循环计数
string msg = String.Empty;
List writeDataList = new List();
PropertyInfo[] ps = typeof(RT_Plan).GetProperties();
PropertyInfo[] psMaterial = typeof(Pmt_weigh).GetProperties();
List listMaterial = new List(); //计划对应的配方对应的物料列表
Pmt_recipe currentPmtRecipe = new Pmt_recipe(); //当前配方
RT_Plan nextRTPlan = null; //下一条计划
Pmt_recipe nextPmtRecipe = null; //当前配方
bool planDownFlag = false;
if (msgList == null)
{
msgList = new List();
}
#endregion
#region 验证处理-配置
if (list == null || list.Count == 0)
{
msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg40")); //小料-计划信息下传PLC失败:无可下传计划!
msgList.Add(msg);
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
List writerList = PlcSchemaHelper.Instance.GetPlcWriter("PlanRecipeData"); //配方头数据
if (writerList == null || writerList.Count == 0)
{
msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg10")); //小料-计划信息下传PLC失败:在PlcSchema.xml中没有RT_Plan配置节!
msgList.Add(msg);
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
List writerList1 = PlcSchemaHelper.Instance.GetMaterialPlcWriter("PlanMaterialData"); //物料数据
if (writerList == null || writerList.Count == 0)
{
msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg10")); //小料-计划信息下传PLC失败:在PlcSchema.xml中没有RT_Plan配置节!
msgList.Add(msg);
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
writerList = writerList.Concat(writerList1).ToList();
#endregion
#region 验证处理-数据
if (list == null || list.Count == 0)
{
msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg15")); //小料-计划信息下传PLC失败:当班计划列表为空!
msgList.Add(msg);
return false;
}
else
{
#region 根据配方recipeID获取物料信息
string recipeID = list[0].Recipe_ID;
listMaterial = Product.PptPlan.PlanHelper.GetPmt_weighList(recipeID);
if(listMaterial != null)
{
Global.PublicVar.Instance.currentListPmt_weigh = listMaterial;
}
#endregion
#region 根据配方recipeID获取配方信息
currentPmtRecipe = Technical.PmtRecipe.RecipeHelper.GetRecipeEntityByGUID(recipeID);
#endregion
#region 获取下一配方信息
nextRTPlan = Product.PptPlan.PlanHelper.GetNextPlan((int)list[0].Plan_Serial);
if(nextRTPlan != null){
nextPmtRecipe = Technical.PmtRecipe.RecipeHelper.GetRecipeEntityByGUID(nextRTPlan.Recipe_ID);
}
#endregion
}
#endregion
#region 业务处理
foreach (PlcWriter writer in writerList)
{
writeDataList.Clear();
#region 验证处理
if (writer.EquipRunName != "Recipe_Data_Download_BaseInf" && writer.EquipRunName != "Hopper_Recipe_Detail_Inf")
{
continue;
}
#endregion
#region 获取PLC品牌名称,处理西门子与其他PLC差异
string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName);
writer.EquipBrand = equipBrand;
#endregion
#region 整理数据
if (writer.EquipRunName == "Recipe_Data_Download_BaseInf")
{
Entity.RT_Plan entity = null;
for (int i = 0; i < writer.ThisCount; i++)
{
if (list != null && i < list.Count)
{
entity = list[i];
DateTime timeNow = DateTime.Now;
foreach (PlcWriteItem item in writer.SchemaList)
{
item.ClearData();
item.EquipBrand = equipBrand; //设置PLC设备品牌
foreach (PropertyInfo pi in ps)
{
if (item.DataFieldName == pi.Name)
{
item.SetValue = pi.GetValue(entity, null);
break;
}
else if (item.EquipRunName == "DownLoad_H_Year")
{
item.SetValue = timeNow.Year;
break;
}
else if (item.EquipRunName == "DownLoad_H_Month")
{
item.SetValue = timeNow.Month;
break;
}
else if (item.EquipRunName == "DownLoad_H_Date")
{
item.SetValue = timeNow.Day;
break;
}
else if (item.EquipRunName == "DownLoad_H_Hour")
{
item.SetValue = timeNow.Hour;
break;
}
else if (item.EquipRunName == "DownLoad_H_Minute")
{
item.SetValue = timeNow.Minute;
break;
}
else if (item.EquipRunName == "DownLoad_H_Second")
{
item.SetValue = timeNow.Second;
break;
}
else if (item.EquipRunName == "DownLoad_MachineCode")
{
item.SetValue = "01";
break;
}
else if (item.EquipRunName == "DownLoad_TotalSetWeight")
{
if (currentPmtRecipe != null && currentPmtRecipe.Total_Weight != null)
{
item.SetValue = Convert.ToInt32(currentPmtRecipe.Total_Weight * 1000);
}
break;
}
else if (item.EquipRunName == "DownLoad_TotalErrorWeight")
{
if (currentPmtRecipe != null && currentPmtRecipe.Total_Error != null)
{
item.SetValue = Convert.ToInt32(currentPmtRecipe.Total_Error * 1000);
}
break;
}
else if (item.EquipRunName == "DownLoad_1LOT")
{
if (currentPmtRecipe != null && currentPmtRecipe.GroupBags != null)
{
item.SetValue = (Int32)currentPmtRecipe.GroupBags;
}
break;
}
else if (item.EquipRunName == "DownLoad_NextPlanCode")
{
if (nextPmtRecipe != null && nextPmtRecipe.Recipe_Name != null)
{
item.SetValue = nextPmtRecipe.Recipe_Name;
}
break;
}
else if (item.EquipRunName == "DownLoad_NextTotalSetWeight")
{
if (nextPmtRecipe != null && nextPmtRecipe.Total_Weight != null)
{
item.SetValue = Convert.ToInt32(nextPmtRecipe.Total_Weight * 1000);
}
break;
}
else if (item.EquipRunName == "DownLoad_NextPlanNum")
{
if (nextRTPlan != null && nextRTPlan.Plan_Num != null)
{
item.SetValue = Convert.ToInt32(nextRTPlan.Plan_Num);
}
break;
}
else if (item.EquipRunName == "DownLoad_SeparateNum")
{
if (entity != null && entity.Plan_Num != null)
{
item.SetValue = entity.Plan_Num; //后期会有配置项进行设置
}
break;
}
}
writeDataList.AddRange(item.WriteData());
}
}
else
{
foreach (PlcWriteItem item in writer.SchemaList)
{
item.ClearData();
item.EquipBrand = equipBrand; //设置PLC设备品牌
writeDataList.AddRange(item.WriteData());
}
}
}
}
if (writer.EquipRunName == "Hopper_Recipe_Detail_Inf")
{
Pmt_weigh entity = null;
for (int i = 0; i < writer.ThisCount; i++)
{
if (listMaterial != null && i < listMaterial.Count)
{
entity = listMaterial[i];
DateTime timeNow = DateTime.Now;
foreach (PlcWriteItem item in writer.SchemaList)
{
item.ClearData();
item.EquipBrand = equipBrand; //设置PLC设备品牌
foreach (PropertyInfo pi in psMaterial)
{
if (item.DataFieldName == pi.Name)
{
item.SetValue = pi.GetValue(entity, null);
if (item.DataFieldName == "Set_Weight" || item.DataFieldName == "Set_Error")
{
object temd = item.SetValue;
item.SetValue = Convert.ToDouble(temd) * 1000;
}
else if (item.DataFieldName == "Weight_Id")
{
object temd = item.SetValue;
item.SetValue = Convert.ToInt32(temd) - 1;
}
break;
}
else if (item.EquipRunName == "DownLoad_BinNo")
{
Pmt_Bin pmtBin = Product.PptPlan.PlanHelper.GetPmt_Bin(entity.Material_ID);
if (pmtBin != null && pmtBin.Bin_Serial != null)
{
item.SetValue = pmtBin.Bin_Serial;
}
else
{
item.SetValue = 100; //对应手动秤功能
}
break;
}
}
writeDataList.AddRange(item.WriteData());
}
}
else
{
foreach (PlcWriteItem item in writer.SchemaList)
{
item.ClearData();
item.EquipBrand = equipBrand; //设置PLC设备品牌
writeDataList.AddRange(item.WriteData());
}
}
}
}
#endregion
#region 下传数据
object[] buff = new object[writeDataList.Count];
Array.Copy(writeDataList.ToArray(), buff, buff.Length);
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]开始下传计划信息...", writer.EquipRunName));
if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff))
{
msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg50")); //小料-计划信息下传PLC[{0}]失败...
msg = String.Format(msg, writer.EquipRunName);
msgList.Add(msg);
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
else
{
planDownFlag = true;
}
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]计划信息下传完毕...", writer.EquipRunName));
#endregion
}
#endregion
#region 交互逻辑
if (planDownFlag)
{
#region 下传请求信号
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_LoadingStatus, new object[] { 1 });
if (!result)
{
msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg20")); //小料-计划信息下传PLC:向PLC下传请求信号失败!
msgList.Add(msg);
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
#endregion
#region 数据下传完成后,将该条计划的状态更改为已下传
Product.PptPlan.PlanHelper.UpdatePlanState(list[0].Plan_Id, 4);
planDownFlag = false;
#endregion
if (AutoDownloadPlan != null)
{
AutoDownloadPlan(sender, System.EventArgs.Empty);
}
}
#endregion
return true;
}
catch (Exception ex)
{
msgList.Add(ex.Message);
ICSharpCode.Core.LoggingService.Error(ex.Message, ex);
return false;
}
finally
{
#region 交互逻辑
if (Global.PublicVar.Instance.PlcDownloadMode == 1)
{
//#region 清除请求信号
//bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.Mix_SysAction_ExchPlanInfoRep_Req, new object[] { 0 });
//if (!result)
//{
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.Mix_SysAction_ExchPlanInfoRep_Req, new object[] { 0 });
//}
//#endregion
}
#endregion
}
}
#endregion
#endregion
#region 获取PLC计划列表中某条计划中允许修改的最小车数
///
/// 获取上辅机PLC计划列表中某条计划中允许修改的最小车数
///
/// 要获取的允许最小车数的计划号
/// 返回对应计划号的最小车数
//public static int GetMixMinPlanNumFromPlc(string planID)
//{
// DataTable dt = BasePlcHelper.Instance.Mix_PlanState_PlcPlanList.LastValue.ToObject() as DataTable;
// if (dt != null && dt.Rows.Count > 0)
// {
// foreach(DataRow dr in dt.Rows)
// {
// if (Mesnac.Basic.DataProcessor.RowValue(dr, "PlanID", String.Empty) == planID)
// {
// return Mesnac.Basic.DataProcessor.RowValue(dr, "NumModifyMin", 0);
// }
// }
// return 0;
// }
// else
// {
// return 0;
// }
//}
#endregion
#region 获取PLC计划列表中某条计划的计划数
///
/// 获取PLC计划列表中某条计划的计划数
///
/// 计划编号
/// 默认值
/// 返回对应计划号的计划数
//public static int GetMixPlanNumFromPlc(string planID, int defaultValue)
//{
// DataTable dt = BasePlcHelper.Instance.Mix_PlanState_PlcPlanList.LastValue.ToObject() as DataTable;
// if (dt != null && dt.Rows.Count > 0)
// {
// foreach (DataRow dr in dt.Rows)
// {
// if (Mesnac.Basic.DataProcessor.RowValue(dr, "PlanID", String.Empty) == planID)
// {
// return Mesnac.Basic.DataProcessor.RowValue(dr, "PlanNum", defaultValue);
// }
// }
// return defaultValue;
// }
// else
// {
// return defaultValue;
// }
//}
#endregion
#region 把PLC的计划状态更新至数据库
///
/// 把PLC的计划状态更新至数据库
///
public static void UpdatePlanStateFromPlc()
{
try
{
bool flag = false;
#region 小料同步计划状态和完成数
if (BasePlcHelper.Instance.ChemicalWeighing_PLC_Plan_Status_ShakeHand.NowValue.ToInt() == 1 && BasePlcHelper.Instance.ChemicalWeighing_PLC_Plan_Status_FeedBack.NowValue.ToInt() == 0)
{
int planSerial = BasePlcHelper.Instance.ChemicalWeighing_Plan_Serial.NowValue.ToInt(); //计划序号
int planState = BasePlcHelper.Instance.ChemicalWeighing_Plan_Status.NowValue.ToInt(); //计划状态
int planNum = BasePlcHelper.Instance.ChemicalWeighing_Plan_Number.NowValue.ToInt(); //计划数量
int planRestNum = BasePlcHelper.Instance.ChemicalWeighing_Remain_Number.NowValue.ToInt(); //剩余数量
int planComNum = planNum - planRestNum; //完成数量
if (planState == (int)Entity.PlanState.Producting)
{
Product.PptPlan.PlanHelper.UpdatePlanInfo(planSerial, planState, planNum, planComNum);
}
else if (planState == (int)Entity.PlanState.Completed)
{
Product.PptPlan.PlanHelper.UpdatePlanInfo(planSerial, planState, planNum, planComNum,DateTime.Now.ToString());
}
else
{
return;
}
flag = true;
//PlanListReDown();20211205三元现场注释掉
#region 此处需要将RT_Plan中计划写入到LR_Plan中,同时向LR_Recipe中存储信息
RT_Plan rtPlan = Product.PptPlan.PlanHelper.GetPlanDataEntity(planSerial);
if (rtPlan != null)
{
LR_plan lrPlan = new LR_plan();
Product.PptPlan.PlanHelper.EntityToEntity(rtPlan, lrPlan);
if (Product.PptPlan.PlanHelper.LRPlanExists(lrPlan.Plan_Id))
{
//更新
if (planState == (int)Entity.PlanState.Producting)
{
Product.PptPlan.PlanHelper.LRUpdatePlanInfo(lrPlan.Plan_Id, planState, planNum, planComNum);
}
else if (planState == (int)Entity.PlanState.Completed)
{
Product.PptPlan.PlanHelper.LRUpdatePlanInfo(lrPlan.Plan_Id, planState, planNum, planComNum, DateTime.Now.ToString());
#region 执行删除计划操作
Product.PptPlan.PlanHelper.DeletePlan(rtPlan.Plan_Id);
#endregion
}
}
else
{
//添加(LR_plan)
Product.PptPlan.PlanHelper.LRAddPlan(lrPlan);
//添加(LR_recipe)
LR_recipe lrRecipe = new LR_recipe();
lrRecipe.Plan_id = rtPlan.Plan_Id;
lrRecipe.Equip_Code = rtPlan.Equip_Code;
string recipeID = rtPlan.Recipe_ID;
List listPmtWeigh = Product.PptPlan.PlanHelper.GetPmt_weighList(recipeID);
foreach (Pmt_weigh tempPW in listPmtWeigh)
{
lrRecipe.Weight_ID = tempPW.Weight_Id - 1;
lrRecipe.Set_Weight = (float)tempPW.Set_Weight;
lrRecipe.Set_Error = (float)tempPW.Set_Error;
lrRecipe.CPK_Error = (decimal)0;
Pmt_material pmtMaterial = Product.PptPlan.PlanHelper.GetPmt_material(tempPW.Material_ID);
if (pmtMaterial != null)
{
lrRecipe.Material_Code = pmtMaterial.Material_code;
lrRecipe.Material_Name = pmtMaterial.Material_name;
lrRecipe.Batch_number = pmtMaterial.Batch_number;
lrRecipe.remark = null;
Product.PptPlan.PlanHelper.AddLR_recipe(lrRecipe);
}
}
}
}
#endregion
}
#endregion
#region 触发事件
if (flag)
{
#region 下传请求信号
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PLC_Plan_Status_FeedBack, new object[] { 1 });
if (!result)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg30")); //小料-计划信息下传PLC:向PLC下传计划状态请求信号失败!
ICSharpCode.Core.LoggingService.Error(msg);
}
#endregion
#region 判断等待计划数和正在运行的计划数。如果两个都是0,清空RT_Plan表。
int waitPlanCount = Product.PptPlan.PlanHelper.GetUnExePlanNum();
int runningPlanCount = Product.PptPlan.PlanHelper.GetRunningPlanNum();
int downPlanCount = Product.PptPlan.PlanHelper.GetDownPlanNum();
if (waitPlanCount == 0 && runningPlanCount == 0 && downPlanCount == 0)
{
Product.PptPlan.PlanHelper.ClearRT_Plan();
}
#endregion
if (OnUpdatePlanStateFromPlc != null)
{
OnUpdatePlanStateFromPlc(sender, System.EventArgs.Empty);
}
}
#endregion
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("把PLC的计划状态更新至数据库异常:" + ex.Message, ex);
}
finally
{
Global.PublicVar.Instance.LocalPlanIsRefresh = false;
}
}
#endregion
#region 处理HMI的修改计划请求
///
/// 处理HMI的修改计划请求
///
public static void ChangePlan()
{
try
{
bool flag = false;
#region 读取并处理HMI的配方添加计划请求(添加计划)
if (BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_ShakeHand.NowValue.ToInt() == 1 && (BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_FeedBack.NowValue.ToInt() <= 0 || BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_FeedBack.NowValue.ToInt() == 65535))
{
#region 从PLC中获取要添加的计划信息
int planCommand = BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_Command.NowValue.ToInt(); //命令
String sysMachine = BasePlcHelper.Instance.ChemicalWeighing_Sys_Machine2.NowValue.ToString(); //机台号
int[] planIdData;
BasePlcHelper.Instance.PlcRead(BasePlcHelper.Instance.ChemicalWeighing_HMIChange_PlanId, out planIdData);
string planId = Mesnac.Basic.DataProcessor.ToString1(planIdData); //计划
int ChangePlanNum = BasePlcHelper.Instance.ChemicalWeighing_HMIChange_PlanNum.NowValue.ToInt(); //设定数量
if (String.IsNullOrEmpty(sysMachine))
{
sysMachine = "01";
}
#endregion
#region 验证(PLC中读取过来的planid对应的数据库中的计划必须是存在的)
RT_Plan currentRT_Plan = Product.PptPlan.PlanHelper.GetPlanDataEntity(planId);
if (currentRT_Plan == null)
{
ChangePlanErrorReturn();
return;
}
#endregion
#region 判断命令(0默认 1刷新 2上移 3下移 4修改车数 5删除计划)并执行操作
if (planCommand == 1)
{
//刷新事件,将最新的计划列表重写入PLC。
}
else if (planCommand == 2)
{
#region 获取交换位置对象并判断是否可以上移(条件:在该条计划前,是否有一条未运行中的计划)并执行上移
int swagPlanSerial = (int)currentRT_Plan.Plan_Serial - 1;
RT_Plan swagRtPLan = Product.PptPlan.PlanHelper.GetPlanBySerialUp(swagPlanSerial);
if (swagRtPLan == null)
{
ChangePlanErrorReturn();
return;
}
else
{
currentRT_Plan.Plan_Serial = currentRT_Plan.Plan_Serial - 1;
swagRtPLan.Plan_Serial = swagRtPLan.Plan_Serial + 1;
Product.PptPlan.PlanHelper.UpdatePlanSerial(currentRT_Plan);
Product.PptPlan.PlanHelper.UpdatePlanSerial(swagRtPLan);
#region 重新下传计划列表
flag = PlanListReDown();
#endregion
}
#endregion
}
else if (planCommand == 3)
{
#region 获取交换位置对象并判断是否可以下移(条件:在该条计划后,是否有一条未运行中的计划)并执行下移
int swagPlanSerial = (int)currentRT_Plan.Plan_Serial + 1;
RT_Plan swagRtPLan = Product.PptPlan.PlanHelper.GetPlanBySerialDown(swagPlanSerial);
if (swagRtPLan == null)
{
ChangePlanErrorReturn();
return;
}
else
{
currentRT_Plan.Plan_Serial = currentRT_Plan.Plan_Serial + 1;
swagRtPLan.Plan_Serial = swagRtPLan.Plan_Serial - 1;
Product.PptPlan.PlanHelper.UpdatePlanSerial(currentRT_Plan);
Product.PptPlan.PlanHelper.UpdatePlanSerial(swagRtPLan);
#region 重新下传计划列表
flag = PlanListReDown();
#endregion
}
#endregion
}
else if (planCommand == 4)
{
#region 执行修改计划操作
Product.PptPlan.PlanHelper.UpdatePlanNum(planId, ChangePlanNum);
#endregion
#region 重新下传计划列表
flag = PlanListReDown();
#endregion
}
else if (planCommand == 5)
{
#region 获取计划号对应的序号
int delSerial = (int)currentRT_Plan.Plan_Serial;
#endregion
#region 执行删除计划操作
Product.PptPlan.PlanHelper.DeletePlan(planId);
#endregion
#region 整理修改后续计划的序号(-1)
List mRtPlan = Product.PptPlan.PlanHelper.GetPlanListAfterPlanSerial(delSerial);
if (mRtPlan != null && mRtPlan.Count > 0)
{
foreach (RT_Plan tempRT in mRtPlan)
{
tempRT.Plan_Serial = tempRT.Plan_Serial - 1;
Product.PptPlan.PlanHelper.UpdatePlanSerial(tempRT);
}
}
#endregion
#region 将等待计划数写入PLC
WaitPlanNumToPLC();
#endregion
#region 重新下传计划列表
flag = PlanListReDown();
#endregion
}
else
{
//默认
}
#endregion
#region 触发事件
if (OnChangePlan != null)
{
OnChangePlan(sender, System.EventArgs.Empty);
}
#endregion
}
#endregion
#region HMI修改计划请求交互
if (flag)
{
#region 下传请求信号
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_FeedBack, new object[] { 1 });
if (!result)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ChangePlan_logContent_1")); //HMI修改计划请求成功后:向PLC下传反馈信号失败!
ICSharpCode.Core.LoggingService.Error(msg);
}
#endregion
}
#endregion
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("从HMI修改计划异常:" + ex.Message, ex);
}
}
#endregion
#region 修改计划出现异常反馈到PLC
public static void ChangePlanErrorReturn()
{
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_FeedBack, new object[] { 3 });
if (!result)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ChangePlan_logContent_2")); //HMI修改计划请求成功后:向PLC下传异常反馈信号失败!
ICSharpCode.Core.LoggingService.Error(msg);
}
}
#endregion
#region 执行完修改计划操作后重新向PLC写入计划列表数据
public static bool PlanListReDown()
{
#region 定义变量
bool reFlag = false;
List writeDataList = new List();
PropertyInfo[] ps = typeof(RT_Plan).GetProperties();
List rtPlanList = Product.PptPlan.PlanHelper.GetPlanEntityListByNum(5);
#endregion
#region 验证处理-配置
if (rtPlanList == null || rtPlanList.Count == 0)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_AutoAddPlan_logContent_3")); //HMI添加计划请求成功后:计划列表获取失败!
ICSharpCode.Core.LoggingService.Error(msg);
}
List writerList = PlcSchemaHelper.Instance.GetPlcWriter("PlanListData"); //计划列表数据
if (writerList == null || writerList.Count == 0)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_AutoAddPlan_logContent_4")); //HMI添加计划请求成功后:计划列表写入数据结构获取失败!
ICSharpCode.Core.LoggingService.Error(msg);
}
#endregion
#region 业务处理
foreach (PlcWriter writer in writerList)
{
writeDataList.Clear();
#region 验证处理
if (writer.EquipRunName != "PlanList_Info")
{
continue;
}
#endregion
#region 获取PLC品牌名称,处理西门子与其他PLC差异
string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName);
writer.EquipBrand = equipBrand;
#endregion
#region 整理数据
if (writer.EquipRunName == "PlanList_Info")
{
Entity.RT_Plan entity = null;
for (int i = 0; i < writer.ThisCount; i++)
{
if (rtPlanList != null && i < rtPlanList.Count)
{
entity = rtPlanList[i];
DateTime timeNow = DateTime.Now;
foreach (PlcWriteItem item in writer.SchemaList)
{
item.ClearData();
item.EquipBrand = equipBrand; //设置PLC设备品牌
foreach (PropertyInfo pi in ps)
{
if (item.DataFieldName == pi.Name)
{
item.SetValue = pi.GetValue(entity, null);
break;
}
else if (item.EquipRunName == "DownLoad_MachineCode")
{
item.SetValue = "01";
break;
}
}
writeDataList.AddRange(item.WriteData());
}
}
}
}
if (writeDataList.Count < 200)
{
int fillNum = 200 - writeDataList.Count;
for (int i = 0; i < fillNum; i++)
{
writeDataList.AddRange(new short[] { 0 });
}
}
#endregion
#region 下传数据
object[] buff = new object[writeDataList.Count];
Array.Copy(writeDataList.ToArray(), buff, buff.Length);
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]开始下传计划信息...", writer.EquipRunName));
if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff))
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_AutoAddPlan_logContent_5")); //HMI添加计划请求成功后:计划列表写入PLC失败!
ICSharpCode.Core.LoggingService.Error(msg);
}
else
{
reFlag = true;
}
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]计划列表信息下传完毕...", writer.EquipRunName));
#endregion
}
#endregion
return reFlag;
}
#endregion
#region 待计划数写入PLC
public static void WaitPlanNumToPLC()
{
try
{
int waitPlanNum = Product.PptPlan.PlanHelper.GetUnExePlanNum();
#region 向PLC写入等待计划数
object[] tempob = new object[1] { 0 };
tempob[0] = waitPlanNum;
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Scheduled_Num, tempob);
if (!result)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_AutoAddPlan_logContent_8")); //向PLC写入等待计划数失败!
ICSharpCode.Core.LoggingService.Error(msg);
}
#endregion
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("把等待计划数写入PLC异常:" + ex.Message, ex);
}
}
#endregion
#region 终止计划
///
/// 终止计划方法
///
/// 要终止的计划序号
/// 终止命令
/// 要终止的计划数
/// 要终止的计划剩余数
/// 是否方法内显示消息窗口
/// 输出的消息列表
/// 成功返回true,失败返回false
public static bool ExecStop(int planSerial, int planCommand, int planNum, int unFinishedNum, bool isShowMsg, List msgList)
{
try
{
#region 1 定义变量
List writeDataList = new List();
#endregion
#region 2 验证处理-配置
List writerList = PlcSchemaHelper.Instance.GetPlcWriter("PlanModifyData");
if (writerList == null || writerList.Count == 0)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecStop_logContent_1")); //终止计划数据结构获取失败!
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
#endregion
#region 3 业务处理
foreach (PlcWriter writer in writerList)
{
writeDataList.Clear();
#region 验证处理
if (writer.EquipRunName != "Plan_To_Plc")
{
continue;
}
#endregion
#region 获取PLC品牌名称,处理西门子与其他PLC差异
string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName);
writer.EquipBrand = equipBrand;
#endregion
#region 整理数据
if (writer.EquipRunName == "Plan_To_Plc")
{
for (int i = 0; i < writer.ThisCount; i++)
{
foreach (PlcWriteItem item in writer.SchemaList)
{
item.ClearData();
item.EquipBrand = equipBrand;
if (item.EquipRunName == "DownLoad_PlanSerial")
{
item.SetValue = planSerial;
}
else if (item.EquipRunName == "DownLoad_PlanCommand")
{
item.SetValue = planCommand;
}
else if (item.EquipRunName == "DownLoad_PlanNum")
{
item.SetValue = planNum;
}
else if (item.EquipRunName == "DownLoad_RealNum")
{
item.SetValue = unFinishedNum;
}
writeDataList.AddRange(item.WriteData());
}
}
}
#endregion
#region 下传数据
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 1 });
if (!result)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecStop_logContent_3")); //向PLC下传终止计划命令失败!
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
else
{
object[] buff = new object[writeDataList.Count];
Array.Copy(writeDataList.ToArray(), buff, buff.Length);
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]开始下传终止计划信息...", writer.EquipRunName));
if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff))
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecStop_logContent_2")); //终止计划写入PLC失败!
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
else
{
bool result1 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 2 });
if (!result1)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecStop_logContent_4")); //向PLC下传终止计划命令及数据成功后,反馈失败!
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
else
{
int readCount = 0;
while (readCount < 5)
{
if (BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_FeedBack.NowValue.ToInt() == 1)
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 0 });
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_FeedBack, new object[] { 0 });
break;
}
readCount++;
Thread.Sleep(200);
}
}
}
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]计划列表信息下传完毕...", writer.EquipRunName));
}
#endregion
}
#endregion
#region 4 关闭进度提示
Sys.FrmNotify.Instance.Value = 100;
Sys.FrmNotify.Instance.Destory();
#endregion
return true;
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error(ex.Message);
msgList.Add(ex.Message);
return false;
}
finally
{
Sys.FrmNotify.Instance.Destory();
}
}
#endregion
#region 修改计划数
///
/// 修改计划数方法
///
/// 要终止的计划编号
/// 新的计划数
/// 是否方法内显示消息窗口
/// 输出的消息列表
/// 成功返回true,失败返回false
public static bool ExecModifyPlanNum(int planSerial, int planCommand, int newPlanNum, int unFinishedNum, bool isShowMsg, List msgList)
{
try
{
#region 1 定义变量
List writeDataList = new List();
#endregion
#region 2 验证处理-配置
List writerList = PlcSchemaHelper.Instance.GetPlcWriter("PlanModifyData");
if (writerList == null || writerList.Count == 0)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecModify_logContent_1")); //上位机修改计划数:数据结构获取失败!
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
#endregion
#region 3 业务处理
foreach (PlcWriter writer in writerList)
{
writeDataList.Clear();
#region 验证处理
if (writer.EquipRunName != "Plan_To_Plc")
{
continue;
}
#endregion
#region 获取PLC品牌名称,处理西门子与其他PLC差异
string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName);
writer.EquipBrand = equipBrand;
#endregion
#region 整理数据
if (writer.EquipRunName == "Plan_To_Plc")
{
for (int i = 0; i < writer.ThisCount; i++)
{
foreach (PlcWriteItem item in writer.SchemaList)
{
item.ClearData();
item.EquipBrand = equipBrand;
if (item.EquipRunName == "DownLoad_PlanSerial")
{
item.SetValue = planSerial;
}
else if (item.EquipRunName == "DownLoad_PlanCommand")
{
item.SetValue = planCommand;
}
else if (item.EquipRunName == "DownLoad_PlanNum")
{
item.SetValue = newPlanNum;
}
else if (item.EquipRunName == "DownLoad_RealNum")
{
item.SetValue = unFinishedNum;
}
writeDataList.AddRange(item.WriteData());
}
}
}
#endregion
#region 下传数据
object[] buff = new object[writeDataList.Count];
Array.Copy(writeDataList.ToArray(), buff, buff.Length);
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]开始下传终止计划信息...", writer.EquipRunName));
if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff))
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecModify_logContent_3")); //上位机修改计划数:写入PLC失败!
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
else
{
bool result1 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 2 });
if (!result1)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecModify_logContent_4")); //上位机修改计划数:向PLC下传修改计划数成功后,反馈失败!
ICSharpCode.Core.LoggingService.Error(msg);
return false;
}
else
{
int readCount = 0;
while (readCount < 5)
{
if (BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_FeedBack.NowValue.ToInt() == 1)
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 0 });
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_FeedBack, new object[] { 0 });
break;
}
readCount++;
Thread.Sleep(200);
}
}
}
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]计划列表信息下传完毕...", writer.EquipRunName));
#endregion
}
#endregion
#region 5 关闭进度提示
Sys.FrmNotify.Instance.Value = 100;
Sys.FrmNotify.Instance.Destory();
#endregion
return true;
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error(ex.Message);
msgList.Add(ex.Message);
return false;
}
finally
{
Sys.FrmNotify.Instance.Destory();
}
}
#endregion
#region 条码命令处理下传
///
/// 条码命令处理下传方法
///
/// 通过Socket取到的扫码枪条码字符串
/// 成功返回true,失败返回false
public static bool ScanCodeDown(string codeStr)
{
try
{
#region 1 条码处理:取出查找物料等相关信息的字符串。
//string useStr = codeStr.Substring(Global.PublicVar.Instance.ScanCodeStrStart, Global.PublicVar.Instance.ScanCodeStrEnd);
string useStr = codeStr;
if (useStr == null || useStr == string.Empty || useStr == "")
{
bool resultHopper_No1 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Hopper_No_103, new object[] { 0 });
bool resultScanCommand1 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_ScanCommand, new object[] { 0 });
if (!resultHopper_No1 || !resultScanCommand1)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_ScanCodeDown_Error1")); //没有获取到条码中的有效信息。
ICSharpCode.Core.LoggingService.Error(msg);
}
return false;
}
#endregion
#region 2 根据从条码中取出的物料名称获取物料代码
string meterialId = Product.PptPlan.PlanHelper.GetPmt_materialID(useStr);
if (meterialId == null || meterialId == string.Empty || meterialId == "")
{
bool resultHopper_No2 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Hopper_No_103, new object[] { 0 });
bool resultScanCommand2 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_ScanCommand, new object[] { 0 });
if (!resultHopper_No2 || !resultScanCommand2)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_ScanCodeDown_Error2")); //没有找到对应的物料代码。
ICSharpCode.Core.LoggingService.Error(msg);
}
return false;
}
#endregion
#region 3 根据物料代码获取对应的料仓号
int binSerial = Product.PptPlan.PlanHelper.GetPmt_BinSerial(meterialId);
if (binSerial == 0)
{
bool resultHopper_No3 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Hopper_No_103, new object[] { 0 });
bool resultScanCommand3 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_ScanCommand, new object[] { 0 });
if (!resultHopper_No3 || !resultScanCommand3)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_ScanCodeDown_Error3")); //没有找到对应的料仓号。
ICSharpCode.Core.LoggingService.Error(msg);
}
return false;
}
#endregion
#region 4 下传料仓号和命令(失败反馈)
bool resultHopper_No4 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Hopper_No_103, new object[] { binSerial });
bool resultScanCommand4 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_ScanCommand, new object[] { 1 });
bool resultFromPlc = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Open_door_Command_ShakeHand, new object[] { 2 });
if (!resultHopper_No4 || !resultScanCommand4 || !resultFromPlc)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_ScanCodeDown_Error4")); //料仓号获取成功,下传时失败。
ICSharpCode.Core.LoggingService.Error(msg);
}
#endregion
#region 将扫码信息写入数据库报表
LR_BarcodeLog lR_BarcodeLog = new LR_BarcodeLog();
lR_BarcodeLog.Equip_Code = ConfigurationManager.AppSettings["EquipCode"];
lR_BarcodeLog.Scan_Time = DateTime.Now.ToString();
lR_BarcodeLog.Scan_Bar = useStr;
lR_BarcodeLog.Material = Product.PptPlan.PlanHelper.GetPmt_material(meterialId).Material_name;
lR_BarcodeLog.Bin = binSerial;
lR_BarcodeLog.Scan_State = 1;
Report.ReportHelper.InsertLR_BarcodeLog(lR_BarcodeLog);
#endregion
return true;
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error(ex.Message);
return false;
}
finally
{
Sys.FrmNotify.Instance.Destory();
}
}
#endregion
#region 更新物料名称
///
/// 更新物料名称
///
public static void UpdateMaterialNameToPlc()
{
try
{
bool flag = false;
#region 更新物料名称及物料代码
if (BasePlcHelper.Instance.ChemicalWeighing_PLC_LoadingConfig.NowValue.ToInt() == 1 && BasePlcHelper.Instance.ChemicalWeighing_PC_LoadingConfig.NowValue.ToInt() == 0)
{
#region 下传物料名称
List pmt_Bins = Product.PptPlan.PlanHelper.GetAllPmt_Bin();
for (int i = 1; i <= 20; i++)
{
bool findFlag = false;
DataKeyValue ChemicalWeighing_MaterName = new DataKeyValue("MaterName_Bin" + Mesnac.Basic.DataProcessor.FillZero(i.ToString(), 2));
DataKeyValue ChemicalWeighing_MaterCode = new DataKeyValue("MaterCode_Bin" + Mesnac.Basic.DataProcessor.FillZero(i.ToString(), 2));
if (pmt_Bins != null && pmt_Bins.Count > 0)
{
for (int j = 0; j < pmt_Bins.Count; j++)
{
Pmt_material pmt_Material = Product.PptPlan.PlanHelper.GetPmt_material(pmt_Bins[j].Material_ID);
string binStr = null;
if (pmt_Bins[j] != null && pmt_Bins[j].Bin_Serial != null && pmt_Material != null && pmt_Material.Material_name != null)
{
binStr = Mesnac.Basic.DataProcessor.FillZero(pmt_Bins[j].Bin_Serial.ToString(), 2);
if (ChemicalWeighing_MaterName.EquipRunName.Contains(binStr))
{
object[] oblist = Mesnac.Basic.DataProcessor.ToPLCDataArray(pmt_Material.Material_name);
object[] oblistCode = Mesnac.Basic.DataProcessor.ToPLCDataArray(pmt_Material.Material_code);
BasePlcHelper.Instance.PlcWriteByDataKey(ChemicalWeighing_MaterName, FullObj(oblist));
BasePlcHelper.Instance.PlcWriteByDataKey(ChemicalWeighing_MaterCode, FullObj(oblistCode));
findFlag = true;
break;
}
}
}
if (findFlag == false)
{
object[] oblist = new object[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
object[] oblistCode = new object[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
BasePlcHelper.Instance.PlcWriteByDataKey(ChemicalWeighing_MaterName, oblist);
BasePlcHelper.Instance.PlcWriteByDataKey(ChemicalWeighing_MaterCode, oblistCode);
}
}
}
flag = true;
#endregion
}
#endregion
#region 触发事件
if (flag)
{
#region 下传请求信号
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_LoadingConfig, new object[] { 1 });
if (!result)
{
string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg60")); //小料物料名称向PLC下传反馈信号失败!
ICSharpCode.Core.LoggingService.Error(msg);
}
#endregion
}
#endregion
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("把PLC的计划状态更新至数据库异常:" + ex.Message, ex);
}
finally
{
Global.PublicVar.Instance.LocalPlanIsRefresh = false;
}
}
#endregion
#region 修改PCOnlin心跳信号
public static void HeartBeatChange()
{
if (BasePlcHelper.Instance.ChemicalWeighing_PLC_Online_Flag.NowValue.ToInt() != 0)
{
if (BasePlcHelper.Instance.ChemicalWeighing_PC_Online.NowValue.ToInt() == 1)
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Online, new object[] { 0 });
}
else
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Online, new object[] { 1 });
}
}
}
#endregion
#region 自动修改班次
public static void shiftIDAutoChange()
{
Global.PublicVar.Instance.globalShiftID = Product.ProductHelper.shiftIDAtuoRefresh();
}
#endregion
public static object[] FullObj(object[] ob)
{
object[] reOb = ob;
if (reOb.Count() < 20)
{
for (int z = reOb.Count(); z < 20; z++)
{
object[] tempo = new object[1] { 0 };
reOb = reOb.Concat(tempo).ToArray();
}
}
return reOb;
}
#region 溶剂配方
#region 溶剂下发任务到PLC 2023-06-17
///
/// 溶剂下发任务到PLC
///
///
///
public static string DownloadPlanDataToPlc(List materialList)
{
int i = 1;
foreach (var item in materialList)
{
switch (i)
{
case 1:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep0_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep0_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep0_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1
break;
case 2:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep1_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep1_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep1_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1
break;
case 3:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep2_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep2_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep2_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1
break;
case 4:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep3_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep3_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep3_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1
break;
case 5:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep4_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep4_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep4_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1
break;
case 6:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep5_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep5_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep5_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1
break;
case 7:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep6_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep6_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep6_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1
break;
case 8:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep7_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep7_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep7_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1
break;
case 9:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep8_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep8_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep8_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 10:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep9_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep9_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep9_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 11:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep10_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep10_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep10_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 12:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep11_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep11_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep11_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 13:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep12_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep12_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep12_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 14:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep13_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep13_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep13_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 15:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep14_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep14_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep14_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 16:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep15_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep15_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep15_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 17:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep16_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep16_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep16_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 18:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep17_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep17_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep17_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 19:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep18_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep18_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep18_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 20:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep19_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep19_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep19_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
case 21:
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep20_MatCode_1, new object[] { item.MID }); // 物料名称
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep20_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep20_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1
break;
default:
break;
}
if (i == 1)
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_RecipeNo, new object[] { item.MID });//配方编码
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_reqSerial, new object[] { item.Plan_Serial }); // 设定批次
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_Total, new object[] { item.Total_Weight * 100 }); // 总重
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_startScale, new object[] { 1 }); // 启动称量
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_stopScale, new object[] { 1 }); // 停止称量
}
i++;
}
return null;
}
#endregion
///
/// 更新溶剂状态
///
public static void UpdatePlanData()
{
//状态:1,需要加料,2,称量完成;3,超差报警;4,存盘信号
int status = BasePlcHelper.Instance.solvent_State.NowValue.ToInt();
if (status == 4)
{
int matSerial = BasePlcHelper.Instance.solvent_MaterRowNum.NowValue.ToInt();//执行顺序
ReadMaterData(matSerial);
}
}
///
/// 完成序号
///
///
public static void ReadMaterData(int serial)
{
string RMatCode = string.Empty;
double RActWeight = 0.000;
double RActTol = 0.000;
var list = Product.PptPlan.PlanHelper.GetPlan();
if (list.Count == 0) return;
int batch = BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt();//完成批次
for (int i = 1; i <= serial; i++)
{
var plan = list.SingleOrDefault(d => d.MID == i);
switch (serial)
{
case 1:
RMatCode = BasePlcHelper.Instance.solvent_SaveData0_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData0_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData0_RActTol_1.NowValue.ToDouble() / 100;
break;
case 2:
RMatCode = BasePlcHelper.Instance.solvent_SaveData1_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData1_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData1_RActTol_1.NowValue.ToDouble() / 100;
break;
case 3:
RMatCode = BasePlcHelper.Instance.solvent_SaveData2_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData2_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData2_RActTol_1.NowValue.ToDouble() / 100;
break;
case 4:
RMatCode = BasePlcHelper.Instance.solvent_SaveData3_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData3_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData3_RActTol_1.NowValue.ToDouble() / 100;
break;
case 5:
RMatCode = BasePlcHelper.Instance.solvent_SaveData4_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData4_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData4_RActTol_1.NowValue.ToDouble() / 100;
break;
case 6:
RMatCode = BasePlcHelper.Instance.solvent_SaveData5_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData5_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData5_RActTol_1.NowValue.ToDouble() / 100;
break;
case 7:
RMatCode = BasePlcHelper.Instance.solvent_SaveData6_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData6_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData6_RActTol_1.NowValue.ToDouble() / 100;
break;
case 8:
RMatCode = BasePlcHelper.Instance.solvent_SaveData7_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData7_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData7_RActTol_1.NowValue.ToDouble() / 100;
break;
case 9:
RMatCode = BasePlcHelper.Instance.solvent_SaveData8_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData8_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData8_RActTol_1.NowValue.ToDouble() / 100;
break;
case 10:
RMatCode = BasePlcHelper.Instance.solvent_SaveData9_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData9_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData9_RActTol_1.NowValue.ToDouble() / 100;
break;
case 11:
RMatCode = BasePlcHelper.Instance.solvent_SaveData10_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData10_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData10_RActTol_1.NowValue.ToDouble() / 100;
break;
case 12:
RMatCode = BasePlcHelper.Instance.solvent_SaveData11_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData11_RActWeight_1.NowValue.ToInt() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData11_RActTol_1.NowValue.ToInt() / 100;
break;
case 13:
RMatCode = BasePlcHelper.Instance.solvent_SaveData12_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData12_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData12_RActTol_1.NowValue.ToDouble() / 100;
break;
case 14:
RMatCode = BasePlcHelper.Instance.solvent_SaveData13_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData13_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData13_RActTol_1.NowValue.ToDouble() / 100;
break;
case 15:
RMatCode = BasePlcHelper.Instance.solvent_SaveData14_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData14_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData14_RActTol_1.NowValue.ToDouble() / 100;
break;
case 16:
RMatCode = BasePlcHelper.Instance.solvent_SaveData15_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData15_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData16_RActTol_1.NowValue.ToDouble() / 100;
break;
case 17:
RMatCode = BasePlcHelper.Instance.solvent_SaveData16_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData16_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData16_RActTol_1.NowValue.ToDouble() / 100;
break;
case 18:
RMatCode = BasePlcHelper.Instance.solvent_SaveData17_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData17_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData17_RActTol_1.NowValue.ToDouble() / 100;
break;
case 19:
RMatCode = BasePlcHelper.Instance.solvent_SaveData18_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData18_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData18_RActTol_1.NowValue.ToDouble() / 100;
break;
case 20:
RMatCode = BasePlcHelper.Instance.solvent_SaveData19_RMatCode1.NowValue.ToString();
RActWeight = BasePlcHelper.Instance.solvent_SaveData19_RActWeight_1.NowValue.ToDouble() / 100;
RActTol = BasePlcHelper.Instance.solvent_SaveData19_RActTol_1.NowValue.ToDouble() / 100;
break;
default:
break;
}
bool result = SaveToHwPlan(plan, batch, RMatCode, RActWeight, RActTol);
}
var rtplan = list.Take(1).First();
//更新计划完成状态
if (BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt() == rtplan.Plan_Num)
{
PlanHelper.UpdatePlan(rtplan.Plan_Id, BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt(), 8, rtplan.Plan_TotalWeight, rtplan.Plan_TotalError);
//完成后写入清空信号
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_status, new object[] { 1 });//存盘以后置为1 需要加料
}
else
{
PlanHelper.UpdateRealNum(rtplan.Plan_Id, BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt(), rtplan.Plan_TotalWeight, rtplan.Plan_TotalError);
}
}
public static string GetExecMaterName()
{
string no = string.Empty;//物料名称
int matSerial = BasePlcHelper.Instance.solvent_MaterRowNum.NowValue.ToInt();//执行顺序
switch (matSerial)
{
case 1:
no = BasePlcHelper.Instance.solvent_SaveData0_RMatCode1.NowValue.ToString();
break;
case 2:
no = BasePlcHelper.Instance.solvent_SaveData1_RMatCode1.NowValue.ToString();
break;
case 3:
no = BasePlcHelper.Instance.solvent_SaveData2_RMatCode1.NowValue.ToString();
break;
case 4:
no = BasePlcHelper.Instance.solvent_SaveData3_RMatCode1.NowValue.ToString();
break;
case 5:
no = BasePlcHelper.Instance.solvent_SaveData4_RMatCode1.NowValue.ToString();
break;
case 6:
no = BasePlcHelper.Instance.solvent_SaveData5_RMatCode1.NowValue.ToString();
break;
case 7:
no = BasePlcHelper.Instance.solvent_SaveData6_RMatCode1.NowValue.ToString();
break;
case 8:
no = BasePlcHelper.Instance.solvent_SaveData7_RMatCode1.NowValue.ToString();
break;
case 9:
no = BasePlcHelper.Instance.solvent_SaveData8_RMatCode1.NowValue.ToString();
break;
case 10:
no = BasePlcHelper.Instance.solvent_SaveData9_RMatCode1.NowValue.ToString();
break;
case 11:
no = BasePlcHelper.Instance.solvent_SaveData10_RMatCode1.NowValue.ToString();
break;
case 12:
no = BasePlcHelper.Instance.solvent_SaveData11_RMatCode1.NowValue.ToString();
break;
case 13:
no = BasePlcHelper.Instance.solvent_SaveData12_RMatCode1.NowValue.ToString();
break;
case 14:
no = BasePlcHelper.Instance.solvent_SaveData13_RMatCode1.NowValue.ToString();
break;
case 15:
no = BasePlcHelper.Instance.solvent_SaveData14_RMatCode1.NowValue.ToString();
break;
case 16:
no = BasePlcHelper.Instance.solvent_SaveData15_RMatCode1.NowValue.ToString();
break;
case 17:
no = BasePlcHelper.Instance.solvent_SaveData16_RMatCode1.NowValue.ToString();
break;
case 18:
no = BasePlcHelper.Instance.solvent_SaveData17_RMatCode1.NowValue.ToString();
break;
case 19:
no = BasePlcHelper.Instance.solvent_SaveData18_RMatCode1.NowValue.ToString();
break;
case 20:
no = BasePlcHelper.Instance.solvent_SaveData19_RMatCode1.NowValue.ToString();
break;
default:
break;
}
return no;
}
///
/// 已完成重量
///
///
public static double GetExecMaterWeight()
{
double weight = 0.000;
int matSerial = BasePlcHelper.Instance.solvent_MaterRowNum.NowValue.ToInt();//执行顺序
for (int i = 1; i <= matSerial; i++)
{
switch (matSerial)
{
case 1:
weight = BasePlcHelper.Instance.solvent_SaveData0_RActWeight_1.NowValue.ToDouble();
break;
case 2:
weight = BasePlcHelper.Instance.solvent_SaveData1_RActWeight_1.NowValue.ToDouble();
break;
case 3:
weight = BasePlcHelper.Instance.solvent_SaveData2_RActWeight_1.NowValue.ToDouble();
break;
case 4:
weight = BasePlcHelper.Instance.solvent_SaveData3_RActWeight_1.NowValue.ToDouble();
break;
case 5:
weight = BasePlcHelper.Instance.solvent_SaveData4_RActWeight_1.NowValue.ToDouble();
break;
case 6:
weight = BasePlcHelper.Instance.solvent_SaveData5_RActWeight_1.NowValue.ToDouble();
break;
case 7:
weight = BasePlcHelper.Instance.solvent_SaveData6_RActWeight_1.NowValue.ToDouble();
break;
case 8:
weight = BasePlcHelper.Instance.solvent_SaveData7_RActWeight_1.NowValue.ToDouble();
break;
case 9:
weight = BasePlcHelper.Instance.solvent_SaveData8_RActWeight_1.NowValue.ToDouble();
break;
case 10:
weight = BasePlcHelper.Instance.solvent_SaveData9_RActWeight_1.NowValue.ToDouble();
break;
case 11:
weight = BasePlcHelper.Instance.solvent_SaveData10_RActWeight_1.NowValue.ToDouble();
break;
case 12:
weight = BasePlcHelper.Instance.solvent_SaveData11_RActWeight_1.NowValue.ToDouble();
break;
case 13:
weight = BasePlcHelper.Instance.solvent_SaveData12_RActWeight_1.NowValue.ToDouble();
break;
case 14:
weight = BasePlcHelper.Instance.solvent_SaveData13_RActWeight_1.NowValue.ToDouble();
break;
case 15:
weight = BasePlcHelper.Instance.solvent_SaveData14_RActWeight_1.NowValue.ToDouble();
break;
case 16:
weight = BasePlcHelper.Instance.solvent_SaveData15_RActWeight_1.NowValue.ToDouble();
break;
case 17:
weight = BasePlcHelper.Instance.solvent_SaveData16_RActWeight_1.NowValue.ToDouble();
break;
case 18:
weight = BasePlcHelper.Instance.solvent_SaveData17_RActWeight_1.NowValue.ToDouble();
break;
case 19:
weight = BasePlcHelper.Instance.solvent_SaveData18_RActWeight_1.NowValue.ToDouble();
break;
case 20:
weight = BasePlcHelper.Instance.solvent_SaveData19_RActWeight_1.NowValue.ToDouble();
break;
default:
break;
}
weight += weight;
}
return weight;
}
///
/// 初始化扫码设备 采用COM连接
///
public static void InitScanCode()
{
if (!flag1)
{
string COM1 = "COM3";
ScanControl scnew = new ScanControl();
scnew.InstanceSerialPort3(COM1);
flag1 = true;
}
//if (!flag2)
//{
// string COM2 = "COM5";
// ScanControl scnew2 = new ScanControl();
// scnew2.InstanceSerialPort5(COM2);
// flag2 = true;
//}
}
///
/// 小料扫码
///
public static void XlScanCode()
{
string scan = ScanControl.scanStr;
if (!string.IsNullOrEmpty(scan))
{
for (int i = 1; i <= 15; i++)
{
switch (i)
{
case 1:
int scan1 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 2:
int scan2 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 3:
int scan3 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 4:
int scan4 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 5:
int scan5 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 6:
int scan6 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 7:
int scan7 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 8:
int scan8 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 9:
int scan9 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 10:
int scan10 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 11:
int scan11 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 12:
int scan12 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 13:
int scan13 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 14:
int scan14 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 15:
int scan15 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
default:
break;
}
}
}
}
///
/// 溶剂投料扫码
///
public static void RjScanCode()
{
string scan = ScanControl.scanStr;
for (int i = 1; i <= 20; i++)
{
switch (i)
{
case 1:
int scan1 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
if (scan1 == 1)
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_Set_station_U1_barcode, new object[] { 1 });//0、未扫描、1、匹配;2、报警
}
break;
case 2:
int scan2 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 3:
int scan3 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 4:
int scan4 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 5:
int scan5 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 6:
int scan6 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 7:
int scan7 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 8:
int scan8 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 9:
int scan9 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 10:
int scan10 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 11:
int scan11 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 12:
int scan12 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 13:
int scan13 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 14:
int scan14 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
case 15:
int scan15 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情
break;
default:
break;
}
}
}
public static bool SaveToHwPlan(MetagePlan item, int batch, string RMatCode, double realWeight, double realError)
{
try
{
bool addPlan = false;
bool addWeigh = false;
Hw_plan plan = SolventDBHelper.GetRtPlan(item.Plan_Id, batch);
if (plan != null)
{
double totalWeight = plan.Total_Weight + realWeight;
double totalError = plan.Total_Error + realError;
//保存物料
Hw_weigh weigh = new Hw_weigh();
weigh.Dosing_ID = plan.Dosing_Id;
weigh.Plan_ID = item.Plan_Id;
weigh.Recipe_ID = item.Recipe_ID;
weigh.Material_ID = item.MaterialID;
weigh.Material_Name = item.Material_name;
weigh.Set_Weight = item.Set_Weight;
weigh.Set_Error = item.Set_Error;
weigh.Real_Weight = realWeight;
weigh.Real_Error = realError;
addPlan = SolventDBHelper.UpdateHwPlan(item.Plan_Id, totalWeight, totalError);
addWeigh = SolventDBHelper.AddHwWeigh(weigh);
if (addPlan && addWeigh)
{
return true;
}
else
{
return false;
}
}
else
{
//保存计划
Hw_plan hwPlan = new Hw_plan();
hwPlan.Plan_Id = item.Plan_Id;
hwPlan.Plan_Serial = item.Plan_Serial;
hwPlan.Recipe_ID = item.Recipe_ID;
hwPlan.Recipe_Name = item.Recipe_Name;
hwPlan.Version = item.Version;
hwPlan.Plan_Num = item.Plan_Num;
hwPlan.Real_Num = BasePlcHelper.Instance.plt_Station1_Batch.NowValue.ToInt();
hwPlan.Shift_Id = item.Shift_Id;
hwPlan.Shift_Class = item.Shift_Class;
hwPlan.Total_Weight = realWeight;
hwPlan.Total_Error = realError;
hwPlan.IsRetransmission = item.IsRetransmission;
hwPlan.Retransmission_Num = item.Retransmission_Num;
//保存物料
Hw_weigh weigh = new Hw_weigh();
weigh.Plan_ID = item.Plan_Id;
weigh.Recipe_ID = item.Recipe_ID;
weigh.Material_ID = item.MaterialID;
weigh.Material_Name = item.Material_name;
weigh.Set_Weight = item.Set_Weight;
weigh.Set_Error = item.Set_Error;
weigh.Real_Weight = realWeight;
weigh.Real_Error = realError;
addPlan = SolventDBHelper.AddHwPlan(hwPlan);
addWeigh = SolventDBHelper.AddHwWeigh(weigh);
if (addPlan && addWeigh)
{
return true;
}
else
{
return false;
}
}
}
catch (Exception)
{
return false;
}
}
#region 设置配方 PLC点位信息
///
/// 重传配方设置数量
///
/// 计划列表
/// 是否设置成功
public static bool ReloadPlanToPlc(int num)
{
string msg = string.Empty;
try
{
if (BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt() < num)
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_reqSerial, new object[] { num });//设定执行数量
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
return false;
}
}
#endregion
#endregion
}
}