BaseModel.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.IO;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Forms;
  8. using Tps_LQ_Transmitter.com;
  9. namespace Tps_LQ_Transmitter.models
  10. {
  11. /// <summary>
  12. /// 测试模板,对测试模板的基础类别
  13. /// </summary>
  14. public class BaseModel
  15. {
  16. /// <summary>
  17. /// 测试模板名称,测试指标配置表中的模板名称源自这个参数
  18. /// </summary>
  19. public string TemplateName { get; protected set; }
  20. public bool IsRuning { get; set; }
  21. public bool IsPassed { get; protected set; }
  22. public DateTime FinishedTime { get; protected set; }
  23. /// <summary>
  24. /// 这个测试项对应的显示界面,也可能是一个界面有多个测试项共用,取决于顶层的控制
  25. /// </summary>
  26. public UserControl UC { get; set; }
  27. /// <summary>
  28. /// 主程序
  29. /// </summary>
  30. public MainTps tps { get; set; }
  31. public virtual bool Run(TestNode parameters)
  32. {
  33. return false;
  34. }
  35. /// <summary>
  36. /// 开始测试
  37. /// </summary>
  38. /// <returns></returns>
  39. public virtual bool Start(TestNode parameters)
  40. {
  41. IsRuning = true;
  42. IsPassed = false;
  43. bool ok = Run(parameters);
  44. IsRuning = false;
  45. FinishedTime = DateTime.Now;
  46. return ok;
  47. // return true;
  48. }
  49. /// <summary>
  50. /// 停止测试
  51. /// </summary>
  52. /// <returns></returns>
  53. public virtual bool Stop()
  54. {
  55. IsRuning = false;
  56. return true;
  57. }
  58. public event DltShowMsg MessageEvent;
  59. protected void ShowMessage(MsgType msgType, string msg)
  60. {
  61. if (MessageEvent != null)
  62. {
  63. MessageEvent(msgType, msg);
  64. }
  65. if (msgType == MsgType.Error)
  66. {
  67. MessageBox.Show(msg);
  68. }
  69. }
  70. public void OpenExcel(string sheetname, out Spire.Xls.Workbook workbook, out Spire.Xls.Worksheet sheet)
  71. {
  72. Spire.Xls.Worksheet sheet1 = null;
  73. string productname;
  74. if (tps.Product.Contains('-'))
  75. {
  76. productname = tps.Product.Split('-')[0];
  77. }
  78. else
  79. {
  80. productname = tps.Product;
  81. }
  82. string ModelFile = "./发射机/" + productname + "/模板/" + tps.TestProject + "模板.xlsx";
  83. string subPath = "./发射机/" + productname + "/测试数据/" + tps.TestProject +"/";
  84. if (false == System.IO.Directory.Exists(subPath))
  85. {
  86. System.IO.Directory.CreateDirectory(subPath);
  87. }
  88. workbook = new Spire.Xls.Workbook();
  89. string FileName = subPath + tps.Serial + ".xlsx";
  90. if (File.Exists(FileName))
  91. {
  92. workbook.LoadFromFile(FileName);
  93. sheet1 = workbook.Worksheets[sheetname];
  94. }
  95. else if (File.Exists(ModelFile))
  96. {
  97. workbook.LoadFromFile(ModelFile);
  98. sheet1 = workbook.Worksheets["测试信息"];
  99. sheet1.Range["A2"].Value2 = tps.Serial;//序列号
  100. sheet1.Range["B2"].Value2 = tps.Tester;//检验员
  101. sheet1.Range["C2"].Value2 = DateTime.Now.Date.ToString();//日期
  102. sheet1.Range["D2"].Value2 = tps.Temperature;//温度
  103. sheet1.Range["E2"].Value2 = tps.Humidity;//湿度
  104. sheet1 = workbook.Worksheets[sheetname];
  105. }
  106. if (!File.Exists(ModelFile))
  107. {
  108. sheet1 = null;
  109. }
  110. sheet = sheet1;
  111. }
  112. public void WriteExcelData(Spire.Xls.Worksheet sheet, int row, int channel, string name, string lower, string upper, string val, string result)
  113. {
  114. int column = (channel - 1) * 6;
  115. sheet.Range[row + 2, 1 + column].Value2 = name;
  116. sheet.Range[row + 2, 2 + column].Value2 = lower;
  117. sheet.Range[row + 2, 3 + column].Value2 = upper;
  118. sheet.Range[row + 2, 4 + column].Value = val;
  119. sheet.Range[row + 2, 5 + column].Value2 = result;
  120. }
  121. public void SaveExcel(Spire.Xls.Workbook workbook)
  122. {
  123. string productname;
  124. if (tps.Product.Contains('-'))
  125. {
  126. productname = tps.Product.Split('-')[0];
  127. }
  128. else
  129. {
  130. productname = tps.Product;
  131. }
  132. string subPath = "./发射机/" + productname + "/测试数据 /" + tps.TestProject + "/";
  133. string FileName = subPath + tps.Serial + ".xlsx";
  134. workbook.CalculateAllValue();
  135. workbook.SaveToFile(FileName);
  136. }
  137. #region 串口配置表
  138. /// <summary>
  139. /// 获取串口配置表
  140. /// </summary>
  141. /// <returns></returns>
  142. public MatchComPara LoadComWorkBook()
  143. {
  144. MatchComPara pars = new MatchComPara();
  145. string FileName = Path.Combine(Bundle.bundle.BundleDir, "config\\串口控制.xlsx");
  146. if (!File.Exists(FileName))
  147. {
  148. ShowMessage(MsgType.Error, "找不到串口控制.xlsx");
  149. return null;
  150. }
  151. Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
  152. workbook.LoadFromFile(FileName);
  153. //获取第一个工作表sheet1
  154. Spire.Xls.Worksheet sheet = workbook.Worksheets[0];
  155. int num = 0;
  156. int blankRows = 0;
  157. while (num++ < 200)
  158. {
  159. //索引从1开始
  160. string col1 = sheet.Range[num, 1].Value2 != null ? sheet.Range[num, 1].Value2.ToString() : "";
  161. col1 = col1.Trim();
  162. if (string.IsNullOrEmpty(col1))
  163. {
  164. blankRows++;
  165. if (blankRows > 5)
  166. {
  167. //连续5个空行以上则退出
  168. break;
  169. }
  170. }
  171. else
  172. {
  173. blankRows = 0;
  174. }
  175. if (col1.Equals("序号"))
  176. {
  177. List<ComMatchParameter> ComTable = ReadParameters(sheet, num);
  178. foreach (var item in ComTable)
  179. {
  180. if (pars.ComParameters.ContainsKey(item.SN))
  181. {
  182. ShowMessage(MsgType.Error, string.Format("串口控制:{0} 存在同名参数:{1},无法重复添加参数", sheet.Name, item.SN));
  183. continue;
  184. }
  185. pars.ComParameters.Add(item.SN, item);
  186. }
  187. }
  188. }
  189. return pars;
  190. }
  191. public class MatchComPara
  192. {
  193. public Dictionary<string, ComMatchParameter> ComParameters;
  194. public MatchComPara()
  195. {
  196. ComParameters = new Dictionary<string, ComMatchParameter>();
  197. }
  198. public string GetComPort(string name)
  199. {
  200. if (string.IsNullOrEmpty(name))
  201. return null;
  202. if (this.ComParameters.ContainsKey(name) == false)
  203. return null;
  204. string val1 = this.ComParameters[name].ComPort.Trim();
  205. return val1;
  206. }
  207. public string GetThirdByte(string name)
  208. {
  209. string val1 = this.ComParameters[name].ThirdByte.Trim();
  210. return val1;
  211. }
  212. public string GetFourthByte(string name)
  213. {
  214. string val2 = this.ComParameters[name].FourthByte.Trim();
  215. return val2;
  216. }
  217. public string Getfreqpoint(string name)
  218. {
  219. string val2 = this.ComParameters[name].freqpoint.Trim();
  220. return val2;
  221. }
  222. }
  223. List<ComMatchParameter> ReadParameters(Spire.Xls.Worksheet sheet, int rowIndex)
  224. {
  225. List<ComMatchParameter> ModulationTable = new List<ComMatchParameter>();
  226. string col1 = sheet.Range[rowIndex, 1].Value2 != null ? sheet.Range[rowIndex, 1].Value2.ToString() : "";
  227. string col2 = sheet.Range[rowIndex, 2].Value2 != null ? sheet.Range[rowIndex, 2].Value2.ToString() : "";
  228. string col3 = sheet.Range[rowIndex, 3].Value2 != null ? sheet.Range[rowIndex, 3].Value2.ToString() : "";
  229. string col4 = sheet.Range[rowIndex, 4].Value2 != null ? sheet.Range[rowIndex, 4].Value2.ToString() : "";
  230. string col5 = sheet.Range[rowIndex, 5].Value2 != null ? sheet.Range[rowIndex, 5].Value2.ToString() : "";
  231. if (!(col1 == "序号" && col2 == "串口号" && col3 == "第3个字节" && col4 == "第4个字节" && col5 == "频点(MHz)"))
  232. {
  233. ShowMessage(MsgType.Error, "'串口控制'行首标题位置和格式不正确");
  234. return ModulationTable;
  235. }
  236. int num = rowIndex;
  237. //默认最多30行
  238. while (num++ < rowIndex + 100)
  239. {
  240. col1 = sheet.Range[num, 1].Value2 != null ? sheet.Range[num, 1].Value2.ToString() : "";
  241. col2 = sheet.Range[num, 2].Value2 != null ? sheet.Range[num, 2].Value2.ToString() : "";
  242. col3 = sheet.Range[num, 3].Value2 != null ? sheet.Range[num, 3].Value2.ToString() : "";
  243. col4 = sheet.Range[num, 4].Value2 != null ? sheet.Range[num, 4].Value2.ToString() : "";
  244. col5 = sheet.Range[num, 5].Value2 != null ? sheet.Range[num, 5].Value2.ToString() : "";
  245. if (string.IsNullOrEmpty(col1))
  246. {
  247. break;
  248. }
  249. ComMatchParameter ObjModulation = new ComMatchParameter();
  250. ObjModulation.SN = col1;
  251. ObjModulation.ComPort = col2;
  252. ObjModulation.ThirdByte = col3;
  253. ObjModulation.FourthByte = col4;
  254. ObjModulation.freqpoint = col5;
  255. ModulationTable.Add(ObjModulation);
  256. }
  257. return ModulationTable;
  258. }
  259. /// <summary>
  260. /// 串口控制4个对应项
  261. /// </summary>
  262. public class ComMatchParameter
  263. {
  264. /// <summary>
  265. /// 序号
  266. /// </summary>
  267. public string SN { get; set; }
  268. /// <summary>
  269. /// 串口号
  270. /// </summary>
  271. public string ComPort { get; set; }
  272. /// <summary>
  273. /// 第3个字节
  274. /// </summary>
  275. public string ThirdByte { get; set; }
  276. /// <summary>
  277. /// 第4个字节
  278. /// </summary>
  279. public string FourthByte { get; set; }
  280. /// <summary>
  281. /// 频点
  282. /// </summary>
  283. public string freqpoint { get; set; }
  284. }
  285. #endregion
  286. public class DataType
  287. {
  288. /// <summary>
  289. /// 测试名称
  290. /// </summary>
  291. public string Test_name { set; get; }
  292. /// <summary>
  293. /// 指标下限
  294. /// </summary>
  295. public double Lower { set; get; }
  296. /// <summary>
  297. /// 指标上限
  298. /// </summary>
  299. public double Upper { set; get; }
  300. /// <summary>
  301. /// 测试值
  302. /// </summary>
  303. public double TestVal { set; get; }
  304. /// <summary>
  305. /// 判断结果
  306. /// </summary>
  307. public string Result { set; get; }
  308. }
  309. }
  310. }