NormalTemperatureTest.cs 42 KB

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