Browse Source

update

tags/v0
zhaohe 1 year ago
parent
commit
a4ea5aa497
  1. 17
      src/main/java/a8k/appbean/A8kScanCurve.java
  2. 10
      src/main/java/a8k/appbean/IncubatorPos.java
  3. 12
      src/main/java/a8k/appbean/PlateBoxCh.java
  4. 25
      src/main/java/a8k/appbean/PlateInfo.java
  5. 8
      src/main/java/a8k/appbean/ecode/AppRet.java
  6. 77
      src/main/java/a8k/canbus/A8kCanBusService.java
  7. 6
      src/main/java/a8k/canbus/A8kModParamInitializer.java
  8. 7
      src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java
  9. 216
      src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java
  10. 29
      src/main/java/a8k/utils/ByteArray.java

17
src/main/java/a8k/appbean/A8kScanCurve.java

@ -0,0 +1,17 @@
package a8k.appbean;
import java.util.List;
public class A8kScanCurve {
public List<Integer> scanDataCurve;
public List<Integer> refCurve;
public List<Integer> refLine;
public A8kScanCurve() {
}
public A8kScanCurve(List<Integer> scanDataCurve, List<Integer> refLine) {
this.scanDataCurve = scanDataCurve;
this.refLine = refLine;
}
}

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

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

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

8
src/main/java/a8k/appbean/ecode/AppRet.java

@ -9,6 +9,7 @@ public class AppRet<T> {
boolean success = false;
AppRetEcodeInfo ecode;
String dataType;
T data;
long timestamp;//接口请求时间
String traceInfo;
@ -44,9 +45,10 @@ public class AppRet<T> {
public static <T> AppRet<T> success(T data) {
AppRet<T> 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;
}

77
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<Integer> plateCodeScanerReadRawResult(MId id) throws HardwareException, InterruptedException {
int i = 0;
List<Integer> 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);
}

6
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() {

7
src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java

@ -228,12 +228,7 @@ public class MotorTubeRackMoveCtrlService implements HardwareCtrlModule {
@HardwareServiceAction(name = "通过归零读取当前电机位置", group = "模块基础动作")
public AppRet<Integer> 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()));
}

216
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 (扫码前设置该数值为10码判定阈值)
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<PlateInfo> 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<A8kScanCurve> readPlateScanCurve() throws HardwareException, InterruptedException {
List<Integer> scanDataCurve = canBus.plateCodeScanerReadRawResult(MId.PlatesBoxScanner);
List<Integer> 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<Integer> 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<Integer> readPlatesBoxYMPosByMoveToZero() throws HardwareException, InterruptedException {
return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.PlatesBoxYM, getActionOvertime()));
}
/**
* 移动转盘到出口位置
* @param turntablePos 第几个仓位
*/
void moveTurntableToExitPos(int turntablePos) {
/*
moveTurntableToEnterPos
*/
@HardwareServiceAction(name = "通过归零读取<推杆>位置", group = "位置测量")
public AppRet<Integer> readPlatesBoxPusherMPosByMoveToZero() throws HardwareException, InterruptedException {
return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.PlatesBoxPusherM, getActionOvertime()));
}
/**
* 移动转盘到点滴位置
* @param turntablePos 第几个仓位
*/
void moveTurntableToDropLiquidPos(int turntablePos) {
/*
同moveTurntableToEnterPos
*/
@HardwareServiceAction(name = "通过归零读取<拉杆>位置", group = "位置测量")
public AppRet<Integer> readOptModPullMPosByMoveToZero() throws HardwareException, InterruptedException {
return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.OptModPullM, getActionOvertime()));
}
void emptyTurntable() {
/*
清空转盘
*/
@HardwareServiceAction(name = "通过归零读取<光学模组扫描器>位置", group = "位置测量")
public AppRet<Integer> readOptModScannerMPosByMoveToZero() throws HardwareException, InterruptedException {
return AppRet.success(canBus.stepMotorReadPosByMoveToZeroBlock(MId.OptModScannerM, getActionOvertime()));
}
}

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

Loading…
Cancel
Save