using Admin.Core.Common.Helper; using Admin.Core.IRepository; using Admin.Core.IService; using Admin.Core.Model; using Admin.Core.Model.Model_New; using Admin.Core.Repository; using Admin.Core.Service; using Aucma.Core.HwPLc; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Aucam.Core.PerfusionService.Business { /// /// 采集灌注数据 /// public class PerfusionCollection { Semaphore semaphore = new Semaphore(1, 1); protected readonly IPerfusionRecordServices? _perfusionRecordServices ; protected readonly IPerfusionAlarmServices ?_perfusionAlarmServices; protected readonly IPerfusionDeviceStatusServices? _perfusionDeviceStatusServices; private static System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); private Perfusion_Record record = new Perfusion_Record(); private Perfusion_Record temprRecord; private Perfusion_DeviceStatus perfusion_DeviceStatus = new Perfusion_DeviceStatus(); private Perfusion_Alarm perfusion_Alarm = new Perfusion_Alarm(); public PerfusionCollection(PerfusionRecordServices perfusionRecordServices, IPerfusionAlarmServices perfusionAlarmServices, IPerfusionDeviceStatusServices perfusionDeviceStatusServices) { _perfusionRecordServices = perfusionRecordServices; _perfusionAlarmServices = perfusionAlarmServices; _perfusionDeviceStatusServices = perfusionDeviceStatusServices; startCollect(); } public void startCollect() { Task.Run(() => { while (true) { semaphore.WaitOne(); try { Thread.Sleep(3000); var obj = PlcHelper.siemensList.FirstOrDefault(d => d.EquipName.Equals("PerfusionPlc")); if (obj != null && obj.plc.IsConnected) { //采集数据 ReadEquipSystem(obj,record, perfusion_DeviceStatus, perfusion_Alarm); //更新设备状态 // _perfusionDeviceStatusServices.UpdateAsync; // 更新报警信息 //充注结束 if (record.PerfusionFinishStatus == "1") { //缓存没数据查数据库 if(temprRecord == null) { Perfusion_Record lastRecord = _perfusionRecordServices.Query(d => d.PerfusionBoxCode.Equals(record.PerfusionBoxCode)).FirstOrDefault(); // 数据库没有数据 if (lastRecord == null) { _= _perfusionRecordServices.AddAsync(record).Result; return; } } // 箱体码和上次不一样,或者箱体码一样但是充铸结果不一样 else if(temprRecord.PerfusionBoxCode!=record.PerfusionBoxCode || (temprRecord.PerfusionBoxCode == record.PerfusionBoxCode && temprRecord.PerfusionResult!=record.PerfusionResult) ) { _ = _perfusionRecordServices.AddAsync(record).Result; } } } } catch (Exception ex) { Console.WriteLine(ex); } finally { temprRecord = record; semaphore.Release(); } } }); } /// /// 采集灌注参数 /// /// static void ReadEquipSystem(Aucma.Core.HwPLc.PlcModel obj, Perfusion_Record record, Perfusion_DeviceStatus deviceStatus, Perfusion_Alarm alarmInfo) { byte[] info = obj.plc.Read("DB55.0", 84); if (info == null) return; #region 灌注记录赋值 record.PerfusionActualVolume=byteToDouble(info.Skip(0).Take(8).ToArray()).ToString(); record.PerfusionR = byteToDouble(info.Skip(8).Take(4).ToArray()).ToString().ToString(); record.PerfusionL = byteToFloat(info.Skip(55).Take(4).ToArray()).ToString(); record.PerfusionDuration = int.Parse(StringChange.bytesToHexStr(info.Skip(12).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber).ToString(); record.Yield = int.Parse(StringChange.bytesToHexStr(info.Skip(16).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber).ToString(); record.PerfusionBoxCode = asciiEncoding.GetString(info.Skip(20).Take(24).ToArray()).Replace("\0", "").Trim('\n'); record.PerfusionRefrigerantTypeLeft = asciiEncoding.GetString(info.Skip(58).Take(7).ToArray()).Trim('\n'); record.PerfusionRefrigerantTypeRight = asciiEncoding.GetString(info.Skip(68).Take(7).ToArray()).Trim('\n'); record.PerfusionSetVolume = byteToFloat(info.Skip(78).Take(4).ToArray()).ToString(); record.PerfusionSystem =short.Parse(StringChange.bytesToHexStr(info.Skip(82).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber).ToString(); ///灌注完成状态字 record.PerfusionFinishStatus = short.Parse(StringChange.bytesToHexStr(info.Skip(46).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber).ToString(); record.PerfusionResult = short.Parse(StringChange.bytesToHexStr(info.Skip(48).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber); record.CreatedBy = "equip"; record.CreatedTime = DateTime.Now; record.UpdatedBy = "equip"; record.UpdatedTime = DateTime.Now; #endregion #region 设备状态赋值 deviceStatus.PerfusionDevicetype = "灌注"; deviceStatus.PerfusionStatus = short.Parse(StringChange.bytesToHexStr(info.Skip(50).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber); deviceStatus.CreatedBy = "equip"; deviceStatus.CreatedTime = DateTime.Now; deviceStatus.UpdatedBy = "equip"; deviceStatus.UpdatedTime = DateTime.Now; #endregion #region 设备报警赋值 alarmInfo.PerfusionBoxcode = record.PerfusionBoxCode; alarmInfo.PerfusionStatus = short.Parse(StringChange.bytesToHexStr(info.Skip(52).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber); alarmInfo.PerfusionAlarm = AlarmTrans(alarmInfo.PerfusionStatus); alarmInfo.PerfusionCompleted = "1"; alarmInfo.CreatedBy = "equip"; alarmInfo.CreatedTime = DateTime.Now; alarmInfo.UpdatedBy = "equip"; alarmInfo.UpdatedTime = DateTime.Now; #endregion } static string AlarmTrans(short code) { string result = ""; switch (code) { case 2: result = "充注枪真空不合格"; break; case 4: result = "充注故障"; break; case 8: result = "充注时真空度超限定"; break; case 16: result = "回升检测不合格"; break; case 32: result = "工件真空不合格"; break; case 64: result = "平衡缸接近开关异常"; break; case 128: result = "增压超时"; break; case 256: result = "风压不足"; break; } return result; } #region 字符工具转换方法 /// byte[]转十进制ascii码 /// /// static string ByteArrayToString(byte[] bytes) { string result = string.Empty; foreach (byte b in bytes) { int decimalValue = Convert.ToInt32(b); // 将字节转换为十进制值 result += decimalValue; } return result; } /// /// byte[]转二进制 /// /// static string ByteArrayToBinary(byte[] bytes) { StringBuilder binaryString = new StringBuilder(); foreach (byte b in bytes) { binaryString.Append(Convert.ToString(b, 2).PadLeft(8, '0')); } // Console.WriteLine(binaryString); string reversedStr = new string(binaryString.ToString().Reverse().ToArray()); // Console.WriteLine(reversedStr); return reversedStr; } /// /// 根据二进制字符串确定夹具状态 1正常生产 2暂停生产 /// static int judgeStatus(string str1) { int item1 = 0; if (str1.Substring(0, 1) == "1") { item1 = 1; // } else if (str1.Substring(1, 1) == "1") { item1 = 2; // } return item1; } /// /// byte数组转换为float /// static float byteToFloat(byte[] list) { float result = 0.00f; Array.Reverse(list); result = BitConverter.ToSingle(list, 0); return result; } /// /// byte数组转换为float /// static double byteToDouble(byte[] list) { double result = 0; Array.Reverse(list); result = BitConverter.ToDouble(list, 0); return result; } #endregion } }