sige 2 years ago
parent
commit
2b06d6bada
  1. 3
      src/src/main/java/com/my/graphiteDigesterBg/MyApplicationRunner.java
  2. 1
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java
  3. 6
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceActuatorManager.java
  4. 62
      src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java
  5. 22
      src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java
  6. 6
      src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java
  7. 17
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java
  8. 10
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java
  9. 21
      src/src/main/java/com/my/graphiteDigesterBg/testcase/TestcasePeristalticPumpTest.java
  10. 234
      src/src/main/resources/device.yml

3
src/src/main/java/com/my/graphiteDigesterBg/MyApplicationRunner.java

@ -59,8 +59,5 @@ public class MyApplicationRunner implements ApplicationRunner {
actuators.register(MyDevice.ACT_HEAT_SLOT_01_COVER_SERVO, new DiActServo(){{ actuators.register(MyDevice.ACT_HEAT_SLOT_01_COVER_SERVO, new DiActServo(){{
mid = 12; mid = 12;
}}); }});
actuators.register(MyDevice.ACT_LIQUID_PERISTALTIC_PUMP_0, new DiActPeristalticPump(){{
mid = 61;
}});
} }
} }

1
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java

@ -74,6 +74,7 @@ abstract public class DiActuatorBase implements DiActuator {
} else { } else {
this.onDisable(); this.onDisable();
} }
this.log("setEnable({})", enable);
} }
// active config // active config

6
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceActuatorManager.java

@ -1,6 +1,7 @@
package com.my.graphiteDigesterBg.diframe; package com.my.graphiteDigesterBg.diframe;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -27,6 +28,11 @@ public class DiDeviceActuatorManager {
return this.actuators.get( id ); return this.actuators.get( id );
} }
// get all
public List<DiActuator> getAll() {
return new ArrayList<>(this.actuators.values());
}
// setup // setup
public void setup() { public void setup() {
Object config = this.device.getConfig().get("actuators"); Object config = this.device.getConfig().get("actuators");

62
src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java

@ -2,14 +2,64 @@ package com.my.graphiteDigesterBg.diframe.actuator;
import com.my.graphiteDigesterBg.diframe.DiActuatorBase; import com.my.graphiteDigesterBg.diframe.DiActuatorBase;
import com.my.graphiteDigesterBg.diframe.DiCommand; import com.my.graphiteDigesterBg.diframe.DiCommand;
public class DiActPeristalticPump extends DiActuatorBase { public class DiActPeristalticPump extends DiActuatorBase {
// volume
public void pump(Integer volume) {
// @TODO : 这里要根据配置参数计算 ~~~
this.call(DiCommand.MOTOR_EASY_MOVE_BY, 100 * volume);
// shaft
protected Integer shaft;
// one circle pulse
protected Integer oneCirclePulse;
// one circle pulse denominator
protected Integer oneCirclePulseDenominator;
// default velocity
protected Integer defaultVelocity;
// default acc
protected Integer defaultAcc;
// default dec
protected Integer defaultDec;
// look zero edge pulse
protected Integer stepMotorIHold;
// look zero edge pulse
protected Integer stepMotorIRun;
// volume per circle
protected Double volumePerCircle;
@Override
protected void onEnable() {
if ( null != this.shaft ) {
this.call(DiCommand.MODULE_SET_REG,1051, this.shaft);
}
if ( null != this.oneCirclePulse ) {
this.call(DiCommand.MODULE_SET_REG, 1052, this.oneCirclePulse);
}
if ( null != this.oneCirclePulseDenominator ) {
this.call(DiCommand.MODULE_SET_REG, 1053, this.oneCirclePulseDenominator);
}
if ( null != this.defaultVelocity ) {
this.call(DiCommand.MODULE_SET_REG, 1054, this.defaultVelocity);
}
if ( null != this.defaultAcc ) {
this.call(DiCommand.MODULE_SET_REG, 1055, this.defaultAcc);
}
if ( null != this.defaultDec ) {
this.call(DiCommand.MODULE_SET_REG, 1056, this.defaultDec);
}
if ( null != this.stepMotorIHold ) {
this.call(DiCommand.MODULE_SET_REG, 1058, this.stepMotorIHold);
}
if ( null != this.stepMotorIRun ) {
this.call(DiCommand.MODULE_SET_REG, 1059, this.stepMotorIRun);
}
this.activeConfig();
}
// rotate by circle count
public void rotateByCircleCount( Integer circleCount ) {
Integer targetPos = this.oneCirclePulse * circleCount;
this.call(DiCommand.MOTOR_EASY_MOVE_BY, targetPos);
this.waitForFinish(); this.waitForFinish();
} }
public void rotate() {
this.call(DiCommand.MOTOR_EASY_MOVE_BY, 100 * 30);
// volume
public void pump(Integer volume) {
Integer circleCount = (int) (volume / this.volumePerCircle);
this.rotateByCircleCount(circleCount);
} }
} }

22
src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java

@ -2,12 +2,24 @@ package com.my.graphiteDigesterBg.move;
import com.my.graphiteDigesterBg.MyDevice; import com.my.graphiteDigesterBg.MyDevice;
import com.my.graphiteDigesterBg.diframe.DiTaskMoveBase; import com.my.graphiteDigesterBg.diframe.DiTaskMoveBase;
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor;
import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump;
import com.my.graphiteDigesterBg.resource.ResAcidManager;
public class MoveLiquidAdd extends DiTaskMoveBase { public class MoveLiquidAdd extends DiTaskMoveBase {
// shake times // shake times
public Integer shakeTimes; public Integer shakeTimes;
// liquid volume
public Integer liquidVolume;
// liquid type
public String liquidType;
@Override @Override
public void run() { public void run() {
var liquidBucketMan = this.getResourceManager(ResAcidManager.class);
var bucket = liquidBucketMan.getBucketByAcidType(this.liquidType);
var groupInPump = this.getActuator("LiquidPeristalticPump_" + bucket.index + "_0", DiActPeristalticPump.class);
var groupOutPump = this.getActuator("LiquidPeristalticPump_" + bucket.index + "_1", DiActPeristalticPump.class);
// 加液 // 加液
DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class); DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class);
DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class);
@ -15,14 +27,16 @@ public class MoveLiquidAdd extends DiTaskMoveBase {
// 外圈试管加液 // 外圈试管加液
liquidMotor.moveTo("LiquidArmPumpGroupOut"); liquidMotor.moveTo("LiquidArmPumpGroupOut");
liquidPlateMotor.moveTo("LiquidPlateSlotPumpOutGroup", i); liquidPlateMotor.moveTo("LiquidPlateSlotPumpOutGroup", i);
// 加液指定数量
//liquidPump.pump(this.liquidVolume);
groupOutPump.pump(this.liquidVolume);
groupInPump.pump(this.liquidVolume);
bucket.volume -= this.liquidVolume * 2;
// 内圈试管加液 // 内圈试管加液
liquidMotor.moveTo("LiquidArmPumpGroupIn"); liquidMotor.moveTo("LiquidArmPumpGroupIn");
liquidPlateMotor.moveTo("LiquidPlateSlotPumpInGroup", i); liquidPlateMotor.moveTo("LiquidPlateSlotPumpInGroup", i);
// 加液指定数量
//liquidPump.pump(this.liquidVolume);
groupInPump.pump(this.liquidVolume);
groupOutPump.pump(this.liquidVolume);
bucket.volume -= this.liquidVolume * 2;
} }
liquidMotor.moveTo("LiquidArmStandby"); liquidMotor.moveTo("LiquidArmStandby");

6
src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java

@ -14,6 +14,12 @@ public class ResAcidManager extends DiResourceManagerBase {
this.buckets = new ArrayList<>(); this.buckets = new ArrayList<>();
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
ResAcidBucket bucket = new ResAcidBucket(this, i); ResAcidBucket bucket = new ResAcidBucket(this, i);
// @TODO : remove this
bucket.acidType = "sulfuric";
bucket.volume = 5000;
bucket.maxVolume = 5000;
this.buckets.add(bucket); this.buckets.add(bucket);
} }
} }

17
src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java

@ -1,15 +1,10 @@
package com.my.graphiteDigesterBg.task; package com.my.graphiteDigesterBg.task;
import com.my.graphiteDigesterBg.MyDevice;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor;
import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump;
import com.my.graphiteDigesterBg.diframe.actuator.DiActServo;
import com.my.graphiteDigesterBg.move.MoveLiquidAdd; import com.my.graphiteDigesterBg.move.MoveLiquidAdd;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate;
import com.my.graphiteDigesterBg.resource.ResAcidManager;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate;
@Task(name="LiquidAdd") @Task(name="LiquidAdd")
public class TaskLiquidAdd extends DiTaskBase { public class TaskLiquidAdd extends DiTaskBase {
// slot index // slot index
@ -35,8 +30,16 @@ public class TaskLiquidAdd extends DiTaskBase {
var liquidAdd = new MoveLiquidAdd(); var liquidAdd = new MoveLiquidAdd();
liquidAdd.setDevice(this.getDevice()); liquidAdd.setDevice(this.getDevice());
liquidAdd.shakeTimes = this.shakeTimes; liquidAdd.shakeTimes = this.shakeTimes;
liquidAdd.liquidType = this.liquidType;
liquidAdd.liquidVolume = this.liquidVolume;
liquidAdd.run(); liquidAdd.run();
// move tube rack from liquid plate to heat plate
var moveTubeRackFromLiquidPlateToHeatPlate = new MoveMoveTubeRackFromLiquidPlateToHeatPlate();
moveTubeRackFromLiquidPlateToHeatPlate.setDevice(this.getDevice());
moveTubeRackFromLiquidPlateToHeatPlate.slotIndex = this.slotIndex;
moveTubeRackFromLiquidPlateToHeatPlate.run();
this.setStatus(TaskStatus.FINISHED); this.setStatus(TaskStatus.FINISHED);
} }
} }

10
src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java

@ -3,6 +3,7 @@ import com.my.graphiteDigesterBg.MyDevice;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor;
import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump;
import com.my.graphiteDigesterBg.diframe.actuator.DiActServo; import com.my.graphiteDigesterBg.diframe.actuator.DiActServo;
@Task(name="StartReset") @Task(name="StartReset")
public class TaskStartReset extends DiTaskBase { public class TaskStartReset extends DiTaskBase {
@ -49,8 +50,13 @@ public class TaskStartReset extends DiTaskBase {
heatPlateMotor.reset(); heatPlateMotor.reset();
heatPlateMotor.moveTo("HeatPlateStandby"); heatPlateMotor.moveTo("HeatPlateStandby");
// @TODO : 蠕动泵初始化
LOG.error("@TODO : 蠕动泵初始化");
// 蠕动泵初始化
var actuators = this.getDevice().getActuators().getAll();
for ( var actuator : actuators ) {
if (actuator instanceof DiActPeristalticPump pump) {
pump.setEnable(true);
}
}
runtimeVars.set("IsDeviceReady", "YES"); runtimeVars.set("IsDeviceReady", "YES");
runtimeVars.set("IsTaskStartResetExecuting", "NO"); runtimeVars.set("IsTaskStartResetExecuting", "NO");

21
src/src/main/java/com/my/graphiteDigesterBg/testcase/TestcasePeristalticPumpTest.java

@ -0,0 +1,21 @@
package com.my.graphiteDigesterBg.testcase;
import com.my.graphiteDigesterBg.diframe.DiTestcaseBase;
import com.my.graphiteDigesterBg.diframe.Testcase;
import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump;
@Testcase(
name="PeristalticPumpTest",
title="测试每个蠕动泵旋转情况",
description="测试时需将桶内装入一定量的水,并在加液臂处放置容器用于接水"
)
public class TestcasePeristalticPumpTest extends DiTestcaseBase {
@Override
public void run() {
// for ( int i = 0; i < 8; i++ ) {
// for ( int j=0; j<2; j++ ) {
// var pump = this.getActuator("LiquidPeristalticPump_0_0", DiActPeristalticPump.class);
// pump.rotate();
// }
// }
}
}

234
src/src/main/resources/device.yml

@ -104,18 +104,232 @@ actuators :
defaultVelocity : 400 defaultVelocity : 400
defaultTorque : 300 defaultTorque : 300
- name : 蠕动泵-0-0
key : LiquidPeristalticPump_0_0
mid : 108
type : PeristalticPump
shaft : 0
oneCirclePulse : 100
oneCirclePulseDenominator : 1
defaultVelocity : 500
defaultAcc : 300
defaultDec : 300
stepMotorIHold : 0
stepMotorIRun : 25
volumePerCircle : 0.1
- name: 蠕动泵-0-1
key: LiquidPeristalticPump_0_1
mid: 107
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-1-0
key: LiquidPeristalticPump_1_0
mid: 106
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-1-1
key: LiquidPeristalticPump_1_1
mid: 105
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-2-0
key: LiquidPeristalticPump_2_0
mid: 104
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-2-1
key: LiquidPeristalticPump_2_1
mid: 103
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-3-0
key: LiquidPeristalticPump_3_0
mid: 102
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-3-1
key: LiquidPeristalticPump_3_1
mid: 101
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-4-0
key: LiquidPeristalticPump_4_0
mid: 118
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-4-1
key: LiquidPeristalticPump_4_1
mid: 117
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-5-0
key: LiquidPeristalticPump_5_0
mid: 116
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-5-1
key: LiquidPeristalticPump_5_1
mid: 115
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-6-0
key: LiquidPeristalticPump_6_0
mid: 114
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-6-1
key: LiquidPeristalticPump_6_1
mid: 113
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-7-0
key: LiquidPeristalticPump_7_0
mid: 112
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
- name: 蠕动泵-7-1
key: LiquidPeristalticPump_7_1
mid: 111
type: PeristalticPump
shaft: 0
oneCirclePulse: 100
oneCirclePulseDenominator: 1
defaultVelocity: 500
defaultAcc: 300
defaultDec: 300
stepMotorIHold: 0
stepMotorIRun: 25
volumePerCircle: 0.1
# device registers # device registers
registers : registers :
# 加热盘 Slot Cover # 加热盘 Slot Cover
- {key: "HeatingPlateSlot1CoverServeMotorDefaultVelocity" , mid : 12, index : 1054, defaultValue : 150} - {key: "HeatingPlateSlot1CoverServeMotorDefaultVelocity" , mid : 12, index : 1054, defaultValue : 150}
- {key: "HeatingPlateSlot1CoverServeMotorDefaultTorque" , mid : 12, index : 1077, defaultValue : 330} - {key: "HeatingPlateSlot1CoverServeMotorDefaultTorque" , mid : 12, index : 1077, defaultValue : 330}
# 加酸蠕动泵
- {key: "LiquidPeristalticPump0MotorShaft" , mid : 61, index : 1051, defaultValue : 0}
- {key: "LiquidPeristalticPump0MotorOneCirclePulse" , mid : 61, index : 1052, defaultValue : 100}
- {key: "LiquidPeristalticPump0MotorOneCirclePulseDenominator" , mid : 61, index : 1053, defaultValue : 1}
- {key: "LiquidPeristalticPump0MotorDefaultVelocity" , mid : 61, index : 1054, defaultValue : 500}
- {key: "LiquidPeristalticPump0MotorDefaultAcc" , mid : 61, index : 1055, defaultValue : 300}
- {key: "LiquidPeristalticPump0MotorDefaultDec" , mid : 61, index : 1056, defaultValue : 300}
- {key: "LiquidPeristalticPump0MotorStepMotorIHold" , mid : 61, index : 1058, defaultValue : 0}
- {key: "LiquidPeristalticPump0MotorStepMotorIRun" , mid : 61, index : 1059, defaultValue : 4}
Loading…
Cancel
Save