sige 1 year ago
parent
commit
96392c00ce
  1. 37
      src/main/java/a8k/a8k_can_protocol/IOId.java
  2. 2
      src/main/java/a8k/a8k_can_protocol/ModuleId.java
  3. 27
      src/main/java/a8k/a8k_can_protocol/ModuleType.java
  4. 27
      src/main/java/a8k/appbean/AppErrorCode.java
  5. 60
      src/main/java/a8k/base_hardware/A8kCanBusService.java
  6. 43
      src/main/java/a8k/service/A8kDebugTaskExecutorService.java
  7. 9
      src/main/java/a8k/service/A8kStateMgrService.java
  8. 27
      src/main/java/a8k/service/db/entity/SamplesPreProcessModuleParameter.java
  9. 154
      src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java
  10. 95
      src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java

37
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;
}
}

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

27
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;
}
}

27
src/main/java/a8k/appbean/AppErrorCode.java

@ -0,0 +1,27 @@
package a8k.appbean;
public enum AppErrorCode {
Success("Success", 0), //成功
TubeNotHasHat("TubeNotHasHat", 1); //试管没有帽子
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;
}
public int getErrorIndex() {
return errorIndex;
}
}

60
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);

43
src/main/java/a8k/service/A8kDebugTaskExecutorService.java

@ -0,0 +1,43 @@
package a8k.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class A8kDebugTaskExecutorService {
public static final Logger logger = LoggerFactory.getLogger(A8kDebugTaskExecutorService.class);
Thread task;
synchronized void exec(Runnable runnable) {
if (task != null) {
task.interrupt();
try {
task.join();
} catch (InterruptedException ignored) {
return;
}
}
task = new Thread(runnable);
task.start();
}
synchronized void stop() {
try {
task.join();
task = null;
} catch (InterruptedException e) {
logger.error(e.getMessage());
}
}
synchronized boolean isRunning() {
if (task == null) {
return false;
}
return task.isAlive();
}
}

9
src/main/java/a8k/service/A8kStateMgrService.java

@ -0,0 +1,9 @@
package a8k.service;
import org.springframework.stereotype.Component;
@Component
public class A8kStateMgrService {
}

27
src/main/java/a8k/service/db/entity/SamplesPreProcessModuleParameter.java

@ -1,9 +1,15 @@
package a8k.service.db.entity;
import com.iflytop.uf.UfActiveRecord;
import com.iflytop.uf.UfActiveRecordField;
public class SamplesPreProcessModuleParameter {
@UfActiveRecordField
public Integer moveToZeroOvertime;// 回零超时时间
@UfActiveRecordField
public Integer actionOvertime;// 执行动作的超时时间该超时时间适用于当前模块在当前产品中所有动作的最大时间
/**
* 升降电机相关位置
*/
@ -14,6 +20,12 @@ public class SamplesPreProcessModuleParameter {
public Integer shortBlood_TakeCapPos;//矮全血试管取帽位置
@UfActiveRecordField
public Integer highBlood_capJudgePos;//高试管帽子判断位置
@UfActiveRecordField
public Integer shortBlood_capJudgePos;//矮全血试管帽子判断位置
@UfActiveRecordField
public Integer elevating_MotorPosOffset;//升降电机位置偏移
/**
@ -32,13 +44,17 @@ public class SamplesPreProcessModuleParameter {
* 取帽舵机
*/
@UfActiveRecordField
public Integer takeCapServo_standbyPos; //取帽舵机待机位置
public Integer gripperServo_standbyPos; //抓手舵机待机位置
@UfActiveRecordField
public Integer gripperServo_takeCapTorque; //抓手舵机取帽扭矩
@UfActiveRecordField
public Integer takeCapServo_takeCapTorque; //取帽舵机取帽扭矩
public Integer gripperServo_takeTubePos; // 抓手舵机取试管位置
@UfActiveRecordField
public Integer takeCapServo_takeTubePos; // 取帽舵机取试管位置
public Integer gripperServo_hatDeterminesPosThres; //判断是否有帽子的位置阈值
/**
* 摇匀电机
@ -56,6 +72,9 @@ public class SamplesPreProcessModuleParameter {
@UfActiveRecordField
public Integer tubeClampMotor_ClampPos;
@UfActiveRecordField
public Integer aerosolFanLevel; //气溶胶风扇工作功率
public static String getTableName() {
return "SamplesPreProcessModuleParameter" + "Table";
}

154
src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java

@ -0,0 +1,154 @@
package a8k.service.hardware;
import a8k.appbean.AppErrorCode;
import org.springframework.stereotype.Component;
@Component
public class ReactionPlatesTransmitCtrlService {
/*
职责说明
1.仓位变化
2.推出反应板
3.反应板推出异常检测
4.反应板推出二次校准服务
*/
/* =======================================================================================
基础操作
=======================================================================================*/
void 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 (扫码前设置该数值为10码判定阈值)
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
*/
}
}

95
src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java

@ -1,49 +1,77 @@
package a8k.service.hardware;
import a8k.appbean.AppErrorCode;
import a8k.appbean.SampleTubeState;
import org.springframework.stereotype.Component;
@Component
public class SamplesPreProcessModuleCtrlService {
/*
样品预处理模块
主要负责样品预处理的相关操作
*/
/* =======================================================================================
基础方法
=======================================================================================*/
/**
* 样品预处理模块
* 主要负责样品预处理的相关操作
*
* 涉及到常量
* 1.试管的相关信息---试管高度
* 2.试管的相关信息---试管含帽高度
* 3.平移电机待机位置
* 4.平移电机取试管位置
* 5.平移电机试管处理位置
*
*
* 按照一定顺序归零设备
*/
public void moveToZero() {
/*
1. 假设没有试管在当前设备上的前提下归零设备
2. 舵机虽然没有零位但需要将其移动到待机位置
*/
}
/**
* 使能模组
* @param enable 是否使能模组
*/
public void enableModule(boolean enable) {
public void takeTube(String tubeType) {
//
// 取试管并将试管放在夹紧位置同时升降电机和平移电机移动到待机位
// 试管放置的水平高度和其在试管架中的高度保持一直
//
}
/* =======================================================================================
主要服务
=======================================================================================*/
/**
* 摇匀试管
* @param tubeType
* @param times
* @param shakeDegree
* 取试管帽,如果试管帽存在
* @param tubeType TubeType_HighBlood,TubeType_ShortBlood,TubeType_Mini,TubeType_MiniBlood,TubeType_BulletTube1P5,TubeType_BulletTube0P5
* @param judgeCapExist 是否判断试管帽子存在与否
*/
public void ShakeTube(String tubeType, int times, int shakeDegree) {
//
//
//
public AppErrorCode takeTube(String tubeType,boolean judgeCapExist) {
/*
注意事项:
1. 取试管并将试管放在试管夹紧位置同时升降电机和平移电机移动到待机位
2. 试管放置的水平高度和其在试管架中的高度保持一直
3. 取试管前先通过试管夹紧功能判断一下试管帽是否存在在试管没帽的边沿位置抓手扭矩抓紧如果等待一定时间后抓手位置接近极限位置则认为没有帽子返回TubeNotHasHat错误
4. 无论是否抓取成功只要不向外抛出异常方法结束时该模块涉及到组件均需要返回待机位置
*/
return AppErrorCode.Success;
}
/**
* 取试管帽
*/
public void takeTubeCap() {
public AppErrorCode takeTubeCap() {
//
//
//
//
return AppErrorCode.Success;
}
/**
@ -55,6 +83,21 @@ public class SamplesPreProcessModuleCtrlService {
//
}
/* =======================================================================================
辅助操作
=======================================================================================*/
/**
* 摇匀试管
* @param tubeType TubeType_HighBlood,TubeType_ShortBlood,TubeType_Mini,TubeType_MiniBlood,TubeType_BulletTube1P5,TubeType_BulletTube0P5
* @param times 摇匀次数
* @param shakeDegree 摇匀角度
*/
public void ShakeTube(String tubeType, int times, int shakeDegree) {
}
/**
* 打开气溶胶风扇
*/
@ -82,4 +125,6 @@ public class SamplesPreProcessModuleCtrlService {
public void moduleRuntimeReset() {
}
}
Loading…
Cancel
Save