NormalTemperatureTest.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. using System.Threading;
  8. using Tps_LQ_Transmitter.com;
  9. using System.Diagnostics;
  10. namespace Tps_LQ_Transmitter.models
  11. {
  12. class NormalTemperatureTest : BaseModel
  13. {
  14. public NormalTemperatureTest()
  15. {
  16. TemplateName = "常温检查测试";
  17. }
  18. public override bool Run(TestNode parameters)
  19. {
  20. DateTime currentTime1 = new DateTime();
  21. Random random = new Random();
  22. //获取仪器
  23. var SA = this.tps.GetDevice("频谱仪");
  24. var DC = this.tps.GetDevice("程控电源");
  25. /*
  26. if (DC == null || SA == null)
  27. {
  28. ShowMessage(MsgType.Error, string.Format("仪器不齐全,{0}/{1}无法运行", parameters.Channel, parameters.Name));
  29. return false;
  30. }
  31. */
  32. ConfigParameter PowerPara = new ConfigParameter();
  33. PowerPara.IntervalTime = parameters.Parameters.GetParameter<int>("相对时间");//min
  34. PowerPara.TestTime = parameters.Parameters.GetParameter<int>("测试次数");//min
  35. int IntervalTime = (int)(PowerPara.IntervalTime * 60);//将min转换成s
  36. int time=0;
  37. Stopwatch TimesCounter = new Stopwatch();
  38. while ( time < PowerPara.TestTime)
  39. {
  40. currentTime1 = DateTime.Now;
  41. TimesCounter.Restart();
  42. tps.SetTestTableCellValue(time, 3, true, currentTime1.Hour.ToString()+":"+ currentTime1.Minute.ToString());//测试时间
  43. tps.SetTestTableCellValue(time + PowerPara.TestTime, 3, true, currentTime1.Hour.ToString() + ":" + currentTime1.Minute.ToString());//测试时间
  44. MainTest(parameters,time);
  45. while (TimesCounter.Elapsed.TotalSeconds <= IntervalTime && time!= PowerPara.TestTime-1)
  46. {
  47. Thread.Sleep(100);
  48. if (IsRuning == false)
  49. {
  50. return false;
  51. }
  52. }
  53. TimesCounter.Stop();
  54. time = time + 1;
  55. }
  56. return true;
  57. }
  58. public bool MainTest(TestNode parameters,int time)
  59. {
  60. Random random = new Random();
  61. DataType VoltDataPrint = new DataType();
  62. DataType CurrentDataPrint = new DataType();
  63. DataType PowerPrint = new DataType();//功率(dBm)
  64. DataType FreqPrint = new DataType();//实测频率
  65. DataType FreqAccuracyPrint = new DataType();//频率稳定度
  66. DataType PowerSumPrint = new DataType();//两路功率总和(w)
  67. DataType PowerFlatnessPrint = new DataType();//两路功率不平度(dB)
  68. DataType ModulationIndexPrint = new DataType();
  69. DataType MaxFreqOffsetPrint = new DataType();
  70. DataType DBMaxFreqOffsetPrint = new DataType();
  71. DataType SpuriousSuppressionPrint = new DataType();
  72. DataType HarmonicSuppressionPrint = new DataType();
  73. //获取仪器
  74. var SA = this.tps.GetDevice("频谱仪");
  75. var DC = this.tps.GetDevice("程控电源");
  76. TransmitterSerialPort SerialClient = new TransmitterSerialPort();
  77. TestPara Data = new TestPara();
  78. /*
  79. if (DC == null || SA == null)
  80. {
  81. ShowMessage(MsgType.Error, string.Format("仪器不齐全,{0}/{1}无法运行", parameters.Channel, parameters.Name));
  82. return false;
  83. }
  84. */
  85. MatchModulaPara CfigModuParas = new MatchModulaPara();
  86. CfigModuParas = LoadModulationWorkBook();
  87. ConfigParameter PowerPara = new ConfigParameter();
  88. PowerPara.ComPort = parameters.Parameters.GetParameter<string>("串口");
  89. PowerPara.OutLoss = parameters.Parameters.GetParameter<double>("输出损耗");
  90. PowerPara.ChannelPara = parameters.Parameters.GetParameter<int>("通道数");
  91. PowerPara.StartFrequency = parameters.Parameters.GetParameter<double>("起始频率");
  92. PowerPara.StepFrequency = parameters.Parameters.GetParameter<double>("频率步进");
  93. PowerPara.FrequencyNumber = parameters.Parameters.GetParameter<int>("频点数量");
  94. PowerPara.StopFrequency = parameters.Parameters.GetParameter<double>("终止频率");
  95. PowerPara.SPAN = parameters.Parameters.GetParameter<string>("扫描带宽(SPAN)");
  96. PowerPara.REF = parameters.Parameters.GetParameter<string>("参考电平(REF)");
  97. PowerPara.SmallSignalREF = parameters.Parameters.GetParameter<string>("小信号参考电平(REF)");
  98. PowerPara.RBW = parameters.Parameters.GetParameter<string>("分辨率带宽(RBW)");
  99. PowerPara.VBW = parameters.Parameters.GetParameter<string>("视频带宽(VBW)");
  100. PowerPara.HarmonicTime = parameters.Parameters.GetParameterToArray<int>("谐波次数");
  101. PowerPara.ControlDelay = parameters.Parameters.GetParameter<int>("控制延时");
  102. PowerPara.VoltLower = parameters.Parameters.GetParameter<double>("电压下限");
  103. PowerPara.VoltUpper = parameters.Parameters.GetParameter<double>("电压上限");
  104. PowerPara.CurrentLower = parameters.Parameters.GetParameter<double>("电流下限");
  105. PowerPara.CurrentUpper = parameters.Parameters.GetParameter<double>("电流上限");
  106. PowerPara.PowerLower = parameters.Parameters.GetParameter<double>("功率下限");
  107. PowerPara.PowerUpper = parameters.Parameters.GetParameter<double>("功率上限");
  108. //PowerPara.FreqAccuracyUpper = parameters.Parameters.GetParameter<double>("频率稳定度上限");
  109. // PowerPara.PowerFlatnessUpper = parameters.Parameters.GetParameter<double>("功率不平度上限");
  110. // PowerPara.ModulationIndexLower = parameters.Parameters.GetParameter<double>("调制系数下限");
  111. // PowerPara.ModulationIndexUpper = parameters.Parameters.GetParameter<double>("调制系数上限");
  112. PowerPara.MaxFreqOffsetLower = parameters.Parameters.GetParameter<double>("最大频偏(KHz)下限");
  113. PowerPara.MaxFreqOffsetUpper = parameters.Parameters.GetParameter<double>("最大频偏(KHz)上限");
  114. PowerPara.SpuriousSuppressionLower = parameters.Parameters.GetParameter<double>("杂波抑制下限");
  115. PowerPara.HarmonicSuppressionLower = parameters.Parameters.GetParameter<double>("谐波抑制下限");
  116. if ((PowerPara.StartFrequency == 0) ||(PowerPara.ChannelPara == 0) ||((PowerPara.StepFrequency == 0) && (PowerPara.FrequencyNumber == 0)) || (PowerPara.StopFrequency == 0)
  117. || (PowerPara.SPAN == null) || (PowerPara.REF == null) || (PowerPara.RBW == null) || (PowerPara.VBW == null) || (PowerPara.PowerLower == 0)
  118. || (PowerPara.PowerUpper == 0) || (PowerPara.MaxFreqOffsetLower == 0) || (PowerPara.MaxFreqOffsetUpper == 0) || (PowerPara.SpuriousSuppressionLower == 0)
  119. ||(PowerPara.HarmonicSuppressionLower == 0))
  120. {
  121. ShowMessage(MsgType.Error, string.Format("配置文件中频率参数为空,{0}/{1}无法运行", parameters.Channel, parameters.Name));
  122. return false;
  123. }
  124. if (PowerPara.ControlDelay == 0)
  125. {
  126. PowerPara.ControlDelay = 10;
  127. }
  128. if ((PowerPara.FrequencyNumber != 0) && (PowerPara.FrequencyNumber != 1) && (PowerPara.StepFrequency == 0))
  129. {
  130. PowerPara.StepFrequency = ((int)(((PowerPara.StopFrequency - PowerPara.StartFrequency) / (PowerPara.FrequencyNumber - 1)) * 100)) / 100;
  131. }
  132. if (PowerPara.StepFrequency != 0)
  133. {
  134. PowerPara.FrequencyNumber = ((int)((PowerPara.StopFrequency - PowerPara.StartFrequency) / PowerPara.StepFrequency)) + 1;
  135. }
  136. int channel = 0;
  137. int point = 0;
  138. bool Result;
  139. double CenterFreq;
  140. double[] PowerDelt = new double[PowerPara.FrequencyNumber];
  141. Data.Power = new double[PowerPara.FrequencyNumber];
  142. Data.Freq = new double[PowerPara.FrequencyNumber];
  143. Data.FreqAccuracy = new double[PowerPara.FrequencyNumber];
  144. Data.ModulationIndex = new string[PowerPara.FrequencyNumber];
  145. Data.MaxFreqOffset = new string[PowerPara.FrequencyNumber];
  146. Data.DBMaxFreqOffset = new string[PowerPara.FrequencyNumber];
  147. for (channel = 0; channel < PowerPara.ChannelPara; channel++)
  148. {
  149. #region 输出功率、频率、电压、电流、调制频偏dB、调制频偏KHz测试
  150. //SA.Write("仪器复位"); SA.Query("OPC");
  151. //SA.Write("SPAN", PowerPara.SPAN); SA.Query("OPC");
  152. //SA.Write("RBW", PowerPara.RBW); SA.Query("OPC");
  153. //SA.Write("VBW", PowerPara.VBW); SA.Query("OPC");
  154. //SA.Write("REF", PowerPara.REF); SA.Query("OPC");
  155. //SA.Write("SingleOrCont", "0"); SA.Query("OPC");
  156. //SA.Write("MARK打开", "1"); SA.Query("OPC");
  157. //SA.Write("MARK打开", "2"); SA.Query("OPC");
  158. //SA.Write("DELT打开", "2"); SA.Query("OPC");
  159. for (point = 0; ; point++)
  160. {
  161. CenterFreq = PowerPara.StartFrequency + PowerPara.StepFrequency * point;
  162. if (CenterFreq > PowerPara.StopFrequency || (PowerPara.FrequencyNumber == 1 && point == 1))
  163. {
  164. break;
  165. }
  166. //控制
  167. //SerialClient.DUT_Transmitter_Ctrol(PowerPara.ComPort, Convert.ToByte(point + 1));
  168. Thread.Sleep(PowerPara.ControlDelay);//单位ms
  169. #region 电压、电流测试
  170. //Data.VoltVal[point] = DC.Query("读取电压");
  171. //Data.CurrentVal[point] = DC.Query("读取电流");
  172. VoltDataPrint.Lower = PowerPara.VoltLower;
  173. VoltDataPrint.Upper = PowerPara.VoltUpper;
  174. //VoltDataPrint.TestVal = double.Parse(Data.VoltVal[point]);
  175. VoltDataPrint.TestVal = random.Next(2500, 3000) / 100.0;//随机数
  176. Judge(VoltDataPrint.Lower, VoltDataPrint.Upper, VoltDataPrint.TestVal, out Result);
  177. VoltDataPrint.Result = Result;
  178. CurrentDataPrint.Lower = PowerPara.CurrentLower;
  179. CurrentDataPrint.Upper = PowerPara.CurrentUpper;
  180. //CurrentDataPrint.TestVal = double.Parse(Data.CurrentVal[point]);
  181. CurrentDataPrint.TestVal = random.Next(90, 160) / 100.0;
  182. Judge(CurrentDataPrint.Lower, CurrentDataPrint.Upper, CurrentDataPrint.TestVal, out Result);
  183. CurrentDataPrint.Result = Result;
  184. #endregion
  185. #region 输出功率、频率测试
  186. //SA.Write("CENTER", CenterFreq.ToString()); SA.Query("OPC");
  187. //SA.Write("PEAK", "1"); SA.Query("OPC");
  188. //SA.Write("NextPeak", "2"); SA.Query("OPC");
  189. // PsaPeakValue_Tracedata(SA, out y_value, out x_value, true);
  190. // Data.Power[point] = y_value + PowerPara.OutLoss;//功率
  191. Data.Power[point] = random.Next(3000, 4000) / 100.0;//随机数
  192. PowerPrint.TestVal = Math.Round(Math.Pow(10, (Data.Power[point] / 10)) / 1000, 2);//功率W
  193. Judge(PowerPara.PowerLower, PowerPara.PowerUpper, PowerPrint.TestVal, out Result);
  194. PowerPrint.Result = Result;
  195. FreqPrint.Lower = 0 - ((PowerPara.FreqAccuracyUpper * CenterFreq) + CenterFreq);
  196. FreqPrint.Upper = (PowerPara.FreqAccuracyUpper * CenterFreq) + CenterFreq;
  197. // FreqPrint.TestVal = Math.Round(x_value / 1000000, 3);//实测频率
  198. FreqPrint.TestVal = random.Next(-600, 6000) / 100.0 + CenterFreq;//随机数
  199. Judge(FreqPrint.Lower, FreqPrint.Upper, FreqPrint.TestVal, out Result);
  200. FreqPrint.Result = Result;
  201. #endregion
  202. #region 调制测试
  203. //PowerDelt[point] = double.Parse(SA.Query("读DELT功率", "2")); SA.Query("OPC");
  204. PowerDelt[point] = random.Next(500, 1200) / 100.0;//随机数
  205. double temp = 30;
  206. string RelativeVal = "0";
  207. foreach (KeyValuePair<string, ModulationMatchParameter> kvp in CfigModuParas.ModulaParameters)
  208. {
  209. if ((Math.Abs(PowerDelt[point] - double.Parse(kvp.Value.CfgRelative))) < temp)
  210. {
  211. temp = Math.Abs(PowerDelt[point] - double.Parse(kvp.Value.CfgRelative));
  212. RelativeVal = kvp.Value.CfgRelative;
  213. }
  214. }
  215. //Data.ModulationIndex[point] = CfigModuParas.GetModulaParameter(RelativeVal);//调制系数
  216. Data.MaxFreqOffset[point] = CfigModuParas.GetFreqOffsetParameter(RelativeVal);//最大频偏kHz
  217. Data.DBMaxFreqOffset[point] = PowerDelt[point].ToString();//最大频偏dB
  218. //ModulationIndexPrint.TestVal = double.Parse(Data.ModulationIndex[point]);
  219. //Judge (PowerPara.ModulationIndexLower, PowerPara.ModulationIndexUpper, ModulationIndexPrint.TestVal, out Result);
  220. //ModulationIndexPrint.Result = Result;
  221. MaxFreqOffsetPrint.TestVal = double.Parse(Data.MaxFreqOffset[point]);
  222. DBMaxFreqOffsetPrint.TestVal = double.Parse(Data.DBMaxFreqOffset[point]);
  223. Judge(PowerPara.MaxFreqOffsetLower, PowerPara.MaxFreqOffsetUpper, MaxFreqOffsetPrint.TestVal, out Result);
  224. MaxFreqOffsetPrint.Result = Result;
  225. DBMaxFreqOffsetPrint.Result = Result;
  226. #endregion
  227. if (channel == 0)
  228. {
  229. // tps.SetTestTableCellValue(point, 2, SpuriousSuppressionPrint.Result, SpuriousSuppressionPrint.TestVal);//相对时间(min)
  230. // tps.SetTestTableCellValue(point, 3, SpuriousSuppressionPrint.Result, SpuriousSuppressionPrint.TestVal);//绝对时间
  231. tps.SetTestTableCellValue(point + time, 4, VoltDataPrint.Result, VoltDataPrint.TestVal);//供电电压(V)
  232. tps.SetTestTableCellValue(point + time, 5, CurrentDataPrint.Result, CurrentDataPrint.TestVal);//消耗电流(A)
  233. tps.SetTestTableCellValue(point + time, 6, FreqPrint.Result, FreqPrint.TestVal);//输出频率(kHz)
  234. tps.SetTestTableCellValue(point + time, 7, DBMaxFreqOffsetPrint.Result, DBMaxFreqOffsetPrint.TestVal);//调制频偏(dB)
  235. tps.SetTestTableCellValue(point + time, 8, MaxFreqOffsetPrint.Result, MaxFreqOffsetPrint.TestVal);//调制频偏(kHz)
  236. tps.SetTestTableCellValue(point + time, 9, PowerPrint.Result, PowerPrint.TestVal);//输出功率(W)
  237. }
  238. else if (channel == 1)
  239. {
  240. // tps.SetTestTableCellValue(point + 5, 2, SpuriousSuppressionPrint.Result, SpuriousSuppressionPrint.TestVal);//相对时间(min)
  241. // tps.SetTestTableCellValue(point + 5, 3, SpuriousSuppressionPrint.Result, SpuriousSuppressionPrint.TestVal);//绝对时间
  242. tps.SetTestTableCellValue(point + time + 5, 4, VoltDataPrint.Result, VoltDataPrint.TestVal);//供电电压(V)
  243. tps.SetTestTableCellValue(point + time + 5, 5, CurrentDataPrint.Result, CurrentDataPrint.TestVal);//消耗电流(A)
  244. tps.SetTestTableCellValue(point + time + 5, 6, FreqPrint.Result, FreqPrint.TestVal);//输出频率(kHz)
  245. tps.SetTestTableCellValue(point + time + 5, 7, DBMaxFreqOffsetPrint.Result, DBMaxFreqOffsetPrint.TestVal);//调制频偏(dB)
  246. tps.SetTestTableCellValue(point + time + 5, 8, MaxFreqOffsetPrint.Result, MaxFreqOffsetPrint.TestVal);//调制频偏(kHz)
  247. tps.SetTestTableCellValue(point + time + 5, 9, PowerPrint.Result, PowerPrint.TestVal);//输出功率(W)
  248. }
  249. }
  250. #endregion
  251. #region 杂波抑制
  252. //SA.Write("仪器复位"); SA.Query("OPC");
  253. //SA.Write("SPAN", PowerPara.SPAN); SA.Query("OPC");
  254. //SA.Write("REF", PowerPara.SmallSignalREF); SA.Query("OPC");
  255. //SA.Write("RBW", PowerPara.RBW); SA.Query("OPC");
  256. //SA.Write("VBW", PowerPara.VBW); SA.Query("OPC");
  257. //SA.Write("SingleOrCont", "0"); SA.Query("OPC");
  258. for (point = 0; ; point++)
  259. {
  260. CenterFreq = PowerPara.StartFrequency + PowerPara.StepFrequency * point;
  261. if (CenterFreq > PowerPara.StopFrequency || (PowerPara.FrequencyNumber == 1 && point == 1))
  262. {
  263. break;
  264. }
  265. //// 控制
  266. //SerialClient.DUT_Transmitter_Ctrol(PowerPara.ComPort, Convert.ToByte(point + 1));
  267. //Thread.Sleep(PowerPara.ControlDelay);//单位ms
  268. //SA.Write("CENTER", CenterFreq.ToString()); SA.Query("OPC");
  269. //PsaPeakValue_Tracedata(SA, out y_value, out x_value, false);
  270. //Power = y_value;
  271. ////测主频左侧杂散
  272. //SA.Write("START", PowerPara.LeftStart.ToString()); SA.Query("OPC");
  273. //SA.Write("STOP", (CenterFreq - PowerPara.LeftOffset).ToString()); SA.Query("OPC");
  274. //PsaPeakValue_Tracedata(SA, out y_value, out x_value, false);
  275. //PowerLeft = Power - y_value;
  276. ////测主频右侧杂散
  277. //SA.Write("START", (CenterFreq + PowerPara.RightOffset).ToString()); SA.Query("OPC");
  278. //SA.Write("STOP", PowerPara.RightStop.ToString()); SA.Query("OPC");
  279. //PsaPeakValue_Tracedata(SA, out y_value, out x_value, false);
  280. //PowerRigth = Power - y_value;
  281. SpuriousSuppressionPrint.Lower = PowerPara.SpuriousSuppressionLower;
  282. //SpuriousSuppressionPrint.TestVal = Math.Round(Math.Min(PowerLeft, PowerRigth), 2);
  283. SpuriousSuppressionPrint.TestVal = random.Next(4000, 12000) / 100.0;//随机数
  284. Judge(SpuriousSuppressionPrint.Lower, 201, SpuriousSuppressionPrint.TestVal, out Result);
  285. SpuriousSuppressionPrint.Result = Result;
  286. if (channel == 0)
  287. {
  288. tps.SetTestTableCellValue(point + time, 10, SpuriousSuppressionPrint.Result, SpuriousSuppressionPrint.TestVal);//杂波抑制(dBc)
  289. }
  290. else if (channel == 1)
  291. {
  292. tps.SetTestTableCellValue(point + time + 5, 10, SpuriousSuppressionPrint.Result, SpuriousSuppressionPrint.TestVal);//杂波抑制(dBc)
  293. }
  294. }
  295. #endregion
  296. #region 谐波抑制
  297. //SA.Write("仪器复位"); SA.Query("OPC");
  298. //SA.Write("SPAN", PowerPara.SPAN); SA.Query("OPC");
  299. //SA.Write("RBW", PowerPara.RBW); SA.Query("OPC");
  300. //SA.Write("VBW", PowerPara.VBW); SA.Query("OPC");
  301. //SA.Write("SingleOrCont", "0"); SA.Query("OPC");
  302. for (point = 0; ; point++)
  303. {
  304. CenterFreq = PowerPara.StartFrequency + PowerPara.StepFrequency * point;
  305. if (CenterFreq > PowerPara.StopFrequency || (PowerPara.FrequencyNumber == 1 && point == 1))
  306. {
  307. break;
  308. }
  309. // 控制
  310. //SerialClient.DUT_Transmitter_Ctrol(PowerPara.ComPort, Convert.ToByte(point + 1));
  311. //Thread.Sleep(PowerPara.ControlDelay);//单位ms
  312. //SA.Write("CENTER", CenterFreq.ToString()); SA.Query("OPC");
  313. //PsaPeakValue_Tracedata(SA, out y_value, out x_value, false);
  314. //Power = y_value;
  315. double[] HarmonicTimeVal = new double[PowerPara.HarmonicTime.Length];
  316. double HarmonicMinTimeVal = 0;
  317. //for ( harmonic_num = 0; harmonic_num < PowerPara.HarmonicTime.Length; harmonic_num++)
  318. //{
  319. // SA.Write("CENTER", (CenterFreq * PowerPara.HarmonicTime[harmonic_num]).ToString()); SA.Query("OPC");//N次谐波
  320. // PsaPeakValue_Tracedata(SA, out y_value, out x_value, false);
  321. // Data.HarmonicSuppression[point,harmonic_num] = Math.Round( Power - y_value,2 );
  322. // HarmonicTimeVal[harmonic_num] = Data.HarmonicSuppression[point, harmonic_num];
  323. //}
  324. //if (PowerPara.HarmonicTime.Length > 1)//计算几次谐波中的最小值
  325. //{
  326. // HarmonicMinTimeVal = HarmonicTimeVal.Min();
  327. //}
  328. //else
  329. //{
  330. // HarmonicMinTimeVal = HarmonicTimeVal[0];
  331. //}
  332. HarmonicSuppressionPrint.Lower = PowerPara.HarmonicSuppressionLower;
  333. HarmonicSuppressionPrint.TestVal = HarmonicMinTimeVal;
  334. HarmonicSuppressionPrint.TestVal = random.Next(4000, 12000) / 100.0;//随机数
  335. Judge(HarmonicSuppressionPrint.Lower, 201, HarmonicSuppressionPrint.TestVal, out Result);
  336. HarmonicSuppressionPrint.Result = Result;
  337. if (channel == 0)
  338. {
  339. tps.SetTestTableCellValue(point + time, 11, HarmonicSuppressionPrint.Result, HarmonicSuppressionPrint.TestVal);//谐波抑制(dBc)
  340. }
  341. else if (channel == 1)
  342. {
  343. tps.SetTestTableCellValue(point + time + 5, 11, HarmonicSuppressionPrint.Result, HarmonicSuppressionPrint.TestVal);//谐波抑制(dBc)
  344. }
  345. }
  346. #endregion
  347. }
  348. return true;
  349. }
  350. /// <summary>
  351. /// 判断上下限
  352. /// </summary>
  353. /// <returns></returns>
  354. public void Judge(double Lower,double Upper,double TestValue,out bool JudgeResult)
  355. {
  356. if (Upper >= 200)
  357. {
  358. if (TestValue >= Lower)
  359. {
  360. JudgeResult = true;
  361. }
  362. else
  363. {
  364. JudgeResult = false;
  365. }
  366. }
  367. else if (Lower <= -200)
  368. {
  369. if (TestValue <= Upper)
  370. {
  371. JudgeResult = true;
  372. }
  373. else
  374. {
  375. JudgeResult = false;
  376. }
  377. }
  378. else
  379. {
  380. if (TestValue >= Lower && TestValue <= Upper)
  381. {
  382. JudgeResult = true;
  383. }
  384. else
  385. {
  386. JudgeResult = false;
  387. }
  388. }
  389. }
  390. public MatchModulaPara LoadModulationWorkBook()
  391. {
  392. MatchModulaPara pars = new MatchModulaPara();
  393. string FileName = Path.Combine(Bundle.bundle.BundleDir, "config\\ModulationMode.xlsx");
  394. if (!File.Exists(FileName))
  395. {
  396. ShowMessage(MsgType.Error, "找不到ModulationMode.xlsx");
  397. return null;
  398. }
  399. Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
  400. workbook.LoadFromFile(FileName);
  401. //获取第一个工作表sheet1
  402. Spire.Xls.Worksheet sheet = workbook.Worksheets[0];
  403. int num = 0;
  404. int blankRows = 0;
  405. while (num++ < 200)
  406. {
  407. //索引从1开始
  408. string col1 = sheet.Range[num, 1].Value2 != null ? sheet.Range[num, 1].Value2.ToString() : "";
  409. col1 = col1.Trim();
  410. if (string.IsNullOrEmpty(col1))
  411. {
  412. blankRows++;
  413. if (blankRows > 5)
  414. {
  415. //连续5个空行以上则退出
  416. break;
  417. }
  418. }
  419. else
  420. {
  421. blankRows = 0;
  422. }
  423. if (col1.Equals("功率变化(dB)"))
  424. {
  425. List<ModulationMatchParameter> ModulationTable = ReadParameters(sheet, num);
  426. foreach (var item in ModulationTable)
  427. {
  428. if (pars.ModulaParameters.ContainsKey(item.CfgRelative))
  429. {
  430. ShowMessage(MsgType.Error, string.Format("调制对应表:{0} 存在同名参数:{1},无法重复添加参数", sheet.Name, item.CfgRelative));
  431. continue;
  432. }
  433. pars.ModulaParameters.Add(item.CfgRelative, item);
  434. }
  435. }
  436. }
  437. return pars;
  438. }
  439. List<ModulationMatchParameter> ReadParameters(Spire.Xls.Worksheet sheet, int rowIndex)
  440. {
  441. List<ModulationMatchParameter> ModulationTable = new List<ModulationMatchParameter>();
  442. string col1 = sheet.Range[rowIndex, 1].Value2 != null ? sheet.Range[rowIndex, 1].Value2.ToString() : "";
  443. string col2 = sheet.Range[rowIndex, 2].Value2 != null ? sheet.Range[rowIndex, 2].Value2.ToString() : "";
  444. string col3 = sheet.Range[rowIndex, 3].Value2 != null ? sheet.Range[rowIndex, 3].Value2.ToString() : "";
  445. if (!(col1 == "功率变化(dB)" && col2 == "调制指数(mf)" && col3 == "最大频偏(KHz)"))
  446. {
  447. ShowMessage(MsgType.Error, "'调制对应表'行首标题位置和格式不正确");
  448. return ModulationTable;
  449. }
  450. int num = rowIndex;
  451. //默认最多30行
  452. while (num++ < rowIndex + 100)
  453. {
  454. col1 = sheet.Range[num, 1].Value2 != null ? sheet.Range[num, 1].Value2.ToString() : "";
  455. col2 = sheet.Range[num, 2].Value2 != null ? sheet.Range[num, 2].Value2.ToString() : "";
  456. col3 = sheet.Range[num, 3].Value2 != null ? sheet.Range[num, 3].Value2.ToString() : "";
  457. if (string.IsNullOrEmpty(col1) || string.IsNullOrEmpty(col2) || string.IsNullOrEmpty(col3))
  458. {
  459. break;
  460. }
  461. ModulationMatchParameter ObjModulation = new ModulationMatchParameter();
  462. ObjModulation.CfgRelative = col1;
  463. ObjModulation.CfgModulation = col2;
  464. ObjModulation.CfgFreqOffset = col3;
  465. ModulationTable.Add(ObjModulation);
  466. }
  467. return ModulationTable;
  468. }
  469. /// <summary>
  470. /// 一个调制指数的配置信息
  471. /// </summary>
  472. public class MatchModulaPara
  473. {
  474. public Dictionary<string, ModulationMatchParameter> ModulaParameters;
  475. public MatchModulaPara()
  476. {
  477. ModulaParameters = new Dictionary<string, ModulationMatchParameter>();
  478. }
  479. public string GetModulaParameter(string name)
  480. {
  481. if (string.IsNullOrEmpty(name))
  482. return null;
  483. if (this.ModulaParameters.ContainsKey(name) == false)
  484. return null;
  485. string val1 = this.ModulaParameters[name].CfgModulation.Trim();
  486. return val1;
  487. }
  488. public string GetFreqOffsetParameter(string name)
  489. {
  490. if (string.IsNullOrEmpty(name))
  491. return null;
  492. if (this.ModulaParameters.ContainsKey(name) == false)
  493. return null;
  494. string val2 = this.ModulaParameters[name].CfgFreqOffset.Trim();
  495. return val2;
  496. }
  497. }
  498. /// <summary>
  499. /// 调制指数3个对应项
  500. /// </summary>
  501. public class ModulationMatchParameter
  502. {
  503. /// <summary>
  504. /// 功率变化(dB)
  505. /// </summary>
  506. public string CfgRelative { get; set; }
  507. /// <summary>
  508. /// 调制指数(mf)
  509. /// </summary>
  510. public string CfgModulation { get; set; }
  511. /// <summary>
  512. /// 最大频偏(KHz)
  513. /// </summary>
  514. public string CfgFreqOffset { get; set; }
  515. }
  516. public class ConfigParameter
  517. {
  518. /// <summary>
  519. /// 串口
  520. /// </summary>
  521. public string ComPort { set; get; }
  522. /// <summary>
  523. /// 输出损耗
  524. /// </summary>
  525. public double OutLoss { set; get; }
  526. /// <summary>
  527. /// 通道数量
  528. /// </summary>
  529. public int ChannelPara { set; get; }
  530. /// <summary>
  531. /// 测试次数
  532. /// </summary>
  533. public int TestTime { set; get; }
  534. /// <summary>
  535. /// 相对时间
  536. /// </summary>
  537. public int IntervalTime { set; get; }
  538. /// <summary>
  539. /// 产品测试的起始频率
  540. /// </summary>
  541. public double StartFrequency { set; get; }
  542. /// <summary>
  543. /// 产品测试的频率步进
  544. /// </summary>
  545. public double StepFrequency { set; get; }
  546. /// <summary>
  547. /// 产品测试的频点数量
  548. /// </summary>
  549. public int FrequencyNumber { set; get; }
  550. /// <summary>
  551. /// 产品的工作频带上限(终止频率)
  552. /// 功能:用于判断从起始频率按一定的步进测试是否超出产品工作频段上限
  553. /// </summary>
  554. public double StopFrequency { set; get; }
  555. /// <summary>
  556. ///设置频谱仪的SPAN
  557. /// </summary>
  558. public string SPAN { set; get; }
  559. /// <summary>
  560. /// 设置参考电平
  561. /// </summary>
  562. public string REF { set; get; }
  563. /// <summary>
  564. /// 设置小信号参考电平
  565. /// </summary>
  566. public string SmallSignalREF { set; get; }
  567. /// <summary>
  568. /// 设置RBW
  569. /// </summary>
  570. public string RBW { set; get; }
  571. /// <summary>
  572. /// 设置VBW
  573. /// </summary>
  574. public string VBW { set; get; }
  575. /// <summary>
  576. /// 谐波次数
  577. /// </summary>
  578. public int[] HarmonicTime { set; get; }
  579. /// <summary>
  580. /// 控制延时
  581. /// </summary>
  582. public int ControlDelay { set; get; }
  583. /// <summary>
  584. /// 功率下限
  585. /// </summary>
  586. public double PowerLower { set; get; }
  587. /// <summary>
  588. /// 功率上限
  589. /// </summary>
  590. public double PowerUpper { set; get; }
  591. /// <summary>
  592. /// 频率稳定度上限
  593. /// </summary>
  594. public double FreqAccuracyUpper { set; get; }
  595. /// <summary>
  596. /// 两路功率总和下限
  597. /// </summary>
  598. public double PowerSumLower { set; get; }
  599. /// <summary>
  600. /// 功率不平度上限
  601. /// </summary>
  602. public double PowerFlatnessUpper { set; get; }
  603. /// <summary>
  604. /// 调制系数下限
  605. /// </summary>
  606. public double ModulationIndexLower { get; set; }
  607. /// <summary>
  608. ///调制系数上限
  609. /// </summary>
  610. public double ModulationIndexUpper { get; set; }
  611. /// <summary>
  612. /// 最大频偏kHz下限
  613. /// </summary>
  614. public double MaxFreqOffsetLower { get; set; }
  615. /// <summary>
  616. ///最大频偏kHz调制系数上限
  617. /// </summary>
  618. public double MaxFreqOffsetUpper { get; set; }
  619. /// <summary>
  620. /// 杂波抑制下限
  621. /// </summary>
  622. public double SpuriousSuppressionLower { set; get; }
  623. // <summary>
  624. /// 谐波抑制下限
  625. /// </summary>
  626. public double HarmonicSuppressionLower { set; get; }
  627. /// <summary>
  628. /// 电压下限
  629. /// </summary>
  630. public double VoltLower { set; get; }
  631. /// <summary>
  632. /// 电压上限
  633. /// </summary>
  634. public double VoltUpper { set; get; }
  635. /// <summary>
  636. /// 电流下限
  637. /// </summary>
  638. public double CurrentLower { set; get; }
  639. /// <summary>
  640. /// 电流上限
  641. /// </summary>
  642. public double CurrentUpper { set; get; }
  643. }
  644. public class TestPara
  645. {
  646. /// <summary>
  647. /// 读电压值
  648. /// </summary>
  649. public string[] VoltVal { set; get; }
  650. /// <summary>
  651. /// 读电流值
  652. /// </summary>
  653. public string[] CurrentVal { set; get; }
  654. /// <summary>
  655. /// 输出功率(W)
  656. /// </summary>
  657. public double[] Power { set; get; }
  658. /// <summary>
  659. /// 频率稳定度
  660. /// </summary>
  661. public double[] FreqAccuracy { set; get; }
  662. /// <summary>
  663. /// 实测频点
  664. /// </summary>
  665. public double[] Freq { set; get; }
  666. /// <summary>
  667. /// 两路功率总和(W)
  668. /// </summary>
  669. public double[] PowerSum { set; get; }
  670. /// <summary>
  671. /// 两路功率不平度(dB)
  672. /// </summary>
  673. public double[] PowerFlatness { set; get; }
  674. /// <summary>
  675. ///调制系数
  676. /// </summary>
  677. public string[] ModulationIndex { set; get; }
  678. /// <summary>
  679. /// 最大频偏KHz
  680. /// </summary>
  681. public string[] MaxFreqOffset { set; get; }
  682. /// <summary>
  683. /// 最大频偏dB
  684. /// </summary>
  685. public string[] DBMaxFreqOffset { set; get; }
  686. }
  687. public class DataType
  688. {
  689. /// <summary>
  690. /// 测试名称
  691. /// </summary>
  692. public string Test_name { set; get; }
  693. /// <summary>
  694. /// 指标下限
  695. /// </summary>
  696. public double Lower { set; get; }
  697. /// <summary>
  698. /// 指标上限
  699. /// </summary>
  700. public double Upper { set; get; }
  701. /// <summary>
  702. /// 测试值
  703. /// </summary>
  704. public double TestVal { set; get; }
  705. /// <summary>
  706. /// 判断结果
  707. /// </summary>
  708. public bool Result { set; get; }
  709. }
  710. }
  711. }