| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 | 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            };            var cfqList = new List<CfqOptions>();            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<CfqOptions> setCfgs = new List<CfqOptions>();            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<CfqOptions> 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<CfqOptions> 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);            }        }    }}
 |