using CliWrap.Buffered; using Ips.DevAlgorithm; using Ips.Library.Basic; using Ips.Library.DxpLib; using Ips.Library.Entity; using Ips.Library.LocLib; using Ips.Sps.Cfqs; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ips.Sps.Scheduling.SigAds { public class AdSigUtil { public static AdcAndCfgOptions GetAdcAndCfqOptions(RunAdCard adCard, RunSig sig, bool sp4m = false) { var adcOpt = new AdcOptions() { CardType = adCard.CardType, ClockType = adCard.ClockType, TriggerMode = adCard.TriggerMode, DdcFreq = adCard.DdcFreq, ClockFreq = adCard.ClockFreq, Mutil = SigCalcUtil.CalcMutil(adCard.ClockFreq, sig.BandWidth, sp4m), TimeLen = sig.SigLen, StorePath = adCard.StorePath, CardCode = adCard.CardCode, }; var cfqList = new List(); FreqPointInfo mainSatFreq = null; if (sig.MainSatId > 0) { var ch = adCard.Channels.Find(m => m.Sats.Any(sat => sat.SatId == sig.MainSatId)); if (ch != null) { var sat = ch.Sats.Find(m => m.SatId == sig.MainSatId); mainSatFreq = SigCalcUtil.GetFreqPointBySigFreq(sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn); long centerFreq = ch.CenterFreq; if (ch.CanSetFrq()) { cfqList.Add(new CfqOptions(ch.FrqAddr, mainSatFreq.DownFreq)); centerFreq = mainSatFreq.DownFreq; } var chOpt = adcOpt.SetChannel(ch.AntCode, ch.AdcCode, ch.ChNum, centerFreq); if (chOpt != null) chOpt.AddSignal(mainSatFreq.DownFreq, sig.BandWidth, sat.SatNum.ToString(), mainSatFreq.UpFreq); } } //if (mainSatFreq == 0) upFreq = sig.SigFreq; foreach (var adjaSatId in sig.AdjaSatIds) { var ch = adCard.Channels.Find(m => m.Sats.Any(sat => sat.SatId == adjaSatId)); if (ch != null) { var sat = ch.Sats.Find(m => m.SatId == adjaSatId); var adjaSatFreq = SigCalcUtil.GetFreqPointBySigFreq(mainSatFreq?.UpFreq ?? sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn); long centerFreq = ch.CenterFreq; if (ch.CanSetFrq()) { cfqList.Add(new CfqOptions(ch.FrqAddr, adjaSatFreq.DownFreq)); centerFreq = adjaSatFreq.DownFreq; } var chOpt = adcOpt.SetChannel(ch.AntCode, ch.AdcCode, ch.ChNum, centerFreq); if (chOpt != null) chOpt.AddSignal(adjaSatFreq.DownFreq, sig.BandWidth, sat.SatNum.ToString(), adjaSatFreq.UpFreq); } } var result = new AdcAndCfgOptions() { AdOptions = adcOpt, CfOptions = cfqList }; return result; } public static void SetAdCardFreq(RunAdCard adCard, AdcOptions adcOptions, CancellationToken token) { List setCfgs = new List(); foreach (var ch in adcOptions.Channels) { if (ch.CenterFreq == 0) continue; var adCh = adCard.Channels.Find(m => m.ChNum == ch.ChNum); if (adCh.CanSetFrq()) { setCfgs.Add(new CfqOptions(adCh.FrqAddr, ch.CenterFreq)); } } SetCfqList(setCfgs, token); } public static void SetCfqList(List setCfgs, CancellationToken token) { if (setCfgs.IsNullOrEmpty()) return; #warning wyq注释变频器 // CfqManager.Default.SetCfqList(setCfgs.Select(m => new SetCfqItem(m.CfqAddr, m.FreqPoint)), out string errMsg, token); #region 原注释 //if (cliPath.IsNotNullOrWhitespace()) //{ // if (!CfqUtil.SetFreqByCli(cliPath, setCfgs.Select(m => new SetCfqItem(m.CfqAddr, m.FreqPoint)), out string errMsg)) // { // IpsLogger.Warn(errMsg); // } // else // { // IpsLogger.Info($"设置变频器成功,频点:{setCfgs.OrderBy(m => m.CfqAddr).Select(m => m.FreqPoint.E6m()).JoinAsString(",")}"); // } // return; //} //var freqGroup = setCfgs.GroupBy(m => m.Addr); //Parallel.ForEach(freqGroup, fg => //{ //bool isFirst = true; //foreach (var frqCh in fg) //{ // if (token.IsCancellationRequested) return; // if (!isFirst) Task.Delay(800, token).Wait(); // isFirst = false; // double downFreq = frqCh.FreqPoint; // SetFreq(frqCh.CfqAddr, downFreq, token); //} // try // { // var chCount = fg.Max(m => m.ChNum); // double[] freqs; // if (chCount == 0) // { // freqs = fg.OrderBy(m => m.CfqAddr).Select(m => m.FreqPoint.E6m()).ToArray(); // } // else // { // freqs = new double[chCount]; // foreach (var item in fg) // { // freqs[item.ChNum - 1] = item.FreqPoint.E6m(); // } // } // if (!CfqUtil.SetFreq(fg.Key, freqs, out string errMsg)) // { // IpsLogger.Error($"设置变频器【{fg.Key}】失败,错误消息:{errMsg},频点:{freqs.JoinAsString(",")}"); // } // else // { // IpsLogger.Info($"设置变频器【{fg.Key}】成功,频点:{freqs.JoinAsString(",")}"); // } // } // catch (Exception ex) // { // IpsLogger.Warn($"设置变频器失败,错误消息:{ex.Message}"); // } //}); #endregion } public static void SetCfqByCli(List setCfgs, CancellationToken token) { if (setCfgs.IsNullOrEmpty()) return; string cliPath = Path.Combine(IpsPath.CliRootDir, "bpq", "bpq.exe"); var cmd = CliWrap.Cli.Wrap(cliPath) .WithArguments(args => { foreach (var item in setCfgs) { args.Add(item.CfqAddr, true).Add(item.FreqPoint); } }); var res = cmd.ExecuteBufferedAsync(token.LinkTimeout(20)).GetAwaiter().GetResult(); if (res.StandardError.IsNotNullOrWhitespace()) { IpsLogger.Warn($"{res.StandardError},{cmd.Arguments}"); } else { IpsLogger.Info($"设置变频器成功,频点:{setCfgs.OrderBy(m => m.CfqAddr).Select(m => m.FreqPoint.E6m()).JoinAsString(",")}"); } } public static void SetFreq(string cfqAddr, double freqPoint, CancellationToken token) { try { //#warning 添加设置变频器编码 } catch (Exception ex) { IpsLogger.Error($"设置变频器[{cfqAddr}]频点[{freqPoint}]失败", ex); } } } }