diff --git a/src/main/java/a8k/appbean/A8kScanCurve.java b/src/main/java/a8k/appbean/A8kScanCurve.java new file mode 100644 index 0000000..7a2d8a1 --- /dev/null +++ b/src/main/java/a8k/appbean/A8kScanCurve.java @@ -0,0 +1,17 @@ +package a8k.appbean; + +import java.util.List; + +public class A8kScanCurve { + public List scanDataCurve; + public List refCurve; + public List refLine; + + public A8kScanCurve() { + } + + public A8kScanCurve(List scanDataCurve, List refLine) { + this.scanDataCurve = scanDataCurve; + this.refLine = refLine; + } +} diff --git a/src/main/java/a8k/appbean/IncubatorPos.java b/src/main/java/a8k/appbean/IncubatorPos.java new file mode 100644 index 0000000..6e7a86b --- /dev/null +++ b/src/main/java/a8k/appbean/IncubatorPos.java @@ -0,0 +1,10 @@ +package a8k.appbean; + +public enum IncubatorPos { + POS01, POS02, POS03, POS04, POS05, POS06, POS07, POS08, POS09, POS10, POS11, POS12, POS13, POS14, POS15, POS16, POS17, POS18, POS19, POS20; + + final public Integer off; + private IncubatorPos() { + this.off = ordinal(); + } +} diff --git a/src/main/java/a8k/appbean/PlateBoxCh.java b/src/main/java/a8k/appbean/PlateBoxCh.java new file mode 100644 index 0000000..c9accc6 --- /dev/null +++ b/src/main/java/a8k/appbean/PlateBoxCh.java @@ -0,0 +1,12 @@ +package a8k.appbean; + +public enum PlateBoxCh { + CH1, CH2, CH3, CH4, CH5, CH6, + ; + + final public Integer off; + + PlateBoxCh() { + this.off = ordinal(); + } +} diff --git a/src/main/java/a8k/appbean/PlateInfo.java b/src/main/java/a8k/appbean/PlateInfo.java new file mode 100644 index 0000000..4dd6695 --- /dev/null +++ b/src/main/java/a8k/appbean/PlateInfo.java @@ -0,0 +1,25 @@ +package a8k.appbean; + + +import java.util.List; + +public class PlateInfo { + + public Integer lot; + public Integer item; + public Boolean legal; + public String rawcode; + + public PlateInfo() { + } + + public PlateInfo(Integer lot, Integer item) { + this.lot = lot; + this.item = item; + } + + + public String toString() { + return String.format("%02d-%02d", lot, item); + } +} diff --git a/src/main/java/a8k/appbean/ecode/AppRet.java b/src/main/java/a8k/appbean/ecode/AppRet.java index 2686b45..e8cf2fe 100644 --- a/src/main/java/a8k/appbean/ecode/AppRet.java +++ b/src/main/java/a8k/appbean/ecode/AppRet.java @@ -9,6 +9,7 @@ public class AppRet { boolean success = false; AppRetEcodeInfo ecode; + String dataType; T data; long timestamp;//接口请求时间 String traceInfo; @@ -44,9 +45,10 @@ public class AppRet { public static AppRet success(T data) { AppRet r = new AppRet<>(); - r.success = true; - r.ecode = null; - r.data = data; + r.success = true; + r.ecode = null; + r.data = data; + r.dataType = data.getClass().getSimpleName(); return r; } diff --git a/src/main/java/a8k/canbus/A8kCanBusService.java b/src/main/java/a8k/canbus/A8kCanBusService.java index e621a86..a7c6543 100644 --- a/src/main/java/a8k/canbus/A8kCanBusService.java +++ b/src/main/java/a8k/canbus/A8kCanBusService.java @@ -1,6 +1,7 @@ package a8k.canbus; import a8k.app_eventbus.appevent.A8kCanBusOnConnectEvent; +import a8k.appbean.PlateInfo; import a8k.canbus.custom_param_mgr.A8kModCustomParamMgr; import a8k.canbus.protocol.*; import a8k.canbus.protocol.MId; @@ -22,10 +23,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.util.HashMap; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; +import java.util.*; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; @@ -154,18 +152,68 @@ public class A8kCanBusService { } return new A8kPacket(buffer.array()); } - // fan_controler_set_speed + + + //plate_code_scaner_adc_readraw + + + public void plateCodeScanerPushCardAndScan(MId id, Integer finalStopPos) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.plate_code_scaner_push_card_and_scan.toInt(), finalStopPos); + } + + public void plateCodeScanerPushCardAndScanBlock(MId id, Integer finalStopPos, Integer actionOvertime) throws HardwareException, InterruptedException { + plateCodeScanerPushCardAndScan(id, finalStopPos); + waitForMod(id, actionOvertime); + } + + public void plateCodeScanerStopScan(MId id) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.plate_code_scaner_stop_scan.toInt()); + } + + public List plateCodeScanerReadRawResult(MId id) throws HardwareException, InterruptedException { + int i = 0; + List result = new ArrayList<>(); + while (true) { + var rxPacket = callcmd(id.toInt(), CmdId.plate_code_scaner_read_result.toInt(), i++); + if (rxPacket.getCmdContent().length == 0) { + break; + } + var rawdata = ByteArray.readU16bitArray(rxPacket.getCmdContent()); + result.addAll(Arrays.asList(rawdata)); + } + return result; + } + + public PlateInfo plateCodeScannerReadCode(MId mid) throws HardwareException { + var receipt = callcmd(mid.toInt(), CmdId.plate_code_scaner_read_code.toInt()); + PlateInfo plateInfo = new PlateInfo(); + plateInfo.rawcode = Integer.toBinaryString(receipt.getContentI32(0)); + plateInfo.legal = receipt.getContentI32(1) != 0; + plateInfo.lot = receipt.getContentI32(2); + plateInfo.item = receipt.getContentI32(3); + return plateInfo; + } + + public void plateCodeScanerOpenLaser(MId id) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.plate_code_scaner_open_laser.toInt()); + } + + public void plateCodeScanerCloseLaser(MId id) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.plate_code_scaner_close_laser.toInt()); + } + + + public Integer plateCodeScanerAdcReadRaw(MId id) throws HardwareException, InterruptedException { + var packet = callcmd(id.toInt(), CmdId.plate_code_scaner_adc_readraw.toInt()); + return packet.getContentI32(0); + } + public void fanControlerSetSpeed(MId id, int speed) throws HardwareException, InterruptedException { callcmd(id.toInt(), CmdId.fan_controler_set_speed.toInt(), speed); } - //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, InterruptedException { callcmd(id.toInt(), CmdId.code_scaner_start_scan.toInt()); } @@ -333,6 +381,15 @@ public class A8kCanBusService { waitForMod(id, actionOvertime); } + public Integer stepMotorReadPosByMoveToZeroBlock(MId id, Integer actionOvertime) throws HardwareException, InterruptedException { + stepMotorEnable(id, 1); + stepMotorEasyMoveToZeroBlock(id, actionOvertime); + Integer nowpos = stepMotorReadPos(id); + Integer measurepos = -moduleGetReg(id, RegIndex.kreg_step_motor_dpos) + nowpos; + stepMotorEnable(id, 0); + return measurepos; + } + public void stepMotorEasySetCurrentPos(MId id, int pos) throws HardwareException { callcmd(id.toInt(), CmdId.step_motor_easy_set_current_pos.toInt(), pos); } diff --git a/src/main/java/a8k/canbus/A8kModParamInitializer.java b/src/main/java/a8k/canbus/A8kModParamInitializer.java index 98c836b..922aedc 100644 --- a/src/main/java/a8k/canbus/A8kModParamInitializer.java +++ b/src/main/java/a8k/canbus/A8kModParamInitializer.java @@ -62,11 +62,15 @@ public class A8kModParamInitializer implements AppEventListener { canBus.moduleSetReg(MId.ShakeModGripperZM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); canBus.moduleSetReg(MId.ShakeModShakeM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); canBus.moduleSetReg(MId.PlatesBoxYM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); - canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kret_step_motor_io_trigger_append_distance, 3); canBus.moduleSetReg(MId.OptModPullM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); canBus.moduleSetReg(MId.OptModScannerM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); canBus.moduleSetReg(MId.PipetteModZM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); canBus.moduleSetReg(MId.IncubatorRotateCtrlM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + + // + canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_run_to_zero_speed, 500); + } public void forceInitA8kModParams() { diff --git a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java index 1ab8b3e..1d09bd1 100644 --- a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java +++ b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java @@ -228,12 +228,7 @@ public class MotorTubeRackMoveCtrlService implements HardwareCtrlModule { @HardwareServiceAction(name = "通过归零读取当前电机位置", group = "模块基础动作") public AppRet readXPosByMoveZero() throws HardwareException, InterruptedException { - canBus.stepMotorEnable(MId.FeedingModXM, 1); - canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, getActionOvertime()); - Integer nowpos = canBus.stepMotorReadPos(MId.FeedingModXM); - Integer measurepos = -canBus.moduleGetReg(MId.FeedingModXM, RegIndex.kreg_step_motor_dpos) + nowpos; - canBus.stepMotorEnable(MId.FeedingModXM, 0); - return AppRet.success(measurepos); + return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.FeedingModXM, getActionOvertime())); } diff --git a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java index f28f956..7f2b78a 100644 --- a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java +++ b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java @@ -1,9 +1,9 @@ package a8k.service.hardware; +import a8k.appbean.*; import a8k.canbus.protocol.A8kEcode; import a8k.canbus.protocol.IOId; import a8k.canbus.protocol.MId; -import a8k.appbean.HardwareException; import a8k.appbean.ecode.AppRet; import a8k.canbus.A8kCanBusService; import a8k.utils.*; @@ -12,6 +12,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; @Component @HardwareService(name = "反应板条搬移服务") @@ -26,7 +28,7 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { @HardwareServiceParam(name = "动作超时时间", group = "基础参数") public Integer getActionOvertime() { - return hpReader.getInteger("actionOvertime", 5000); + return hpReader.getInteger("actionOvertime", 10000); } @HardwareServiceParam(name = "板夹仓通道0位置", group = "板夹仓参数") @@ -55,17 +57,17 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { @HardwareServiceParam(name = "仓位0入板位置", group = "转盘参数") public Integer getTurntablePushPos0() { - return hpReader.getInteger("TurntablePushPos0", 0); + return hpReader.getInteger("TurntablePushPos0", 1650); } @HardwareServiceParam(name = "仓位0出板位置", group = "转盘参数") public Integer getTurntablePullPos0() { - return hpReader.getInteger("TurntablePullPos0", 0); + return hpReader.getInteger("TurntablePullPos0", 1650 + 18000); } @HardwareServiceParam(name = "仓位0点滴位", group = "转盘参数") public Integer getTurntableDropLiquidPos0() { - return hpReader.getInteger("TurntableDropLiquidPos0", 0); + return hpReader.getInteger("TurntableDropLiquidPos0", 1650 + 8950); } public Integer getTurntablePosSpacing() { @@ -77,17 +79,17 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { */ @HardwareServiceParam(name = "拉板目标位置", group = "光学模组参数") public Integer getPullerTargetPos() { - return hpReader.getInteger("PullerTargetPos", 0); + return hpReader.getInteger("PullerTargetPos", 1147); } @HardwareServiceParam(name = "丢板坐标", group = "光学模组参数") public Integer getPlateDropPos() { - return hpReader.getInteger("PlateDropPos", 0); + return hpReader.getInteger("PlateDropPos", -349); } @HardwareServiceParam(name = "扫描待机位", group = "光学模组参数") public Integer getOptScanScandbyPos() { - return hpReader.getInteger("OptScanScandbyPos", 0); + return hpReader.getInteger("OptScanScandbyPos", 580); } /** @@ -122,11 +124,6 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { =======================================================================================*/ private void checkBeforeMoveTrunable() throws HardwareException { - //试管平移通道是否有障碍 - if (canBus.getIOState(IOId.THChInterPPS) || canBus.getIOState(IOId.THChOuterPPS)) { - logger.error("THChInterPPS or THChOuterPPS is trigger"); - throw new HardwareException(A8kEcode.TubeXChannelIsNotEmpty); - } //板夹仓卡板检测 if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS)) { logger.error("PlateBoxPlateStuckPPS is trigger"); @@ -146,6 +143,14 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { } } + private void checkBeforeMovePlateBox() throws HardwareException { + if (!canBus.getIOState(IOId.PusherMZeroPPS)) { + logger.error("PusherM is not in zero pos "); + throw new HardwareException(A8kEcode.PusherMInitPosError); + } + } + + /* ======================================================================================= 基础操作 =======================================================================================*/ @@ -174,42 +179,45 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { @HardwareServiceAction(name = "电机归零", group = "基础操作") @Override public void modGroupMoveToZero() throws HardwareException, InterruptedException { - checkBeforeMoveTrunable(); + //光学模组初始化 + canBus.stepMotorEasyMoveToZeroBlock(MId.OptModPullM, getActionOvertime()); + canBus.stepMotorEasyMoveToZeroBlock(MId.OptModScannerM, getActionOvertime()); //板夹仓初始化 + checkBeforeMovePlateBox(); canBus.stepMotorEasyMoveToZeroBlock(MId.PlatesBoxPusherM, getActionOvertime()); canBus.stepMotorEasyMoveToZeroBlock(MId.PlatesBoxYM, getActionOvertime()); - //光学模组初始化 - canBus.stepMotorEasyMoveToZeroBlock(MId.OptModPullM, getActionOvertime()); - canBus.stepMotorEasyMoveToZeroBlock(MId.OptModScannerM, getActionOvertime()); + //转盘归零 + checkBeforeMoveTrunable(); canBus.stepMotorEasyMoveToZeroBlock(MId.IncubatorRotateCtrlM, getActionOvertime()); } @HardwareServiceAction(name = "电机快速归零", group = "基础操作") @Override public void modGroupMoveToZeroQuick() throws HardwareException, InterruptedException { - //试管平移通道是否有障碍 - checkBeforeMoveTrunable(); + //光学模组初始化 + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.OptModPullM, getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.OptModScannerM, getActionOvertime()); //板夹仓初始化 + checkBeforeMovePlateBox(); canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PlatesBoxPusherM, getActionOvertime()); canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PlatesBoxYM, getActionOvertime()); - //光学模组初始化 - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.OptModPullM, getActionOvertime()); - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.OptModScannerM, getActionOvertime()); + //转盘归零 + checkBeforeMoveTrunable(); canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.IncubatorRotateCtrlM, getActionOvertime()); } - @HardwareServiceAction(name = "转盘移动到推板位", group = "基础操作") + @HardwareServiceAction(name = "转盘移动到推板位", group = "单步操作") public void trunableMoveToPushPos(Integer index) throws HardwareException, InterruptedException { checkBeforeMoveTrunable(); canBus.stepMotorEasyMoveToBlock(MId.IncubatorRotateCtrlM,// getTurntablePushPos0() + index * getTurntablePosSpacing(), getActionOvertime()); } - @HardwareServiceAction(name = "转盘移动到出板位", group = "基础操作") + @HardwareServiceAction(name = "转盘移动到出板位", group = "单步操作") public void trunableMoveToPullPos(Integer index) throws HardwareException, InterruptedException { checkBeforeMoveTrunable(); canBus.stepMotorEasyMoveToBlock(MId.IncubatorRotateCtrlM,// @@ -217,148 +225,74 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { } - @HardwareServiceAction(name = "转盘移动到滴定位", group = "基础操作") + @HardwareServiceAction(name = "转盘移动到滴定位", group = "单步操作") public void trunableMoveToDropLiquidPos(Integer index) throws HardwareException, InterruptedException { checkBeforeMoveTrunable(); canBus.stepMotorEasyMoveToBlock(MId.IncubatorRotateCtrlM,// getTurntableDropLiquidPos0() + index * getTurntablePosSpacing(), getActionOvertime()); } - /* ======================================================================================= - 板夹仓操作 - =======================================================================================*/ - 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; + @HardwareServiceAction(name = "推板", group = "单步操作") + public AppRet pushPlate(PlateBoxCh PBCh, IncubatorPos turntablePosIndex) throws HardwareException, InterruptedException { + trunableMoveToPushPos(turntablePosIndex.off); + canBus.stepMotorEasyMoveToBlock(MId.PlatesBoxYM, getPBCh0Pos() + PBCh.off * getPBChSpacing(), getActionOvertime()); + canBus.plateCodeScanerPushCardAndScanBlock(MId.PlatesBoxScanner, getPusherEndPos(), 10000); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PlatesBoxPusherM, getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PlatesBoxYM, getActionOvertime()); + return AppRet.success(canBus.plateCodeScannerReadCode(MId.PlatesBoxScanner)); } - /** - * 读取 推板时的扫码结果ItermId - */ - int plateScanerReadPlateIterm() { - return 0; - } - /** - * 读取 推板时的扫码结果合法性 - */ - boolean plateScanerReadPlateIsLegal() { - return false; + @HardwareServiceAction(name = "拉板", group = "单步操作") + public void pullPlate(IncubatorPos turntablePosIndex) throws HardwareException, InterruptedException { + trunableMoveToPullPos(turntablePosIndex.off); + canBus.stepMotorEasyMoveToBlock(MId.OptModScannerM, getOptScanScandbyPos(), getActionOvertime()); + canBus.stepMotorEasyMoveToBlock(MId.OptModPullM, getPullerTargetPos(), getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.OptModPullM, getActionOvertime()); } - - Integer[] plateScanerReadRawData() { - /* - 后续实现效果, - 网页端执行完推板后,点击读取,网页端弹出一个页面, - 页面上有一条曲线 - 有曲线的最大值和最小值 - 且参考下面代码打上参考线 - for (int i = 0; i < 15; i++) { - plot2d->addRefLine(i * 12 + 6 ); - } - */ - return null; + @HardwareServiceAction(name = "丢板", group = "单步操作") + public void dropPlate() throws HardwareException, InterruptedException { + canBus.stepMotorEasyMoveToBlock(MId.OptModScannerM, getPlateDropPos(), getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.OptModScannerM, getActionOvertime()); + canBus.stepMotorEasyMoveToBlock(MId.OptModScannerM, getOptScanScandbyPos(), getActionOvertime()); } - /* ======================================================================================= - 光学模组部分操作 - =======================================================================================*/ - void pullReactionPlate(int turntablePosIndex) { - /* - 1.检查当前钩爪出口光电是否触发,如果没有触发,直接报 电机位置异常 - 2.移动转盘 - 3.移动光学模组到丢板的位置 - 4.移动光学模组到待机位置 - 5.钩爪勾取反应板到指定位置 - 6.钩爪动作完成时,检查钩爪零点光电是否触发,如果没有触发报电机阻转异常 - */ - } - - void dropThePlate() { - /* - 光学模组电机移动丢板 - */ + @HardwareServiceAction(name = "显示板夹扫码原始曲线", group = "辅助调试") + public AppRet readPlateScanCurve() throws HardwareException, InterruptedException { + List scanDataCurve = canBus.plateCodeScanerReadRawResult(MId.PlatesBoxScanner); + List refLine = new ArrayList<>(); + for (int i = 0; i < 15; i++) { + refLine.add(i * 12 + 6); + } + return AppRet.success(new A8kScanCurve(scanDataCurve, refLine)); } - - /* ======================================================================================= - 转盘操作 - =======================================================================================*/ - - - AppRet deviceStateCheck() { - return AppRet.success(); + @HardwareServiceAction(name = "读取<转盘>位置", group = "位置测量") + public AppRet readTrunablePos() throws HardwareException, InterruptedException { + return AppRet.success(canBus.stepMotorReadPos(MId.IncubatorRotateCtrlM)); } - - /** - * 移动转盘到入口位置 - * @param 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(); + @HardwareServiceAction(name = "通过归零读取<板夹仓>位置", group = "位置测量") + public AppRet readPlatesBoxYMPosByMoveToZero() throws HardwareException, InterruptedException { + return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.PlatesBoxYM, getActionOvertime())); } - /** - * 移动转盘到出口位置 - * @param turntablePos 第几个仓位 - */ - void moveTurntableToExitPos(int turntablePos) { - /* - moveTurntableToEnterPos - */ + @HardwareServiceAction(name = "通过归零读取<推杆>位置", group = "位置测量") + public AppRet readPlatesBoxPusherMPosByMoveToZero() throws HardwareException, InterruptedException { + return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.PlatesBoxPusherM, getActionOvertime())); } - /** - * 移动转盘到点滴位置 - * @param turntablePos 第几个仓位 - */ - void moveTurntableToDropLiquidPos(int turntablePos) { - /* - 同moveTurntableToEnterPos - */ + @HardwareServiceAction(name = "通过归零读取<拉杆>位置", group = "位置测量") + public AppRet readOptModPullMPosByMoveToZero() throws HardwareException, InterruptedException { + return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.OptModPullM, getActionOvertime())); } - void emptyTurntable() { - /* - 清空转盘 - */ + @HardwareServiceAction(name = "通过归零读取<光学模组扫描器>位置", group = "位置测量") + public AppRet readOptModScannerMPosByMoveToZero() throws HardwareException, InterruptedException { + return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.OptModScannerM, getActionOvertime())); } - - } diff --git a/src/main/java/a8k/utils/ByteArray.java b/src/main/java/a8k/utils/ByteArray.java index 2028794..3892f65 100644 --- a/src/main/java/a8k/utils/ByteArray.java +++ b/src/main/java/a8k/utils/ByteArray.java @@ -27,8 +27,8 @@ public class ByteArray { } public static void setU16bit(byte[] code, int index, int value) { - code[index+1] = (byte) (value >> 8); - code[index] = (byte) value; + code[index + 1] = (byte) (value >> 8); + code[index] = (byte) value; } public static int readS16bit(byte[] code, int index) { @@ -44,7 +44,32 @@ public class ByteArray { return code[index + 3] << 24 | (code[index + 2] & 255) << 16 | (code[index + 1] & 255) << 8 | code[index] & 255; } + public static Integer[] read32bitArray(byte[] code) { + int count = code.length / 4; + Integer[] array = new Integer[count]; + for (int i = 0; i < count; i++) { + array[i] = read32bit(code, i * 4); + } + return array; + } + public static Integer[] read16bitArray(byte[] code) { + int count = code.length / 2; + Integer[] array = new Integer[count]; + for (int i = 0; i < count; i++) { + array[i] = readS16bit(code, i * 2); + } + return array; + } + + public static Integer[] readU16bitArray(byte[] code) { + int count = code.length / 2; + Integer[] array = new Integer[count]; + for (int i = 0; i < count; i++) { + array[i] = readU16bit(code, i * 2); + } + return array; + } public static String toByteString(byte[] arrary) {