ATEQ2.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. package com.mes.util;
  2. import com.mes.ui.MesClient;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import java.util.Arrays;
  6. public class ATEQ2 {
  7. private static final Logger log = LoggerFactory.getLogger(ATEQ2.class);
  8. public static boolean stop() {
  9. String s1 = DataUtils.CRC16(ATEQ2.getStationNo()+" 05 00 00 FF 00");
  10. byte[] read = MesClient.serialPortUtils2.read(s1);
  11. boolean result = Arrays.equals(read, DataUtils.hexStringToByteArray(s1));
  12. log.info("右工位气密仪停止{}", result ? "成功" : "失败");
  13. return result;
  14. }
  15. public static boolean start() {
  16. String s1 = DataUtils.CRC16(ATEQ2.getStationNo()+" 05 00 01 FF 00");
  17. System.out.println("s1:"+s1);
  18. byte[] read = MesClient.serialPortUtils2.read(s1);
  19. boolean result = Arrays.equals(read, DataUtils.hexStringToByteArray(s1));
  20. log.info("右工位气密仪开始{}", result ? "成功" : "失败");
  21. return result;
  22. }
  23. // public static boolean resetFIFO() {
  24. // byte[] read = SerialUtil.read("01 05 00 02 FF 00 2D FA");
  25. // boolean result = Arrays.equals(read, DataUtils.hexStringToByteArray("01 05 00 02 FF 00 2D FA"));
  26. // log.info("重置FIFO{}", result ? "成功" : "失败");
  27. // return result;
  28. // }
  29. // 读取实时结果
  30. public static RealtimeResult readRealtimeResult() {
  31. String s1 = DataUtils.CRC16(ATEQ2.getStationNo()+" 03 00 30 00 0D");
  32. byte[] read = MesClient.serialPortUtils2.read(s1);
  33. System.out.println("右工位结果读取:"+DataUtils.bytesToHex(read));
  34. if(read.length > 30) {
  35. return new RealtimeResult(read);
  36. } else {
  37. throw new RuntimeException("右工位读取实时结果时, 返回的数据长度不够");
  38. }
  39. }
  40. // // 读取先入先出队列中的待处理结果
  41. // public static FIFOResult readFIFOResult() {
  42. // byte[] read = SerialUtil.read("01 03 00 10 00 0D 85 CA");
  43. // if(read.length > 28) {
  44. // return new FIFOResult(read);
  45. // } else {
  46. // throw new RuntimeException("读取FIFO结果时, 返回的数据长度不够");
  47. // }
  48. // }
  49. // 读取最后结果
  50. public static LastResult readLastResult() {
  51. String s1 = DataUtils.CRC16(ATEQ2.getStationNo()+" 03 00 11 00 0C");
  52. byte[] read = MesClient.serialPortUtils2.read(s1);
  53. if(read.length > 20) {
  54. return new LastResult(read);
  55. } else {
  56. throw new RuntimeException("右工位读取FIFO结果时, 返回的数据长度不够");
  57. }
  58. }
  59. // 获取参数, 传入程序号, 获取对应程序号的参数
  60. public static Parameters getParams(Integer programNumber) {
  61. // 步骤1: 选择要编辑的程序
  62. String s1 = DataUtils.CRC16("01 10 30 04 00 01 02 " + DataUtils.intToWord(programNumber - 1));
  63. MesClient.serialPortUtils2.read(s1);
  64. // 步骤2: 写入要读取的标识符
  65. String s2 = "01 10 00 00 00 04 08 03 00 01 00 02 00 03 00 F6 F6"; // s2 表示读取3个参数, 分别是 填充时间、稳定时间、测试时间
  66. MesClient.serialPortUtils2.read(s2);
  67. // 步骤3: 读取数据
  68. byte[] read = MesClient.serialPortUtils2.read("01 03 00 00 00 09 85 CC");
  69. if(read.length > 22) {
  70. return new Parameters(read);
  71. } else {
  72. throw new RuntimeException("读取参数时, 返回的数据长度不够");
  73. }
  74. }
  75. // 获取站号
  76. public static String getStationNo() {
  77. try{
  78. int decimalNumber = Integer.valueOf(MesClient.configParam.getModbusSite2()); // 示例十进制数
  79. String hexString = Integer.toHexString(decimalNumber); // 转换为16进制字符串
  80. // System.out.println(hexString.toUpperCase()); // 输出结果
  81. if(hexString.length() == 1) {
  82. hexString = "0" + hexString;
  83. }
  84. return hexString;
  85. }catch (Exception e){
  86. return "01";
  87. }
  88. }
  89. public static class RealtimeResult {
  90. public final Integer programNumber; // 程序号
  91. // public final Integer FIFO_Number;
  92. public final String testType; // 测试类型
  93. public final String step; // 当前步骤
  94. public final Integer stepCode; // 当前步骤码
  95. public final Double pressureValue; // 压力值
  96. public final Double leakValue; // 泄漏值
  97. public final Boolean isCycleEnd; // 测试是否结束
  98. public final Boolean isPass; // 测试是否通过
  99. public final Boolean isKeyExist; //
  100. public final String pressureUnit; // 压力单位
  101. public final String leakUnit; // 泄漏单位
  102. public RealtimeResult(byte[] data) {
  103. // 大端排序互换位置
  104. // 01031a 0000(程序号) 0800(测试模式) 0100(测试状态) 0080(报警状态) 0600(测试阶段) 160d0000(测试压力) e02e0000(压力单位) 00000000(泄漏量结果) 38c70000(泄漏量单位) cf93
  105. // 01031a 0000(程序号) 0800(测试模式) 0100(测试状态) 3080(报警状态) ffff(测试阶段) 160d0000(测试压力) e02e0000(压力单位) 00000000(泄漏量结果) 38c70000(泄漏量单位) 1b0a
  106. System.out.println("右工位实时数据:"+DataUtils.bytesToHex(data));
  107. this.programNumber = DataUtils.bytesToInt(Arrays.copyOfRange(data, 3, 5)) + 1;
  108. // this.FIFO_Number = DataUtils.bytesToInt(Arrays.copyOfRange(data, 5, 7));
  109. this.testType = getTestTypeStr(DataUtils.bytesToInt(Arrays.copyOfRange(data, 5, 7)));
  110. int state = DataUtils.bytesToInt(Arrays.copyOfRange(data, 7, 9));
  111. this.isCycleEnd = DataUtils.getBit(state, 5) == 1;
  112. this.isPass = DataUtils.getBit(state, 0) == 1;
  113. this.isKeyExist = DataUtils.getBit(state, 15) == 1;
  114. this.stepCode = DataUtils.bytesToInt(Arrays.copyOfRange(data, 11, 13));
  115. this.step = getStepStr(this.stepCode);
  116. this.pressureValue = DataUtils.bytesToInt(Arrays.copyOfRange(data, 13, 17)) / 1000.0;
  117. this.pressureUnit = getUnit(DataUtils.bytesToInt(Arrays.copyOfRange(data, 17, 21)));
  118. this.leakValue = DataUtils.bytesToInt(Arrays.copyOfRange(data, 21, 25)) / 1000.0;
  119. this.leakUnit = getUnit(DataUtils.bytesToInt(Arrays.copyOfRange(data, 25, 29)));
  120. }
  121. @Override
  122. public String toString() {
  123. return "右工位实时结果{" +
  124. " 压力值: " + pressureValue +
  125. ", 泄漏值: " + leakValue +
  126. // ", FIFO数量: " + FIFO_Number +
  127. ", 当前步骤CODE: " + stepCode +
  128. ", 当前步骤: " + step +
  129. // ", 循环是否结束: " + isCycleEnd +
  130. // ", 测试通过: " + isPass +
  131. // ", 是否关键存在: " + isKeyExist +
  132. ", 程序号: " + programNumber +
  133. // ", 测试类型: " + testType +
  134. '}';
  135. }
  136. }
  137. // public static class FIFOResult {
  138. // public final Integer programNumber;
  139. // public final String testType;
  140. // public final Double pressureValue;
  141. // public final Double leakValue;
  142. // public final Boolean isPass;
  143. // public final Boolean isTestLeak;
  144. // public final Boolean isReferLeak;
  145. // public final String pressureUnit;
  146. // public final String leakUnit;
  147. // public FIFOResult(byte[] data) {
  148. // this.programNumber = DataUtils.bytesToInt(Arrays.copyOfRange(data, 3, 5)) + 1;
  149. // this.testType = getTestTypeStr(DataUtils.bytesToInt(Arrays.copyOfRange(data, 5, 7)));
  150. // int state = DataUtils.bytesToInt(Arrays.copyOfRange(data, 7, 9));
  151. // this.isPass = DataUtils.getBit(state, 0) == 1;
  152. // this.isTestLeak = DataUtils.getBit(state, 1) == 1;
  153. // this.isReferLeak = DataUtils.getBit(state, 2) == 1;
  154. // this.pressureValue = DataUtils.bytesToInt(Arrays.copyOfRange(data, 11, 15)) / 1000.0;
  155. // this.pressureUnit = getUnit(DataUtils.bytesToInt(Arrays.copyOfRange(data, 15, 19)));
  156. // this.leakValue = DataUtils.bytesToInt(Arrays.copyOfRange(data, 19, 23)) / 1000.0;
  157. // this.leakUnit = getUnit(DataUtils.bytesToInt(Arrays.copyOfRange(data, 23, 27)));
  158. // }
  159. //
  160. // @Override
  161. // public String toString() {
  162. // return "FIFO结果{" +
  163. // " 压力值: " + pressureValue +
  164. // ", 泄漏值: " + leakValue +
  165. // ", 测试通过: " + isPass +
  166. // ", 测试泄漏: " + isTestLeak +
  167. // ", 参考泄漏: " + isReferLeak +
  168. // ", 程序号: " + programNumber +
  169. // ", 测试类型: " + testType +
  170. // '}';
  171. // }
  172. // }
  173. // 最后结果类
  174. public static class LastResult {
  175. public final Integer programNumber; // 程序号
  176. public final String testType; // 测试类型
  177. public final Double pressureValue; // 压力值
  178. public final Double leakValue; // 泄漏值
  179. public final Boolean isPass; // 测试是否通过(true表示OK, false表示NG)
  180. public final Boolean isTestLeak;
  181. public final Boolean isReferLeak;
  182. public final String pressureUnit; // 压力单位
  183. public final String leakUnit; // 测试单位
  184. public LastResult(byte[] data) {
  185. // 010318 0000(程序号) 0100(测试模式) 0800(测试状态) 0200(报警状态) 160D0000(压力值) E02E0000(压力单位) 00000000(泄露值) 38C70000(泄露值单位) 1EE9
  186. log.info("最终结果:"+DataUtils.bytesToHex(data));
  187. this.programNumber = DataUtils.bytesToInt(Arrays.copyOfRange(data, 3, 5)) + 1;
  188. this.testType = getTestTypeStr(DataUtils.bytesToInt(Arrays.copyOfRange(data, 5, 7)));
  189. int state = DataUtils.bytesToInt(Arrays.copyOfRange(data, 7, 9));
  190. this.isPass = DataUtils.getBit(state, 0) == 1;
  191. this.isTestLeak = DataUtils.getBit(state, 1) == 1;
  192. this.isReferLeak = DataUtils.getBit(state, 2) == 1;
  193. this.pressureValue = DataUtils.bytesToInt(Arrays.copyOfRange(data, 11, 15)) / 1000.0;
  194. this.pressureUnit = getUnit(DataUtils.bytesToInt(Arrays.copyOfRange(data, 15, 19)));
  195. this.leakValue = DataUtils.bytesToInt(Arrays.copyOfRange(data, 19, 23)) / 1000.0;
  196. this.leakUnit = getUnit(DataUtils.bytesToInt(Arrays.copyOfRange(data, 23, 27)));
  197. if(this.leakValue == 0 && !this.isPass){
  198. // this.leakValue = Double.valueOf(9999);
  199. }
  200. }
  201. @Override
  202. public String toString() {
  203. return "最后结果{" +
  204. " 压力值: " + pressureValue +
  205. ", 泄漏值: " + leakValue +
  206. ", 测试通过: " + isPass +
  207. ", 测试泄漏: " + isTestLeak +
  208. ", 参考泄漏: " + isReferLeak +
  209. ", 程序号: " + programNumber +
  210. // ", 测试类型: " + testType +
  211. '}';
  212. }
  213. }
  214. // 参数类
  215. public static class Parameters {
  216. public final Integer fillTime; // 填充时间
  217. public final Integer stabilizeTime; // 稳定时间
  218. public final Integer testTime; // 测试时间
  219. public Parameters(byte[] data) {
  220. log.info("时间参数:"+DataUtils.bytesToHex(data));
  221. this.fillTime = DataUtils.bytesToInt(Arrays.copyOfRange(data, 5, 9)) / 1000;
  222. this.stabilizeTime = DataUtils.bytesToInt(Arrays.copyOfRange(data, 11, 15)) / 1000;
  223. this.testTime = DataUtils.bytesToInt(Arrays.copyOfRange(data, 17, 21)) / 1000;
  224. }
  225. @Override
  226. public String toString() {
  227. return "参数{" +
  228. "填充时间: " + fillTime +
  229. "s, 稳定时间: " + stabilizeTime +
  230. "s, 测试时间: " + testTime +
  231. "s}";
  232. }
  233. }
  234. private static String getTestTypeStr(Integer testTypeCode) {
  235. String s = "未知";
  236. if(testTypeCode == 1) {
  237. s = "泄漏";
  238. }
  239. return s;
  240. }
  241. private static String getStepStr(Integer stepCode) {
  242. String s = "未知";
  243. switch (stepCode) {
  244. case 0:
  245. s = "预填充";
  246. break;
  247. case 1:
  248. s = "预排气";
  249. break;
  250. case 2:
  251. s = "密封零件测试充气";
  252. break;
  253. case 3:
  254. s = "密封零件测试保压";
  255. break;
  256. case 4:
  257. s = "充气";
  258. break;
  259. case 5:
  260. s = "保压";
  261. break;
  262. case 6:
  263. // s = "测试"; // 充气
  264. s = "充气";
  265. break;
  266. case 7:
  267. // s = "排气"; // 保压
  268. s = "保压";
  269. break;
  270. case 8:
  271. s = "测试"; // 保压
  272. break;
  273. case 65535:
  274. s = "未进行测试";
  275. break;
  276. }
  277. return s;
  278. }
  279. private static String getUnit(Integer unitCode) {
  280. String s = "";
  281. switch (unitCode) {
  282. case 0:
  283. s = "cm3/s";
  284. break;
  285. case 1000:
  286. s = "cm3/min";
  287. break;
  288. case 2000:
  289. s = "cm3/h";
  290. break;
  291. case 6000:
  292. s = "Pa";
  293. break;
  294. case 8000:
  295. s = "Pa/s";
  296. break;
  297. case 11000:
  298. s = "Bar";
  299. break;
  300. case 12000:
  301. s = "kPa";
  302. break;
  303. case 50000:
  304. s = "ml/s";
  305. break;
  306. case 51000:
  307. s = "ml/min";
  308. break;
  309. case 52000:
  310. s = "ml/h";
  311. break;
  312. }
  313. return s;
  314. }
  315. }