PowerTest-PowerMeter.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using Tps_LQ_Transmitter.com;
  9. namespace Tps_LQ_Transmitter.models
  10. {
  11. class PowerTest_PowerMeter : BaseModel
  12. {
  13. public PowerTest_PowerMeter()
  14. {
  15. TemplateName = "功率(功率计)测试";
  16. }
  17. /// <summary>
  18. /// 使用功率计(E4418A)进行功率测试
  19. /// </summary>
  20. /// <param name="parameters"></param>
  21. /// <returns></returns>
  22. public override bool Run(TestNode parameters)
  23. {
  24. //获取仪器
  25. DataType PowerPrint = new DataType();//功率(w)
  26. var PowerMeter = this.tps.GetDeviceModel("GPIB0::13::INSTR");
  27. if (PowerMeter == null)
  28. {
  29. ShowMessage(MsgType.Error, string.Format("仪器不齐全,{0}/{1}无法运行", parameters.Channel, parameters.Name));
  30. return false;
  31. }
  32. Thread.Sleep(1000);//让产品稳定
  33. TransmitterSerialPort SerialClient = new TransmitterSerialPort();
  34. ConfigParameter PowerPara = new ConfigParameter();
  35. MatchComPara CfigComParas = new MatchComPara();
  36. CfigComParas = LoadModulationWorkBook();
  37. if (CfigComParas == null)
  38. {
  39. return false;
  40. }
  41. byte FourthByte=0x00;
  42. string ComPort = CfigComParas.GetComPort("1");
  43. string i = CfigComParas.GetThirdByte("1");
  44. i = CfigComParas.GetFourthByte("1");
  45. byte ThridByte = Convert.ToByte(CfigComParas.GetThirdByte("1"),16);
  46. byte ThridByte1 = Convert.ToByte(CfigComParas.GetFourthByte("1"),16);
  47. PowerPara.StartFrequency = parameters.Parameters.GetParameter<double>("起始频率");
  48. PowerPara.StepFrequency = parameters.Parameters.GetParameter<double>("频率步进");
  49. PowerPara.FrequencyNumber = parameters.Parameters.GetParameter<int>("频点数量");
  50. PowerPara.StopFrequency = parameters.Parameters.GetParameter<double>("终止频率");
  51. PowerPara.SPAN = parameters.Parameters.GetParameter<string>("扫描带宽(SPAN)");
  52. PowerPara.REF = parameters.Parameters.GetParameter<string>("参考电平(REF)");
  53. PowerPara.RBW = parameters.Parameters.GetParameter<string>("分辨率带宽(RBW)");
  54. PowerPara.VBW = parameters.Parameters.GetParameter<string>("视频带宽(VBW)");
  55. PowerPara.ControlDelay = parameters.Parameters.GetParameter<int>("控制延时");
  56. PowerPara.PowerLower = parameters.Parameters.GetParameter<double>("功率下限");
  57. PowerPara.PowerUpper = parameters.Parameters.GetParameter<double>("功率上限");
  58. PowerPara.FreqAccuracyUpper = parameters.Parameters.GetParameter<double>("频率稳定度上限");
  59. PowerPara.PowerSumLower = parameters.Parameters.GetParameter<double>("两路功率总和下限");
  60. PowerPara.PowerFlatnessUpper = parameters.Parameters.GetParameter<double>("功率不平度上限");
  61. //if ((PowerPara.StartFrequency == 0) || ((PowerPara.StepFrequency == 0) && (PowerPara.FrequencyNumber == 0)) || (PowerPara.StopFrequency == 0)
  62. // || (PowerPara.SPAN == null) || (PowerPara.REF == null) || (PowerPara.RBW == null) || (PowerPara.VBW == null) || (PowerPara.PowerLower == 0)
  63. // || (PowerPara.PowerUpper == 0) || (PowerPara.FreqAccuracyUpper == 0) || (PowerPara.PowerSumLower == 0) || (PowerPara.PowerFlatnessUpper == 0))
  64. //{
  65. // ShowMessage(MsgType.Error, string.Format("配置文件中频率参数为空,{0}/{1}无法运行", parameters.Channel, parameters.Name));
  66. // return false;
  67. //}
  68. if (PowerPara.ControlDelay == 0)
  69. {
  70. PowerPara.ControlDelay = 10;
  71. }
  72. PowerMeter.Write("设置显示单位W", "1");
  73. if ((PowerPara.FrequencyNumber != 0) && (PowerPara.FrequencyNumber != 1) && (PowerPara.StepFrequency == 0))
  74. {
  75. PowerPara.StepFrequency = ((int)(((PowerPara.StopFrequency - PowerPara.StartFrequency) / (PowerPara.FrequencyNumber - 1)) * 100)) / 100;
  76. }
  77. if (PowerPara.StepFrequency != 0)
  78. {
  79. PowerPara.FrequencyNumber = ((int)((PowerPara.StopFrequency - PowerPara.StartFrequency) / PowerPara.StepFrequency)) + 1;
  80. }
  81. double CenterFreq;
  82. for (int point = 0; ; point++)
  83. {
  84. CenterFreq = PowerPara.StartFrequency + PowerPara.StepFrequency * point;
  85. if (CenterFreq > PowerPara.StopFrequency || (PowerPara.FrequencyNumber == 1 && point == 1))
  86. {
  87. break;
  88. }
  89. FourthByte = byte.Parse(CfigComParas.GetFourthByte((point+1).ToString()));
  90. //SerialClient.DUT_Transmitter_Ctrol(ComPort, ThridByte, FourthByte);
  91. Thread.Sleep(PowerPara.ControlDelay);//单位ms
  92. string aa = PowerMeter.Query("Fetch测量功率", "1");
  93. PowerPrint.Test_name = parameters.Channel + "-功率测试(W)-" + CenterFreq.ToString() + "MHz";
  94. PowerPrint.Lower = PowerPara.PowerLower;
  95. PowerPrint.Upper = PowerPara.PowerUpper;
  96. PowerPrint.TestVal = Math.Round(double.Parse(aa), 2);//功率W
  97. if (PowerPrint.TestVal <= PowerPrint.Upper)
  98. {
  99. PowerPrint.Result = "是";
  100. }
  101. else
  102. {
  103. PowerPrint.Result = "否";
  104. }
  105. tps.TestTableAddCell(PowerPrint.Test_name, "/", PowerPrint.Upper.ToString(), PowerPrint.TestVal.ToString(), PowerPrint.Result);
  106. }
  107. return true;
  108. }
  109. public MatchComPara LoadModulationWorkBook()
  110. {
  111. MatchComPara pars = new MatchComPara();
  112. string FileName = Path.Combine(Bundle.bundle.BundleDir, "config\\串口控制.xlsx");
  113. if (!File.Exists(FileName))
  114. {
  115. ShowMessage(MsgType.Error, "找不到串口控制.xlsx");
  116. return null;
  117. }
  118. Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
  119. workbook.LoadFromFile(FileName);
  120. //获取第一个工作表sheet1
  121. Spire.Xls.Worksheet sheet = workbook.Worksheets[0];
  122. int num = 0;
  123. int blankRows = 0;
  124. while (num++ < 200)
  125. {
  126. //索引从1开始
  127. string col1 = sheet.Range[num, 1].Value2 != null ? sheet.Range[num, 1].Value2.ToString() : "";
  128. col1 = col1.Trim();
  129. if (string.IsNullOrEmpty(col1))
  130. {
  131. blankRows++;
  132. if (blankRows > 5)
  133. {
  134. //连续5个空行以上则退出
  135. break;
  136. }
  137. }
  138. else
  139. {
  140. blankRows = 0;
  141. }
  142. if (col1.Equals("序号"))
  143. {
  144. List<ComMatchParameter> ModulationTable = ReadParameters(sheet, num);
  145. foreach (var item in ModulationTable)
  146. {
  147. if (pars.ModulaParameters.ContainsKey(item.SN))
  148. {
  149. ShowMessage(MsgType.Error, string.Format("串口控制:{0} 存在同名参数:{1},无法重复添加参数", sheet.Name, item.SN));
  150. continue;
  151. }
  152. pars.ModulaParameters.Add(item.SN, item);
  153. }
  154. }
  155. }
  156. return pars;
  157. }
  158. public class MatchComPara
  159. {
  160. public Dictionary<string, ComMatchParameter> ModulaParameters;
  161. public MatchComPara()
  162. {
  163. ModulaParameters = new Dictionary<string, ComMatchParameter>();
  164. }
  165. public string GetComPort(string name)
  166. {
  167. if (string.IsNullOrEmpty(name))
  168. return null;
  169. if (this.ModulaParameters.ContainsKey(name) == false)
  170. return null;
  171. string val1 = this.ModulaParameters[name].ComPort.Trim();
  172. return val1;
  173. }
  174. public string GetThirdByte(string name)
  175. {
  176. string val1 = this.ModulaParameters[name].ThirdByte.Trim();
  177. return val1;
  178. }
  179. public string GetFourthByte(string name)
  180. {
  181. string val2 = this.ModulaParameters[name].FourthByte.Trim();
  182. return val2;
  183. }
  184. }
  185. List<ComMatchParameter> ReadParameters(Spire.Xls.Worksheet sheet, int rowIndex)
  186. {
  187. List<ComMatchParameter> ModulationTable = new List<ComMatchParameter>();
  188. string col1 = sheet.Range[rowIndex, 1].Value2 != null ? sheet.Range[rowIndex, 1].Value2.ToString() : "";
  189. string col2 = sheet.Range[rowIndex, 2].Value2 != null ? sheet.Range[rowIndex, 2].Value2.ToString() : "";
  190. string col3 = sheet.Range[rowIndex, 3].Value2 != null ? sheet.Range[rowIndex, 3].Value2.ToString() : "";
  191. string col4 = sheet.Range[rowIndex, 4].Value2 != null ? sheet.Range[rowIndex, 4].Value2.ToString() : "";
  192. if (!(col1 == "序号" && col2 == "串口号" && col3 == "第3个字节" && col4 == "第4个字节"))
  193. {
  194. ShowMessage(MsgType.Error, "'串口控制'行首标题位置和格式不正确");
  195. return ModulationTable;
  196. }
  197. int num = rowIndex;
  198. //默认最多30行
  199. while (num++ < rowIndex + 100)
  200. {
  201. col1 = sheet.Range[num, 1].Value2 != null ? sheet.Range[num, 1].Value2.ToString() : "";
  202. col2 = sheet.Range[num, 2].Value2 != null ? sheet.Range[num, 2].Value2.ToString() : "";
  203. col3 = sheet.Range[num, 3].Value2 != null ? sheet.Range[num, 3].Value2.ToString() : "";
  204. col4 = sheet.Range[num, 4].Value2 != null ? sheet.Range[num, 4].Value2.ToString() : "";
  205. if (string.IsNullOrEmpty(col1) )
  206. {
  207. break;
  208. }
  209. ComMatchParameter ObjModulation = new ComMatchParameter();
  210. ObjModulation.SN = col1;
  211. ObjModulation.ComPort = col2;
  212. ObjModulation.ThirdByte = col3;
  213. ObjModulation.FourthByte = col4;
  214. ModulationTable.Add(ObjModulation);
  215. }
  216. return ModulationTable;
  217. }
  218. /// <summary>
  219. /// 串口控制4个对应项
  220. /// </summary>
  221. public class ComMatchParameter
  222. {
  223. /// <summary>
  224. /// 序号
  225. /// </summary>
  226. public string SN { get; set; }
  227. /// <summary>
  228. /// 调制指数(mf)
  229. /// </summary>
  230. public string ComPort { get; set; }
  231. /// <summary>
  232. /// 第3个字节
  233. /// </summary>
  234. public string ThirdByte { get; set; }
  235. /// <summary>
  236. /// 第4个字节
  237. /// </summary>
  238. public string FourthByte { get; set; }
  239. }
  240. public class ConfigParameter
  241. {
  242. /// <summary>
  243. /// 输出损耗
  244. /// </summary>
  245. public double OutLoss { set; get; }
  246. /// <summary>
  247. /// 产品测试的起始频率
  248. /// </summary>
  249. public double StartFrequency { set; get; }
  250. /// <summary>
  251. /// 产品测试的频率步进
  252. /// </summary>
  253. public double StepFrequency { set; get; }
  254. /// <summary>
  255. /// 产品测试的频点数量
  256. /// </summary>
  257. public int FrequencyNumber { set; get; }
  258. /// <summary>
  259. /// 产品的工作频带上限(终止频率)
  260. /// 功能:用于判断从起始频率按一定的步进测试是否超出产品工作频段上限
  261. /// </summary>
  262. public double StopFrequency { set; get; }
  263. /// <summary>
  264. ///设置频谱仪的SPAN
  265. /// </summary>
  266. public string SPAN { set; get; }
  267. /// <summary>
  268. /// 设置参考电平
  269. /// </summary>
  270. public string REF { set; get; }
  271. /// <summary>
  272. /// 设置RBW
  273. /// </summary>
  274. public string RBW { set; get; }
  275. /// <summary>
  276. /// 设置VBW
  277. /// </summary>
  278. public string VBW { set; get; }
  279. /// <summary>
  280. /// 控制延时
  281. /// </summary>
  282. public int ControlDelay { set; get; }
  283. /// <summary>
  284. /// 功率下限
  285. /// </summary>
  286. public double PowerLower { set; get; }
  287. /// <summary>
  288. /// 功率上限
  289. /// </summary>
  290. public double PowerUpper { set; get; }
  291. /// <summary>
  292. /// 频率稳定度上限
  293. /// </summary>
  294. public double FreqAccuracyUpper { set; get; }
  295. /// <summary>
  296. /// 两路功率总和下限
  297. /// </summary>
  298. public double PowerSumLower { set; get; }
  299. /// <summary>
  300. /// 功率不平度上限
  301. /// </summary>
  302. public double PowerFlatnessUpper { set; get; }
  303. }
  304. }
  305. }