using SHJX.Service.Control.Common.Assets; using SHJX.Service.Control.Execute.TitrationController; using shjxCamera; namespace SHJX.Service.Control.Service { public class ManualService : IManualService { private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ManualService)); #region Field private readonly IEventAggregator _ea; private readonly IDataManager _dataManager; private readonly ReadConfigUtil _readConfig; public readonly static List GraberValues = new(); public readonly static List GraberValues2 = new(); #endregion #region Property public Dictionary ManualTabItems => _readConfig.GetManualTabItem; public double DissolveTemperatureDefaultValue => _readConfig.DissolveTemperatureValue; public double TitrationTemperatureDefaultValue => _readConfig.TitrationTemperatureValue; #endregion public ManualService(IEventAggregator ea, IDataManager dataManager, ReadConfigUtil readConfig) { _ea = ea; _dataManager = dataManager; _readConfig = readConfig; Messager.Register("GraberColorValue", GetGraberValue); Messager.Register("TitrationStart", ExecuteTitrationStart); Messager.Register("TitrationStop", ExecuteTitrationStop); Messager.Register("TitrationValueChange", ExecuteTitrationValueChange); Messager.Register("GraberColorValue2", GetGraber2Value); Messager.Register("TitrationStart2", ExecuteTitration2Start); Messager.Register("TitrationStop2", ExecuteTitration2Stop); Messager.Register("Titration2ValueChange", ExecuteTitration2ValueChange); } /// /// 获取数据 /// /// public void GetGraberValue(object value) { GraberValues.Add(Convert.ToDouble(value)); _ea.GetEvent().Publish(GraberValues); _ea.GetEvent().Publish(true); } /// /// 获取数据2 /// /// public void GetGraber2Value(object value) { GraberValues2.Add(Convert.ToDouble(value)); _ea.GetEvent().Publish(GraberValues2); _ea.GetEvent().Publish(true); } /// /// 滴定开始 /// /// public void ExecuteTitrationStart(object value) { try { GraberValues.Clear(); _ea.GetEvent().Publish(true); } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 滴定2开始 /// /// public void ExecuteTitration2Start(object value) { try { GraberValues.Clear(); _ea.GetEvent().Publish(true); } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 滴定结束 /// /// public void ExecuteTitrationStop(object value) { try { GraberValues.Clear(); _ea.GetEvent().Publish(false); } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 滴定2结束 /// /// public void ExecuteTitration2Stop(object value) { try { GraberValues2.Clear(); _ea.GetEvent().Publish(false); } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 滴定改变 /// public void ExecuteTitrationValueChange(TitrationValueArgs arg) { _ea.GetEvent().Publish(arg); } /// /// 滴定2改变 /// public void ExecuteTitration2ValueChange(Titration2ValueArgs arg) { _ea.GetEvent().Publish(arg); } public List GetData() where T : class => _dataManager.Query().ToList(); public bool UpdateData(T t) where T : class => _dataManager.Update(t) > 0; public bool UpdateAreaAllData(EquipmentArea name) { DetailState flag = DetailState.Init; int flag2 = 1; if (!name.Enable) { flag = DetailState.Doing; flag2 = 0; } _dataManager.Update().Where(it => it.NodeName.Equals(name.PointName)).SetValues(it => it.TaskStatus.Set(flag) && it.DetailInfo.Set("")).Execute(); _dataManager.Update().Where(it => it.PositionName.Equals(name.PointName)).SetValues(it => it.CurrentOccupy.Set(string.Empty) && it.Enable.Set(flag2)).Execute(); List names = new List(); names.Add(name); _ea.GetEvent().Publish(names); return true; } public async Task ManualWriteRegisterAsync(string name, double value) { return await Task.Factory.StartNew(() => { bool res = ExecuteCommand.RegisterExecute(EquipmentNames.Timer, 1); //开启计时器 return res && ExecuteCommand.RegisterExecute(name, value); //写入 }); } public async Task ManualWriteMoveToMotorAsync(string name, double value, MotorManualMoveType type) { return await Task.Factory.StartNew(() => { MotorConvert convert = _dataManager.Query().ToList()?.FirstOrDefault(item => item.MotorName.Equals(name)); if (convert is null) { return false; } //if (value > 1000 && name.In(EquipmentNames.AxisX, EquipmentNames.AxisY)) //这段代码是xy移动距离大于1000前要看z是否回到原点 //{ // char[] judgeRes = EquipmentNames.AxisZ.MotorRead(); // if (judgeRes is null or { Length: 0 }) // { // return false; // } // if (!judgeRes[3 - 1].Equals('0')) // { // EquipmentNames.AxisZ.MotorGoBack(); // } //} bool res = name.LiquidMotorMove(Convert.ToInt32(Math.Round(value * convert.ConvertRatio))); MotorMoveStatus status = _dataManager.Query().ToList()?.FirstOrDefault(item => item.MotorName.Equals(name)); if (status is null) { return res; } if (res) { switch (type) { case MotorManualMoveType.Forward: status.CurrentPosition += Math.Abs(value); break; case MotorManualMoveType.Inversion: status.CurrentPosition -= Math.Abs(value); if (status.CurrentPosition < 0) { status.CurrentPosition = 0; } break; } _dataManager.Update(status); } return res; }); } public async Task ManualWriteMoveToDMotor(string name, double value, MotorManualMoveType type) { return await Task.Factory.StartNew(() => { MotorConvert convert = _dataManager.Query().ToList()?.FirstOrDefault(item => item.MotorName.Equals(name)); if (convert is null) { return false; } MotorMoveStatus status = _dataManager.Query().ToList()?.FirstOrDefault(item => item.MotorName.Equals(name)); if (status is null) { return false; } bool res = name.LiquidMotorMove(Convert.ToInt32(Math.Round(-1*(Math.Abs(value) - status.CurrentPosition ) * convert.ConvertRatio))); if (res) { switch (type) { case MotorManualMoveType.Forward: status.CurrentPosition = Math.Abs(value); break; } _dataManager.Update(status); } return res; }); } public async Task MotorGoBackAsync(string name) { return await Task.Factory.StartNew(() => { return ExecuteCommand.MotorGoBackExecute(name); }); } public bool MotorStop(string name) => name.MotorStop(); public async Task UpdateSpeedAsync(string name) { return await Task.Factory.StartNew(() => { MotorSpeed speed = _dataManager.Query().Where(it => it.DetailName.Equals(name)).First(); bool res = speed.SystemName.WriteSpeed(speed.Speed); res = res && speed.SystemName.WriteAcSpeed(speed.AcSpeed); res = res && speed.SystemName.WriteDeSpeed(speed.DeSpeed); return res; }); } public bool ManualControlRegister(string typeName, RegisterExecuteType type) { bool res = type switch { RegisterExecuteType.Open => typeName.RegisterOpen(), RegisterExecuteType.Close => typeName.RegisterClose(), _ => throw new ArgumentNullException(typeName), }; return res; } public bool ManualSettingPID(string type, object value) { bool res = type.ToLower() switch { "ratio" => EquipmentNames.DissolveHeating.WriteRatio(value), "integral" => EquipmentNames.DissolveHeating.WriteIntegral(value), "differential" => EquipmentNames.DissolveHeating.WriteDifferential(value), "integraldeafult" => EquipmentNames.DissolveHeating.WriteIntegralDeafult(value), _ => throw new ArgumentException("未找到对应PID项定义") }; return res; } public bool ManualSettingTemp(object value) { return EquipmentNames.DissolveHeating.WriteTemperature(value); } public async Task ManualDirectOutLiquidAsync(string type, object value) { return await Task.Factory.StartNew(() => { return type.LiquidMotorMove(Convert.ToInt32(Math.Round(Convert.ToDouble(value)))); }); } //public static async Task ManualLiquidExecuteStatic(string pumpName, LiquidSwitchPattern pattern, object value) //{ // return await Task.Factory.StartNew(() => // { // return LiquidPipeSwitch.StartNew.SetLiquidName(pumpName).Execute(pattern, value); // }); //} public async Task ManualLiquidExecute(string pumpName, LiquidSwitchPattern pattern, object value) { return await Task.Factory.StartNew(() => { return LiquidPipeSwitch.StartNew.SetLiquidName(pumpName).Execute(pattern, value); }); } public async Task ManualLiquidExecuteOxalate(string pumpName, LiquidSwitchPattern pattern, object value) { return await Task.Factory.StartNew(() => { return LiquidPipeSwitchOxalate.StartNew.SetLiquidName(pumpName).ExecuteOxalate(pattern, value); }); } public LiquidAmount GetOnceDropLiquidAmount() { LiquidAmount liquid = _dataManager.Query().Where(it => it.LiquidName.Equals(EquipmentNames.Titration1PotassiumPermanganate)).First(); return liquid; } public void ManualExecuteTitration(TitrationArg arg) { double amount = 0.0; TitrationExecute.Start(arg, ref amount); } public void ManualExecuteTitrationStop() { TitrationExecute.Running = false; } public void ManualExecuteExplosion(int MaxCameraRange) { ColorDataGraber _graber = Globals.Graber; CameraValue explosion = _dataManager.Query().First(); _graber.PresetLightParammanual(explosion, MaxCameraRange); } public void ManualExecuteTitration2(Titration2Arg arg) { double amount = 0.0; Titration2Execute.Start(arg, ref amount); } public void ManualExecuteTitration2Stop() { Titration2Execute.Running = false; } public void ManualExecuteExplosion2(int MaxCameraRange) { ColorData2Graber _graber = Globals.Graber2; Camera2Value explosion= _dataManager.Query().First(); _graber.PresetLightParammanual(explosion, MaxCameraRange); } public void ManualcheckParams2() { ColorData2Graber _graber = Globals.Graber2; _graber.ShowParammanual(); } public void ManualcheckParams() { ColorDataGraber _graber = Globals.Graber; _graber.ShowParammanual(); } /// /// 计算k值 /// /// public double CalculationKValue() { List tasks = _dataManager.Query().Where(it => it.TaskType.Equals(TaskTypeName.CALIBRATION_ZH)).With(a => a.WaveKey, b => b.WaveKey, _dataManager.Query().Where(it => it.TaskType.Equals(TaskTypeName.CALIBRATION_ZH) && it.Status.Equals(TaskState.Finished)).OrderBy(it => it.CreateTime, OrderPattern.Desc).Take(1), WithPattern.Equals).ToList(); if (!tasks.Any()) { return 0; } double volumeSum = 0.0; foreach (EquipmentTask task in tasks) { volumeSum += task.Amount; } if (volumeSum.Equals(0)) { return 0; } double avgRes = volumeSum / tasks.Count; double returnResult = 10 / avgRes; return Math.Round(returnResult,3); } public Task ElectricDropper(string EpType, RegisterExecuteType type) { bool res = type switch { RegisterExecuteType.Open => DropperForward(EpType), RegisterExecuteType.Close => DropperInversion(EpType), RegisterExecuteType.Point => DropperPoint(EpType), _ => throw new ArgumentOutOfRangeException(nameof(type)), }; return Task.FromResult(res); } public Task ElectricDropperFind(string EpType, RegisterExecuteType type) { bool res = type switch { RegisterExecuteType.Open => DropperForward(EpType), RegisterExecuteType.Close => DropperInversion(EpType), _ => throw new ArgumentOutOfRangeException(nameof(type)), }; return Task.FromResult(res); } private static bool DropperForward(string elementName) { char[] readData2 = $"{elementName}Dropper".MotorRead(); if (readData2 is null or not { Length: 8 }) { return false; } if (readData2[5 - 1].Equals('0')) { $"{elementName}DropperForward".RegisterOpen(); Thread.Sleep(200); $"{elementName}DropperInversion".RegisterOpen(); bool res = true; do { Thread.Sleep(200); char[] readData = $"{elementName}Dropper".MotorRead(); if (readData is null or not { Length: 8 }) { continue; } res = readData[6 - 1].Equals('0'); } while (!res); $"{elementName}DropperInversion".RegisterClose(); Thread.Sleep(200); $"{elementName}DropperForward".RegisterClose(); return true; } else return false; } public static bool DropperInversion(string elementName) { char[] readData2 = $"{elementName}Dropper".MotorRead(); if (readData2 is null or not { Length: 8}) { return false; } if (readData2[6 - 1].Equals('0')) { bool res = $"{elementName}DropperInversion".RegisterOpen(); do { Thread.Sleep(200); char[] readData = $"{elementName}Dropper".MotorRead(); if (readData is null or not { Length: 8 }) { continue; } res = readData[5 - 1].Equals('0'); } while (!res); $"{elementName}DropperInversion".RegisterClose(); return res; } else return false; } public static bool DropperPoint(string elementName) { char[] readData2 = $"{elementName}Dropper".MotorRead(); if (readData2 is null or not { Length: 8 }) { return false; } bool res = $"{elementName}DropperInversion".RegisterOpen(); do { Thread.Sleep(200); char[] readData = $"{elementName}Dropper".MotorRead(); if (readData is null or not { Length: 8 }) { continue; } res = readData[5 - 1].Equals('0'); } while (!res); $"{elementName}DropperInversion".RegisterClose(); return res; } } }