AdSigUtil.cs 7.8 KB

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