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 S7Read where T : class, new() { private S7Client opcClient; private Dictionary fieldDict; private Dictionary stringLengthDict; /// /// 构造方法,传入参数 /// /// public S7Read(S7Client opcClient) { this.opcClient = opcClient; //默认取出所有的只读或者可读可写的属性 GetNodeType(out fieldDict, out stringLengthDict); } /// /// 获得所有具有可读属性的数据 /// /// private void GetNodeType(out Dictionary fieldDict, out Dictionary stringLengthDict) { fieldDict = new Dictionary(); stringLengthDict = new Dictionary(); //获得对象T的属性 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.ReadOnly) { fieldDict.Add(myattr.Address, info); stringLengthDict.Add(myattr.Address, myattr.StrLength); } } } /// /// 执行获得数据,映射成对象 /// /// 返回错误信息 /// public bool Execute(out T t) { if (fieldDict.Count == 0) { t = default(T); return false; } try { if (!opcClient.IsConnected) { t = default(T); return false; } bool flag = false; T entity = (T)Activator.CreateInstance(typeof(T)); //循环读取每一个 foreach (KeyValuePair keyValue in fieldDict) { //判断当前keyValue是什么类型 if (keyValue.Value.PropertyType == typeof(ushort)) { ushort value=0; flag = opcClient.Plc.ReadInt16(keyValue.Key, out value); if (!flag) { t = default(T); return false; } keyValue.Value.SetValue(entity, value); } else if (keyValue.Value.PropertyType == typeof(int)) { ushort value =0; flag = opcClient.Plc.ReadInt16(keyValue.Key, out value); if (!flag) { t = default(T); return false; } keyValue.Value.SetValue(entity, value); } //else if (keyValue.Value.PropertyType == typeof(float)) //{ // float value; // flag = opcClient.Plc.ReadReal(keyValue.Key, out value); // if (!flag) // { // t = default(T); // return false; // } // keyValue.Value.SetValue(entity, value); //} else if (keyValue.Value.PropertyType == typeof(string)) { string value; flag = opcClient.Plc.ReadString(keyValue.Key, stringLengthDict[keyValue.Key], out value); if (!flag) { t = default(T); return false; } keyValue.Value.SetValue(entity, value); } } t = entity; return true; } catch { t = default(T); return false; } } /// /// 传入Lambda表达式,指定读取的数据 /// /// /// public S7Read ReadField(Expression> columns) { Dictionary fieldDict = new Dictionary(); Dictionary stringLengthDict = new Dictionary(); //取出要读的属性 string lambda = columns.Body.ToString(); int index1 = lambda.IndexOf('('); int index2 = lambda.IndexOf(')'); string str = lambda.Substring(index1 + 1, index2 - index1 - 1); List keyList = str.Split(',').Select(it => it.Split('=')[0].Trim()).ToList(); fieldDict.Clear(); //获得对象T的属性 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.ReadOnly) { if (keyList.Contains(info.Name)) { fieldDict.Add(myattr.Address, info); stringLengthDict.Add(myattr.Address, myattr.StrLength); } } } this.fieldDict = fieldDict; this.stringLengthDict = stringLengthDict; return this; } } }