using Admin.Core.IService.IService_New; using Admin.Core.Model.Model_New; using Aucma.Core.DataCollector.Factory; using Aucma.Core.HwPLc; using log4net; using NPOI.SS.Formula.Functions; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Aucma.Core.DataCollector { /// /// 设备数据采集 /// public abstract class DataCollectorFactory { public readonly log4net.ILog _logger = LogManager.GetLogger(typeof(DataCollectorFactory)); public readonly IBaseDeviceParamServices _deviceParamServices; public readonly IRecordDeviceAlarmInfoServices _deviceAlarmInfoServices; public readonly IRecordDeviceElectricityServices _deviceElectricityServices; public int AlarmReadTimer = (1000 * 5); public int EleReadTimer = (1000 * 60 * 5); public DataCollectorFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) { _deviceParamServices = deviceParamServices; _deviceAlarmInfoServices = deviceAlarmInfoServices; _deviceElectricityServices = deviceElectricityServices; } /// /// 采集设备报警信息 /// /// public abstract void CollectDeviceAlarmInfo(out List deviceAlarmInfos); /// /// 采集设备用电 /// /// public abstract void CollectDeviceElectricity(out List deviceElectricitys); /// /// 根据PLC地址读取设备用电 /// /// /// /// public void ReadDeviceElectricity(string[] address,IPlc plc,ref Record_DeviceElectricity deviceElectricity) { var ground = plc.ReadRandomInt32(address); if (ground != null) { if (ground.Length >= 10) { var info = ParseAndReverseByteArray(ground, 0, address.Length * 2); if(info != null) { if(info.Length >= 10) { //deviceElectricity.Glys = ground[0]; deviceElectricity.Va = (decimal)info[0]/100; deviceElectricity.Vb = (decimal)info[1]/100; deviceElectricity.Vc = (decimal)info[2]/100; deviceElectricity.Ia = (decimal)info[6]/100; deviceElectricity.Ib = (decimal)info[7]/100; deviceElectricity.Ic = (decimal)info[8]/100; deviceElectricity.Zxyg = (decimal)info[9]/100; deviceElectricity.CollectType = 0; deviceElectricity.CollectTime = DateTime.Now; deviceElectricity.RecordTime = DateTime.Now; } } } } else { deviceElectricity = null; } } /// /// 读取PLC数据 /// /// /// /// /// public void ReadParamValueByPlc(IPlc _plc, string addr, string dataType, out int paramValue) { object result = null; switch (dataType) { case "int": result = _plc.ReadInt16(addr); break; case "float": result = _plc.ReadFloat(addr); break; case "bool": result = _plc.ReadBool(addr); break; default: result = _plc.ReadInt16(addr); break; } if (result == null) { result = "0"; } paramValue = Convert.ToInt32(result); } /// /// 电表数据解析 /// /// /// /// /// /// private int[] ParseAndReverseByteArray(byte[] data, int startIndex, int length) { if (data == null || data.Length < startIndex + length) { throw new ArgumentException("Invalid data or startIndex/length parameter."); } int[] resultArray = new int[length / 2]; for (int i = 0; i < resultArray.Length; i++) { byte[] subset = new byte[2]; Array.Copy(data, startIndex + (i * 2), subset, 0, 2); Array.Reverse(subset); string hexString = BitConverter.ToString(subset).Replace("-", ""); resultArray[i] = Convert.ToInt32(hexString, 16); } return resultArray; } } }