From ce10e6a99c8f50c9b55db014566c951c289b2ae4 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 23 Jul 2024 10:27:16 +0800 Subject: [PATCH] update --- README.md | 10 ++- src/main/java/a8k/appbean/ecode/AppRet.java | 1 + .../java/a8k/base_hardware/A8kCanBusService.java | 31 ++++++- .../MotorTubeRackMoveCtrlServiceParameterDao.java | 2 - .../db/dao/ReactionPlatesTransmitCtrlParamDao.java | 89 +++++++++++++++++++ .../ReactionPlatesTransmitCtrlParamService.java | 85 ------------------- .../MotorTubeRackMoveCtrlServiceParameter.java | 50 ----------- .../hardware/MotorTubeRackMoveCtrlService.java | 55 ++++++++---- .../ReactionPlatesTransmitCtrlService.java | 99 +++++++++++++++++++--- 9 files changed, 249 insertions(+), 173 deletions(-) create mode 100644 src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamDao.java delete mode 100644 src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamService.java delete mode 100644 src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java diff --git a/README.md b/README.md index 8f2c8d7..abc5107 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,12 @@ 2.水平移动舵机初始化位置为200(处于设备最后端) - - - - + 复位要求: + 1. 板夹仓推杆电机需要处于零点位置 + 2. 光学模组推杆电机需要处于零点位置 + 3. 试管架通道中没有试管架 + 4. 出料口没有试管架 + 5. 进出料位置没有试管 ``` diff --git a/src/main/java/a8k/appbean/ecode/AppRet.java b/src/main/java/a8k/appbean/ecode/AppRet.java index f0b0242..7e41374 100644 --- a/src/main/java/a8k/appbean/ecode/AppRet.java +++ b/src/main/java/a8k/appbean/ecode/AppRet.java @@ -46,6 +46,7 @@ public class AppRet { return r; } + public static AppRet success() { AppRet r = new AppRet<>(); r.suc = true; diff --git a/src/main/java/a8k/base_hardware/A8kCanBusService.java b/src/main/java/a8k/base_hardware/A8kCanBusService.java index 8e0e9b7..259b98c 100644 --- a/src/main/java/a8k/base_hardware/A8kCanBusService.java +++ b/src/main/java/a8k/base_hardware/A8kCanBusService.java @@ -145,6 +145,22 @@ public class A8kCanBusService { } + //code_scaner_start_scan + //code_scaner_stop_scan + //code_scaner_result_is_ready + //code_scaner_read_scaner_result + + public void codeScanerStartScan(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.code_scaner_start_scan.toInt()); + } + + public void codeScanerStopScan(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.code_scaner_stop_scan.toInt()); + } + + public A8kPacket codeScanerReadScanerResult(MId id) throws HardwareException { + return callcmd(id.toInt(), CmdId.code_scaner_read_scaner_result.toInt()); + } // // module opeation // @@ -378,8 +394,10 @@ public class A8kCanBusService { public void waitForMod(MId mid, Integer acitionOvertime) throws InterruptedException, HardwareException { long startedAt = System.currentTimeMillis(); - CmdId action = lastCmdMap.get(mid); + // CmdId action = lastCmdMap.get(mid); + CmdId action = lastCmdMapGet(mid); do { + try { var status = getModuleStatus(mid); if (status == ModuleStatus.IDLE) { @@ -442,6 +460,7 @@ public class A8kCanBusService { this.callblockcmd(moduleId, cmdId, new Integer[]{}, acitionOvertime); } + // TODO public Integer module_read_reg(Integer moduleId, RegIndex regindex) { return 0; @@ -515,7 +534,7 @@ public class A8kCanBusService { } if (pack.getCmdId() != CmdId.module_get_status.toInt()) { - lastCmdMap.put(MId.valueOf(pack.getModuleId()), CmdId.valueOf(pack.getCmdId())); + lastCmdMapPut(MId.valueOf(pack.getModuleId()), CmdId.valueOf(pack.getCmdId())); } @@ -577,6 +596,14 @@ public class A8kCanBusService { } } } + + synchronized void lastCmdMapPut(MId mid, CmdId cmdId) { + lastCmdMap.put(mid, cmdId); + } + + synchronized CmdId lastCmdMapGet(MId mid) { + return lastCmdMap.get(mid); + } // // public static void main(String[] args) { // A8kCanBusService service = new A8kCanBusService(); diff --git a/src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java b/src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java index bb2fed4..07472ea 100644 --- a/src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java +++ b/src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java @@ -1,9 +1,7 @@ package a8k.service.db.dao; import a8k.service.db.entity.HardwareServiceSetting; -import a8k.service.db.entity.MotorTubeRackMoveCtrlServiceParameter; import com.iflytop.uf.UfActiveRecord; -import com.iflytop.uf.UfActiveRecordField; import org.springframework.stereotype.Component; import java.util.List; diff --git a/src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamDao.java b/src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamDao.java new file mode 100644 index 0000000..9fa8f9e --- /dev/null +++ b/src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamDao.java @@ -0,0 +1,89 @@ +package a8k.service.db.dao; + +/** + * 反应板夹搬运相关服务访问 + */ +public class ReactionPlatesTransmitCtrlParamDao { + + // + + public final String serviceName = "ReactionPlatesTransmitCtrlService"; + + public int getActionOvertime() { + return 0; + } + + + /* + * 板夹仓相关参数 + */ + public int getPlateBoxChannel0Pos() { + //板夹仓通道0位置 + return 0; + } + + public int getPlateBoxChannelInterval() { + //板夹仓通道间间距 + return 0; + } + + public int getPlatePusherEndPos() { + //板夹仓推杆到位位置 + return 0; + } + + public int getPlatePusherScanerStartPos() { + //推杆扫码开始位置 + return 0; + } + + /* + * 转盘相关位置 + */ + + public int getTurntablePushPos0() { + //转盘仓位0,入板位置 + return 0; + } + + public int getTurntablePullPos0() { + //转盘仓位0,出板位置 + return 0; + } + + public int getTurntableReactionPos0() { + //转盘仓位0,出板位置 + return 0; + } + + public int getTurntablePosInterval() { + //转盘仓位之间间距 + return 0; + } + + /* + * 光学模组相关 + */ + + public int getPullerStandbyPos() { + //获取拉杆待机位置 + return 0; + } + + public int getPullerTargetPos() { + //获取拉杆,目标位 + return 0; + } + + public int getDropPos() { + //获取丢板位置 + return 0; + } + + public int getOptScanScandbyPos() { + //获取拉板,光学模组待机位 + return 0; + } + + +} diff --git a/src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamService.java b/src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamService.java deleted file mode 100644 index d3d8065..0000000 --- a/src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamService.java +++ /dev/null @@ -1,85 +0,0 @@ -package a8k.service.db.dao; - -/** - * 反应板夹搬运相关服务访问 - */ -public class ReactionPlatesTransmitCtrlParamService { - - // - - public final String serviceName = "ReactionPlatesTransmitCtrlService"; - - - /* - * 板夹仓相关参数 - */ - public int getPlateBoxChannel0Pos() { - //板夹仓通道0位置 - return 0; - } - - public int getPlateBoxChannelInterval() { - //板夹仓通道间间距 - return 0; - } - - public int getPlatePusherEndPos() { - //板夹仓推杆到位位置 - return 0; - } - - public int getPlatePusherScanerStartPos() { - //推杆扫码开始位置 - return 0; - } - - /* - * 转盘相关位置 - */ - - public int getTurntablePushPos0() { - //转盘仓位0,入板位置 - return 0; - } - - public int getTurntablePullPos0() { - //转盘仓位0,出板位置 - return 0; - } - - public int getTurntableReactionPos0() { - //转盘仓位0,出板位置 - return 0; - } - - public int getTurntablePosInterval() { - //转盘仓位之间间距 - return 0; - } - - /* - * 光学模组相关 - */ - - public int getPullerStandbyPos() { - //获取拉杆待机位置 - return 0; - } - - public int getPullerTargetPos() { - //获取拉杆,目标位 - return 0; - } - - public int getDropPos() { - //获取丢板位置 - return 0; - } - - public int getOptScanScandbyPos() { - //获取拉板,光学模组待机位 - return 0; - } - - -} diff --git a/src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java b/src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java deleted file mode 100644 index 01eb112..0000000 --- a/src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java +++ /dev/null @@ -1,50 +0,0 @@ -package a8k.service.db.entity; - -import com.iflytop.uf.UfActiveRecord; -import com.iflytop.uf.UfActiveRecordField; - -public class MotorTubeRackMoveCtrlServiceParameter { - @UfActiveRecordField - public Integer moveToZeroOvertime;// 回零超时时间 - - @UfActiveRecordField - public Integer actionOvertime;// 执行动作的超时时间,该超时时间适用于当前模块在当前产品中所有动作的最大时间。 - - @UfActiveRecordField - public Integer tubeScanPos; //试管扫码位置 - - @UfActiveRecordField - public Integer tubeHeighJudgmentPos; //高低试管判断位置 - - @UfActiveRecordField - public Integer tubePreProcessPos; //试管预处理位置 - - @UfActiveRecordField - public Integer tubeExistJudgmentPos; //入料位置 - - @UfActiveRecordField - public Integer tubeRackEnterPos; //出料位置 - - @UfActiveRecordField - public Integer tubeRackExitPos; //出料位置 - - @UfActiveRecordField - public Integer tubeRackScanCodePos; //试管架扫码位置 - - @UfActiveRecordField - public Integer horizontalMotorLostStepThresholdVal; //水平电机丢步判断 - - @UfActiveRecordField - public Integer scanCodeClampPos; //试管扫码夹紧位置 - - @UfActiveRecordField - public Integer scanCodeReleasePos;//试管扫码释放位置 - - @UfActiveRecordField - public Integer tubeSpacing; - - - public static String getTableName() { - return "MotorTubeRackMoveCtrlServiceParameter" + "Table"; - } -} diff --git a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java index a79b724..3ab4226 100644 --- a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java +++ b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java @@ -49,14 +49,26 @@ public class MotorTubeRackMoveCtrlService { // // 电机基础控制 // - public void moveToZeroWhenDeviceSetup() throws HardwareException, InterruptedException { - canBus.stepMotorEasyMoveToZero(MId.FeedingModXM); - canBus.waitForMod(MId.FeedingModXM, paramDao.getMoveToZeroOvertime()); + + /** + * 电机归零,设备初始化时调用,特点是直接调用MoveToZero + * @throws HardwareException 硬件异常 + * @throws InterruptedException 打断异常 + */ + public void moveToZeroWhenDeviceSetup() throws HardwareException, InterruptedException { canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeReleasePos()); - canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getMoveToZeroOvertime()); + canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime()); + + canBus.stepMotorEasyMoveToZero(MId.FeedingModXM); + canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime()); } + /** + * 电机归零,电机运行时归零,特点是通过归零判断设备是否丢步 + * @throws HardwareException + * @throws InterruptedException + */ public void moveToZero() throws HardwareException, InterruptedException { //先通过move_to 指令移动到零点 //再通过 move_to_zero 进行归零(设置超时时间),超时时间,来源MotorParameterDao @@ -66,17 +78,16 @@ public class MotorTubeRackMoveCtrlService { //3.读取电机运行完成后所在的位置 //4.比较dpos和上面两个位置的差值 相差多少,如果超过2mm,即超过20则认为发生过阻转。 - var params = this.paramDao; var beforePos = canBus.stepMotorReadPos(MId.FeedingModXM); canBus.stepMotorEasyMoveToZero(MId.FeedingModXM); - canBus.waitForMod(MId.FeedingModXM, paramDao.getMoveToZeroOvertime()); + canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime()); var afterPos = canBus.stepMotorReadPos(MId.FeedingModXM); var distance = beforePos - afterPos; - var dval = canBus.module_read_reg(MId.FeedingModXM.toInt(), RegIndex.kreg_step_motor_dpos); + var dval = canBus.module_read_reg(MId.FeedingModXM.toInt(), RegIndex.kreg_step_motor_dpos); if (Math.abs(dval - distance) > params.getHorizontalMotorLostStepThresholdVal()) { throw new HardwareException(MId.FeedingModXM, A8kEcode.MotorLostStep); } @@ -92,37 +103,50 @@ public class MotorTubeRackMoveCtrlService { * 移动试管架到入口位置 */ public void moveTubeRackToEnterPos() throws HardwareException, InterruptedException { - var params = this.paramDao; - this.canBus.callblockcmd(MId.FeedingModXM.toInt(), CmdId.step_motor_easy_move_to.toInt(), params.getTubeRackEnterPos(), params.getActionOvertime()); + canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeReleasePos()); + canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime()); + + canBus.stepMotorEasyMoveTo(MId.FeedingModXM, paramDao.getTubeRackEnterPos()); + canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime()); } /** * 移动试管架到出口位置 */ public void moveTubeRackToExitPos() throws HardwareException, InterruptedException { - var params = this.paramDao; - this.canBus.callblockcmd(MId.FeedingModXM.toInt(), CmdId.step_motor_easy_move_to.toInt(), params.getTubeRackExitPos(), params.getActionOvertime()); + canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeReleasePos()); + canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime()); + + canBus.stepMotorEasyMoveTo(MId.FeedingModXM, paramDao.getTubeRackExitPos()); + canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime()); } /** * 移动试管架到试管架扫码位置 */ public void moveTubeRackToScanPos() throws HardwareException, InterruptedException { - var params = this.paramDao; - this.canBus.callblockcmd(MId.FeedingModXM.toInt(), CmdId.step_motor_easy_move_to.toInt(), params.getTubeRackScanCodePos(), params.getActionOvertime()); + canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeReleasePos()); + canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime()); + + canBus.stepMotorEasyMoveTo(MId.FeedingModXM, paramDao.getTubeRackScanCodePos()); + canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime()); } /** * 移动试管架到试管架扫码并扫码 */ public String moveTubeRackToScanPosAndScan() throws HardwareException, InterruptedException { - this.moveTubeRackToScanPos(); - this.canBus.callcmd(MId.FeedingModScannerMod.toInt(), CmdId.code_scaner_start_scan.toInt()); + moveTubeRackToScanPos(); + canBus.callcmd(MId.FeedingModScannerMod.toInt(), CmdId.code_scaner_start_scan.toInt()); Thread.sleep(5000); var response = this.canBus.callcmd(MId.FeedingModScannerMod.toInt(), CmdId.code_scaner_read_scaner_result.toInt()); this.canBus.callcmd(MId.FeedingModScannerMod.toInt(), CmdId.code_scaner_stop_scan.toInt()); var contentBytes = response.getCmdContent(); return new String(contentBytes); + // this.moveTubeRackToScanPos(); + // moveTubeRackToScanPos(); + // canBus. + // return ""; } // @@ -223,7 +247,6 @@ public class MotorTubeRackMoveCtrlService { // 其他辅助组件 // - /** * 扫描夹紧机构夹紧 */ diff --git a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java index c07038b..99ca7fa 100644 --- a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java +++ b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java @@ -1,11 +1,21 @@ package a8k.service.hardware; +import a8k.a8k_can_protocol.A8kEcode; +import a8k.a8k_can_protocol.IOId; +import a8k.a8k_can_protocol.MId; +import a8k.appbean.HardwareException; +import a8k.appbean.ecode.AppRet; +import a8k.base_hardware.A8kCanBusService; +import a8k.service.db.dao.ReactionPlatesTransmitCtrlParamDao; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class ReactionPlatesTransmitCtrlService { - + static Logger logger = LoggerFactory.getLogger(ReactionPlatesTransmitCtrlService.class); /* 职责说明 @@ -15,29 +25,81 @@ public class ReactionPlatesTransmitCtrlService { 4.反应板推出二次校准服务 */ + @Resource + A8kCanBusService canBus; + + @Resource + ReactionPlatesTransmitCtrlParamDao paramDao; + /* ======================================================================================= 基础操作 =======================================================================================*/ - void moduleReset() { - /* - 复位要求 - 1. 反应板夹仓推杆零点光电处于触发状态 - 2. 板夹钩爪零点光电处于触发状态 或 终点光电处于触发状态 - 3. 板夹卡板光电没有处于触发状态 - */ + AppRet moduleReset() throws HardwareException, InterruptedException { + //光电状态检查 + //试管平移通道是否有障碍 + if (canBus.getIOState(IOId.THChInterPPS) || canBus.getIOState(IOId.THChOuterPPS)) { + logger.warn("THChInterPPS or THChOuterPPS is trigger"); + // throw new HardwareException(MId.A8kIdCardReaderBoard, A8kEcode.PlateStuckDetectorSensorTrigger); + return AppRet.fail(A8kEcode.PlateStuckDetectorSensorTrigger); + } + //板夹仓卡板检测 + if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS)) { + logger.warn("PlateBoxPlateStuckPPS is trigger"); + return AppRet.fail(A8kEcode.PlateStuckDetectorSensorTrigger); + } + + //检查钩板电机是否处于终点位置 + if (!canBus.getIOState(IOId.PullerMZeroPPS)) { + logger.warn("PullerM is not in zero pos"); + return AppRet.fail(A8kEcode.PullerMInitPosError); + } + + //检查板夹仓光电是否处于起点位置 + if (!canBus.getIOState(IOId.PusherMZeroPPS)) { + logger.warn("PusherM is not in zero pos"); + return AppRet.fail(A8kEcode.PusherMInitPosError); + } + + //板夹仓初始化 + canBus.stepMotorEasyMoveToZero(MId.PlatesBoxYM); + canBus.waitForMod(MId.PlatesBoxYM, paramDao.getActionOvertime()); + canBus.stepMotorEasyMoveToZero(MId.PlatesBoxPusherM); + canBus.waitForMod(MId.PlatesBoxPusherM, paramDao.getActionOvertime()); + + //光学模组初始化 + canBus.stepMotorEasyMoveToZero(MId.OptModPullM); + canBus.waitForMod(MId.OptModPullM, paramDao.getActionOvertime()); + canBus.stepMotorEasyMoveToZero(MId.OptModScannerM); + canBus.waitForMod(MId.OptModScannerM, paramDao.getActionOvertime()); + + //转盘归零 + canBus.stepMotorEasyMoveToZero(MId.IncubatorRotateCtrlM); + canBus.waitForMod(MId.IncubatorRotateCtrlM, paramDao.getActionOvertime()); + + return AppRet.success(); } - void moduleEnable() { + void moduleEnable() throws HardwareException { /* 模块使能 */ + canBus.stepMotorEnable(MId.PlatesBoxYM, 1); + canBus.stepMotorEnable(MId.PlatesBoxPusherM, 1); + canBus.stepMotorEnable(MId.OptModPullM, 1); + canBus.stepMotorEnable(MId.OptModScannerM, 1); + canBus.stepMotorEnable(MId.IncubatorRotateCtrlM, 1); } - void moduleDisable() { + void moduleDisable() throws HardwareException { /* 模块失能 */ + canBus.stepMotorEnable(MId.PlatesBoxYM, 0); + canBus.stepMotorEnable(MId.PlatesBoxPusherM, 0); + canBus.stepMotorEnable(MId.OptModPullM, 0); + canBus.stepMotorEnable(MId.OptModScannerM, 0); + canBus.stepMotorEnable(MId.IncubatorRotateCtrlM, 0); } /* ======================================================================================= @@ -60,9 +122,9 @@ public class ReactionPlatesTransmitCtrlService { kreg_plate_code_scaner_item (扫码完成读取) kreg_plate_code_scaner_lot (扫码完成读取) kreg_plate_code_scaner_code_legal (扫码完成读取) - */ + } /** @@ -89,7 +151,6 @@ public class ReactionPlatesTransmitCtrlService { Integer[] plateScanerReadRawData() { /* - 先不实现, 后续实现效果, 网页端执行完推板后,点击读取,网页端弹出一个页面, 页面上有一条曲线 @@ -130,17 +191,27 @@ public class ReactionPlatesTransmitCtrlService { =======================================================================================*/ + AppRet deviceStateCheck() { + return AppRet.success(); + } + + /** * 移动转盘到入口位置 * @param turntablePos 第几个仓位 */ - void moveTurntableToEnterPos(int turntablePos) { + AppRet moveTurntableToEnterPos(int turntablePos) throws HardwareException { /* 注意事项: 1.移动前检查,出转盘钩爪电机光电是否触发(两个光电必须触发一个才能执行动作),否则直接抛出 电机位置异常错误 2.移动前检测,入转盘钩爪零点光电是否触发。 3.移动前检查,入转盘卡板光电是否触发。 */ + + if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS) || !canBus.getIOState(IOId.PullerMZeroPPS) || !canBus.getIOState(IOId.PusherMZeroPPS)) { + return AppRet.fail(A8kEcode.PlateStuckDetectorSensorTrigger); + } + return AppRet.success(); } /** @@ -149,7 +220,7 @@ public class ReactionPlatesTransmitCtrlService { */ void moveTurntableToExitPos(int turntablePos) { /* - 同moveTurntableToEnterPos + moveTurntableToEnterPos */ }