using Mesnac.Action.ChemicalWeighing.Entity.Report;
using Mesnac.Equips;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Mesnac.Action.ChemicalWeighing.FinishBatch
{
///
/// 存盘业务辅助类
///
public class FinishBatchHelper
{
#region 冠合事件定义
public static object sender = null;
public static event EventHandler GHOnUpdatePlanStateFromPlc;
#endregion
#region 小料称量数据存盘
///
/// 小料称量数据存盘
///
public static void SaveData()
{
try
{
#region 0 存盘信号读取
//if (BasePlcHelper.Instance.ChemicalWeighing_PLC_Request_Save_ShakeHand.NowValue.ToInt() == 1 && (BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack.NowValue.ToInt() <= 0 || BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack.NowValue.ToInt() == 65535 || BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack.NowValue.ToInt() == -1))
if (true)
{
#region 1 变量定义
int offset = 0; //保存偏移量
string reportHeadEquipRunName = String.Empty; //报表头基本信息设备变量别名
string materialEquipRunName = String.Empty; //物料信息设备变量别名
int[] reportHeaddataValue = null; //保存报表头基本信息设备变量别名的PLC数据
int[] materialDataValue = null; //保存物料信息设备变量别名的PLC数据
System.Reflection.PropertyInfo[] pis = null; //实体类型属性信息
Entity.LR_lot lRlotData = null; //报表头数据类
List lrWeighList = new List(); //物料数据类List
#endregion
#region 1.1 读取PlcSchema.xml中相应的存盘配置节,并根据配置节对应的设备变量别名读取PLC数据
List readerList = PlcSchemaHelper.Instance.GetCWSSPlcReader("WeighDataInfo");
if (readerList == null || readerList.Count == 0)
{
ICSharpCode.Core.LoggingService.Warn(String.Format("基础报表数据读取失败:PlcSchema.xml中没有对应WeighDataInfo的配置节!"));
#region 保存异常,下传save=3
if (!BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 }))
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 });
}
#endregion
return;
}
reportHeadEquipRunName = readerList[0].PlcFiledName;
for (int i = 1; i < readerList.Count; i++)
{
if (reportHeadEquipRunName != readerList[i].PlcFiledName)
{
ICSharpCode.Core.LoggingService.Warn(String.Format("基础报表数据读取失败:PlcSchema.xml中相同配置节的equip={0}属性与第一个不相同!", readerList[i].PlcFiledName));
#region 保存异常,下传save=3
if (!BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 }))
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 });
}
#endregion
return;
}
}
List materialReaderList = PlcSchemaHelper.Instance.GetCWSSPlcReader("MaterialDataInfo");
if (materialReaderList == null || materialReaderList.Count == 0)
{
ICSharpCode.Core.LoggingService.Warn(String.Format("物料数据读取失败:PlcSchema.xml中没有对应MaterialDataInfo的配置节!"));
#region 保存异常,下传save=3
if (!BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 }))
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 });
}
#endregion
return;
}
materialEquipRunName = materialReaderList[0].PlcFiledName;
for (int i = 1; i < materialReaderList.Count; i++)
{
if (materialEquipRunName != materialReaderList[i].PlcFiledName)
{
ICSharpCode.Core.LoggingService.Warn(String.Format("物料数据读取失败:PlcSchema.xml中相同配置节的equip={0}属性与第一个不相同!", readerList[i].PlcFiledName));
#region 保存异常,下传save=3
if (!BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 }))
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 });
}
#endregion
return;
}
}
#endregion
#region 1.2 获取PLC品牌名称,处理西门子与其他PLC差异
foreach (PlcRecipeReader reader in readerList)
{
string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(reader.PlcFiledName);
reader.EquipBrand = equipBrand;
foreach (PlcRecipeReaderItem readerItem in reader.ItemList)
{
readerItem.EquipBrand = equipBrand;
}
}
foreach (PlcRecipeReader materialReader in materialReaderList)
{
string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(materialReader.PlcFiledName);
materialReader.EquipBrand = equipBrand;
foreach (PlcRecipeReaderItem materialReaderItem in materialReader.ItemList)
{
materialReaderItem.EquipBrand = equipBrand;
}
}
#endregion
#region 2 存盘业务处理
#region 2.1 根据配置节对应的设备变量别名读取PLC基础报表存盘数据
if (!BasePlcHelper.Instance.PlcReadByRunName(reportHeadEquipRunName, out reportHeaddataValue))
{
ICSharpCode.Core.LoggingService.Warn(String.Format("基础报表数据存盘失败:读取对应的PLC设备变量[{0}]数据失败!", reportHeadEquipRunName));
return;
}
else
{
ICSharpCode.Core.LoggingService.Debug(String.Format("基础报表数据存盘_读取PLC设备变量[{0}]成功,长度={1}", reportHeadEquipRunName, reportHeaddataValue.Length));
}
#endregion
#region 2.2 根据配置节对应的设备变量别名读取PLC物料存盘数据
if (!BasePlcHelper.Instance.PlcReadByRunName(materialEquipRunName, out materialDataValue))
{
ICSharpCode.Core.LoggingService.Warn(String.Format("物料数据存盘失败:读取对应的PLC设备变量[{0}]数据失败!", materialEquipRunName));
return;
}
else
{
ICSharpCode.Core.LoggingService.Debug(String.Format("物料数据存盘_读取PLC设备变量[{0}]成功,长度={1}", materialEquipRunName, materialDataValue.Length));
}
#endregion
#region 2.3 把读取的PLC报表头基本信息数据进行实体映射处理并写入数据库
lRlotData = new Entity.LR_lot();
foreach (PlcRecipeReader reader in readerList)
{
ICSharpCode.Core.LoggingService.Debug(String.Format("targetTable={0}, runName={1}", reader.TargetTable, reader.PlcFiledName));
#region 3.1 数据处理
if (reader.TargetTable == "LR_lot")
{
if (reader.ThisCount != 1)
{
ICSharpCode.Core.LoggingService.Warn(String.Format("上辅机称量数据存盘失败:PlcSchema.xml中对应targetTable={0}的配置节count属性值不为1!", reader.TargetTable));
#region 保存异常,下传save=3
if (!BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 }))
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 3 });
}
#endregion
return;
}
#region 3.2 配置项赋值
pis = typeof(Entity.LR_lot).GetProperties();
foreach (PlcRecipeReaderItem readerItem in reader.ItemList)
{
int[] value = new int[readerItem.ValueLen];
Array.Copy(reportHeaddataValue, offset, value, 0, value.Length);
readerItem.SetValue = value;
offset += value.Length;
foreach (System.Reflection.PropertyInfo pi in pis)
{
if (pi.Name == readerItem.DataFieldName)
{
object objValue = null;
try
{
if (readerItem.DataType.Equals("Int32", StringComparison.CurrentCultureIgnoreCase))
{
if (readerItem.SetValue[0] > 32767)
{
readerItem.SetValue[0] = Math.Abs(readerItem.SetValue[0] - 65536);
}
if (readerItem.SetValue[1] > 32767)
{
readerItem.SetValue[1] = Math.Abs(readerItem.SetValue[1] - 65536);
}
}
objValue = Mesnac.Basic.DataProcessor.ChangeType(readerItem.GetValue(), pi.PropertyType);
if (readerItem.DataFieldName == "Prd_date")
{
objValue = DateTime.Now.ToString();
}
}
catch
{
objValue = readerItem.GetValue();
}
pi.SetValue(lRlotData, objValue, null);
}
}
}
#endregion
SaveHelper.LotSaveHelper.InsertLRLotData(lRlotData);
break;
}
#endregion
}
ICSharpCode.Core.LoggingService.Debug("数据存盘_PLC报表基本数据进行实体映射处理完毕!");
#endregion
#region 2.4 把读取的PLC物料信息数据进行实体映射处理并写入数据库
foreach (PlcRecipeReader reader in materialReaderList)
{
ICSharpCode.Core.LoggingService.Debug(String.Format("targetTable={0}, runName={1}", reader.TargetTable, reader.PlcFiledName));
if (reader.TargetTable == "LR_weigh")
{
offset = 0;
pis = typeof(Entity.LR_weigh).GetProperties();
for (int i = 0; i < reader.ThisCount; i++)
{
Entity.LR_weigh tempLRweigh = new Entity.LR_weigh();
bool isCanAddFlag = false;
foreach (PlcRecipeReaderItem readerItem in reader.ItemList)
{
int[] value = new int[readerItem.ValueLen];
Array.Copy(materialDataValue, offset, value, 0, value.Length);
readerItem.SetValue = value;
offset += value.Length;
if (readerItem.PlcFiledName == "Read_BinNo" && readerItem.ValueLen == 1 && readerItem.SetValue[0] != 0)
{
isCanAddFlag = true;
}
}
if (isCanAddFlag)
{
tempLRweigh.Dosing_id = 0;
tempLRweigh.Plan_id = lRlotData.Plan_id;
tempLRweigh.Equip_Code = lRlotData.Equip_Code;
tempLRweigh.Serial_Num = lRlotData.Serial_Num;
foreach (PlcRecipeReaderItem readerItem in reader.ItemList)
{
foreach (System.Reflection.PropertyInfo pi in pis)
{
if (pi.Name == readerItem.DataFieldName)
{
object objValue = null;
try
{
objValue = Mesnac.Basic.DataProcessor.ChangeType(readerItem.GetValue(), pi.PropertyType);
if (readerItem.DataFieldName == "Weight_Time")
{
objValue = DateTime.Now.ToString();
}
}
catch
{
objValue = readerItem.GetValue();
}
pi.SetValue(tempLRweigh, objValue, null);
}
}
}
lrWeighList.Add(tempLRweigh);
SaveHelper.LotSaveHelper.InsertLRweighData(tempLRweigh);
}
}
}
}
ICSharpCode.Core.LoggingService.Debug("数据存盘_PLC物料数据写入数据库处理完毕!");
#endregion
#region 2.5 反馈信号
bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Request_Save_FeedBack, new object[] { 1 });
if (!result)
{
ICSharpCode.Core.LoggingService.Debug("数据存盘后写入反馈信号失败!");
}
#endregion
#endregion
}
else
{
return;
}
#endregion
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error(String.Format("数据存盘异常:{1}", ex.Message), ex);
}
}
#endregion
}
}