From 7c66377ec1d7adebba0803637e8c159c3fd87f77 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 15 Jul 2024 08:56:47 +0800 Subject: [PATCH] update --- src/main/java/a8k/a8k_can_protocol/IOId.java | 37 +++++ src/main/java/a8k/a8k_can_protocol/ModuleId.java | 2 + src/main/java/a8k/a8k_can_protocol/ModuleType.java | 27 ++++ src/main/java/a8k/appbean/AppErrorCode.java | 4 + .../java/a8k/base_hardware/A8kCanBusService.java | 62 +++++++- .../ReactionPlatesTransmitCtrlService.java | 156 +++++++++++++++++++++ 6 files changed, 285 insertions(+), 3 deletions(-) create mode 100644 src/main/java/a8k/a8k_can_protocol/IOId.java create mode 100644 src/main/java/a8k/a8k_can_protocol/ModuleType.java create mode 100644 src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java diff --git a/src/main/java/a8k/a8k_can_protocol/IOId.java b/src/main/java/a8k/a8k_can_protocol/IOId.java new file mode 100644 index 0000000..3805953 --- /dev/null +++ b/src/main/java/a8k/a8k_can_protocol/IOId.java @@ -0,0 +1,37 @@ +package a8k.a8k_can_protocol; + +public enum IOId { + TubeHeightDetecter(ModuleType.kboard, 60, 0), //高低试管检测IO + TubeHolderTransferChannelTubeDetecterOuter(ModuleType.kboard, 60, 1),//试管架转移通道有无检测 外 + TubeHolderTransferChannelTubeDetecterInter(ModuleType.kboard, 60, 2),//试管架转移通道有无检测 内 + SampleExitTubeHolderlDetecter(ModuleType.kboard, 60, 3),//试管出料位置 试管架有无检测 + TubeExistDetecter(ModuleType.kboard, 60, 4),//试管有无光电 + SampleEnterTubeHolderlDetecter(ModuleType.kboard, 60, 5),//试管架入料位置 试管架有无检测 + + WasteBucketOverflowedDetector(ModuleType.kboard, 40, 2),//废料桶满溢检测 + WasteBucketOverflowedDetectorPowerCtrl(ModuleType.kboard, 40, 0),//废料桶光栅电源 + + PlateBoxCoverClosureDetector(ModuleType.kboard, 20, 0),//板夹仓舱盖闭合检测 + PlateBoxPlateStuckDetector(ModuleType.kboard, 20, 1),//板夹仓卡板检测 + + //转盘逻辑相关光电 + //钩板电机,零点光电,终点光电 + PlaterHookerMotorZeroPointDetector(ModuleType.ktmc_step_motor,ModuleId.MotorTestCardPullModule,0), + PlaterHookerMotorEndPointDetector(ModuleType.ktmc_step_motor,ModuleId.MotorTestCardPullModule,1), + //推板电机,零点光电,终点光电 + PlaterPusherMotorZeroPointDetector(ModuleType.ktmc_step_motor,ModuleId.MotorCardWarehousePushModule,0), + PlaterPusherMotorEndPointDetector(ModuleType.ktmc_step_motor,ModuleId.MotorCardWarehousePushModule,1), + ; + + + final public ModuleType mtype; + final public int mid; + final public int ioIndex; + + IOId(ModuleType mtype, int mid, int ioIndex) { + this.mtype = mtype; + this.mid = mid; + this.ioIndex = ioIndex; + } + +} diff --git a/src/main/java/a8k/a8k_can_protocol/ModuleId.java b/src/main/java/a8k/a8k_can_protocol/ModuleId.java index 2b7f8ed..5ca9a0e 100644 --- a/src/main/java/a8k/a8k_can_protocol/ModuleId.java +++ b/src/main/java/a8k/a8k_can_protocol/ModuleId.java @@ -7,6 +7,7 @@ public class ModuleId { public static final int MotorCardWarehouseMoveBoardModule = 20;//板夹仓模块 public static final int MotorCardWarehouseMoveModule = 21;//板夹仓移动电机 public static final int MotorCardWarehousePushModule = 22;//板夹仓推杆电机 + public static final int CardWarehouseScanerModule = 23;//板夹仓扫码模组 public static final int ShakeModuleBoard = 30;//摇匀模组板 public static final int MotorTubeScanClampModule = 31;//试管固定夹爪电机 @@ -55,6 +56,7 @@ public class ModuleId { case MotorCardWarehouseMoveBoardModule -> "MotorCardWarehouseMoveBoardModule"; case MotorCardWarehouseMoveModule -> "MotorCardWarehouseMoveModule"; case MotorCardWarehousePushModule -> "MotorCardWarehousePushModule"; + case CardWarehouseScanerModule -> "CardWarehouseScanerModule"; case ShakeModuleBoard -> "ShakeModuleBoard"; case MotorTubeScanClampModule -> "MotorTubeScanClampModule"; diff --git a/src/main/java/a8k/a8k_can_protocol/ModuleType.java b/src/main/java/a8k/a8k_can_protocol/ModuleType.java new file mode 100644 index 0000000..053057c --- /dev/null +++ b/src/main/java/a8k/a8k_can_protocol/ModuleType.java @@ -0,0 +1,27 @@ +package a8k.a8k_can_protocol; + +public enum ModuleType { + khbot_module(1), // hbot模块 + ktemperature_ctrl_module(3), // 温度控制 + kfan_ctrl_module(5), // 风扇控制 + kcode_scaner(6), // 扫码器 + kpipette_ctrl_module(7), // 移液体枪控制 + ka8000_optical_module(8), // a8000光学模组 + ktmc_step_motor(10), // 步进电机 + kmini_servo_motor_module(11), // 舵机 + kboard(12), // 板子 + ka8000_idcard_reader(13), // id卡读卡器 + ka8000_plate_code_scaner(14); // 反应板条扫码器 + + final private int val; + + ModuleType(int val) { + this.val = val; + } + + public int getVal() { + return val; + } + + +} diff --git a/src/main/java/a8k/appbean/AppErrorCode.java b/src/main/java/a8k/appbean/AppErrorCode.java index d8e0476..5758a3d 100644 --- a/src/main/java/a8k/appbean/AppErrorCode.java +++ b/src/main/java/a8k/appbean/AppErrorCode.java @@ -7,11 +7,15 @@ public enum AppErrorCode { final private String name; final private int errorIndex; + public int mid; + private AppErrorCode(String name, int errorIndex) { this.name = name; this.errorIndex = errorIndex; } + + public String toString() { return name; } diff --git a/src/main/java/a8k/base_hardware/A8kCanBusService.java b/src/main/java/a8k/base_hardware/A8kCanBusService.java index 22f2eb6..6ce634d 100644 --- a/src/main/java/a8k/base_hardware/A8kCanBusService.java +++ b/src/main/java/a8k/base_hardware/A8kCanBusService.java @@ -3,6 +3,7 @@ package a8k.base_hardware; import a8k.a8k_can_protocol.A8kPacket; import a8k.a8k_can_protocol.CmdId; import a8k.a8k_can_protocol.Errorcode; +import a8k.a8k_can_protocol.IOId; import a8k.appbean.HardwareException; import a8k.appbean.appevent.A8kHardwareReport; import a8k.service.AppEventBusService; @@ -142,12 +143,67 @@ public class A8kCanBusService { } //TODO + public boolean getIOState(IOId ioid) throws HardwareException { + return false; + } + + //TODO + public void setIOState(IOId ioid, boolean val) throws HardwareException { + } + + + //TODO + public A8kPacket callcmd(Integer moduleId, Integer cmdId) throws HardwareException { + return null; + } + + //TODO + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0) throws HardwareException { + return null; + } + + //TODO + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1) throws HardwareException { + return null; + } + + //TODO + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer p2) throws HardwareException { + return null; + } + + //TODO + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer p2, Integer p3) throws HardwareException { + return null; + } + + //TODO + public void callblockcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer p2, Integer p3, Integer acitionOvertime) throws HardwareException, InterruptedException { + } + + //TODO + public void callblockcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer p2, Integer acitionOvertime) throws HardwareException, InterruptedException { + } + + //TODO + public void callblockcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer acitionOvertime) throws HardwareException, InterruptedException { + } + + //TODO + public void callblockcmd(Integer moduleId, Integer cmdId, Integer p0, Integer acitionOvertime) throws HardwareException, InterruptedException { + } + + //TODO + public void callblockcmd(Integer moduleId, Integer cmdId, Integer acitionOvertime) throws HardwareException, InterruptedException { + } + + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer[] params) throws HardwareException { var packet = this.packParamsToPacket(moduleId, cmdId, params); return this.sendCmd(packet, A8kPacket.CMD_OVERTIME); } - //TODO + public A8kPacket sendCmdAutoResend(A8kPacket pack, int overtime) throws HardwareException { //调用sendCmd, // 如果捕获到超时异常,则重发,最多重发三次 @@ -164,7 +220,7 @@ public class A8kCanBusService { return null; } - //TODO + public void callblockcmd(Integer moduleId, Integer cmdId, Integer[] params, int acitionOvertime) throws HardwareException, InterruptedException { var packet = this.packParamsToPacket(moduleId, cmdId, params); this.sendCmdAutoResend(packet, A8kPacket.CMD_OVERTIME); @@ -175,7 +231,7 @@ public class A8kCanBusService { long startedAt = System.currentTimeMillis(); do { - var pack = this.callcmd(moduleId, CmdId.kmodule_get_status, new Integer[]{}); + var pack = this.callcmd(moduleId, CmdId.kmodule_get_status, new Integer[]{}); var status = pack.getContentI32(0); if (0 == status) { break; diff --git a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java new file mode 100644 index 0000000..c20221d --- /dev/null +++ b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java @@ -0,0 +1,156 @@ +package a8k.service.hardware; + +import a8k.appbean.AppErrorCode; +import org.springframework.stereotype.Component; + +@Component +public class ReactionPlatesTransmitCtrlService { + + + /* + 职责说明 + 1.仓位变化 + 2.推出反应板 + 3.反应板推出异常检测 + 4.反应板推出二次校准服务 + */ + + /* ======================================================================================= + 基础操作 + =======================================================================================*/ + + boolean moduleReset() { + /* + 复位要求 + 1. 反应板夹仓推杆零点光电处于触发状态 + 2. 板夹钩爪零点光电处于触发状态 或 终点光电处于触发状态 + 3. 板夹卡板光电没有处于触发状态 + */ + + + + + + } + + + /* ======================================================================================= + 板夹仓操作 + =======================================================================================*/ + void pushReactionPlate(int plateBoxChannelNum, int turntablePosIndex) { + /* + 1. 控制转盘移动到第turntablePosIndex个位置 + 2. 控制板夹仓平移到第boxChannelNum个仓位 + 3. 推出板 + 3.1 板推出后检查推板电机终点电机是否触发,如果没有触发,则说明卡板,上报硬件异常 + 4. 板夹推杆回到零点,并执行一次归零动作。 + 5. 板夹仓平移电机,移动零点,并执行一次归零动作,归零后向后相对移动1mm,保证零点触发。 + + 推板 使用模块 CardWarehouseScanerModule + 指令: kplate_code_scaner_push_card_and_scan(参数为扫码结束位置,相当于指令moveTo参数) + 相关寄存器: + kreg_plate_code_scaner_scan_start_pos (每次扫码前需要设置该参数) + kreg_plate_code_scaner_code_judgment_threshold (扫码前设置,该数值为1,0码判定阈值) + kreg_plate_code_scaner_item (扫码完成读取) + kreg_plate_code_scaner_lot (扫码完成读取) + kreg_plate_code_scaner_code_legal (扫码完成读取) + + */ + + } + + /** + * 读取 推板时的扫码结果LotId + */ + int plateScanerReadlateLot() { + return 0; + } + + /** + * 读取 推板时的扫码结果ItermId + */ + int plateScanerReadPlateIterm() { + return 0; + } + + /** + * 读取 推板时的扫码结果合法性 + */ + boolean plateScanerReadPlateIsLegal() { + return false; + } + + + Integer[] plateScanerReadRawData() { + /* + 先不实现, + 后续实现效果, + 网页端执行完推板后,点击读取,网页端弹出一个页面, + 页面上有一条曲线 + 有曲线的最大值和最小值 + 且参考下面代码打上参考线 + for (int i = 0; i < 15; i++) { + plot2d->addRefLine(i * 12 + 6 ); + } + */ + return null; + } + + /* ======================================================================================= + 光学模组部分操作 + =======================================================================================*/ + + void pullReactionPlate(int turntablePosIndex) { + /* + 1.检查当前钩爪出口光电是否触发,如果没有触发,直接报 电机位置异常 + 2.移动转盘 + 3.移动光学模组到丢板的位置 + 4.移动光学模组到待机位置 + 5.钩爪勾取反应板到指定位置 + 6.钩爪动作完成时,检查钩爪零点光电是否触发,如果没有触发报电机阻转异常 + */ + + } + + + + /* ======================================================================================= + 转盘操作 + =======================================================================================*/ + + + /** + * 移动转盘到入口位置 + * @param turntablePos 第几个仓位 + */ + void moveTurntableToEnterPos(int turntablePos) { + /* + 注意事项: + 1.移动前检查,出转盘钩爪电机光电是否触发(两个光电必须触发一个才能执行动作),否则直接抛出 电机位置异常错误 + 2.移动前检测,入转盘钩爪零点光电是否触发。 + 3.移动前检查,入转盘卡板光电是否触发。 + */ + } + + /** + * 移动转盘到出口位置 + * @param turntablePos 第几个仓位 + */ + void moveTurntableToExitPos(int turntablePos) { + /* + 同moveTurntableToEnterPos + */ + } + + /** + * 移动转盘到点滴位置 + * @param turntablePos 第几个仓位 + */ + void moveTurntableToDropLiquidPos(int turntablePos) { + /* + 同moveTurntableToEnterPos + */ + } + + +}