Browse Source

update

tags/v0
zhaohe 1 year ago
parent
commit
ce10e6a99c
  1. 10
      README.md
  2. 1
      src/main/java/a8k/appbean/ecode/AppRet.java
  3. 31
      src/main/java/a8k/base_hardware/A8kCanBusService.java
  4. 2
      src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java
  5. 6
      src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamDao.java
  6. 50
      src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java
  7. 55
      src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java
  8. 99
      src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java

10
README.md

@ -20,10 +20,12 @@
2.水平移动舵机初始化位置为200(处于设备最后端)
复位要求:
1. 板夹仓推杆电机需要处于零点位置
2. 光学模组推杆电机需要处于零点位置
3. 试管架通道中没有试管架
4. 出料口没有试管架
5. 进出料位置没有试管
```

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

@ -46,6 +46,7 @@ public class AppRet<T> {
return r;
}
public static <T> AppRet<T> success() {
AppRet<T> r = new AppRet<>();
r.suc = true;

31
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();

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

6
src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamService.java → src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamDao.java

@ -3,12 +3,16 @@ package a8k.service.db.dao;
/**
* 反应板夹搬运相关服务访问
*/
public class ReactionPlatesTransmitCtrlParamService {
public class ReactionPlatesTransmitCtrlParamDao {
//
public final String serviceName = "ReactionPlatesTransmitCtrlService";
public int getActionOvertime() {
return 0;
}
/*
* 板夹仓相关参数

50
src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java

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

55
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 {
// 其他辅助组件
//
/**
* 扫描夹紧机构夹紧
*/

99
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
*/
}

Loading…
Cancel
Save