sige 1 year ago
parent
commit
25149f15c1
  1. 139
      README.md
  2. 22
      src/main/java/a8k/appbean/A8kTubeType.java
  3. 22
      src/main/java/a8k/appbean/KeyValType.java
  4. 19
      src/main/java/a8k/appbean/LargeBottleBufferPosInfo.java
  5. 16
      src/main/java/a8k/appbean/Plates2dCodeScanPosInfo.java
  6. 13
      src/main/java/a8k/appbean/Pos2d.java
  7. 5
      src/main/java/a8k/appbean/Pos3d.java
  8. 11
      src/main/java/a8k/appbean/PosZ.java
  9. 27
      src/main/java/a8k/appbean/SmallBottleBufferPosInfo.java
  10. 25
      src/main/java/a8k/appbean/TipPickUpPosInfo.java
  11. 35
      src/main/java/a8k/appbean/TubeSamplePos.java
  12. 40
      src/main/java/a8k/service/db/dao/HbotControlParamsService.java
  13. 85
      src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamService.java
  14. 133
      src/main/java/a8k/service/db/dao/SamplesPreProcessModuleCtrlParamsService.java
  15. 12
      src/main/java/a8k/service/db/dao/SamplesPreProcessModuleParameterDao.java
  16. 7
      src/main/java/a8k/service/db/entity/A8kTubeInfo.java
  17. 18
      src/main/java/a8k/service/db/entity/HardwareServiceSetting.java
  18. 6
      src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java
  19. 81
      src/main/java/a8k/service/db/entity/SamplesPreProcessModuleParameter.java
  20. 21
      src/main/java/a8k/service/hardware/HbotControlService.java
  21. 18
      src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java
  22. 24
      代码说明/20240718.txt

139
README.md

@ -0,0 +1,139 @@
```
==========================模块参数-维护===========================
参数类型,模块参数:
模块名称,模块ID,参数ID,参数数值,参数名称
前端页面:
一级菜单,模块名称
二级菜单,参数列表
功能:
改,查,刷新到硬件
后端逻辑:
执行刷新到硬件后,参数全刷新到底层硬件
设备开机后,
首先自动刷新所有参数到硬件。
```
```
硬件服务目标
单独调试每一个业务动作
硬件服务参数维护
1. 每个服务一个数据库
2. 数据格式为key-val
表单格式:
key,chName,valType,val
valType:
float
int
bool
Pos3d
RectangularPosSet
```
前后端交互:
```
前端的代码:
1. 弹出提示框
2. 用户交互
3. 提交数据
4. 触发机械动作
后端代码:业务逻辑
约定:
1.只要是触发短暂的机械动作,前端均弹出蒙板加载页面。(短暂意味着,不可中断,几分钟的执行完成)
2.设备主逻辑(非阻塞,调用后端方法)
启动
停止
暂停
3.配置提交,无机械动作,直接提交到数据库。
```
```
具体业务:
1. 系统初始化
登录后,弹出提示话,询问用户是否进行设备初始化。
如何实现:
页面切换,弹出提示框,用户点击确认,提交初始化请求到后台。
后台Service阻塞执行动作,返回执行结果。执行结果中携带是否执行成功。
2.
前端:
1. 弹窗信息提示
2.
错误信息的展示:
后端抛出错误事件
异常中携带用于展示的错误信息。
后端执行方法,返回错误码,前端直接显示错误码的信息即可。
错误码对应的中英文字符串存储在数据库中。
执行动作,需要执行一些前置动作。由前端进行状态检查,确定需要执行前置动作后,弹出提示框,用户点击确认,然后执行动作。
哪些动作需要蒙版:
1. 非设备启动动作外均需要蒙版
2. 项目手动配置中,根据耗材的减少自动更新状态信息。
1.总数从后端拿到
2.用户每提交和选中一个项目后,向后台提交配置,同时返回剩余量。
3.
*:前端每一次点击,将更新的内容提交到后台,后台返回前端当前页面所有状态信息。(非表单信息)
*:
后台存储:
耗材总数
```
```
```
1. 急诊逻辑
点击急诊位
---> 弹出是否添加急诊
---> 点击确认
---> 弹出急诊添加涉及到的信息框
配置好信息后 ---> 点击添加
```
```
1. 执行机械相关的动作都需要加载一个蒙版
2. 非机械相关的动作,无须蒙版
3. 每次提交一次请求,都返回两类信息
1. 是否弹出错误提示框
2. 全部的前端状态信息。
4.
```
```

22
src/main/java/a8k/appbean/A8kTubeType.java

@ -0,0 +1,22 @@
package a8k.appbean;
public enum A8kTubeType {
HighBlood("HighBlood", "0000"), //全血试管
ShortBlood("ShortBlood", "0000"), //全血试管
Mini("Mini", "1111"), //迷你试管
MiniBlood("MiniBlood", "2222"), //阳普管
BulletTube1P5("BulletTube1P5", "5555"),//子弹头试管1.5mL
BulletTube0P5("BulletTube0P5", "4444"); //子弹头试管0.5mL
final public String scanCode;
final public String name;
A8kTubeType(String name, String scanCode) {
this.scanCode = scanCode;
this.name = name;
}
}

22
src/main/java/a8k/appbean/KeyValType.java

@ -0,0 +1,22 @@
package a8k.appbean;
public enum KeyValType {
Pos3d("Pos3d"),//
Pos2d("Pos2d"),//
Bool("Bool"),//
Int("Int"),//
String("String"),//
LargeBottleBufferPosInfo("LargeBottleBufferPosInfo"),//
Plates2dCodeScanPosInfo("Plates2dCodeScanPosInfo"),//
SmallBottleBufferPosInfo("SmallBottleBufferPosInfo"),//
TipPickUpPosInfo("TipPickUpPosInfo"),//
TubeSamplePos("TubeSamplePos"),//
Float("Float");
final public String name;
KeyValType(String name) {
this.name = name;
}
}

19
src/main/java/a8k/appbean/LargeBottleBufferPosInfo.java

@ -0,0 +1,19 @@
package a8k.appbean;
public class LargeBottleBufferPosInfo {
/*
* {
* "topLelf":[
* {"x":x,"y":y}
* ],
* "xinterval":,
* "yinterval":,
*
* "scancodeLineEachRelaPos":dy, //扫码相对每个大屏缓冲液的位置第一排-dy第二排dy
* "sampleStartPos":z,//取样开始位置
* "sampleHight":z,//取样深度
*
* }
*/
}

16
src/main/java/a8k/appbean/Plates2dCodeScanPosInfo.java

@ -0,0 +1,16 @@
package a8k.appbean;
public class Plates2dCodeScanPosInfo {
public Pos2d getCh0ScanPos() {
return null; //通道1扫码位置
}
public Integer getInterval() {
return 0;
}
public Pos2d getChScanPos(int chindex) {
return null;
}
}

13
src/main/java/a8k/appbean/Pos2d.java

@ -0,0 +1,13 @@
package a8k.appbean;
public class Pos2d {
public int x;
public int y;
public Pos2d(int x, int y) {
this.x = x;
this.y = y;
}
}

5
src/main/java/a8k/appbean/PosBean.java → src/main/java/a8k/appbean/Pos3d.java

@ -1,10 +1,11 @@
package a8k.appbean;
public class PosBean {
public class Pos3d {
public int x;
public int y;
public int z;
public PosBean(int x, int y, int z) {
public Pos3d(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;

11
src/main/java/a8k/appbean/PosZ.java

@ -0,0 +1,11 @@
package a8k.appbean;
public class PosZ {
int zpos;
int depth;
PosZ(int zpos, int depth) {
this.zpos = zpos;
this.depth = depth;
}
}

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

@ -0,0 +1,27 @@
package a8k.appbean;
public class SmallBottleBufferPosInfo {
/*
* {
* "topLelf":[
* {"x":x,"y":y},
* {"x":x,"y":y},
* {"x":x,"y":y},
* {"x":x,"y":y},
* {"x":x,"y":y},
* {"x":x,"y":y}
* ],
* "xinterval":,
* "yinterval":,
*
* "scancodeRelaPos":[dx,dy],
* "piercedZPos":z,//刺破高度
* "distributeZPos":z,//吐液高度
* "detectMaterialDistributeZpos":z//探测物质吐液高度
*
* }
*/
}

25
src/main/java/a8k/appbean/TipPickUpPosInfo.java

@ -0,0 +1,25 @@
package a8k.appbean;
public class TipPickUpPosInfo {
/*
* {
* "topLelf":[
* {"x":x,"y":y},
* {"x":x,"y":y},
* {"x":x,"y":y}
* ],
* "xinterval":,
* "yinterval":,
*
* "horizontalPointsNum":30,
* "verticalPointsNum":20,
* "pickUpZPos":100, //拾取高度
*
*
* }
*/
}

35
src/main/java/a8k/appbean/TubeSamplePos.java

@ -0,0 +1,35 @@
package a8k.appbean;
public class TubeSamplePos {
/*
"{
"sampleXYPos0":[x,y], //非全血试管取样位置
"sampleXYPos1":[x,y], //全血试管取样位置
"HighBlood":{
"sampleStartPos":1,
"sampleDepth":2,
},
"ShortBlood":{
"sampleStartPos":1,
"sampleDepth":2,
}
"Mini":{
"sampleStartPos":1,
"sampleDepth":2,
}
"MiniBlood":{
"sampleStartPos":1,
"sampleDepth":2,
}
"BulletTube1P5":{
"sampleStartPos":1,
"sampleDepth":2,
}
"BulletTube0P5":{
"sampleStartPos":1,
"sampleDepth":2,
}
}"
*/
}

40
src/main/java/a8k/service/db/dao/HbotControlParamsService.java

@ -0,0 +1,40 @@
package a8k.service.db.dao;
import a8k.appbean.*;
/**
* XY机械臂控制相关参数访问
*/
public class HbotControlParamsService {
Pos3d getReactionPos() {
return null;
} //滴液反应位
TipPickUpPosInfo TipPickUpPosInfo() {
return null;
} //TIP组0 位置信息
SmallBottleBufferPosInfo getSmallBottleBufferPosInfo() {
return null;
}//小瓶缓冲液位置
Plates2dCodeScanPosInfo getPlates2dCodeScanPosInfo() {
return null;
}//反应板夹仓位置
LargeBottleBufferPosInfo getLargeBottleBufferPosInfo() {
return null;
}//大瓶缓冲液位置
Pos3d getEmergencyPos() {
return null;
} //急诊位
Pos3d getTipDropPos() {
return null;
} //tip丢弃位置
}

85
src/main/java/a8k/service/db/dao/ReactionPlatesTransmitCtrlParamService.java

@ -0,0 +1,85 @@
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;
}
}

133
src/main/java/a8k/service/db/dao/SamplesPreProcessModuleCtrlParamsService.java

@ -0,0 +1,133 @@
package a8k.service.db.dao;
/**
* 样本预处理相关参数访问
*/
public class SamplesPreProcessModuleCtrlParamsService {
/**
* 参数存放在HardwareServiceSetting中
* 每个参数依赖于Key+serviceName进行索引
*/
public final String serviceName = "SamplesPreProcessModuleCtrlService";
// 回零超时时间
public int getMoveToZeroOvertime() {
// 索引为 "SamplesPreProcessModuleCtrlService" "MoveToZeroOvertime"
return 0;
}
// 执行动作的超时时间该超时时间适用于当前模块在当前产品中所有动作的最大时间
public int getActionOvertime() {
// 索引为 "SamplesPreProcessModuleCtrlService" "MoveToZeroOvertime"
return 0;
}
/**
* 升降电机相关位置
*/
// 高全血试管取帽位置
public int getHighBlood_TakeCapPos() {
return 0;
}
// 矮全血试管取帽位置
public int getShortBlood_TakeCapPos() {
return 0;
}
// 高试管帽子判断位置
public int getHighBlood_capJudgePos() {
return 0;
}
// 矮全血试管帽子判断位置
public int getShortBlood_capJudgePos() {
return 0;
}
// 升降电机位置偏移
public int getElevating_MotorPosOffset() {
return 0;
}
/*
* 平移电机相关参数
*/
// 水平移动电机待机位置
public int getHorizontalMotor_standbyPos() {
return 0;
}
// 水平移动电机取帽位置
public int getHorizontalMotor_takeCapPos() {
return 0;
}
// 水平移动电机放帽位置
public int getHorizontalMotor_takePushCapPos() {
return 0;
}
/*
* 抓手
*/
// 抓手舵机待机位置
public int getGripperServo_standbyPos() {
return 0;
}
// 抓手舵机取帽扭矩
public int getGripperServo_takeCapTorque() {
return 0;
}
// 抓手舵机取试管位置
public int getGripperServo_takeTubePos() {
return 0;
}
// 判断是否有帽子的位置阈值
public int getGripperServo_hatDeterminesPosThres() {
return 0;
}
/*
* 摇匀电机
*/
// 摇匀电机待机位置
public int getShakeMotor_standbyPos() {
return 0;
}
// 摇匀电机摇匀角度
public int getShakeMotor_shakeDegree() {
return 0;
}
/*
* 夹紧电机
*/
// 试管夹紧电机待机位置
public int getTubeClampMotor_standbyPos() {
return 0;
}
// 试管夹紧电机夹紧位置
public int getTubeClampMotor_ClampPos() {
return 0;
}
/*
* 气溶胶风扇控制参数
*/
// 气溶胶风扇风力大小(0->100)
public int getAerosolFanLevel() {
return 0;
}
}

12
src/main/java/a8k/service/db/dao/SamplesPreProcessModuleParameterDao.java

@ -1,12 +0,0 @@
package a8k.service.db.dao;
import a8k.service.db.entity.SamplesPreProcessModuleParameter;
import org.springframework.stereotype.Component;
@Component
public class SamplesPreProcessModuleParameterDao {
public SamplesPreProcessModuleParameter getParameter() {
//TODO:
return null;
}
}

7
src/main/java/a8k/service/db/entity/A8kTubeInfo.java

@ -18,17 +18,16 @@ public class A8kTubeInfo extends UfActiveRecord {
/**
* 摇匀模组使用
*/
/*
@UfActiveRecordField
public Integer takeTubeCapPos;// 0.1mm 取试管帽高度
/**
* Z轴使用
*/
@UfActiveRecordField
public Integer sampleBeginPos;// 0.1mm 取样高度
@UfActiveRecordField
public Integer sampleEndPos;//0.1mm 取样低位
*/
public static String getTableName() {
return "A8kTubeInfo" + "Table";
}

18
src/main/java/a8k/service/db/entity/HardwareServiceSetting.java

@ -0,0 +1,18 @@
package a8k.service.db.entity;
import com.iflytop.uf.UfActiveRecordField;
public class HardwareServiceSetting {
@UfActiveRecordField
public String key;
@UfActiveRecordField
public String serviceName; //属于哪个服务的, hardware目录下的类名
@UfActiveRecordField
public String valType;
@UfActiveRecordField
public String val;
public static String getTableName() {
return "HardwareServiceSetting" + "Table";
}
}

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

@ -32,9 +32,6 @@ public class MotorTubeRackMoveCtrlServiceParameter {
public Integer tubeRackScanCodePos; //试管架扫码位置
@UfActiveRecordField
Integer horizontalMotorOffset; //水平移动电机位置偏移
@UfActiveRecordField
public Integer horizontalMotorLostStepThresholdVal; //水平电机丢步判断
@UfActiveRecordField
@ -43,6 +40,9 @@ public class MotorTubeRackMoveCtrlServiceParameter {
@UfActiveRecordField
public Integer scanCodeReleasePos;//试管扫码释放位置
@UfActiveRecordField
public Integer tubeSpacing;
public static String getTableName() {
return "MotorTubeRackMoveCtrlServiceParameter" + "Table";

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

@ -1,81 +0,0 @@
package a8k.service.db.entity;
import com.iflytop.uf.UfActiveRecordField;
public class SamplesPreProcessModuleParameter {
@UfActiveRecordField
public Integer moveToZeroOvertime;// 回零超时时间
@UfActiveRecordField
public Integer actionOvertime;// 执行动作的超时时间该超时时间适用于当前模块在当前产品中所有动作的最大时间
/**
* 升降电机相关位置
*/
@UfActiveRecordField
public Integer highBlood_TakeCapPos;//高全血试管取帽位置
@UfActiveRecordField
public Integer shortBlood_TakeCapPos;//矮全血试管取帽位置
@UfActiveRecordField
public Integer highBlood_capJudgePos;//高试管帽子判断位置
@UfActiveRecordField
public Integer shortBlood_capJudgePos;//矮全血试管帽子判断位置
@UfActiveRecordField
public Integer elevating_MotorPosOffset;//升降电机位置偏移
/**
* 水平移动电机
*/
@UfActiveRecordField
public Integer horizontalMotor_standbyPos;//水平移动电机待机位置
@UfActiveRecordField
public Integer horizontalMotor_takeCapPos; //水平移动电机取帽位置
@UfActiveRecordField
public Integer horizontalMotor_takePushCapPos; //水平移动电机放帽位置
/**
* 取帽舵机
*/
@UfActiveRecordField
public Integer gripperServo_standbyPos; //抓手舵机待机位置
@UfActiveRecordField
public Integer gripperServo_takeCapTorque; //抓手舵机取帽扭矩
@UfActiveRecordField
public Integer gripperServo_takeTubePos; // 抓手舵机取试管位置
@UfActiveRecordField
public Integer gripperServo_hatDeterminesPosThres; //判断是否有帽子的位置阈值
/**
* 摇匀电机
*/
@UfActiveRecordField
public Integer shakeMotor_standbyPos;
@UfActiveRecordField
public Integer shakeMotor_shakeDegree;
/**
* 夹紧电机
*/
@UfActiveRecordField
public Integer tubeClampMotor_standbyPos;
@UfActiveRecordField
public Integer tubeClampMotor_ClampPos;
@UfActiveRecordField
public Integer aerosolFanLevel; //气溶胶风扇工作功率
public static String getTableName() {
return "SamplesPreProcessModuleParameter" + "Table";
}
}

21
src/main/java/a8k/service/hardware/HbotControlService.java

@ -0,0 +1,21 @@
package a8k.service.hardware;
/**
* Hbot控制服务
*/
public class HbotControlService {
public void moduleReset() {
}
public void moduleEnable() {
}
public void moduleDisable() {
}
}

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

@ -3,6 +3,7 @@ package a8k.service.hardware;
import a8k.appbean.AppErrorCode;
import org.springframework.stereotype.Component;
@Component
public class ReactionPlatesTransmitCtrlService {
@ -26,11 +27,19 @@ public class ReactionPlatesTransmitCtrlService {
2. 板夹钩爪零点光电处于触发状态 终点光电处于触发状态
3. 板夹卡板光电没有处于触发状态
*/
}
void moduleEnable() {
/*
模块使能
*/
}
void moduleDisable() {
/*
模块失能
*/
}
/* =======================================================================================
板夹仓操作
@ -107,7 +116,12 @@ public class ReactionPlatesTransmitCtrlService {
5.钩爪勾取反应板到指定位置
6.钩爪动作完成时检查钩爪零点光电是否触发如果没有触发报电机阻转异常
*/
}
void dropThePlate() {
/*
光学模组电机移动丢板
*/
}

24
代码说明/20240718.txt

@ -0,0 +1,24 @@
```
1.添加下面几种数据类型,每种类型都对应一种json,json的格式已经在对应的类中给出
Pos3d("Pos3d"),//
Pos2d("Pos2d"),//
Bool("Bool"),//
Int("Int"),//
String("String"),//
LargeBottleBufferPosInfo("LargeBottleBufferPosInfo"),//
Plates2dCodeScanPosInfo("Plates2dCodeScanPosInfo"),//
SmallBottleBufferPosInfo("SmallBottleBufferPosInfo"),//
TipPickUpPosInfo("TipPickUpPosInfo"),//
TubeSamplePos("TubeSamplePos"),//
Float("Float");
2.Hbot控制涉及到参数的访问和更改写在,HbotControlParamsService
3.反应板夹搬运(板夹出仓,转盘转动...,勾取反应板)相关参数的访问和更改写在 ReactionPlatesTransmitCtrlParamService
4.样本预处理(脱毛盖帽摇匀)涉及到参数的访问和更改写在 SamplesPreProcessModuleCtrlParamsService
5.所有硬件控制涉及到的参数都写在HardwareServiceSetting数据库中,数据库中的条目索引,由key+ServiceName作为索引标识。
6.之前写的进出料控制,也改成类似的风格。(这个我没有改)
7.删除掉试管类型数据库,试管类型信息存储在A8kTubeType枚举中。试管架间距,参数也放在MotorTubeRackMoveCtrlServiceParameterDao中,(我没有删,你改完之后再删)
```
Loading…
Cancel
Save