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.

442 lines
13 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.Threading.Tasks;
namespace Mesnac.Action.ChemicalWeighing
{
/// <summary>
/// PLC参数写入项
/// </summary>
public class PlcWriteItem
{
#region 构造方法
public PlcWriteItem()
{
this.EquipBrand = String.Empty;
this.DataFieldName = string.Empty;
this.EquipRunName = 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 EquipRunName { 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 object SetValue { get; set; }
#endregion
#region 公有方法
#region 获取PLC写入项数据
/// <summary>
/// 获取PLC写入项数据
/// </summary>
/// <returns>返回PLC写入项Int16数组</returns>
public Int16[] WriteData()
{
Int16[] result = null;
Int16[] newResult = new Int16[ValueLen];
for (int i = 0; i < newResult.Length; i++)
{
newResult[i] = 0;
}
if (string.IsNullOrWhiteSpace(DataType))
{
result = WriteData_Null();
}
else if (DataType.Equals("string", StringComparison.CurrentCultureIgnoreCase))
{
result = WriteData_string();
}
else if (DataType.Equals("DateTime", StringComparison.CurrentCultureIgnoreCase))
{
result = WriteData_DateTime();
}
else if (DataType.Equals("Time", StringComparison.CurrentCultureIgnoreCase))
{
result = WriteData_Time();
}
else if (DataType.Equals("Int32", StringComparison.CurrentCultureIgnoreCase))
{
result = WriteData_Int32();
}
else if (DataType.Equals("float", StringComparison.CurrentCultureIgnoreCase))
{
result = WriteData_float();
}
else if (DataType.Equals("Int16", StringComparison.CurrentCultureIgnoreCase))
{
result = WriteData_Int16();
}
else
{
result = WriteData_Null();
}
if (result.Length <= ValueLen)
{
Array.Copy(result, newResult, result.Length);
}
else
{
Array.Copy(result, newResult, ValueLen);
}
return newResult;
}
#endregion
#region 清空PLC写入项数据
/// <summary>
/// 清空PLC写入项数据
/// </summary>
public void ClearData()
{
this.SetValue = null;
}
#endregion
#endregion
#region 辅助方法
#region 乘法遍历参数数组中的每个元素让每个元素乘以this.Multiply
/// <summary>
/// 乘法遍历参数数组中的每个元素让每个元素乘以this.Multiply
/// </summary>
/// <param name="buff">参数数组</param>
/// <returns>返回各元素乘以this.Multiply后的数组</returns>
private Int16[] MultiplyData(double[] buff)
{
Int16[] result = new Int16[buff.Length];
for (int i = 0; i < buff.Length; i++)
{
//result[i] = (int)(buff[i] * this.Multiply);
result[i] = (Int16)Math.Round(buff[i] * this.Multiply);
}
return result;
}
private Int16[] MultiplyData(Int16[] buff)
{
Int16[] result = new Int16[buff.Length];
for (int i = 0; i < buff.Length; i++)
{
result[i] = (Int16)(buff[i] * this.Multiply);
}
return result;
}
#endregion
#region 写入Null值
/// <summary>
/// 对空PLC写入项进行数据处理
/// </summary>
/// <returns>返回空数据的PLC写入项数组</returns>
private Int16[] WriteData_Null()
{
double[] buff = new double[ValueLen];
double ivalue = 0;
if (SetValue != null && SetValue != DBNull.Value && double.TryParse(SetValue.ToString(), out ivalue))
{
buff[0] = ivalue;
}
else
{
buff[0] = 0.0;
}
return MultiplyData(buff);
}
#endregion
#region 写入Int32类型值
/// <summary>
/// 对Int32类型的PLC写入项进行数据处理此处要注意不同类型PLC的处理方式
/// </summary>
/// <returns></returns>
private Int16[] WriteData_Int32()
{
Int16[] buff = new Int16[ValueLen];
for (int i = 0; i < buff.Length; i++)
{
buff[i] = 0;
}
Int32 ivalue = 0;
if (ValueLen / 2 == 1)
{
if (SetValue != null && SetValue != DBNull.Value && Int32.TryParse(SetValue.ToString(), out ivalue))
{
Int16[] intValues = new Int16[2];
if (this.EquipBrand.Equals("Siemens", StringComparison.CurrentCultureIgnoreCase))
{
intValues = Mesnac.Basic.DataProcessor.ToSiemensPLCInt16Array(ivalue);
}
else
{
intValues = Mesnac.Basic.DataProcessor.ToPLCInt16Array(ivalue);
}
buff[0] = intValues[0];
buff[1] = intValues[1];
}
}
else
{
if (SetValue is Int32[])
{
Int32[] setValues = SetValue as Int32[];
for (int i = 0; i < setValues.Length; i++)
{
if (i * 2 >= ValueLen)
{
break;
}
Int16[] intValues = new Int16[2];
if (this.EquipBrand.Equals("Siemens", StringComparison.CurrentCultureIgnoreCase))
{
intValues = Mesnac.Basic.DataProcessor.ToSiemensPLCInt16Array(setValues[i]);
}
else
{
intValues = Mesnac.Basic.DataProcessor.ToPLCInt16Array(setValues[i]);
}
buff[i * 2] = intValues[0];
buff[i * 2 + 1] = intValues[1];
}
}
}
return buff;
}
#endregion
#region 写入float类型值
/// <summary>
/// 对float类型的PLC写入项进行数据处理此处要注意不同类型PLC的处理方式
/// </summary>
/// <returns></returns>
private Int16[] WriteData_float()
{
Int16[] buff = new Int16[ValueLen];
for (int i = 0; i < buff.Length; i++)
{
buff[i] = 0;
}
float fvalue = 0.0f;
if (ValueLen / 2 == 1)
{
if (SetValue != null && SetValue != DBNull.Value && float.TryParse(SetValue.ToString(), out fvalue))
{
Int16[] intValues = new Int16[2];
if (this.EquipBrand.Equals("Siemens", StringComparison.CurrentCultureIgnoreCase))
{
intValues = Mesnac.Basic.DataProcessor.ToSiemensPLCInt16Array(fvalue);
}
else
{
intValues = Mesnac.Basic.DataProcessor.ToPLCInt16Array(fvalue);
}
buff[0] = intValues[0];
buff[1] = intValues[1];
}
}
else
{
if (SetValue is float[])
{
float[] setValues = SetValue as float[];
for (int i = 0; i < setValues.Length; i++)
{
if (i * 2 >= ValueLen)
{
break;
}
Int16[] intValues = new Int16[2];
if (this.EquipBrand.Equals("Siemens", StringComparison.CurrentCultureIgnoreCase))
{
intValues = Mesnac.Basic.DataProcessor.ToSiemensPLCInt16Array(setValues[i]);
}
else
{
intValues = Mesnac.Basic.DataProcessor.ToPLCInt16Array(setValues[i]);
}
buff[i * 2] = intValues[0];
buff[i * 2 + 1] = intValues[1];
}
}
}
return buff;
}
#endregion
#region 写入Int16类型值
/// <summary>
/// 对Int16类型的PLC写入项进行数据处理
/// </summary>
/// <returns></returns>
private Int16[] WriteData_Int16()
{
Int16[] buff = new Int16[ValueLen];
for (int i = 0; i < buff.Length; i++)
{
buff[i] = 0;
}
Int16 ivalue = 0;
if (ValueLen == 1)
{
if (SetValue != null && SetValue != DBNull.Value && Int16.TryParse(SetValue.ToString(), out ivalue))
{
buff[0] = ivalue;
}
}
else
{
if (SetValue is Int16[])
{
Int16[] setValues = SetValue as Int16[];
for (int i = 0; i < setValues.Length; i++)
{
if (i >= ValueLen)
{
break;
}
buff[i] = setValues[i];
}
}
}
return buff;
}
#endregion
#region 写入String类型值
/// <summary>
/// 把字符串解析为PLC地址块数据
/// </summary>
/// <returns></returns>
private Int16[] WriteData_string()
{
string ss = string.Empty;
if (SetValue != null && SetValue != DBNull.Value)
{
ss = SetValue.ToString();
}
Int16[] buff = Mesnac.Basic.DataProcessor.ToPLCInt16Array(ss);
#region 补够长度
Int16[] buffResult = new Int16[this.ValueLen];
Array.Copy(buff, buffResult, buff.Length);
#endregion
return MultiplyData(buffResult);
}
#endregion
#region 写入DateTime类型值
/// <summary>
/// 处理日期时间写入项
/// </summary>
/// <returns></returns>
private Int16[] WriteData_DateTime()
{
string ss = string.Empty;
if (SetValue != null && SetValue != DBNull.Value)
{
ss = SetValue.ToString();
}
DateTime dtNow = DateTime.Now;
if (!DateTime.TryParse(ss, out dtNow))
{
dtNow = DateTime.Now;
}
//double[] buff = new double[] { dtNow.Year, dtNow.Month, dtNow.Day, dtNow.Hour, dtNow.Minute, dtNow.Second };
Int16[] buff = Mesnac.Basic.DataProcessor.ToPLCInt16Array(dtNow);
return MultiplyData(buff);
}
#endregion
#region 写入Time类型值
/// <summary>
/// 处理时间写入项
/// </summary>
/// <returns></returns>
private Int16[] WriteData_Time()
{
string ss = string.Empty;
if (SetValue != null && SetValue != DBNull.Value)
{
ss = SetValue.ToString();
}
Int16[] buff = Mesnac.Basic.DataProcessor.ToPLCInt16ArrayFromTimeStr(ss);
return MultiplyData(buff);
}
#endregion
#endregion
}
}