AdSigUtil.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using CliWrap.Buffered;
  2. using Ips.DevAlgorithm;
  3. using Ips.Library.Basic;
  4. using Ips.Library.DxpLib;
  5. using Ips.Library.Entity;
  6. using Ips.Library.LocLib;
  7. using Ips.Sps.Cfqs;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace Ips.Sps.Scheduling.SigAds
  14. {
  15. public class AdSigUtil
  16. {
  17. public static AdcAndCfgOptions GetAdcAndCfqOptions(RunAdCard adCard, RunSig sig, bool sp4m = false)
  18. {
  19. var adcOpt = new AdcOptions()
  20. {
  21. CardType = adCard.CardType,
  22. ClockType = adCard.ClockType,
  23. TriggerMode = adCard.TriggerMode,
  24. DdcFreq = adCard.DdcFreq,
  25. ClockFreq = adCard.ClockFreq,
  26. Mutil = SigCalcUtil.CalcMutil(adCard.ClockFreq, sig.BandWidth, sp4m),
  27. TimeLen = sig.SigLen,
  28. StorePath = adCard.StorePath
  29. };
  30. var cfqList = new List<CfqOptions>();
  31. FreqPointInfo mainSatFreq = null;
  32. if (sig.MainSatId > 0)
  33. {
  34. var ch = adCard.Channels.Find(m => m.Sats.Any(sat => sat.SatId == sig.MainSatId));
  35. if (ch != null)
  36. {
  37. var sat = ch.Sats.Find(m => m.SatId == sig.MainSatId);
  38. mainSatFreq = SigCalcUtil.GetFreqPointBySigFreq(sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);
  39. long centerFreq = ch.CenterFreq;
  40. if (ch.CanSetFrq())
  41. {
  42. cfqList.Add(new CfqOptions(ch.FrqAddr, mainSatFreq.DownFreq));
  43. centerFreq = mainSatFreq.DownFreq;
  44. }
  45. var chOpt = adcOpt.SetChannel(ch.AntCode, ch.AdcCode, ch.ChNum, centerFreq);
  46. if (chOpt != null)
  47. chOpt.AddSignal(mainSatFreq.DownFreq, sig.BandWidth, sat.SatNum.ToString(), mainSatFreq.UpFreq);
  48. }
  49. }
  50. //if (mainSatFreq == 0) upFreq = sig.SigFreq;
  51. foreach (var adjaSatId in sig.AdjaSatIds)
  52. {
  53. var ch = adCard.Channels.Find(m => m.Sats.Any(sat => sat.SatId == adjaSatId));
  54. if (ch != null)
  55. {
  56. var sat = ch.Sats.Find(m => m.SatId == adjaSatId);
  57. var adjaSatFreq = SigCalcUtil.GetFreqPointBySigFreq(mainSatFreq?.UpFreq ?? sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);
  58. long centerFreq = ch.CenterFreq;
  59. if (ch.CanSetFrq())
  60. {
  61. cfqList.Add(new CfqOptions(ch.FrqAddr, adjaSatFreq.DownFreq));
  62. centerFreq = adjaSatFreq.DownFreq;
  63. }
  64. var chOpt = adcOpt.SetChannel(ch.AntCode, ch.AdcCode, ch.ChNum, centerFreq);
  65. if (chOpt != null)
  66. chOpt.AddSignal(adjaSatFreq.DownFreq, sig.BandWidth, sat.SatNum.ToString(), adjaSatFreq.UpFreq);
  67. }
  68. }
  69. var result = new AdcAndCfgOptions()
  70. {
  71. AdOptions = adcOpt,
  72. CfOptions = cfqList
  73. };
  74. return result;
  75. }
  76. public static void SetAdCardFreq(RunAdCard adCard, AdcOptions adcOptions, CancellationToken token)
  77. {
  78. List<CfqOptions> setCfgs = new List<CfqOptions>();
  79. foreach (var ch in adcOptions.Channels)
  80. {
  81. if (ch.CenterFreq == 0) continue;
  82. var adCh = adCard.Channels.Find(m => m.ChNum == ch.ChNum);
  83. if (adCh.CanSetFrq())
  84. {
  85. setCfgs.Add(new CfqOptions(adCh.FrqAddr, ch.CenterFreq));
  86. }
  87. }
  88. SetCfqList(setCfgs, token);
  89. }
  90. public static void SetCfqList(List<CfqOptions> setCfgs, CancellationToken token)
  91. {
  92. if (setCfgs.IsNullOrEmpty()) return;
  93. #warning wyq注释变频器
  94. // CfqManager.Default.SetCfqList(setCfgs.Select(m => new SetCfqItem(m.CfqAddr, m.FreqPoint)), out string errMsg, token);
  95. #region 原注释
  96. //if (cliPath.IsNotNullOrWhitespace())
  97. //{
  98. // if (!CfqUtil.SetFreqByCli(cliPath, setCfgs.Select(m => new SetCfqItem(m.CfqAddr, m.FreqPoint)), out string errMsg))
  99. // {
  100. // IpsLogger.Warn(errMsg);
  101. // }
  102. // else
  103. // {
  104. // IpsLogger.Info($"设置变频器成功,频点:{setCfgs.OrderBy(m => m.CfqAddr).Select(m => m.FreqPoint.E6m()).JoinAsString(",")}");
  105. // }
  106. // return;
  107. //}
  108. //var freqGroup = setCfgs.GroupBy(m => m.Addr);
  109. //Parallel.ForEach(freqGroup, fg =>
  110. //{
  111. //bool isFirst = true;
  112. //foreach (var frqCh in fg)
  113. //{
  114. // if (token.IsCancellationRequested) return;
  115. // if (!isFirst) Task.Delay(800, token).Wait();
  116. // isFirst = false;
  117. // double downFreq = frqCh.FreqPoint;
  118. // SetFreq(frqCh.CfqAddr, downFreq, token);
  119. //}
  120. // try
  121. // {
  122. // var chCount = fg.Max(m => m.ChNum);
  123. // double[] freqs;
  124. // if (chCount == 0)
  125. // {
  126. // freqs = fg.OrderBy(m => m.CfqAddr).Select(m => m.FreqPoint.E6m()).ToArray();
  127. // }
  128. // else
  129. // {
  130. // freqs = new double[chCount];
  131. // foreach (var item in fg)
  132. // {
  133. // freqs[item.ChNum - 1] = item.FreqPoint.E6m();
  134. // }
  135. // }
  136. // if (!CfqUtil.SetFreq(fg.Key, freqs, out string errMsg))
  137. // {
  138. // IpsLogger.Error($"设置变频器【{fg.Key}】失败,错误消息:{errMsg},频点:{freqs.JoinAsString(",")}");
  139. // }
  140. // else
  141. // {
  142. // IpsLogger.Info($"设置变频器【{fg.Key}】成功,频点:{freqs.JoinAsString(",")}");
  143. // }
  144. // }
  145. // catch (Exception ex)
  146. // {
  147. // IpsLogger.Warn($"设置变频器失败,错误消息:{ex.Message}");
  148. // }
  149. //});
  150. #endregion
  151. }
  152. public static void SetCfqByCli(List<CfqOptions> setCfgs, CancellationToken token)
  153. {
  154. if (setCfgs.IsNullOrEmpty()) return;
  155. string cliPath = Path.Combine(IpsPath.CliRootDir, "bpq", "bpq.exe");
  156. var cmd = CliWrap.Cli.Wrap(cliPath)
  157. .WithArguments(args =>
  158. {
  159. foreach (var item in setCfgs)
  160. {
  161. args.Add(item.CfqAddr, true).Add(item.FreqPoint);
  162. }
  163. });
  164. var res = cmd.ExecuteBufferedAsync(token.LinkTimeout(20)).GetAwaiter().GetResult();
  165. if (res.StandardError.IsNotNullOrWhitespace())
  166. {
  167. IpsLogger.Warn($"{res.StandardError},{cmd.Arguments}");
  168. }
  169. else
  170. {
  171. IpsLogger.Info($"设置变频器成功,频点:{setCfgs.OrderBy(m => m.CfqAddr).Select(m => m.FreqPoint.E6m()).JoinAsString(",")}");
  172. }
  173. }
  174. public static void SetFreq(string cfqAddr, double freqPoint, CancellationToken token)
  175. {
  176. try
  177. {
  178. //#warning 添加设置变频器编码
  179. }
  180. catch (Exception ex)
  181. {
  182. IpsLogger.Error($"设置变频器[{cfqAddr}]频点[{freqPoint}]失败",ex);
  183. }
  184. }
  185. }
  186. }