From 2b06d6badac04ed8f9ca17b634ef326846fc538d Mon Sep 17 00:00:00 2001 From: sige Date: Mon, 5 Feb 2024 17:03:02 +0800 Subject: [PATCH] ~~ --- .../my/graphiteDigesterBg/MyApplicationRunner.java | 3 - .../graphiteDigesterBg/diframe/DiActuatorBase.java | 1 + .../diframe/DiDeviceActuatorManager.java | 6 + .../diframe/actuator/DiActPeristalticPump.java | 62 +++++- .../my/graphiteDigesterBg/move/MoveLiquidAdd.java | 22 +- .../resource/ResAcidManager.java | 6 + .../my/graphiteDigesterBg/task/TaskLiquidAdd.java | 17 +- .../my/graphiteDigesterBg/task/TaskStartReset.java | 10 +- .../testcase/TestcasePeristalticPumpTest.java | 21 ++ src/src/main/resources/device.yml | 236 ++++++++++++++++++++- 10 files changed, 351 insertions(+), 33 deletions(-) create mode 100644 src/src/main/java/com/my/graphiteDigesterBg/testcase/TestcasePeristalticPumpTest.java diff --git a/src/src/main/java/com/my/graphiteDigesterBg/MyApplicationRunner.java b/src/src/main/java/com/my/graphiteDigesterBg/MyApplicationRunner.java index d30b35c..58d5a48 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/MyApplicationRunner.java +++ b/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(){{ mid = 12; }}); - actuators.register(MyDevice.ACT_LIQUID_PERISTALTIC_PUMP_0, new DiActPeristalticPump(){{ - mid = 61; - }}); } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java index 98225d8..50a619c 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java @@ -74,6 +74,7 @@ abstract public class DiActuatorBase implements DiActuator { } else { this.onDisable(); } + this.log("setEnable({})", enable); } // active config diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceActuatorManager.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceActuatorManager.java index e0158f9..57f6bb6 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceActuatorManager.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceActuatorManager.java @@ -1,6 +1,7 @@ package com.my.graphiteDigesterBg.diframe; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -27,6 +28,11 @@ public class DiDeviceActuatorManager { return this.actuators.get( id ); } + // get all + public List getAll() { + return new ArrayList<>(this.actuators.values()); + } + // setup public void setup() { Object config = this.device.getConfig().get("actuators"); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java index fbfad09..1ed6ce5 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java +++ b/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.DiCommand; 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(); } - 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); } } \ No newline at end of file diff --git a/src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java index 7bff9da..3623fe4 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java +++ b/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.diframe.DiTaskMoveBase; 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 { // shake times public Integer shakeTimes; + // liquid volume + public Integer liquidVolume; + // liquid type + public String liquidType; @Override 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 liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); @@ -15,14 +27,16 @@ public class MoveLiquidAdd extends DiTaskMoveBase { // 外圈试管加液 liquidMotor.moveTo("LiquidArmPumpGroupOut"); liquidPlateMotor.moveTo("LiquidPlateSlotPumpOutGroup", i); - // 加液指定数量 - //liquidPump.pump(this.liquidVolume); + groupOutPump.pump(this.liquidVolume); + groupInPump.pump(this.liquidVolume); + bucket.volume -= this.liquidVolume * 2; // 内圈试管加液 liquidMotor.moveTo("LiquidArmPumpGroupIn"); liquidPlateMotor.moveTo("LiquidPlateSlotPumpInGroup", i); - // 加液指定数量 - //liquidPump.pump(this.liquidVolume); + groupInPump.pump(this.liquidVolume); + groupOutPump.pump(this.liquidVolume); + bucket.volume -= this.liquidVolume * 2; } liquidMotor.moveTo("LiquidArmStandby"); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java index 4718188..86d6491 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java @@ -14,6 +14,12 @@ public class ResAcidManager extends DiResourceManagerBase { this.buckets = new ArrayList<>(); for (int i = 0; i < 8; i++) { ResAcidBucket bucket = new ResAcidBucket(this, i); + + // @TODO : remove this + bucket.acidType = "sulfuric"; + bucket.volume = 5000; + bucket.maxVolume = 5000; + this.buckets.add(bucket); } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java index 5c0177f..786c8b2 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java @@ -1,15 +1,10 @@ package com.my.graphiteDigesterBg.task; -import com.my.graphiteDigesterBg.MyDevice; import com.my.graphiteDigesterBg.diframe.DiTaskBase; 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.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") public class TaskLiquidAdd extends DiTaskBase { // slot index @@ -35,8 +30,16 @@ public class TaskLiquidAdd extends DiTaskBase { var liquidAdd = new MoveLiquidAdd(); liquidAdd.setDevice(this.getDevice()); liquidAdd.shakeTimes = this.shakeTimes; + liquidAdd.liquidType = this.liquidType; + liquidAdd.liquidVolume = this.liquidVolume; 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); } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java index 86fd2e1..8ea6805 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java +++ b/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.Task; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; +import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump; import com.my.graphiteDigesterBg.diframe.actuator.DiActServo; @Task(name="StartReset") public class TaskStartReset extends DiTaskBase { @@ -49,8 +50,13 @@ public class TaskStartReset extends DiTaskBase { heatPlateMotor.reset(); 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("IsTaskStartResetExecuting", "NO"); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/testcase/TestcasePeristalticPumpTest.java b/src/src/main/java/com/my/graphiteDigesterBg/testcase/TestcasePeristalticPumpTest.java new file mode 100644 index 0000000..3012c4f --- /dev/null +++ b/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(); +// } +// } + } +} diff --git a/src/src/main/resources/device.yml b/src/src/main/resources/device.yml index d30f98d..e1c53b0 100644 --- a/src/src/main/resources/device.yml +++ b/src/src/main/resources/device.yml @@ -104,18 +104,232 @@ actuators : defaultVelocity : 400 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 registers : # 加热盘 Slot Cover - {key: "HeatingPlateSlot1CoverServeMotorDefaultVelocity" , mid : 12, index : 1054, defaultValue : 150} - - {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} + - {key: "HeatingPlateSlot1CoverServeMotorDefaultTorque" , mid : 12, index : 1077, defaultValue : 330} \ No newline at end of file