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.

332 lines
12 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;
namespace Mesnac.Action.ChemicalWeighing
{
/// <summary>
/// PLCSchema.xml中的存盘数据项类 - 对应add节点
/// </summary>
public class PlcRecipeReaderItem
{
#region 构造方法
/// <summary>
/// 默认构造方法
/// </summary>
public PlcRecipeReaderItem()
{
this.EquipBrand = String.Empty;
this.DataFieldName = string.Empty;
this.PlcFiledName = string.Empty;
this.DataType = string.Empty;
this.PlcShifting = 0;
this.DefaultValue = 0;
this.ValueLen = 1;
this.Multiply = 1;
this.SetValue = null;
}
#endregion
#region 属性定义
/// <summary>
/// 所属PLC设备品牌
/// </summary>
public string EquipBrand { get; set; }
/// <summary>
/// 数据库字段名
/// </summary>
public string DataFieldName { get; set; }
/// <summary>
/// Plc别名
/// </summary>
public string PlcFiledName { get; set; }
/// <summary>
/// 偏移值
/// </summary>
public int PlcShifting { get; set; }
/// <summary>
/// 默认值
/// </summary>
public int DefaultValue { get; set; }
/// <summary>
/// 长度
/// </summary>
public int ValueLen { get; set; }
/// <summary>
/// 数据处理方式
/// </summary>
public string DataType { get; set; }
/// <summary>
/// 乘数
/// </summary>
public int Multiply { get; set; }
/// <summary>
/// 原始值
/// </summary>
public int[] SetValue { get; set; }
#endregion
#region 方法定义
/// <summary>
/// 数据转化值
/// </summary>
/// <returns></returns>
public object GetValue()
{
if (string.IsNullOrWhiteSpace(DataType))
{
return GetValue_Null();
}
else if (DataType.Equals("string", StringComparison.CurrentCultureIgnoreCase))
{
return this.GetValue_String1();
}
else if (DataType.Equals("DateTime", StringComparison.CurrentCultureIgnoreCase))
{
return GetValue_DateTime();
}
else if (DataType.Equals("Int32", StringComparison.CurrentCultureIgnoreCase))
{
return GetValue_Int32();
}
else if (DataType.Equals("float", StringComparison.CurrentCultureIgnoreCase))
{
return GetValue_Float();
}
else if (DataType.Equals("Int16", StringComparison.CurrentCultureIgnoreCase))
{
return GetValue_Int16();
}
return GetValue_Null();
}
#endregion
#region 辅助方法定义
/// <summary>
/// 对节点值进行除法运算
/// </summary>
/// <param name="buff">要处理的值</param>
/// <returns>返回除法运算后的结果</returns>
private double MultiplyData(double buff)
{
double result = buff;
if (this.Multiply != 0)
{
result = result / (double)this.Multiply;
}
return result;
}
/// <summary>
/// 获取对应的设备值
/// </summary>
/// <returns></returns>
private double GetValue_Null()
{
if (this.SetValue.Length == 0)
{
return DefaultValue;
}
return MultiplyData(this.SetValue[0]);
}
/// <summary>
/// 获取字符串值
/// </summary>
/// <returns>返回当前读取项的字符串值</returns>
private string GetValue_String()
{
if (this.SetValue == null)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为字符串{0}失败原因SetValue为NULL!", this.DataFieldName));
return String.Empty;
}
else if (this.SetValue.Length != this.ValueLen)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为字符串{0}失败原因SetValue.Length!=ValueLen!", this.DataFieldName));
return String.Empty;
}
else
{
return Mesnac.Basic.DataProcessor.ToString(this.SetValue);
}
}
/// <summary>
/// 获取字符串值
/// </summary>
/// <returns>返回当前读取项的字符串值</returns>
private string GetValue_String1()
{
if (this.SetValue == null)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为字符串{0}失败原因SetValue为NULL!", this.DataFieldName));
return String.Empty;
}
else if (this.SetValue.Length != this.ValueLen)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为字符串{0}失败原因SetValue.Length!=ValueLen!", this.DataFieldName));
return String.Empty;
}
else
{
return Mesnac.Basic.DataProcessor.ToString1(this.SetValue);
}
}
/// <summary>
/// 获取日期值
/// </summary>
/// <returns></returns>
private DateTime GetValue_DateTime()
{
if (this.SetValue == null)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为DateTime:{0}失败原因SetValue为NULL!", this.DataFieldName));
return new DateTime(1900, 1, 1, 0, 0, 0);
}
else if (this.SetValue.Length != this.ValueLen)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为DateTime:{0}失败原因SetValue.Length!=ValueLen!", this.DataFieldName));
return new DateTime(1900, 1, 1, 0, 0, 0);
}
else if (this.SetValue.Length != 6)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为DateTime:{0}失败原因SetValue.Length!=6!", this.DataFieldName));
return new DateTime(1900, 1, 1, 0, 0, 0);
}
else
{
DateTime dateResult = DateTime.Now;
string strDate = String.Format("{0}-{1}-{2} {3}:{4}:{5}", this.SetValue[0], this.SetValue[1], this.SetValue[2], this.SetValue[3], this.SetValue[4], this.SetValue[5]);
if (!DateTime.TryParse(strDate, out dateResult))
{
dateResult = DateTime.Now;
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("字段[{0}]把PLC数据解析为DateTime:{1}失败!", this.DataFieldName, strDate));
}
return dateResult;
}
}
/// <summary>
/// 获取Int32类型的值
/// </summary>
/// <returns></returns>
private Int32 GetValue_Int32()
{
if (this.SetValue == null)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为Int32:{0}失败原因SetValue为NULL!", this.DataFieldName));
return 0;
}
else if (this.SetValue.Length != this.ValueLen)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为Int32:{0}失败原因SetValue.Length!=ValueLen!", this.DataFieldName));
return 0;
}
else if (this.SetValue.Length != 2)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为Int32:{0}失败原因SetValue.Length!=2!", this.DataFieldName));
return 0;
}
else
{
Int32 result = 0;
if (this.EquipBrand.Equals("Siemens", StringComparison.CurrentCultureIgnoreCase))
{
result = Mesnac.Basic.DataProcessor.ToSiemensInt32(this.SetValue);
}
else
{
result = Mesnac.Basic.DataProcessor.ToInt32(this.SetValue);
}
return result;
}
}
/// <summary>
/// 获取Int16类型的值
/// </summary>
/// <returns></returns>
private object GetValue_Int16()
{
if (this.SetValue == null)
{
object[] result = new object[this.ValueLen];
for (int i = 0; i < result.Length;i++ )
{
result[i] = 0;
}
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为Int16:{0}失败原因SetValue为NULL!", this.DataFieldName));
return result;
}
else if (this.SetValue.Length != this.ValueLen)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为Int16:{0}失败原因SetValue.Length!=ValueLen!", this.DataFieldName));
return 0;
}
else if (this.SetValue.Length == 1)
{
return this.SetValue[0];
}
else
{
object[] result = new object[this.ValueLen];
for (int i = 0; i < result.Length; i++)
{
result[i] = this.SetValue[i];
}
return result;
}
}
/// <summary>
/// 获取Float类型的值
/// </summary>
/// <returns></returns>
private float GetValue_Float()
{
if (this.SetValue == null)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为float:{0}失败原因SetValue为NULL!", this.DataFieldName));
return 0.0f;
}
else if (this.SetValue.Length != this.ValueLen)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为float:{0}失败原因SetValue.Length!=ValueLen!", this.DataFieldName));
return 0.0f;
}
else if (this.SetValue.Length != 2)
{
ICSharpCode.Core.LoggingService<PlcRecipeReaderItem>.Warn(String.Format("把PLC数据解析为float:{0}失败原因SetValue.Length!=2!", this.DataFieldName));
return 0.0f;
}
else
{
float result = 0.0f;
if (this.EquipBrand.Equals("Siemens", StringComparison.CurrentCultureIgnoreCase))
{
result = Mesnac.Basic.DataProcessor.ToSiemensFloat(this.SetValue);
}
else
{
result = Mesnac.Basic.DataProcessor.ToFloat(this.SetValue);
}
return result;
}
}
#endregion
}
}