ATEQ.java 12 KB

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