Browse Source

update

tags/v0
zhaohe 9 months ago
parent
commit
9f28d25f84
  1. 17
      README2.md
  2. 49
      src/main/java/a8k/extapi_controler/ExtApiControler.java
  3. 1
      src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java
  4. 2
      src/main/java/a8k/extapi_controler/utils/ExtApiFn.java
  5. 8
      src/main/java/a8k/hardware/A8kCanBusService.java
  6. 15
      src/main/java/a8k/hardware/A8kModParamInitializer.java
  7. 61
      src/main/java/a8k/hardware/type/regindex/StepMotorRegIndex.java
  8. 2
      src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java
  9. 11
      src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java
  10. 108
      src/main/java/a8k/service/app/devicectrl/driver/StepMotorCtrlDriver.java
  11. 3
      src/main/java/a8k/service/app/devicectrl/driver/type/StepMotorRegIndex.java
  12. 7
      src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java
  13. 12
      src/main/java/a8k/service/app/devicectrl/exdriver/TubePreProcesModuleExDriver.java
  14. 117
      src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java
  15. 26
      src/main/java/a8k/service/app/devicectrl/param/calibration/OptModuleParamCalibration.java
  16. 264
      src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java
  17. 47
      src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java
  18. 59
      src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleExtParamsMgr.java
  19. 56
      src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java
  20. 8
      src/main/java/a8k/service/app/devicectrl/param/param_mgr/TemperatureCtrlParamMgr.java
  21. 7
      src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java
  22. 20
      src/main/java/a8k/service/app/devicectrl/param/type/OptModuleExtParam.java
  23. 10
      src/main/java/a8k/service/app/devicectrl/param/type/OptModuleParam.java
  24. 1
      src/main/java/a8k/service/app/devicectrl/param/type/TubePrePorcessStructConstant.java
  25. 3
      src/main/java/a8k/service/app/devicectrl/param/type/TubePreProcessZAxisPos.java
  26. 11
      src/main/java/a8k/type/TipPosConfig.java
  27. 2
      src/main/java/a8k/type/TubePreProcessGripperPos.java
  28. 14
      src/main/java/a8k/utils/ZJsonHelper.java
  29. BIN
      src/main/resources/app.db
  30. 16
      src/main/resources/application-dev.yml
  31. 17
      src/main/resources/application-test.yml
  32. 19
      src/main/resources/application-zhaohe_pc.yml

17
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. 支持鼠标? (困难)
```

49
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<String, Object> 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<String, Object> 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<String, Object>) params.get("params");
List<Object> 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<String, Object> params) throws Exception {

1
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),

2
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;

8
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) {

15
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);
}

61
src/main/java/a8k/hardware/type/regindex/StepMotorRegIndex.java

@ -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;
}
}

2
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));

11
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);
}

108
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;
}
}

3
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), // 设置一圈脉冲数的分母

7
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);
}

12
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);
}
//

117
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<TipRefPoint> 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<Integer> 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();
}
}

26
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<Parameter> 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);

264
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();
}
}

47
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);
}
}

59
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);
};
}
}

56
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);
}

8
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;
}
}

7
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);}

20
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;
}
}

10
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) {

1
src/main/java/a8k/service/app/devicectrl/param/type/TubePrePorcessStructConstant.java

@ -0,0 +1 @@
package a8k.service.app.devicectrl.param.type;

3
src/main/java/a8k/type/TubePreProcessZAxisPos.java → 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("<Z轴>取高试管位置"),//
ZMotorTakeSTubePos("<Z轴>取低试管位置"),//
ZMotorShakeTubePos("<Z轴>摇匀放置位置"),//
ZMotorPutTubeCapPos("<Z轴>盖帽位置"),//
;
public final String chName;
TubePreProcessZAxisPos(String chName) {

11
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;
}

2
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;

14
src/main/java/a8k/utils/ZJsonHelper.java

@ -22,20 +22,34 @@ public class ZJsonHelper {
public static <T> T objectFromJson(ObjectNode node, Class<T> 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());
}

BIN
app.db → src/main/resources/app.db

16
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

17
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

19
src/main/resources/application-zhaohe_pc.yml

@ -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
Loading…
Cancel
Save