using iWareCommon.Common.Globle; using iWareCommon.Utils; using iWareModel; using System; using System.Linq; using System.Reflection; using System.Text; namespace iWareSda.Common { public static class SdaHelper { /// /// 根据DB块地址 赋值DB块的实际值 /// /// 地址对象 /// 目标对象 /// 地址对象 /// 目标对象 /// PLC服务对象 /// 地址头的字符串,如果是西门子的PLC,要为空,罗克韦尔的要有 /// 是否是罗克韦尔的PLC public static void SetPropertyValueForDB(T1 t1, T2 t2, PLCService plcService, string dbHeader, bool isAllenBradley = false) { string proValues = ""; try { //this.R_HandShake = Convert.ToInt16(this.S7.ReadValuePoint(r_dbHeader, r_dbBlock.R_HandShake, typeof(short)));//例子 //遍历T2里面的属性 PropertyInfo[] t2_pros = typeof(T2).GetProperties(); //遍历T1里面的属性 PropertyInfo[] t1_pros = typeof(T1).GetProperties(); var dbAddressValue = "";//获取DB块的地址 PropertyInfo t2Pro; string[] arr = new string[2];//属性值 foreach (var t1_pro in t1_pros) { //获取该属性的值 if (isAllenBradley) {//如果是罗克韦尔的PLC,地址就是他的名字 dbAddressValue = t1_pro.Name; } else { proValues = t1_pro.GetValue(t1, null).ToString(); arr = proValues.Split(WareSdaStruct.PLCDBADDRESS_SEPARATE); if (arr.Length != 2) { continue;//继续下一个循环 } dbHeader = arr[0]; dbAddressValue = arr[1]; } if (!string.IsNullOrEmpty(dbAddressValue)) {//当地址不为空的时候才去获取值 t2Pro = t2_pros.First(x => x.Name == t1_pro.Name); if (t2Pro.PropertyType == typeof(short)) { t2Pro.SetValue(t2, Convert.ToInt16(plcService.ReadValuePoint(dbHeader, dbAddressValue, typeof(short)))); } else if (t2Pro.PropertyType == typeof(int)) { t2Pro.SetValue(t2, Convert.ToInt32(plcService.ReadValuePoint(dbHeader, dbAddressValue, typeof(int)))); } else if (t2Pro.PropertyType == typeof(bool)) { t2Pro.SetValue(t2, Convert.ToBoolean(plcService.ReadValuePoint(dbHeader, dbAddressValue, typeof(bool)))); } else if (t2Pro.PropertyType == typeof(float)) { float aa = Convert.ToSingle(plcService.ReadValuePoint(dbHeader, dbAddressValue, typeof(float))); t2Pro.SetValue(t2, aa); } else if (t2Pro.PropertyType == typeof(string)) {//增加stirng支持 【EditBy shaocx,2022-04-22】 object aa = plcService.ReadValuePoint(dbHeader, dbAddressValue, typeof(string)); t2Pro.SetValue(t2, aa == null ? "" : aa.ToString()); } } } } catch (Exception ex) { var bb = proValues; throw ex; } } /// /// 获取实时的PLC值,并转为字符串 /// /// /// /// /// /// /// /// 西门子PLC可以为空 /// 西门子PLC可以为空 /// /// /// public static string GetStrShow(T t, TWrite t_write, TRead t_read, string header_write, string header_read, int deviceId, string deviceName) { var pros = ClassHelper.GetPropertieModels(t); StringBuilder sb = new StringBuilder(); sb.Append(string.Format("===================================设备号{0},设备名{1}=================================== \r\n", deviceId, deviceName)); var pros_writes = ClassHelper.GetPropertieModels(t_write); var pros_reads = ClassHelper.GetPropertieModels(t_read); PropertieModel pros_read = null; PropertieModel pros_write = null; string dbAddress = ""; foreach (var item in pros) { dbAddress = ""; //获取 TWrite和TRead的对象 pros_read = pros_reads.Where(x => x.PropertyName == item.PropertyName).FirstOrDefault(); if (pros_read != null) { if (string.IsNullOrEmpty(header_read)) { dbAddress = pros_read.DataValue; } else { dbAddress = header_read + "___" + pros_read.DataValue; } } else { pros_write = pros_writes.Where(x => x.PropertyName == item.PropertyName).FirstOrDefault(); if (pros_write != null) { if (string.IsNullOrEmpty(header_write)) { dbAddress = pros_write.DataValue; } else { dbAddress = header_write + "___" + pros_write.DataValue; } } } sb.Append(string.Format("{0}:{1} address:{2} value:{3} \r\n", item.DescriptionName, item.PropertyName, dbAddress, item.DataValue)); } return sb.ToString(); } /// /// 获取PLC的库存信息 /// /// /// /// public static string GetStrShowForStock(string header_write, PLCService S7) { StringBuilder sb = new StringBuilder(); string dbAddress = ""; short value = 0; foreach (var item in SysGloble.offsetPlaceNoDict) { dbAddress = ""; value = 0; dbAddress = header_write + "___" + item.Value; //读取他的PLC值 value = Convert.ToInt16(S7.ReadValuePoint(header_write, item.Value.ToString(), typeof(short))); sb.Append(string.Format("{0} : {1} address:{2}\r\n", item.Key, value, dbAddress)); } return sb.ToString(); } } }