using Admin.Core.Common.Helper; using Admin.Core.IRepository; using Admin.Core.IService; using Admin.Core.Model; using Admin.Core.Model.Model_New; using Aucma.Core.HwPLc; using Newtonsoft.Json; using StackExchange.Profiling.Internal; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Aucma.Core.Tasks.Business { /// /// 采集灌注数据 /// public class PerfusionCollection { Semaphore semaphore = new Semaphore(1, 1); protected readonly IPerfusionRecordServices? _perfusionRecordServices; protected readonly IPerfusionAlarmServices? _perfusionAlarmServices; protected readonly IPerfusionDeviceStatusServices? _perfusionDeviceStatusServices; private readonly IMaterialCompletionServices _materialCompletionServices; private readonly IPrintBarCodeServices _printBarCodeServices; bool flag = true; private static System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); private Perfusion_Record record; private Perfusion_Record temprRecord; private Perfusion_DeviceStatus perfusion_DeviceStatus = new Perfusion_DeviceStatus(); private Perfusion_Alarm perfusion_Alarm = new Perfusion_Alarm(); public PerfusionCollection(IPerfusionRecordServices perfusionRecordServices, IPerfusionAlarmServices perfusionAlarmServices, IPerfusionDeviceStatusServices perfusionDeviceStatusServices, IMaterialCompletionServices materialCompletionServices, IPrintBarCodeServices printBarCodeServices) { _perfusionRecordServices = perfusionRecordServices; _perfusionAlarmServices = perfusionAlarmServices; _perfusionDeviceStatusServices = perfusionDeviceStatusServices; _materialCompletionServices = materialCompletionServices; _printBarCodeServices = printBarCodeServices; startCollect(); } public void startCollect() { Task.Run(() => { Thread.Sleep(3000); Console.WriteLine($"【{DateTime.Now}】》灌注数据采集服务开启"); var obj = PlcHelper.siemensList.FirstOrDefault(d => d.EquipName.Equals("PerfusionPlc")); if (obj != null) { while (true) { if (flag) { flag = false; try { bool signal = obj.plc.ReadBool("DB55.84.0"); if (signal == false) { Console.WriteLine($"【{DateTime.Now}】》当前灌注采集信号:{signal}"); Thread.Sleep(1000); continue; } Console.WriteLine($"【{DateTime.Now}】》当前灌注采集信号:{signal}"); Console.WriteLine($"【{DateTime.Now}】》灌注数据开始采集"); //采集数据 record = ReadEquipSystem(obj, record, perfusion_DeviceStatus, perfusion_Alarm); if (record == null) continue; if (string.IsNullOrEmpty(record.PerfusionBoxCode)) continue; Console.WriteLine($"【{DateTime.Now}】》灌注数据条码:[{record.PerfusionBoxCode}],灌注状态:[{record.PerfusionResult}]"); var tempRecord = _perfusionRecordServices.FirstAsync(d => d.PerfusionBoxCode.Equals(record.PerfusionBoxCode) && d.PerfusionResult == record.PerfusionResult).Result; if (tempRecord != null) { Console.WriteLine($"【{DateTime.Now}】》灌注数据条码:[{record.PerfusionBoxCode}],灌注结果:[{record.PerfusionResult}],已存在系统中"); Thread.Sleep(1000); continue; } #region 更新设备状态 Perfusion_DeviceStatus device = _perfusionDeviceStatusServices.FirstAsync().Result; if (device == null) { _ = _perfusionDeviceStatusServices.AddAsync(perfusion_DeviceStatus).Result; } else { device.PerfusionStatus = perfusion_DeviceStatus.PerfusionStatus; var rsult = _perfusionDeviceStatusServices.UpdateAsync(device).Result; } #endregion #region 更新报警信息 if (perfusion_Alarm.PerfusionStatus > 0) { int a = _perfusionAlarmServices.AddAsync(perfusion_Alarm).Result; } #endregion //充注结束 int result = _perfusionRecordServices.AddAsync(record).Result; if (result == 0) { //添加过点数 if (record.PerfusionResult==8) { InsertToCompleteAndCheck(record); } Console.WriteLine(record.ToJson()); } bool r = obj.plc.WriteBool("DB55.84.0", false);//存盘成功写入bool Console.WriteLine($"【{DateTime.Now}】》灌注数据采集结束写入复位信号{r}"); } catch (Exception ex) { Console.WriteLine(ex); } finally { flag = true; } } } } }); } /// /// 采集灌注参数 /// /// static Perfusion_Record ReadEquipSystem(Aucma.Core.HwPLc.PlcModel obj, Perfusion_Record record, Perfusion_DeviceStatus deviceStatus, Perfusion_Alarm alarmInfo) { record = new Perfusion_Record(); byte[] info = obj.plc.Read("DB55.0", 84); byte[] codeInfo = obj.plc.Read("DB60.0", 46); if (info == null) return null; #region 灌注记录赋值 record.PerfusionActualVolume = byteToDouble(info.Skip(0).Take(8).ToArray()).ToString().Replace("\0", ""); record.PerfusionR = byteToFloat(info.Skip(8).Take(4).ToArray()).ToString().ToString().Replace("\0", ""); record.PerfusionL = byteToFloat(info.Skip(54).Take(4).ToArray()).ToString().Replace("\0", ""); record.PerfusionDuration = int.Parse(StringChange.bytesToHexStr(info.Skip(12).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber).ToString().Replace("\0", ""); record.Yield = int.Parse(StringChange.bytesToHexStr(info.Skip(16).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber).ToString().Replace("\0", ""); record.PerfusionBoxCode = asciiEncoding.GetString(codeInfo.Skip(2).Take(22).ToArray()).Trim('\n').Replace("\0", ""); record.PerfusionRefrigerantTypeLeft = asciiEncoding.GetString(codeInfo.Skip(28).Take(7).ToArray()).Trim('\n').Replace("\0", ""); record.PerfusionRefrigerantTypeRight = asciiEncoding.GetString(codeInfo.Skip(38).Take(7).ToArray()).Trim('\n').Replace("\0", ""); record.PerfusionSetVolume = byteToFloat(info.Skip(78).Take(4).ToArray()).ToString().Replace("\0", ""); record.PerfusionSystem = short.Parse(StringChange.bytesToHexStr(info.Skip(82).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber).ToString().Replace("\0", ""); ///灌注完成状态字 record.PerfusionFinishStatus = short.Parse(StringChange.bytesToHexStr(info.Skip(46).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber).ToString().Replace("\0", ""); 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 // Console.WriteLine("灌注记录:" + record.ToJson()); #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 // Console.WriteLine("设备状态:" + deviceStatus.ToJson()); #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 // Console.WriteLine("报警信息:" + alarmInfo.ToJson()); // Console.WriteLine("\n"); return record; } 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); // 只保留两位小数 // string str = result.ToString("0.00"); return result; } /// /// byte数组转换为double /// static double byteToDouble(byte[] list) { double result = 0; Array.Reverse(list); result = BitConverter.ToDouble(list, 0); return result; } #endregion #region 保存过点数和测温质检 /// /// 保存过点数和测温质检 /// /// /// public bool InsertToCompleteAndCheck(Perfusion_Record record) { var printBarCodeList = _printBarCodeServices.QueryAsync().Result; PrintBarCode barcode = printBarCodeList.First(d => d.MaterialBarcode == record.PerfusionBoxCode); if (barcode == null) return false; #region 更新过点数据 MaterialCompletion completion = new MaterialCompletion(); completion.OrderCode = barcode.OrderCode; completion.MaterialBarcode = record.PerfusionBoxCode; completion.MaterialCode = barcode.MaterialCode; completion.MaterialName = barcode.MaterialName; completion.StationName = "测温检验01"; completion.ProductLineCode = "CX_02"; completion.CompleteDate = DateTime.Now; #endregion int r = _materialCompletionServices.AddAsync(completion).Result; if (r > 0) return true; else return false; } #endregion } }