You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

289 lines
12 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. package com.qyft.ms.app.service;
  2. import cn.hutool.json.JSONUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.qyft.ms.app.common.constant.WebSocketMessageType;
  5. import com.qyft.ms.app.common.generator.PathGenerator;
  6. import com.qyft.ms.app.common.result.CMDResultCode;
  7. import com.qyft.ms.app.model.entity.OperationLog;
  8. import com.qyft.ms.app.model.form.CMDForm;
  9. import com.qyft.ms.app.model.vo.ExecutionResult;
  10. import com.qyft.ms.device.service.DeviceTcpCMDService;
  11. import lombok.RequiredArgsConstructor;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.stereotype.Service;
  14. import java.awt.*;
  15. import java.util.*;
  16. import java.util.List;
  17. import java.util.function.Function;
  18. import java.util.function.Supplier;
  19. import static com.qyft.ms.app.common.generator.PathGenerator.generatePathPoints;
  20. @Slf4j
  21. @RequiredArgsConstructor
  22. @Service
  23. public class CMDService {
  24. private final WebSocketService webSocketService;
  25. private final DeviceTcpCMDService deviceTcpCMDService;
  26. private final OperationLogService operationLogService;
  27. private final MatrixCraftService matrixCraftService;
  28. private void initExecutorThread(List<Supplier<Boolean>> cmdList, CMDForm form) {
  29. new Thread(() -> run(cmdList, form)).start();
  30. }
  31. // 电机移动
  32. public boolean moveMotorToPosition(CMDForm form) {
  33. Map<String, Object> params = form.getParams();
  34. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  35. String axis = (String) params.get("axis");
  36. double position = Optional.ofNullable(params.get("position"))
  37. .filter(Number.class::isInstance)
  38. .map(Number.class::cast)
  39. .map(Number::doubleValue)
  40. .orElse(0.0);
  41. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition(axis, position));
  42. initExecutorThread(cmdList, form);
  43. return true;
  44. };
  45. // 切换清洗管路/喷涂管路
  46. public boolean switchThreeWayValve(CMDForm form) {
  47. Map<String, Object> params = form.getParams();
  48. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  49. String type = (String) params.get("type");
  50. if (type.equals("clean")) {
  51. cmdList.add(deviceTcpCMDService::switchThreeWayValveToSubstrate);
  52. } else if (type.equals("spray")) {
  53. cmdList.add(deviceTcpCMDService::switchThreeWayValveToSpray);
  54. }
  55. initExecutorThread(cmdList, form);
  56. return true;
  57. }
  58. // 除湿阀、清洗阀、喷嘴阀控制方法
  59. public boolean controlValve(CMDForm form) {
  60. Map<String, Object> params = form.getParams();
  61. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  62. if(params.get("valveType") !=null && params.get("isOpen") !=null) {
  63. String valveType = (String) params.get("valveType");
  64. boolean isOpen = (boolean) params.get("isOpen");
  65. cmdList.add(() -> deviceTcpCMDService.controlValve(valveType,isOpen));
  66. }
  67. initExecutorThread(cmdList, form);
  68. return true;
  69. }
  70. // 以指定电压值开启高压电
  71. public boolean turnOnHighVoltage(CMDForm form) {
  72. Map<String, Object> params = form.getParams();
  73. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  74. double voltage = Optional.ofNullable(params.get("voltage"))
  75. .filter(Number.class::isInstance)
  76. .map(Number.class::cast)
  77. .map(Number::doubleValue)
  78. .orElse(0.0);
  79. cmdList.add(() -> deviceTcpCMDService.turnOnHighVoltage(voltage));
  80. initExecutorThread(cmdList, form);
  81. return true;
  82. }
  83. // 关闭高压电
  84. public boolean turnOffHighVoltage(CMDForm form) {
  85. Map<String, Object> params = form.getParams();
  86. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  87. cmdList.add(deviceTcpCMDService::turnOffHighVoltage);
  88. initExecutorThread(cmdList, form);
  89. return true;
  90. }
  91. // 以指定转速、方向和时间开启注射泵
  92. public boolean turnOnSyringePump(CMDForm form) {
  93. Map<String, Object> params = form.getParams();
  94. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  95. double rotationSpeed = Optional.ofNullable(params.get("rotationSpeed"))
  96. .filter(Number.class::isInstance)
  97. .map(Number.class::cast)
  98. .map(Number::doubleValue)
  99. .orElse(0.0);
  100. double time = Optional.ofNullable(params.get("time"))
  101. .filter(Number.class::isInstance)
  102. .map(Number.class::cast)
  103. .map(Number::doubleValue)
  104. .orElse(0.0);
  105. String direction = (String) params.get("direction");
  106. cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump(rotationSpeed, direction, time));
  107. initExecutorThread(cmdList, form);
  108. return true;
  109. }
  110. // 停止注射泵
  111. public boolean turnOffSyringePump(CMDForm form) {
  112. Map<String, Object> params = form.getParams();
  113. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  114. cmdList.add(deviceTcpCMDService::turnOffSyringePump);
  115. initExecutorThread(cmdList, form);
  116. return true;
  117. }
  118. // 设置指定轴的电机运行时电流
  119. public boolean setMotorRunningCurrent(CMDForm form) {
  120. Map<String, Object> params = form.getParams();
  121. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  122. String axis = (String) params.get("axis");
  123. double current = Optional.ofNullable(params.get("current"))
  124. .filter(Number.class::isInstance)
  125. .map(Number.class::cast)
  126. .map(Number::doubleValue)
  127. .orElse(0.0);
  128. cmdList.add(() -> deviceTcpCMDService.setMotorRunningCurrent(axis, current));
  129. initExecutorThread(cmdList, form);
  130. return true;
  131. }
  132. // 开始喷涂
  133. public boolean startWork(CMDForm form) {
  134. Map<String, Object> params = form.getParams();
  135. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  136. // 托盘位置
  137. Map<String, Integer> trayPosition = new HashMap<>();
  138. trayPosition.put("x", 0);
  139. trayPosition.put("y", 0);
  140. trayPosition.put("z", 0);
  141. int space = (Integer) params.get("space");
  142. List<Map<String, Integer>> position = (List<Map<String, Integer>>) params.get("position");
  143. Map<String, Integer> p1 = position.get(0);
  144. Map<String, Integer> p2 = position.get(1);
  145. // 托盘点位 x y z
  146. int left = trayPosition.get("x")+ p1.get("x");
  147. int right = trayPosition.get("x") + p2.get("x");
  148. int top = trayPosition.get("y") + p2.get("y");
  149. int bottom = trayPosition.get("y") + p1.get("y");
  150. // 获取轨迹list
  151. int direction = (Integer) params.get("direction");
  152. List<Point> horizontalPath = generatePathPoints(
  153. left, right, bottom, top, space, direction == 1 ? PathGenerator.MoveMode.HORIZONTAL_ZIGZAG_TOP_DOWN : PathGenerator.MoveMode.VERTICAL_ZIGZAG_LEFT_RIGHT
  154. );
  155. // 将三通阀转至喷涂管路
  156. cmdList.add(deviceTcpCMDService::switchThreeWayValveToSpray);
  157. // 设置指定轴的电机的运行速度
  158. int setMotorSpeed = (Integer) params.get("setMotorSpeed");
  159. cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("x", setMotorSpeed));
  160. cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("y", setMotorSpeed));
  161. cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("z", setMotorSpeed));
  162. // 移动到指定高度(位置)
  163. int height = (Integer) params.get("height");
  164. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("z",trayPosition.get("z") + height ));
  165. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("x", left));
  166. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("y", top));
  167. // 是否加电 电压
  168. Object voltage = params.get("voltage");
  169. if (voltage instanceof Integer) {
  170. cmdList.add(() -> deviceTcpCMDService.turnOnHighVoltage( (Integer) voltage));
  171. }
  172. // 开启喷嘴阀
  173. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
  174. // 推注射泵
  175. cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump(100, "right", 5000));
  176. // 插入日志
  177. cmdList.add( () -> {
  178. OperationLog operationLog = new OperationLog();
  179. operationLog.setStatus(0);
  180. operationLog.setMatrixId((Long) params.get("matrixCraftId"));
  181. operationLog.setMatrixInfo(JSON.toJSONString(params));
  182. operationLogService.add(operationLog);
  183. return true;
  184. });
  185. // 执行轨迹
  186. double curX = left;
  187. double curY = top;
  188. for (Point point : horizontalPath) {
  189. double nextX = (int) point.getX();
  190. double nextY = (int) point.getY();
  191. double distanceX = nextX - curX;
  192. double distanceY = nextY - curY;
  193. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("x", distanceX));
  194. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("y", distanceY));
  195. curX = nextX;
  196. curY = nextY;
  197. }
  198. // 停止喷涂
  199. cmdList.add(deviceTcpCMDService::turnOffSyringePump);
  200. // 关闭喷嘴阀
  201. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
  202. // 回到原点
  203. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X"));
  204. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Y"));
  205. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z"));
  206. // 结束日志
  207. cmdList.add( () -> {
  208. OperationLog operationLog = operationLogService.getIng();
  209. operationLog.setStatus(1);
  210. operationLogService.updateById(operationLog);
  211. return true;
  212. });
  213. initExecutorThread(cmdList, form);
  214. return true;
  215. }
  216. // 结束喷涂
  217. public boolean stopWork(CMDForm form) {
  218. Map<String, Object> params = form.getParams();
  219. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  220. // 停止喷涂
  221. cmdList.add(deviceTcpCMDService::turnOffSyringePump);
  222. // 关闭喷嘴阀
  223. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
  224. // 回到原点
  225. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X"));
  226. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z"));
  227. initExecutorThread(cmdList, form);
  228. return true;
  229. }
  230. // 测试轴转动
  231. public boolean rotate(CMDForm form) {
  232. Map<String, Object> params = form.getParams();
  233. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  234. String axis = (String) params.get("axis");
  235. double rotationSpeed = Optional.ofNullable(params.get("rotationSpeed"))
  236. .filter(Number.class::isInstance)
  237. .map(Number.class::cast)
  238. .map(Number::doubleValue)
  239. .orElse(0.0);
  240. int time = (Integer) params.get("time");
  241. cmdList.add(() -> deviceTcpCMDService.rotate(axis, rotationSpeed, time));
  242. initExecutorThread(cmdList, form);
  243. return true;
  244. }
  245. private void run(List<Supplier<Boolean>> cmdList, CMDForm form) {
  246. ExecutionResult executionResult = new ExecutionResult();
  247. executionResult.setCommandId(form.getCommandId());
  248. executionResult.setCommandName(form.getCommandName());
  249. // 执行所有命令
  250. for (Supplier<Boolean> command : cmdList) {
  251. boolean result = command.get();
  252. if (!result) {
  253. log.error("指令执行异常: {}", JSONUtil.toJsonStr(form));
  254. executionResult.setStatus(CMDResultCode.FAILURE.getCode());
  255. executionResult.setMessage(CMDResultCode.FAILURE.getMsg());
  256. webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
  257. return;
  258. }
  259. }
  260. log.info("指令执行成功: {}", JSONUtil.toJsonStr(form));
  261. executionResult.setStatus(CMDResultCode.SUCCESS.getCode());
  262. executionResult.setMessage(CMDResultCode.SUCCESS.getMsg());
  263. webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
  264. }
  265. }