Files
DevToolsAvalonia/常用工具集/Utility/Network/S7netplus/ORM/S7Write.cs
2025-08-26 08:37:44 +08:00

177 lines
6.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace MES.Utility.Network.S7netplus.ORM
{
public class S7Write<T> where T : class, new()
{
private S7Client opcClient;
private T entity;
private Dictionary<string, PropertyInfo> dict;
private Dictionary<string, int> strLengthDict;
/// <summary>
/// 构造方法,传入参数
/// </summary>
/// <param name="opcClient"></param>
/// <param name="entity"></param>
public S7Write(S7Client opcClient, T entity)
{
this.opcClient = opcClient;
this.entity = entity;
//默认取出所有的只写或者可读可写的属性
GetAllKeyList(out dict, out strLengthDict);
}
/// <summary>
/// 获得所有具有可写属性的数据
/// </summary>
/// <returns></returns>
private void GetAllKeyList(out Dictionary<string, PropertyInfo> dict, out Dictionary<string, int> strLengthDict)
{
dict = new Dictionary<string, PropertyInfo>();
strLengthDict = new Dictionary<string, int>();
//获取entity对象的所有属性
PropertyInfo[] properties = typeof(T).GetProperties();
//得到所有添加注解的属性
foreach (PropertyInfo info in properties)
{
//判断是否具有HttpController属性
object[] attr = info.GetCustomAttributes(false);
if (attr.Length == 0)
{
continue;
}
//从注解数组中取第一个注解(一个属性可以包含多个注解)
S7PLCAttribute myattr = attr[0] as S7PLCAttribute;
if (myattr == null)
continue;
if (myattr.Type == S7NodeType.ReadAndWrite || myattr.Type == S7NodeType.WriteOnly)
{
dict.Add(myattr.Address, info);
strLengthDict.Add(myattr.Address, myattr.StrLength);
}
}
}
/// <summary>
/// 执行写入数据将对象中的数据写入到OPC服务中
/// </summary>
/// <param name="message">返回写入过程中出现的错误信息</param>
/// <returns></returns>
public bool Execute()
{
if (dict.Count == 0)
{
return false;
}
if (!opcClient.IsConnected)
return false;
//循环写入
try
{
bool flag;
foreach (KeyValuePair<string, PropertyInfo> keyValue in dict)
{
//判断当前keyValue是什么类型
if (keyValue.Value.PropertyType == typeof(ushort))
{
flag = opcClient.Plc.WriteInt16(keyValue.Key, (ushort)keyValue.Value.GetValue(entity));
if (!flag)
{
return false;
}
}
else if (keyValue.Value.PropertyType == typeof(int))
{
flag = opcClient.Plc.WriteInt32(keyValue.Key, (int)keyValue.Value.GetValue(entity));
if (!flag)
{
return false;
}
}
else if (keyValue.Value.PropertyType == typeof(float))
{
flag = opcClient.Plc.WriteSingle(keyValue.Key, (float)keyValue.Value.GetValue(entity));
if (!flag)
{
return false;
}
}
else if (keyValue.Value.PropertyType == typeof(string))
{
flag = opcClient.Plc.WriteString(keyValue.Key, (string)keyValue.Value.GetValue(entity), strLengthDict[keyValue.Key]);
if (!flag)
{
return false;
}
}
}
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 传入Lambda表达式指定写入的数据
/// </summary>
/// <param name="columns"></param>
/// <returns></returns>
public S7Write<T> WriteField(Expression<Func<T, object>> columns)
{
Dictionary<string, PropertyInfo> dict = new Dictionary<string, PropertyInfo>();
Dictionary<string, int> strLengthDict = new Dictionary<string, int>();
string lambda = columns.Body.ToString();
int index1 = lambda.IndexOf('(');
int index2 = lambda.IndexOf(')');
string str = lambda.Substring(index1 + 1, index2 - index1 - 1);
List<string> keyList = str.Split(',').Select(it => it.Split('=')[0].Trim()).ToList();
//获取entity对象的所有属性
PropertyInfo[] properties = typeof(T).GetProperties();
//得到所有添加注解的属性
foreach (PropertyInfo info in properties)
{
//判断是否具有HttpController属性
Object[] attr = info.GetCustomAttributes(false);
if (attr.Length == 0)
{
continue;
}
//从注解数组中取第一个注解(一个属性可以包含多个注解)
S7PLCAttribute myattr = attr[0] as S7PLCAttribute;
if (myattr == null)
continue;
if (myattr.Type == S7NodeType.ReadAndWrite || myattr.Type == S7NodeType.WriteOnly)
{
string name = info.Name;
if (keyList.Contains(name))
{
dict.Add(myattr.Address, info);
strLengthDict.Add(myattr.Address, myattr.StrLength);
}
}
}
this.dict = dict;
this.strLengthDict = strLengthDict;
return this;
}
}
}