diff --git a/README2.md b/README2.md index e482ce6..899dba3 100644 --- a/README2.md +++ b/README2.md @@ -104,14 +104,19 @@ TODO: 2. 吸空检测 校准移液枪相关参数 - 10. 加热功能 - 支持通过excel导入项目信息 + 10. 加热功能 OK ``` ``` - 16. 支持急停 -6. 核对ID卡信息 -1. 记录打印功能? -3. 支持鼠标? +0. 支持通过excel导入项目信息 +1. 部署 +2. 支持急停 +3. 在插卡时,添加ID卡信息核对代码 +4. 支持标准卡测试 +5. 支持板夹出仓时扫码检查功能 +4. 记录打印功能? + +6. 支持吸空检测 (困难) +5. 支持鼠标? (困难) ``` \ No newline at end of file diff --git a/src/main/java/a8k/extapi_controler/ExtApiControler.java b/src/main/java/a8k/extapi_controler/ExtApiControler.java index ce03657..e50a336 100644 --- a/src/main/java/a8k/extapi_controler/ExtApiControler.java +++ b/src/main/java/a8k/extapi_controler/ExtApiControler.java @@ -165,7 +165,7 @@ public class ExtApiControler { } return AppRet.success(statusList); } - +// @PostMapping("/api/service-config/service-action-list") @ResponseBody public AppRet serviceActionList(@RequestBody Map params) throws Exception { @@ -280,53 +280,6 @@ public class ExtApiControler { return this.executeServiceActionAndGetResponse(service, method, actionParams); } - @PostMapping("/api/service-config/service-action-exec-by-map") - @ResponseBody - public AppRet serviceActionExecuteByMap(@RequestBody Map params) throws Throwable { - String serviceKey = (String) params.get("serviceKey"); - var service = this.getServiceInstanceByServiceKey(serviceKey); - Assert.isTrue(service != null, "service not found"); - - - var actionName = (String) params.get("action"); - var actionParams = (Map) params.get("params"); - List actionParamList = new ArrayList<>(); - Method method = null; - for (var methodItem : service.getClass().getMethods()) { - if (!methodItem.getName().equals(actionName)) { - continue; - } - if (methodItem.getParameterTypes().length != actionParams.size()) { - continue; - } - if (!methodItem.isAnnotationPresent(ExtApiFn.class)) { - continue; - } - - actionParamList.clear(); - for (var paramItem : methodItem.getParameters()) { - var name = paramItem.getName(); - Object value = actionParams.get(name); - if (paramItem.getType().isEnum()) { - var methodValueOf = paramItem.getType().getMethod("valueOf", String.class); - value = methodValueOf.invoke(null, (String) value); - } else if (paramItem.getType().equals(EnginnerParamFile.class)) { - value = EnginnerParamFile.fromBase64((String) value); - } else if (paramItem.getType().equals(Double.class)) { - value = Double.valueOf(String.format("%s", value)); - } - if (!paramItem.getType().isAssignableFrom(value.getClass())) { - continue; - } - actionParamList.add(value); - } - method = methodItem; - break; - } - Assert.isTrue(method != null, "method not found"); - return this.executeServiceActionAndGetResponse(service, method, actionParamList); - } - @PostMapping("/api/service-config/class-struct-info-get") @ResponseBody public AppRet classStructInfoGet(@RequestBody Map params) throws Exception { diff --git a/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java b/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java index b6af803..7d2a3ea 100644 --- a/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java +++ b/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java @@ -36,6 +36,7 @@ public enum ExtApiTabConfig { VirtualDeviceSimulationTest("测试.虚拟设备测试", true), MainflowCtrlTestService("测试.主流程控制测试", true), A8kPipetteCtrlModule("硬件驱动测试.移液枪测试", true), + StepMotorCtrlDriver("硬件驱动测试.步进电机测试", true), ActionReactorService("底层调试.单步调试", false),//OK ReactionPlatesTransmitCtrl("ReactionPlatesTransmitCtrl", false), diff --git a/src/main/java/a8k/extapi_controler/utils/ExtApiFn.java b/src/main/java/a8k/extapi_controler/utils/ExtApiFn.java index 2033812..9ba3e12 100644 --- a/src/main/java/a8k/extapi_controler/utils/ExtApiFn.java +++ b/src/main/java/a8k/extapi_controler/utils/ExtApiFn.java @@ -7,7 +7,7 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface ExtApiFn { - String name(); + String name() default ""; String group() default ""; int groupOrder() default 0; int order() default 0; diff --git a/src/main/java/a8k/hardware/A8kCanBusService.java b/src/main/java/a8k/hardware/A8kCanBusService.java index c01a982..8a79df4 100644 --- a/src/main/java/a8k/hardware/A8kCanBusService.java +++ b/src/main/java/a8k/hardware/A8kCanBusService.java @@ -22,6 +22,7 @@ import org.java_websocket.enums.ReadyState; import org.java_websocket.handshake.ServerHandshake; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.net.URI; @@ -46,6 +47,7 @@ public class A8kCanBusService { @Resource VirtualDevice virtualDevice; + @Value("${A8kCanBusService.url:ws://127.0.0.1:19005}") public String uri; // assign by application.yml private WebSocketClient client; private A8kPacket txPacketContext; @@ -71,10 +73,8 @@ public class A8kCanBusService { logger.info("BaseHardwareService initilized"); packetIndex = 0; - if (this.uri == null) { - // this.uri = "ws://127.0.0.1:19005"; - this.uri = "ws://192.168.8.10:19005"; - } + + logger.info("+++++++++++++++++++++++++a8k canbus connect to {}", this.uri); URI uri = new URI(this.uri); client = new WebSocketClient(uri) { diff --git a/src/main/java/a8k/hardware/A8kModParamInitializer.java b/src/main/java/a8k/hardware/A8kModParamInitializer.java index 1bb7e0b..d34f3bc 100644 --- a/src/main/java/a8k/hardware/A8kModParamInitializer.java +++ b/src/main/java/a8k/hardware/A8kModParamInitializer.java @@ -1,7 +1,10 @@ package a8k.hardware; import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.type.PipetteRegIndex; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.driver.type.StepMotorRegIndex; import a8k.service.bases.AppEventBusService; import a8k.service.bases.appevent.A8kCanBusOnConnectEvent; import a8k.service.bases.appevent.AppEvent; @@ -24,9 +27,11 @@ public class A8kModParamInitializer { AppEventBusService eventBus; @Resource - A8kCanBusService canBus; + A8kCanBusService canBus; @Resource - PipetteCtrlDriver pipetteCtrlDriver; + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; @Resource @@ -107,6 +112,12 @@ public class A8kModParamInitializer { canBus.moduleSetReg(MId.HbotM, RegIndex.kreg_xyrobot_look_zero_edge_speed, 10); +// //摇匀模组降低其加速度 + stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModShakeM, StepMotorRegIndex.kreg_step_motor_a1, 300); + stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModShakeM, StepMotorRegIndex.kreg_step_motor_d1, 300); + stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModShakeM, StepMotorRegIndex.kreg_step_motor_amax, 300); + stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModShakeM, StepMotorRegIndex.kreg_step_motor_dmax, 300); + } diff --git a/src/main/java/a8k/hardware/type/regindex/StepMotorRegIndex.java b/src/main/java/a8k/hardware/type/regindex/StepMotorRegIndex.java deleted file mode 100644 index 8c11d81..0000000 --- a/src/main/java/a8k/hardware/type/regindex/StepMotorRegIndex.java +++ /dev/null @@ -1,61 +0,0 @@ -package a8k.hardware.type.regindex; - -public enum StepMotorRegIndex { - /*********************************************************************************************************************** - * step_motor * - ***********************************************************************************************************************/ - kreg_step_motor_pos(RegIndex.kreg_step_motor_pos.index), // 机器人x坐标 - kreg_step_motor_is_enable(10102), // 是否使能 - kreg_step_motor_dpos(10103), // 执行完上一条指令后的相对位移 - kreg_step_motor_shift(10150), // x偏移 - kreg_step_motor_shaft(10151), // x轴是否反转 - kreg_step_motor_one_circle_pulse(10152), // x轴一圈脉冲数 - kreg_step_motor_one_circle_pulse_denominator(10153), // 设置一圈脉冲数的分母 - kreg_step_motor_default_velocity(10154), // 默认速度 - kreg_step_motor_ihold(10158), // 步进电机电流配置 - kreg_step_motor_irun(10159), // 步进电机电流配置 - kreg_step_motor_iholddelay(10160), // 步进电机电流配置 - kreg_step_motor_iglobalscaler(10161), // 步进电机电流配置 - kreg_step_motor_run_to_zero_speed(10173), // 回零速度 - kreg_step_motor_look_zero_edge_speed(10175), // 找零边缘速度 - kreg_step_motor_max_d(10178), // 最大限制距离 - kreg_step_motor_min_d(10179), // 最小限制距离 - kreg_step_motor_in_debug_mode(10180), // 驱动器处于调试模式 - kreg_step_motor_vstart(10181), // a1起作用的速度 - kreg_step_motor_a1(10182), // - kreg_step_motor_amax(10183), // - kreg_step_motor_v1(10184), // - kreg_step_motor_dmax(10185), // - kreg_step_motor_d1(10186), // - kreg_step_motor_vstop(10187), // - kreg_step_motor_tzerowait(10188), // - kreg_step_motor_enc_resolution(10189), // 编码器分辨率 1000,1024,4000,4096,16384 - kreg_step_motor_enable_enc(10190), // - kreg_step_motor_dzero_pos(10191), // 驱动器处于调试模式 - kret_step_motor_pos_devi_tolerance(10192), // 位置偏差容忍度 - kret_step_motor_io_trigger_append_distance(10193), // 移动到io时,附加的距离 - ; - - public final int index; - public final Boolean trace; - - StepMotorRegIndex(int regIndex) { - this.index = regIndex; - this.trace = true; - } - - StepMotorRegIndex(int regIndex, Boolean trace) { - this.index = regIndex; - this.trace = trace; - } - - public static StepMotorRegIndex valueOf(int val) { - StepMotorRegIndex[] values = StepMotorRegIndex.values(); - for (StepMotorRegIndex regindex : values) { - if (regindex.index == val) { - return regindex; - } - } - return null; - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java index c2af30b..efb4745 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java @@ -115,7 +115,7 @@ public class DeviceInitCtrlService { actionReactor.dosome("摇匀模组-夹紧电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModClampingM, actionOvertime)); actionReactor.dosome("摇匀模组-夹爪Z轴电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, actionOvertime)); actionReactor.dosome("摇匀模组-摇匀电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModShakeM, actionOvertime)); - actionReactor.dosome("摇匀模组-摇匀电机摆动90度", () -> stepMotorCtrlDriver.stepMotorEasyMoveTo(StepMotorMId.ShakeModShakeM, 90)); + actionReactor.dosome("摇匀模组-摇匀电机摆动90度", () -> stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.ShakeModShakeM, 90,actionOvertime)); //板夹仓初始化 actionReactor.dosome("板夹仓Y轴电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxYM, actionOvertime)); actionReactor.dosome("板夹仓推板电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM, actionOvertime)); diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java index 1d96268..d8e3734 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java @@ -14,6 +14,7 @@ import a8k.service.app.devicectrl.driver.OptModuleDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.type.OptModuleRegIndex; import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr; import a8k.service.app.devicectrl.param.param_mgr.OptModuleParamsMgr; import a8k.service.bases.ActionReactorService; import a8k.service.db.type.ProjOptConfig; @@ -44,6 +45,8 @@ public class OptScanModuleCtrlService { OptModuleDriver optModuleDriver; @Resource + OptModuleExtParamsMgr optModuleExtParamsMgr; + @Resource OptModuleParamsMgr optModuleParamsMgr; @Resource TurnableMoveCtrlService turnableMoveCtrlService; @@ -64,11 +67,11 @@ public class OptScanModuleCtrlService { public Integer[] startOptScan(A8kOptType optType, Integer rawScanGain) throws AppException { - Integer forwardScanPos = optModuleParamsMgr.getOptScanStartPos(optType); + Integer forwardScanPos = optModuleExtParamsMgr.getOptScanStartPos(optType); - // Double scanGain = optModuleParamsMgr.getScanGain(optType); + // Double scanGain = optModuleExtParamsMgr.getScanGain(optType); // Integer rawScanGain = OptGainConvert.scanerToRawGain(optType, scanGain); - Integer lasterGain = optModuleParamsMgr.getOptEmissionIntensity(optType); + Integer lasterGain = optModuleExtParamsMgr.getOptEmissionIntensity(optType); switch (optType) { case TOPT -> { @@ -109,7 +112,7 @@ public class OptScanModuleCtrlService { for (int i = 0; i < adjustCount; i++) { if (i == 0) { - scanRealGain = optModuleParamsMgr.getScanGain(optType); + scanRealGain = optModuleExtParamsMgr.getScanGain(optType); scanRawGain = OptGainConvert.scanerToRawGain(optType, scanRealGain); } diff --git a/src/main/java/a8k/service/app/devicectrl/driver/StepMotorCtrlDriver.java b/src/main/java/a8k/service/app/devicectrl/driver/StepMotorCtrlDriver.java index a456a57..c0176f0 100644 --- a/src/main/java/a8k/service/app/devicectrl/driver/StepMotorCtrlDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/driver/StepMotorCtrlDriver.java @@ -1,67 +1,89 @@ package a8k.service.app.devicectrl.driver; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.A8kPacket; import a8k.hardware.type.a8kcanprotocol.CmdId; import a8k.hardware.type.regindex.RegIndex; import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.driver.type.StepMotorRegIndex; import a8k.type.exception.AppException; +import a8k.utils.ZJsonHelper; +import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.annotation.Resource; import org.slf4j.Logger; import org.springframework.stereotype.Component; @Component +@ExtApiTab(cfg = a8k.extapi_controler.pagecontrol.ExtApiTabConfig.StepMotorCtrlDriver) public class StepMotorCtrlDriver { static Logger logger = org.slf4j.LoggerFactory.getLogger(StepMotorCtrlDriver.class); @Resource A8kCanBusService canBus; + + void stepMotorEasyMoveBy(StepMotorMId id, Integer dpos) throws AppException { + canBus.callcmd(id.mid, CmdId.step_motor_easy_move_by, dpos); + } + + void stepMotorEasyMoveTo(StepMotorMId id, Integer pos) throws AppException { + canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to, pos); + } + + void stepMotorEasyMoveToZero(StepMotorMId id) throws AppException { + canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to_zero); + } + + void stepMotorEasyMoveToZeroPointQuick(StepMotorMId id) throws AppException { + canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to_zero_point_quick); + } + + void stepMotorEasyMoveToEndPoint(StepMotorMId id) throws AppException { + canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to_end_point); + } + // // stepMotor // + @ExtApiFn(name = "stepMotorEnable", order = 1) public void stepMotorEnable(StepMotorMId mid, Integer enable) throws AppException { canBus.callcmd(mid.mid, CmdId.step_motor_enable, enable); } + @ExtApiFn(name = "stepMotorReadPos", order = 2) public Integer stepMotorReadPos(StepMotorMId id) throws AppException { A8kPacket packet = canBus.callcmd(id.mid, CmdId.step_motor_read_pos); return packet.getContentI32(0); } - public void stepMotorEasyRotate(StepMotorMId id, int direction) throws AppException { + @ExtApiFn(name = "stepMotorEasyRotate", order = 3) + public void stepMotorEasyRotate(StepMotorMId id, Integer direction) throws AppException { canBus.callcmd(id.mid, CmdId.step_motor_easy_rotate, direction); } - public void stepMotorEasyMoveBy(StepMotorMId id, int dpos) throws AppException { - canBus.callcmd(id.mid, CmdId.step_motor_easy_move_by, dpos); - } - - public void stepMotorEasyMoveByBlock(StepMotorMId id, int dpos, Integer actionOvertime) throws AppException { + @ExtApiFn(name = "stepMotorEasyMoveByBlock", order = 4) + public void stepMotorEasyMoveByBlock(StepMotorMId id, Integer dpos, Integer actionOvertime) throws AppException { logger.info("stepMotorEasyMoveByBlock {} {}", id, dpos); stepMotorEasyMoveBy(id, dpos); canBus.waitForMod(id.mid, actionOvertime); } - public void stepMotorEasyMoveTo(StepMotorMId id, int pos) throws AppException { - canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to, pos); - } - - public void stepMotorEasyMoveToBlock(StepMotorMId id, int pos, Integer actionOvertime) throws AppException { + @ExtApiFn(name = "stepMotorEasyMoveToBlock", order = 5) + public void stepMotorEasyMoveToBlock(StepMotorMId id, Integer pos, Integer actionOvertime) throws AppException { logger.info("stepMotorEasyMoveToBlock {} {}", id, pos); stepMotorEasyMoveTo(id, pos); canBus.waitForMod(id.mid, actionOvertime); } - public void stepMotorEasyMoveToZero(StepMotorMId id) throws AppException { - canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to_zero); - } - + @ExtApiFn(name = "stepMotorEasyMoveToZeroBlock", order = 6) public void stepMotorEasyMoveToZeroBlock(StepMotorMId id, Integer actionOvertime) throws AppException { logger.info("stepMotorEasyMoveToZeroBlock {}", id); stepMotorEasyMoveToZero(id); canBus.waitForMod(id.mid, actionOvertime); } + @ExtApiFn(name = "stepMotorReadPosByMoveToZeroBlock", order = 7) public Integer stepMotorReadPosByMoveToZeroBlock(StepMotorMId id, Integer actionOvertime) throws AppException { stepMotorEnable(id, 1); stepMotorEasyMoveToZeroBlock(id, actionOvertime); @@ -71,25 +93,23 @@ public class StepMotorCtrlDriver { return measurepos; } - public void stepMotorEasySetCurrentPos(StepMotorMId id, int pos) throws AppException { - canBus.callcmd(id.mid, CmdId.step_motor_easy_set_current_pos, pos); - } - - public void stepMotorEasyMoveToIo(StepMotorMId id, int io) throws AppException { - canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to_io, io); - } + // public void stepMotorEasySetCurrentPos(StepMotorMId id, Integer pos) throws AppException { + // canBus.callcmd(id.mid, CmdId.step_motor_easy_set_current_pos, pos); + // } + // + // public void stepMotorEasyMoveToIo(StepMotorMId id, Integer io) throws AppException { + // canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to_io, io); + // } // step_motor_easy_move_to_zero_point_quick - public void stepMotorEasyMoveToZeroPointQuick(StepMotorMId id) throws AppException { - canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to_zero_point_quick); - } - + @ExtApiFn(name = "stepMotorEasyMoveToZeroPointQuickBlock", order = 8) public void stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId id, Integer actionOvertime) throws AppException { stepMotorEasyMoveToZeroPointQuick(id); canBus.waitForMod(id.mid, actionOvertime); } + @ExtApiFn(name = "stepMotorReadIoState", order = 9) public void stepMotorStop(StepMotorMId id) throws AppException { canBus.callcmd(id.mid, CmdId.step_motor_stop, 0); } @@ -98,26 +118,50 @@ public class StepMotorCtrlDriver { canBus.callcmd(id.mid, CmdId.step_motor_active_cfg); } - public Boolean stepMotorReadIoState(StepMotorMId id, int ioindex) throws AppException { + @ExtApiFn(name = "stepMotorReadIoState", order = 10) + public Boolean stepMotorReadIoState(StepMotorMId id, Integer ioindex) throws AppException { var packet = canBus.callcmd(id.mid, CmdId.step_motor_read_io_state, ioindex); return packet.getContentI32(0) != 0; } - public void stepMotorEasyMoveToEndPoint(StepMotorMId id) throws AppException { - canBus.callcmd(id.mid, CmdId.step_motor_easy_move_to_end_point); - } + @ExtApiFn(name = "stepMotorEasyMoveToZeroPointQuickBlock", order = 12) public void stepMotorEasyMoveToEndPointBlock(StepMotorMId id, Integer actionOvertime) throws AppException { stepMotorEasyMoveToEndPoint(id); canBus.waitForMod(id.mid, actionOvertime); } - public void stepMotorEasyReciprocatingMotion(StepMotorMId id, int startpos, int endpos, int times) throws AppException { + + void stepMotorEasyReciprocatingMotion(StepMotorMId id, Integer startpos, Integer endpos, Integer times) throws AppException { canBus.callcmd(id.mid, CmdId.step_motor_easy_reciprocating_motion, startpos, endpos, times); } - public void stepMotorEasyReciprocatingMotionBlock(StepMotorMId id, int startpos, int endpos, int times, Integer actionOvertime) throws AppException { + @ExtApiFn(name = "stepMotorEasyReciprocatingMotionBlock", order = 13) + public void stepMotorEasyReciprocatingMotionBlock(StepMotorMId id, Integer startpos, Integer endpos, Integer times, Integer actionOvertime) throws AppException { stepMotorEasyReciprocatingMotion(id, startpos, endpos, times); canBus.waitForMod(id.mid, actionOvertime); } + + @ExtApiFn(name = "setReg", order = 14) + public void setReg(StepMotorMId id, StepMotorRegIndex regIndex, Integer val) throws AppException { + canBus.moduleSetReg(id.mid, regIndex.regIndex, val); + } + + @ExtApiFn(name = "getReg", order = 15) + public Integer getReg(StepMotorMId id, StepMotorRegIndex regIndex) throws AppException { + return canBus.moduleGetReg(id.mid, regIndex.regIndex); + } + + @ExtApiFn(name = "getAllReg", order = 16) + public ObjectNode getAllReg(StepMotorMId id) throws AppException { + ObjectNode node = ZJsonHelper.createObjectNode(); + for (StepMotorRegIndex regIndex : StepMotorRegIndex.values()) { + Integer regVal = getReg(id, regIndex); + logger.info("read reg {} -> {}", regIndex,regVal); + node.put(regIndex.name(), getReg(id, regIndex)); + + } + return node; + } + } diff --git a/src/main/java/a8k/service/app/devicectrl/driver/type/StepMotorRegIndex.java b/src/main/java/a8k/service/app/devicectrl/driver/type/StepMotorRegIndex.java index 21c0450..ab13468 100644 --- a/src/main/java/a8k/service/app/devicectrl/driver/type/StepMotorRegIndex.java +++ b/src/main/java/a8k/service/app/devicectrl/driver/type/StepMotorRegIndex.java @@ -7,14 +7,13 @@ public enum StepMotorRegIndex { kreg_module_type(RegIndex.kreg_module_type), // 模块类型 kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag - kreg_extboard_resetflag(RegIndex.kreg_extboard_resetflag), /*********************************************************************************************************************** * step_motor * ***********************************************************************************************************************/ kreg_step_motor_pos(RegIndex.kreg_step_motor_pos), // 机器人x坐标 kreg_step_motor_is_enable(RegIndex.kreg_step_motor_is_enable), // 是否使能 kreg_step_motor_dpos(RegIndex.kreg_step_motor_dpos), // 执行完上一条指令后的相对位移 - kreg_step_motor_shift(RegIndex.kreg_step_motor_shift), // x偏移 +// kreg_step_motor_shift(RegIndex.kreg_step_motor_shift), // x偏移 kreg_step_motor_shaft(RegIndex.kreg_step_motor_shaft), // x轴是否反转 kreg_step_motor_one_circle_pulse(RegIndex.kreg_step_motor_one_circle_pulse), // x轴一圈脉冲数 kreg_step_motor_one_circle_pulse_denominator(RegIndex.kreg_step_motor_one_circle_pulse_denominator), // 设置一圈脉冲数的分母 diff --git a/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java b/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java index 360bb68..d763c36 100644 --- a/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java @@ -33,7 +33,12 @@ public class MotorEnableExDriver { Integer val = enable ? 1 : 0; miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, val); miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, val); - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, val); + if (!enable) { + //TODO: 只有第一台样机,由于无法手拧,所以永不失能 + // stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, val); + } else { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, val); + } stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, val); stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, val); } diff --git a/src/main/java/a8k/service/app/devicectrl/exdriver/TubePreProcesModuleExDriver.java b/src/main/java/a8k/service/app/devicectrl/exdriver/TubePreProcesModuleExDriver.java index 83c9624..f79d8d2 100644 --- a/src/main/java/a8k/service/app/devicectrl/exdriver/TubePreProcesModuleExDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/exdriver/TubePreProcesModuleExDriver.java @@ -46,15 +46,10 @@ public class TubePreProcesModuleExDriver { miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperSV, tubePreProcesPosParamMgr.getGripperServoOpenPos()); } - public void gripperSVCClose() throws AppException { - miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperSV, tubePreProcesPosParamMgr.getGripperServoClosePos()); - } - public void gripperSVClampTube() throws AppException { miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperSV, tubePreProcesPosParamMgr.getGripperServoTakeCapPos()); } - public void YSVMoveToTakeTubePos() throws AppException { miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperYSV, tubePreProcesPosParamMgr.getYServoTakeTubePos() - 100); //该动作是为了消除齿轮间隙 miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperYSV, tubePreProcesPosParamMgr.getYServoTakeTubePos()); @@ -99,6 +94,10 @@ public class TubePreProcesModuleExDriver { stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.ShakeModClampingM, tubePreProcesPosParamMgr.getShakeClampMotorReleasePos(), actionOvertime); } + public void clampingMReleaseTubeInFuzzyPos() throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.ShakeModClampingM, 90, actionOvertime); + } + public void shakeMMoveTo90() throws AppException { stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.ShakeModShakeM, 90, actionOvertime); } @@ -106,8 +105,7 @@ public class TubePreProcesModuleExDriver { public void shakeMShake(Integer shakeDegree, Integer times) throws AppException { var startPos = 90 - shakeDegree; var endPos = 90 + shakeDegree; - stepMotorCtrlDriver.stepMotorEasyReciprocatingMotion(StepMotorMId.ShakeModShakeM, startPos, endPos, times); - canBus.waitForMod(MId.ShakeModShakeM, actionOvertime); + stepMotorCtrlDriver.stepMotorEasyReciprocatingMotionBlock(StepMotorMId.ShakeModShakeM, startPos, endPos, times, actionOvertime); } // diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java index 15882fc..ddead4f 100644 --- a/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java @@ -6,6 +6,7 @@ import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.app.devicectrl.param.ext_param_mgr.HbotConsumableParamMgr; import a8k.service.app.devicectrl.param.param_mgr.HbotTipPosMgr; import a8k.service.app.devicectrl.driver.HbotDriver; import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; @@ -23,6 +24,7 @@ import jakarta.annotation.Resource; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.springframework.stereotype.Component; +import org.springframework.util.Assert; import java.util.List; import java.util.Map; @@ -38,11 +40,14 @@ public class HbotTipPosCalibration { HbotDriver hbotDriver; @Resource - HbotCtrlService hbotCtrlService; + HbotCtrlService hbotCtrlService; @Resource - HbotTipPosMgr hbotTipPosMgr; + HbotTipPosMgr hbotTipPosMgr; + @Resource + HbotConsumableParamMgr hbotConsumableParamMgr; - Boolean stopFlag = false; + Boolean stopFlag = false; + TipGroup tipGroup; Boolean checkStopFlag() { if (stopFlag) { @@ -87,20 +92,24 @@ public class HbotTipPosCalibration { hbotDriver.enable(0); } + + @ExtApiFn(name = "设置上下文", group = "设置上下文", order = 20) + public void setContext(TipGroup tipGroup) throws AppException { + this.tipGroup = tipGroup; + } + // // 标定 // - TipGroup tipGroup; List tipRefPosList; Pos3d tip000; Double tipdx; Double tipdy; - - @ExtApiFn(name = "开始标定Tip坐标", group = "标定TIP坐标", order = 20) - public void startCalibrateTipPos(TipGroup tipGroup) throws AppException { - this.tipGroup = tipGroup; + @ExtApiFn(name = "开始标定Tip坐标", group = "辅助标定", order = 20) + public void startCalibrateTipPos() throws AppException { + Assert.isTrue(tipGroup != null, "请先设置上下文"); tipRefPosList = new java.util.ArrayList<>(); moveToZero(); disableModule(); @@ -109,8 +118,7 @@ public class HbotTipPosCalibration { tip000 = new Pos3d(0, 0, 0); } - - @ExtApiFn(name = "添加Tip参考点", group = "标定TIP坐标", order = 21) + @ExtApiFn(name = "添加Tip参考点", group = "辅助标定", order = 21) public Object addTipPosRefPoint(TipRowNum row, TipColumnNum columnNum) throws AppException { enableModule(); Pos2d xypos = hbotDriver.readPos(); @@ -127,7 +135,7 @@ public class HbotTipPosCalibration { return ret; } - @ExtApiFn(name = "删除上一个Tip参考点", group = "标定TIP坐标", order = 22) + @ExtApiFn(name = "删除上一个Tip参考点", group = "辅助标定", order = 22) public Object removeTipPosRefPoint() throws AppException { if (!tipRefPosList.isEmpty()) { tipRefPosList.remove(tipRefPosList.size() - 1); @@ -138,7 +146,7 @@ public class HbotTipPosCalibration { } - @ExtApiFn(name = "计算Tip坐标", group = "标定TIP坐标", order = 23) + @ExtApiFn(name = "计算Tip坐标", group = "辅助标定", order = 23) public ObjectNode computeTipGroupPos() throws AppException { TipRefPoint tip_ref_01_01 = tipRefPosList.stream().filter(tipRefPoint -> tipRefPoint.eq(TipRowNum.ROW00, TipColumnNum.Colu00)).findFirst().orElse(null); @@ -189,43 +197,104 @@ public class HbotTipPosCalibration { } - @ExtApiFn(name = "保存计算结果", group = "标定TIP坐标", order = 24) + @ExtApiFn(name = "保存计算结果", group = "辅助标定", order = 24) public void saveTipGroupPos() throws AppException { + TipPosConfig tipPosConfig = getTipPosConfig(); + if (tipdx == null || tipdx.isNaN() || tipdx.isInfinite()) { + tipdx = tipPosConfig.spaceingX; + } + + if (tipdy == null || tipdy.isNaN() || tipdy.isInfinite()) { + tipdy = tipPosConfig.spaceingY; + } + hbotTipPosMgr.setTipGroupParam(tipGroup, tip000, tipdx, tipdy); } - @ExtApiFn(name = "标定.丢Tip坐标", group = "标定.丢Tip坐标", order = 30) - public void calibrateDropTipPos() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMeasureDistance(); - hbotTipPosMgr.setDropTipPos(new Pos3d(hbotDriver.readPos().x, hbotDriver.readPos().y, pipetteCtrlDriver.zMotorReadMeasureDistanceResult())); - disableModule(); + @ExtApiFn(name = "获取当前Tip组的配置", group = "直接设置坐标", order = 31) + public TipPosConfig getTipPosConfig() { + return hbotTipPosMgr.getTipPosCfg(tipGroup); + } + + @ExtApiFn(name = "设置Tip000坐标", group = "直接设置坐标", order = 32) + public void setTipPos000(Integer x, Integer y, Integer z) { + tip000 = new Pos3d(x, y, z); + TipPosConfig poscfg = hbotTipPosMgr.getTipPosCfg(tipGroup); + poscfg.tip000 = tip000; + hbotTipPosMgr.setTipPosCfg(tipGroup, poscfg); + } + + @ExtApiFn(name = "设置Tip间距", group = "直接设置坐标", order = 33) + public void setSpacingXAndSpacingY(Double spacingX, Double spacingY) { + TipPosConfig poscfg = hbotTipPosMgr.getTipPosCfg(tipGroup); + poscfg.spaceingX = spacingX; + poscfg.spaceingY = spacingY; + hbotTipPosMgr.setTipPosCfg(tipGroup, poscfg); } // // 校验 // - @ExtApiFn(name = "校验取Tip坐标", group = "校验", order = 300) - public void testTakeTip(TipGroup tipGroup) throws AppException { + @ExtApiFn(name = "校验取Tip坐标(全部坐标)", group = "校验", order = 300) + public void testTakeTipAll(TipGroup tipGroup) throws AppException { resetStopFlag(); enableModule(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + for (int i = 0; i < AppConstant.TIP_NUM; i++) { hbotCtrlService.testTakeTip(tipGroup, i); + Pos3d tipPos = hbotConsumableParamMgr.getTipPos(tipGroup, i); + TipRefPoint tipRefPoint = new TipRefPoint(TipRowNum.values()[i / 12], TipColumnNum.values()[i % 12], tipPos); + if (tipRefPosList != null) + tipRefPosList.add(tipRefPoint); if (checkStopFlag()) return; } } - @ExtApiFn(name = "校验丢Tip", group = "校验", order = 301) - public void testDropTipPos() throws AppException { - hbotCtrlService.dropTip(); + @ExtApiFn(name = "校验取Tip坐标(四角坐标)", group = "校验", order = 300) + public void testTakeTipAround(TipGroup tipGroup) throws AppException { + resetStopFlag(); + enableModule(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + + List testPoint = new java.util.ArrayList<>(); + testPoint.addAll(List.of(0, 1, 10, 11)); + testPoint.addAll(List.of(12, 13, 22, 23)); + testPoint.addAll(List.of(12 * 8, 12 * 8 + 1, 12 * 8 + 10, 12 * 8 + 11)); + testPoint.addAll(List.of(12 * 9, 12 * 9 + 1, 12 * 9 + 10, 12 * 9 + 11)); + + for (Integer i : testPoint) { + hbotCtrlService.testTakeTip(tipGroup, i); + Pos3d tipPos = hbotConsumableParamMgr.getTipPos(tipGroup, i); + TipRefPoint tipRefPoint = new TipRefPoint(TipRowNum.values()[i / 12], TipColumnNum.values()[i % 12], tipPos); + if (tipRefPosList != null) + tipRefPosList.add(tipRefPoint); + if (checkStopFlag()) + return; + } + } + @ExtApiFn(name = "停止校验", group = "校验", order = 304) public void stopTest() throws AppException { setStopFlag(); } + @ExtApiFn(name = "标定.丢Tip坐标", group = "标定.丢Tip坐标", order = 500) + public void calibrateDropTipPos() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMeasureDistance(); + hbotTipPosMgr.setDropTipPos(new Pos3d(hbotDriver.readPos().x, hbotDriver.readPos().y, pipetteCtrlDriver.zMotorReadMeasureDistanceResult())); + disableModule(); + } + + @ExtApiFn(name = "校验丢Tip", group = "标定.丢Tip坐标", order = 501) + public void testDropTipPos() throws AppException { + hbotCtrlService.dropTip(); + } + } diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/OptModuleParamCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/OptModuleParamCalibration.java index 62bc7b0..8c7b530 100644 --- a/src/main/java/a8k/service/app/devicectrl/param/calibration/OptModuleParamCalibration.java +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/OptModuleParamCalibration.java @@ -9,8 +9,8 @@ import a8k.service.app.devicectrl.driver.OptModuleDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; -import a8k.service.app.devicectrl.param.param_mgr.OptModuleParamsMgr; -import a8k.service.app.devicectrl.param.type.OptModuleParam; +import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr; +import a8k.service.app.devicectrl.param.type.OptModuleExtParam; import a8k.service.db.type.Parameter; import a8k.service.db.type.a8kidcard.zenum.A8kOptType; import a8k.type.*; @@ -42,7 +42,7 @@ public class OptModuleParamCalibration { Integer actionOvertime = 5000; @Resource - OptModuleParamsMgr optModuleParamsMgr; + OptModuleExtParamsMgr optModuleExtParamsMgr; @Resource MotorEnableExDriver motorEnableExDriver; @@ -58,7 +58,7 @@ public class OptModuleParamCalibration { @ExtApiFn(name = "获得参数", group = "基础", order = 1) public List getParams() throws AppException { - return optModuleParamsMgr.getParams(); + return optModuleExtParamsMgr.getParams(); } @ExtApiFn(name = "归零", group = "测试工具", order = 11) @@ -137,7 +137,7 @@ public class OptModuleParamCalibration { public void setCurrentAsScanRefPos() throws AppException { stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModScannerM, 10000); - optModuleParamsMgr.setOptParam(OptModuleParam.OptScanRefPos, pos); + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.OptScanRefPos, pos); } //FOptScanShift @@ -146,22 +146,22 @@ public class OptModuleParamCalibration { @ExtApiFn(name = "设置F光学扫描偏移", group = "F光学", order = 300) public void setFOptScanShift(Integer shift) { - optModuleParamsMgr.setOptParam(OptModuleParam.FOptScanShift, shift); + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptScanShift, shift); } @ExtApiFn(name = "设置F光学发射强度[1->255]", group = "F光学", order = 301) public void setFOptEmissionIntensity(Integer val) { - optModuleParamsMgr.setOptParam(OptModuleParam.FOptEmissionIntensity, val); + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptEmissionIntensity, val); } @ExtApiFn(name = "设置F光学接收放大倍数[1.1->47]", group = "F光学", order = 302) public void setFOptScanAmplVal(Double val) { - optModuleParamsMgr.setOptParam(OptModuleParam.FOptScanGainVal, val); + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptScanGainVal, val); } @ExtApiFn(name = "F光学扫描", group = "扫描", order = 303) public A8kScanCurve FOptScan() throws AppException { - Double scanGain = optModuleParamsMgr.getScanGain(A8kOptType.FOPT); + Double scanGain = optModuleExtParamsMgr.getScanGain(A8kOptType.FOPT); Integer rawScanGain = OptGainConvert.scanerToRawGain(A8kOptType.FOPT, scanGain); var result = optScanModuleCtrlService.startOptScan(A8kOptType.FOPT, rawScanGain); return createScanCurve1200Point(result); @@ -173,22 +173,22 @@ public class OptModuleParamCalibration { @ExtApiFn(name = "设置T光学扫描偏移", group = "T光学", order = 400) public void setTOptScanShift(Integer shift) { - optModuleParamsMgr.setOptParam(OptModuleParam.TOptScanShift, shift); + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptScanShift, shift); } @ExtApiFn(name = "设置T光学发射强度[1->255]", group = "T光学", order = 401) public void setTOptEmissionIntensity(Integer val) { - optModuleParamsMgr.setOptParam(OptModuleParam.TOptEmissionIntensity, val); + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptEmissionIntensity, val); } @ExtApiFn(name = "设置T光学接收放大倍数[0.5->21.7]", group = "T光学", order = 402) public void setTOptScanAmplVal(Double val) { - optModuleParamsMgr.setOptParam(OptModuleParam.TOptScanGainVal, val); + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptScanGainVal, val); } @ExtApiFn(name = "T光学扫描", group = "扫描", order = 403) public A8kScanCurve TOptScan() throws AppException { - Double scanGain = optModuleParamsMgr.getScanGain(A8kOptType.TOPT); + Double scanGain = optModuleExtParamsMgr.getScanGain(A8kOptType.TOPT); Integer rawScanGain = OptGainConvert.scanerToRawGain(A8kOptType.TOPT, scanGain); var result = optScanModuleCtrlService.startOptScan(A8kOptType.TOPT, rawScanGain); return createScanCurve1200Point(result); diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java index 15d66a2..3ee31a2 100644 --- a/src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java @@ -15,8 +15,9 @@ import a8k.service.app.devicectrl.param.param_mgr.TubePreProcesPosParamMgr; import a8k.type.TubePreProcessGripperPos; import a8k.type.TubePreProcessTubeClamp; import a8k.type.TubePreProcessYPos; -import a8k.type.TubePreProcessZAxisPos; +import a8k.service.app.devicectrl.param.type.TubePreProcessZAxisPos; import a8k.type.exception.AppException; +import a8k.utils.ZJsonHelper; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; @@ -47,6 +48,8 @@ public class TubePreProcesPosCalibration { public void deviceReset() throws AppException { enableModule(); motorMoveZeroExDriver.preProcessModuleMoveToZero(); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.ShakeModShakeM, 90, 5000); + tubePreProcesModuleExDriver.clampingMReleaseTubeInFuzzyPos(); } @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 2) @@ -65,142 +68,211 @@ public class TubePreProcesPosCalibration { return posMgr.getParams(); } + @ExtApiFn(name = "测量Z轴", group = "辅助工具", order = 10) + public Integer measureZAxis() throws AppException { + enableModule(); + Integer zpos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, 10000); + disableModule(); + return zpos; + } - //TubePreProcessYPos - //TubePreProcessZAxisPos - //TubePreProcessGripperPos - //TubePreProcessTubeClamp - + @ExtApiFn(name = "<试管夹具>夹住试管", group = "辅助工具", order = 11) + public void clampTube() throws AppException { + tubePreProcesModuleExDriver.clampingMclampTube(); + } + @ExtApiFn(name = "<试管夹具>松开试管", group = "辅助工具", order = 12) + public void unclampTube() throws AppException { + tubePreProcesModuleExDriver.clampingMReleaseTube(); + } + // 设置 + // 1. 设置试管帽夹爪冗余(0.1mm) // - // 标定坐标 + // 基础标定 + // 1. 拧开试管夹具 + // 2. 标定当前位置为试管夹具松开位置 + // 3. 掰动试管帽夹爪,让试管帽夹爪处于张开位置 + // 4. 标定当前位置为试管帽夹爪松开位置 + // + // 扩展标定 + // 1. 取一个高试管放入试管架中,挪动设备到取试管的位置 + // 2. 点击标定取高试管位置 + // 3. 取一个低试管放入试管架中,挪动设备到取试管的位置 + // 4. 点击标定取低试管位置 + // 5. 取一个高试管放到摇匀试管的位置,挪动设备到摇匀试管的位置(注意试管夹爪下表面和试管帽接触) + // 6. 点击标定试管摇匀位置 + // + // 辅助测量 + // 读取当前Z轴高度 // - @ExtApiFn(name = "标定前后移动伺服坐标", group = "标定", order = 100) - public Integer calibrateTubePreProcessYPos(TubePreProcessYPos posType) throws AppException { - Integer pos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); - posMgr.setPos(posType, pos); - return pos; - } - @ExtApiFn(name = "标定Z轴坐标", group = "标定", order = 101) - public Integer calibrateTubePreProcessZAxisPos(TubePreProcessZAxisPos posType) throws AppException { + public Integer readShakeModClampingMPos() throws AppException { enableModule(); - Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, 10000); - posMgr.setPos(posType, pos); + Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModClampingM, 10000); disableModule(); return pos; } - @ExtApiFn(name = "标定夹爪伺服坐标", group = "标定", order = 102) - public Integer calibrateTubePreProcessGripperPos(TubePreProcessGripperPos posType) throws AppException { - enableModule(); + + @ExtApiFn(name = "设置试管帽夹爪冗余(0.1mm)", group = "设置", order = 100) + public void setTubeCapGripperRedundancy(Integer val) throws AppException { + posMgr.setPos(TubePreProcessGripperPos.GripperRedundancyHeight, val); + } + + @ExtApiFn(name = "标定<试管帽夹爪>松开位置", group = "基础标定", order = 110) + public Integer calibrateTubeCapGripperOpenPos() throws AppException { Integer pos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperSV); - posMgr.setPos(posType, pos); - disableModule(); + posMgr.setPos(TubePreProcessGripperPos.GripperServoOpenPos, pos); + return pos; + } + + @ExtApiFn(name = "标定<试管夹具>松开位置", group = "基础标定", order = 111) + public Integer calibrateTubeCapGripperClosePos() throws AppException { + Integer pos = readShakeModClampingMPos(); + posMgr.setPos(TubePreProcessTubeClamp.ShakeClampMotorReleasePos, pos); return pos; } - @ExtApiFn(name = "标定试管夹紧伺服坐标", group = "标定", order = 103) - public Integer calibrateTubePreProcessTubeClamp(TubePreProcessTubeClamp posType) throws AppException { + public Object calibrateCurPosAsTakeTubePos(Boolean isHighTube) throws AppException { enableModule(); - Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModClampingM, 10000); - if (posType.equals(TubePreProcessTubeClamp.ShakeClampMotorClampPos)) { - posMgr.setPos(posType, pos - 2); + //1. 读取夹爪位置 + Integer gripperPos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperSV); + //2. 读取Y轴位置 + Integer ySVPos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); + //2. 夹爪松开 + tubePreProcesModuleExDriver.gripperSVOpen(); + //3. Z轴归零,并读取当前位置 + Integer zpos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, 10000); + + posMgr.setPos(TubePreProcessGripperPos.GripperServoTakeCapPos, gripperPos); + posMgr.setPos(TubePreProcessYPos.YServoTakeTubePos, ySVPos); + if (isHighTube) { + posMgr.setPos(TubePreProcessZAxisPos.ZMotorTakeHTubePos, zpos); } else { - posMgr.setPos(posType, pos); + posMgr.setPos(TubePreProcessZAxisPos.ZMotorTakeSTubePos, zpos); } + disableModule(); - return pos; + var ObNode = ZJsonHelper.createObjectNode(); + ObNode.put("gripperSVPos", gripperPos); + ObNode.put("ySVPos", ySVPos); + ObNode.put("zMpos", zpos); + return ObNode; } - // - // 夹爪标定,校准,校验 - // - @ExtApiFn(name = "<校验>张开", group = "校验.夹爪", order = 206) - public void gripperSVOpen() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); - tubePreProcesModuleExDriver.gripperSVOpen(); + + @ExtApiFn(name = "标定<取高试管>位置", group = "扩展标定", order = 200) + public Object calibrateCurPosAsTakeHTubePos() throws AppException { + return calibrateCurPosAsTakeTubePos(true); } - @ExtApiFn(name = "<校验>夹紧", group = "校验.夹爪", order = 205) - public void gripperSVCClose() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); - tubePreProcesModuleExDriver.gripperSVCClose(); + @ExtApiFn(name = "标定<取低试管>位置", group = "扩展标定", order = 201) + public Object calibrateCurPosAsTakeSTubePos() throws AppException { + return calibrateCurPosAsTakeTubePos(false); } - @ExtApiFn(name = "<校验>夹住试管", group = "校验.夹爪", order = 205) - public void gripperSVClampTube() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); - tubePreProcesModuleExDriver.gripperSVClampTube(); + @ExtApiFn(name = "标定<摇匀>位置", group = "扩展标定", order = 202) + public Object calibrateCurPosAsShakePos() throws AppException { + // + //1. 读取Y位置 + Integer ySVPos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); + //2. 试管夹具张开一点 + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, 10, overtime); + //3. Z轴归零,并读取当前位置 + Integer zpos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, 10000); + //4. 夹具归零并读取位置 + Integer clampPos = readShakeModClampingMPos(); + clampPos = clampPos - 10 - 2; + + posMgr.setPos(TubePreProcessZAxisPos.ZMotorShakeTubePos, zpos); + posMgr.setPos(TubePreProcessTubeClamp.ShakeClampMotorClampPos, clampPos); + posMgr.setPos(TubePreProcessYPos.YServoShakePos, ySVPos); + + var obNode = ZJsonHelper.createObjectNode(); + obNode.put("ySVPos", ySVPos); + obNode.put("zMpos", zpos); + obNode.put("clampPos", clampPos); + return obNode; } + // - //YSV : 设置参考点,标定,验证 + // 夹爪标定,校准,校验 // - @ExtApiFn(name = "<校验>移动到摇匀位", group = "校验.YSV", order = 305) - public void YAxixServoShake() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); - tubePreProcesModuleExDriver.YSVMoveToShakePos(); - } + // @ExtApiFn(name = "<校验>张开", group = "校验.夹爪", order = 306) + // public void gripperSVOpen() throws AppException { + // miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); + // tubePreProcesModuleExDriver.gripperSVOpen(); + // } + // + // @ExtApiFn(name = "<校验>夹住试管帽", group = "校验.夹爪", order = 305) + // public void gripperSVClampTube() throws AppException { + // miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); + // tubePreProcesModuleExDriver.gripperSVClampTube(); + // } - @ExtApiFn(name = "<校验>移动到取试管位", group = "校验.YSV", order = 306) - public void YAxixServoTakeTube() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); - tubePreProcesModuleExDriver.YSVMoveToTakeTubePos(); - } - @ExtApiFn(name = "<校验>移动到待机位", group = "校验.YSV", order = 307) - public void YAxixServoMoveToStandyPos() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); - tubePreProcesModuleExDriver.YSVMoveToStandyPos(); - } + // + //YSV : 设置参考点,标定,验证 + // + // @ExtApiFn(name = "<校验>移动到摇匀位", group = "校验.YSV", order = 405) + // public void YAxixServoShake() throws AppException { + // miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); + // tubePreProcesModuleExDriver.YSVMoveToShakePos(); + // } + // + // @ExtApiFn(name = "<校验>移动到取试管位", group = "校验.YSV", order = 406) + // public void YAxixServoTakeTube() throws AppException { + // miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); + // tubePreProcesModuleExDriver.YSVMoveToTakeTubePos(); + // } + // + // @ExtApiFn(name = "<校验>移动到待机位", group = "校验.YSV", order = 407) + // public void YAxixServoMoveToStandyPos() throws AppException { + // miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); + // tubePreProcesModuleExDriver.YSVMoveToStandyPos(); + // } // //ZM : 标定,验证 // - @ExtApiFn(name = "<校验>取试管", group = "校验.ZM", order = 405) - public void takeTube(Boolean isHTube) throws AppException { - enableModule(); - tubePreProcesModuleExDriver.takeTubeFromTubeholder(isHTube); - } - - @ExtApiFn(name = "<校验>放试管", group = "校验.ZM", order = 406) - public void putTube(Boolean isHTube) throws AppException { - enableModule(); - tubePreProcesModuleExDriver.putTubeToTubeholder(isHTube); - } - - @ExtApiFn(name = "<校验>Z轴移动到取试管位置", group = "校验.ZM", order = 407) - public void zMotorMoveToTakeHTubePos(Boolean isHTube) throws AppException { - enableModule(); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); - tubePreProcesModuleExDriver.zMotorMoveToTakeHTubePos(isHTube); - } - - @ExtApiFn(name = "<校验>Z轴移动到摇匀位置", group = "校验.ZM", order = 408) - public void zMotorMoveToShakeTubePos() throws AppException { - enableModule(); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); - tubePreProcesModuleExDriver.zMotorMoveToShakeTubePos(); - } - - @ExtApiFn(name = "<校验>夹紧", group = "校验.夹紧", order = 503) - - public void clampTube() throws AppException { - tubePreProcesModuleExDriver.clampingMclampTube(); - } + // @ExtApiFn(name = "<校验>取试管", group = "校验.ZM", order = 505) + // public void takeTube(Boolean isHTube) throws AppException { + // enableModule(); + // tubePreProcesModuleExDriver.takeTubeFromTubeholder(isHTube); + // } + // + // @ExtApiFn(name = "<校验>放试管", group = "校验.ZM", order = 506) + // public void putTube(Boolean isHTube) throws AppException { + // enableModule(); + // tubePreProcesModuleExDriver.putTubeToTubeholder(isHTube); + // } + // + // @ExtApiFn(name = "<校验>Z轴移动到取试管位置", group = "校验.ZM", order = 507) + // public void zMotorMoveToTakeHTubePos(Boolean isHTube) throws AppException { + // enableModule(); + // stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); + // tubePreProcesModuleExDriver.zMotorMoveToTakeHTubePos(isHTube); + // } + // + // @ExtApiFn(name = "<校验>Z轴移动到摇匀位置", group = "校验.ZM", order = 508) + // public void zMotorMoveToShakeTubePos() throws AppException { + // enableModule(); + // stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); + // tubePreProcesModuleExDriver.zMotorMoveToShakeTubePos(); + // } - @ExtApiFn(name = "<校验>释放", group = "校验.夹紧", order = 504) - public void unclampTube() throws AppException { - tubePreProcesModuleExDriver.clampingMReleaseTube(); - } - @ExtApiFn(name = "<校验>全部流程", group = "校验.全部", order = 600) + @ExtApiFn(name = "<校验>全部流程", group = "校验.全部", order = 700) public void testAll(Boolean isHTube) throws AppException { + deviceReset(); controler.takeTubeFromTubeholderToShakePos(isHTube); controler.shakeTube(45, 5); controler.takeTubeCap(isHTube); controler.putbakTubeCapAndPutbakTubeToTubeHolder(isHTube); + tubePreProcesModuleExDriver.clampingMReleaseTubeInFuzzyPos(); + disableModule(); + } } diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java index aa1b996..b6413bd 100644 --- a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java @@ -2,6 +2,7 @@ package a8k.service.app.devicectrl.param.param_mgr; import a8k.service.app.devicectrl.param.param_mgr.base.ParamMgr; import a8k.service.app.devicectrl.param.type.HbotTipPosParam; +import a8k.type.TipPosConfig; import a8k.type.cfg.Pos3d; import a8k.type.type.TipGroup; import jakarta.annotation.PostConstruct; @@ -18,7 +19,6 @@ public class HbotTipPosMgr extends ParamMgr { static final Logger logger = LoggerFactory.getLogger(HbotTipPosMgr.class); - @PostConstruct void initialize() { for (HbotTipPosParam param : HbotTipPosParam.values()) { @@ -35,6 +35,9 @@ public class HbotTipPosMgr extends ParamMgr { HbotTipPosParam tip000Pos = null; HbotTipPosParam tipDxPos = null; HbotTipPosParam tipDyPos = null; + if(tip000 == null) tip000 = new Pos3d(0, 0, 0); + if(dx == null) dx = 0.0; + if(dy == null) dy = 0.0; if (tipGroup == TipGroup.GROUP0) { tip000Pos = HbotTipPosParam.TipGroup0_000Pos; @@ -43,7 +46,7 @@ public class HbotTipPosMgr extends ParamMgr { } else if (tipGroup == TipGroup.GROUP1) { tip000Pos = HbotTipPosParam.TipGroup1_000Pos; tipDxPos = HbotTipPosParam.TipGroup1_SpaceingX; - tipDyPos = HbotTipPosParam.TipGroup2_SpaceingY; + tipDyPos = HbotTipPosParam.TipGroup1_SpaceingY; } else if (tipGroup == TipGroup.GROUP2) { tip000Pos = HbotTipPosParam.TipGroup2_000Pos; tipDxPos = HbotTipPosParam.TipGroup2_SpaceingX; @@ -57,7 +60,11 @@ public class HbotTipPosMgr extends ParamMgr { setParam(tipDyPos, dy); } - public Pos3d getTipPos(TipGroup tipGroup, Integer tipoff) { + public void setTipPosCfg(TipGroup tipGroup, TipPosConfig cfg) { + setTipGroupParam(tipGroup, cfg.tip000, cfg.spaceingX, cfg.spaceingY); + } + + public TipPosConfig getTipPosCfg(TipGroup tipGroup) { Pos3d tip000 = null; Double dx = 0.0; Double dy = 0.0; @@ -70,32 +77,48 @@ public class HbotTipPosMgr extends ParamMgr { } else if (tipGroup == TipGroup.GROUP1) { tip000 = getParam(HbotTipPosParam.TipGroup1_000Pos, Pos3d.class); dx = getParam(HbotTipPosParam.TipGroup1_SpaceingX, Double.class); - dy = getParam(HbotTipPosParam.TipGroup2_SpaceingY, Double.class); + dy = getParam(HbotTipPosParam.TipGroup1_SpaceingY, Double.class); } else if (tipGroup == TipGroup.GROUP2) { tip000 = getParam(HbotTipPosParam.TipGroup2_000Pos, Pos3d.class); dx = getParam(HbotTipPosParam.TipGroup2_SpaceingX, Double.class); dy = getParam(HbotTipPosParam.TipGroup2_SpaceingY, Double.class); } - Assert.isTrue(tip000 != null, "tip000 != null"); - Assert.isTrue(dx != null, "dx != null"); - Assert.isTrue(dy != null, "dy != null"); + + TipPosConfig cfg = new TipPosConfig(); + if (tip000 == null) { + tip000 = new Pos3d(0, 0, 0); + } + cfg.tip000 = tip000; + cfg.spaceingX = dx; + cfg.spaceingY = dy; + cfg.tipGroup = tipGroup; + return cfg; + } + + + public Pos3d getTipPos(TipGroup tipGroup, Integer tipoff) { + TipPosConfig cfg = getTipPosCfg(tipGroup); + + Assert.isTrue(cfg.tip000 != null, "tip000 != null"); + Assert.isTrue(cfg.spaceingX != null, "dx != null"); + Assert.isTrue(cfg.spaceingY != null, "dy != null"); int xoff = tipoff % 12; int yoff = tipoff / 12; - double x = tip000.x + xoff * dx; - double y = tip000.y + yoff * dy; - double z = tip000.z; + double x = cfg.tip000.x + xoff * cfg.spaceingX; + double y = cfg.tip000.y + yoff * cfg.spaceingY; + double z = cfg.tip000.z; return new Pos3d((int) x, (int) y, (int) z); } - public void setDropTipPos(Pos3d pos){ + public void setDropTipPos(Pos3d pos) { setParam(HbotTipPosParam.DropTipPos, pos); } - public Pos3d getDropTipPos(){ + public Pos3d getDropTipPos() { return getParam(HbotTipPosParam.DropTipPos, Pos3d.class); } } diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleExtParamsMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleExtParamsMgr.java new file mode 100644 index 0000000..59d1ae3 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleExtParamsMgr.java @@ -0,0 +1,59 @@ +package a8k.service.app.devicectrl.param.param_mgr; + + +import a8k.service.app.devicectrl.param.param_mgr.base.ParamMgr; +import a8k.service.app.devicectrl.param.type.OptModuleExtParam; +import a8k.service.app.devicectrl.param.type.OptModuleExtParam; +import a8k.service.db.type.a8kidcard.zenum.A8kOptType; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class OptModuleExtParamsMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(OptModuleExtParamsMgr.class); + + + @PostConstruct + void initialize() { + for (OptModuleExtParam pos : OptModuleExtParam.values()) { + setParamChName(pos, pos.chName); + } + } + + public void setOptParam(OptModuleExtParam pos, Object value) { + setParam(pos, value); + } + + public Integer getOptScanStartPos(A8kOptType type) { + Integer shift = switch (type) { + case TOPT -> getParam(OptModuleExtParam.TOptScanShift, Integer.class); + case FOPT -> getParam(OptModuleExtParam.FOptScanShift, Integer.class); + }; + + Integer scanStartPos = getParam(OptModuleExtParam.OptScanRefPos, Integer.class); + scanStartPos = scanStartPos + shift; + + return scanStartPos; + } + + public Double getScanGain(A8kOptType type) { + return switch (type) { + case TOPT -> getParam(OptModuleExtParam.TOptScanGainVal, Double.class); + case FOPT -> getParam(OptModuleExtParam.FOptScanGainVal, Double.class); + }; + } + + public Integer getOptEmissionIntensity(A8kOptType type) { + return switch (type) { + case TOPT -> getParam(OptModuleExtParam.TOptEmissionIntensity, Integer.class); + case FOPT -> getParam(OptModuleExtParam.FOptEmissionIntensity, Integer.class); + }; + } + +} + diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java index bbd8b68..490cfca 100644 --- a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java @@ -30,8 +30,7 @@ public class OptModuleParamsMgr extends ParamMgr { setParam(OptModuleParam.OptScanerDropPos, -349); setParam(OptModuleParam.OptScanerScandbyPos, 305); setParam(OptModuleParam.OptScanerScandbyPos, 4000); - setParam(OptModuleParam.TOptScanShift, 277); - setParam(OptModuleParam.FOptScanShift, 1441); + } @@ -40,59 +39,6 @@ public class OptModuleParamsMgr extends ParamMgr { } - // public void setPullerTargetPos(Integer pos) { - // setParam(OptModuleParam.PullerTargetPos, pos); - // } - // - // public void setOptScanerDropPos(Integer pos) { - // setParam(OptModuleParam.OptScanerDropPos, pos); - // } - // - // public void setOptScanerScandbyPos(Integer pos) { - // setParam(OptModuleParam.OptScanerScandbyPos, pos); - // } - // - // - // public void setOptScanRefPos(Integer pos) { - // setParam(OptModuleParam.OptScanRefPos, pos); - // } - // - // public void setTOptScanShift(Integer pos) { - // setParam(OptModuleParam.TOptScanShift, pos); - // } - // - // public void setFOptScanShift(Integer pos) { - // setParam(OptModuleParam.FOptScanShift, pos); - // } - - - public Integer getOptScanStartPos(A8kOptType type) { - Integer shift = switch (type) { - case TOPT -> getParam(OptModuleParam.TOptScanShift, Integer.class); - case FOPT -> getParam(OptModuleParam.FOptScanShift, Integer.class); - }; - - Integer scanStartPos = getParam(OptModuleParam.OptScanRefPos, Integer.class); - scanStartPos = scanStartPos + shift; - - return scanStartPos; - } - - public Double getScanGain(A8kOptType type) { - return switch (type) { - case TOPT -> getParam(OptModuleParam.TOptScanGainVal, Double.class); - case FOPT -> getParam(OptModuleParam.FOptScanGainVal, Double.class); - }; - } - - public Integer getOptEmissionIntensity(A8kOptType type) { - return switch (type) { - case TOPT -> getParam(OptModuleParam.TOptEmissionIntensity, Integer.class); - case FOPT -> getParam(OptModuleParam.FOptEmissionIntensity, Integer.class); - }; - } - - public Integer getPullerTargetPos() { return getParam(OptModuleParam.PullerTargetPos, Integer.class); } diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TemperatureCtrlParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TemperatureCtrlParamMgr.java index 4e41b69..c75f8d8 100644 --- a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TemperatureCtrlParamMgr.java +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TemperatureCtrlParamMgr.java @@ -26,7 +26,13 @@ public class TemperatureCtrlParamMgr extends ParamMgr { } public Double getParam(TemperatureCtrlParam pos) { - return super.getParam(pos, Double.class); + Double obj = super.getParam(pos, Double.class); + if (obj == null) { + return switch (pos) { + case IncubatorTCMTempOffset, PlatesBoxTCMTempOffset -> 0.0; + }; + } + return obj; } } diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java index 70c41c7..bef997b 100644 --- a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java @@ -4,7 +4,7 @@ import a8k.service.app.devicectrl.param.param_mgr.base.ParamMgr; import a8k.type.TubePreProcessGripperPos; import a8k.type.TubePreProcessTubeClamp; import a8k.type.TubePreProcessYPos; -import a8k.type.TubePreProcessZAxisPos; +import a8k.service.app.devicectrl.param.type.TubePreProcessZAxisPos; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; @Component public class TubePreProcesPosParamMgr extends ParamMgr { static final Logger logger = LoggerFactory.getLogger(TubeFeedingModuleParamMgr.class); + @PostConstruct void initialize() { for (var pos : TubePreProcessGripperPos.values()) { @@ -52,8 +53,6 @@ public class TubePreProcesPosParamMgr extends ParamMgr { public Integer getGripperServoOpenPos() {return getParam(TubePreProcessGripperPos.GripperServoOpenPos);} - public Integer getGripperServoClosePos() {return getParam(TubePreProcessGripperPos.GripperServoClosePos);} - public Integer getGripperServoTakeCapPos() {return getParam(TubePreProcessGripperPos.GripperServoTakeCapPos);} public Integer getYServoTakeTubePos() {return getParam(TubePreProcessYPos.YServoTakeTubePos);} @@ -70,7 +69,7 @@ public class TubePreProcesPosParamMgr extends ParamMgr { public Integer getZMotorShakeTubePos() {return getParam(TubePreProcessZAxisPos.ZMotorShakeTubePos);} - public Integer getZMotorPutCapPos() {return getParam(TubePreProcessZAxisPos.ZMotorPutTubeCapPos);} + public Integer getZMotorPutCapPos() {return getParam(TubePreProcessZAxisPos.ZMotorShakeTubePos) + getParam(TubePreProcessGripperPos.GripperRedundancyHeight);} public Integer getShakeClampMotorClampPos() {return getParam(TubePreProcessTubeClamp.ShakeClampMotorClampPos);} diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/OptModuleExtParam.java b/src/main/java/a8k/service/app/devicectrl/param/type/OptModuleExtParam.java new file mode 100644 index 0000000..ea210cf --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/type/OptModuleExtParam.java @@ -0,0 +1,20 @@ +package a8k.service.app.devicectrl.param.type; + +public enum OptModuleExtParam { + OptScanRefPos("光学扫描参考坐标"), + + FOptScanShift("F光学扫描偏移"), + FOptEmissionIntensity("F发射强度"),//Int + FOptScanGainVal("F光学扫描放大倍数"),//Double + + TOptScanShift("T光学扫描偏移"), + TOptEmissionIntensity("T发射强度"), + TOptScanGainVal("T光学扫描放大倍数"), + ; + + public final String chName; + + OptModuleExtParam(String chName) { + this.chName = chName; + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/OptModuleParam.java b/src/main/java/a8k/service/app/devicectrl/param/type/OptModuleParam.java index 453761d..6e48399 100644 --- a/src/main/java/a8k/service/app/devicectrl/param/type/OptModuleParam.java +++ b/src/main/java/a8k/service/app/devicectrl/param/type/OptModuleParam.java @@ -4,17 +4,7 @@ public enum OptModuleParam { PullerTargetPos("拉板目标位置"), OptScanerDropPos("丢板坐标"), OptScanerScandbyPos("扫描待机位"), - OptScanRefPos("光学扫描参考坐标"), - - FOptScanShift("F光学扫描偏移"), - FOptEmissionIntensity("F发射强度"),//Int - FOptScanGainVal("F光学扫描放大倍数"),//Double - - TOptScanShift("T光学扫描偏移"), - TOptEmissionIntensity("T发射强度"), - TOptScanGainVal("T光学扫描放大倍数"), ; - public final String chName; OptModuleParam(String chName) { diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/TubePrePorcessStructConstant.java b/src/main/java/a8k/service/app/devicectrl/param/type/TubePrePorcessStructConstant.java new file mode 100644 index 0000000..b5402ea --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/type/TubePrePorcessStructConstant.java @@ -0,0 +1 @@ +package a8k.service.app.devicectrl.param.type; diff --git a/src/main/java/a8k/type/TubePreProcessZAxisPos.java b/src/main/java/a8k/service/app/devicectrl/param/type/TubePreProcessZAxisPos.java similarity index 82% rename from src/main/java/a8k/type/TubePreProcessZAxisPos.java rename to src/main/java/a8k/service/app/devicectrl/param/type/TubePreProcessZAxisPos.java index 3157e12..80a8821 100644 --- a/src/main/java/a8k/type/TubePreProcessZAxisPos.java +++ b/src/main/java/a8k/service/app/devicectrl/param/type/TubePreProcessZAxisPos.java @@ -1,10 +1,9 @@ -package a8k.type; +package a8k.service.app.devicectrl.param.type; public enum TubePreProcessZAxisPos { ZMotorTakeHTubePos("取高试管位置"),// ZMotorTakeSTubePos("取低试管位置"),// ZMotorShakeTubePos("摇匀放置位置"),// - ZMotorPutTubeCapPos("盖帽位置"),// ; public final String chName; TubePreProcessZAxisPos(String chName) { diff --git a/src/main/java/a8k/type/TipPosConfig.java b/src/main/java/a8k/type/TipPosConfig.java new file mode 100644 index 0000000..7baf628 --- /dev/null +++ b/src/main/java/a8k/type/TipPosConfig.java @@ -0,0 +1,11 @@ +package a8k.type; + +import a8k.type.cfg.Pos3d; +import a8k.type.type.TipGroup; + +public class TipPosConfig { + public TipGroup tipGroup; + public Pos3d tip000; + public Double spaceingX; + public Double spaceingY; +} diff --git a/src/main/java/a8k/type/TubePreProcessGripperPos.java b/src/main/java/a8k/type/TubePreProcessGripperPos.java index 39102dc..d4b554e 100644 --- a/src/main/java/a8k/type/TubePreProcessGripperPos.java +++ b/src/main/java/a8k/type/TubePreProcessGripperPos.java @@ -2,8 +2,8 @@ package a8k.type; public enum TubePreProcessGripperPos { GripperServoOpenPos("<抓手>张开位置"),// - GripperServoClosePos("<抓手>闭合位置"),// GripperServoTakeCapPos("<抓手>取试管位置"),// + GripperRedundancyHeight("<抓手>冗余高度"),// ; public final String chName; diff --git a/src/main/java/a8k/utils/ZJsonHelper.java b/src/main/java/a8k/utils/ZJsonHelper.java index ca83a14..1c908a9 100644 --- a/src/main/java/a8k/utils/ZJsonHelper.java +++ b/src/main/java/a8k/utils/ZJsonHelper.java @@ -22,20 +22,34 @@ public class ZJsonHelper { public static T objectFromJson(ObjectNode node, Class tClass) { ObjectMapper mapper = new ObjectMapper(); + if(node == null) { + return null; + } + if (tClass.getTypeName().equals(Integer.class.getTypeName())) { + if (node.get("value") == null) + return null; return (T) Integer.valueOf(node.get("value").asInt()); } if (tClass.getTypeName().equals(String.class.getTypeName())) { + if (node.get("value") == null) + return null; return (T) node.get("value").asText(); } if (tClass.getTypeName().equals(Boolean.class.getTypeName())) { + if (node.get("value") == null) + return null; return (T) Boolean.valueOf(node.get("value").asBoolean()); } if (tClass.getTypeName().equals(Double.class.getTypeName())) { + if (node.get("value") == null) + return null; return (T) Double.valueOf(node.get("value").asDouble()); } if (tClass.getTypeName().equals(Float.class.getTypeName())) { + if (node.get("value") == null) + return null; return (T) Float.valueOf(node.get("value").floatValue()); } diff --git a/app.db b/src/main/resources/app.db similarity index 85% rename from app.db rename to src/main/resources/app.db index f800f48..0429c62 100644 Binary files a/app.db and b/src/main/resources/app.db differ diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 79c30ea..a8a84fa 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,14 +1,2 @@ -server : - port : 80 - -spring: - datasource: - url: jdbc:sqlite:D:/java_workspace/a8000/app.db - driver-class-name: org.sqlite.JDBC -device: - connections: - - name : zcancmder - key : zcancmder - enable : true - type : ZcancmderWebsocket - uri: ws://192.168.8.10:19005 +A8kCanBusService: + url: ws://127.0.0.1:19005 \ No newline at end of file diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index f53ee31..46ab07c 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -1,15 +1,2 @@ -server : - port : 80 - -spring: - datasource: - url: jdbc:sqlite:/app/device.db - driver-class-name: org.sqlite.JDBC - -device: - connections: - - name : zcancmder - key : zcancmder - enable : true - type : ZcancmderWebsocket - uri: ws://192.168.8.10:19005 +A8kCanBusService: + url: ws://192.168.8.10:19005 \ No newline at end of file diff --git a/src/main/resources/application-zhaohe_pc.yml b/src/main/resources/application-zhaohe_pc.yml deleted file mode 100644 index c99d2bc..0000000 --- a/src/main/resources/application-zhaohe_pc.yml +++ /dev/null @@ -1,19 +0,0 @@ -server : - port : 80 - -spring: - datasource: - url: jdbc:sqlite:D:/java_workspace/a8000/app.db - driver-class-name: org.sqlite.JDBC - -device: - connections: - - name : zcancmder - key : zcancmder - enable : true - type : ZcancmderWebsocket - uri: ws://192.168.8.10:19005 - -VirtualDevice: - enableVirtualDevice: true -