From 5b673f24d73e5591af11a62e9851c35b84eee185 Mon Sep 17 00:00:00 2001 From: sige Date: Sat, 13 Apr 2024 16:20:07 +0800 Subject: [PATCH] ~ --- app.db | Bin 299008 -> 299008 bytes .../com/iflytop/digester/StartResetTaskThread.java | 178 +++++++-------------- .../deviceinstance/HeatingTurntableInstance.java | 18 +++ .../deviceinstance/HeatingTurntableSlot.java | 5 + .../deviceinstance/LiquidAdditionInstance.java | 23 +-- src/main/resources/application.yml | 3 +- web | 2 +- 7 files changed, 98 insertions(+), 131 deletions(-) diff --git a/app.db b/app.db index 6809d9b5c15fc7b2f87331190e21eb195c8fe452..42a74f41da63c98bb2492e5b6568ee62c7277324 100644 GIT binary patch delta 4383 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 aYKStwu3uhjwQt@nzdUl6wM#=VwB=vusCqB} diff --git a/src/main/java/com/iflytop/digester/StartResetTaskThread.java b/src/main/java/com/iflytop/digester/StartResetTaskThread.java index e27e21a..6f09447 100644 --- a/src/main/java/com/iflytop/digester/StartResetTaskThread.java +++ b/src/main/java/com/iflytop/digester/StartResetTaskThread.java @@ -10,6 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; +import java.util.List; import java.util.Map; public class StartResetTaskThread extends Thread { @@ -27,98 +28,61 @@ public class StartResetTaskThread extends Thread { this.setProgressMessage("设备初始化..."); UfCmdSnippetExecutor.execute("StartResetInitDevices"); - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - throw new RuntimeException(e); +// this.setupHeatingSlotCover(); +// this.setupPeristalticPump(); + if ( this.isErrorTubeRackRequired ) { + this.setupErrorTubeRack(); } - this.setupHeatingSlotCover(); -// this.setupPeristalticPump(); -// // this.setProgressMessage("设备初始化 : 相机"); // DiActCameraBasler camera = this.getActuator(MyDevice.ACT_CAMERA, DiActCameraBasler.class); // camera.setEnable(true); -// -// this.setProgressMessage("设备初始化 : 定时刷新加热盘温度"); -// var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); -// slotMan.startTemperatureRefresh(); -// -// if ( this.isErrorTubeRackRequired ) { -// this.setProgressMessage("设备初始化 : 放入异常处理试管架"); -// doorMotor.reset(); // 打开设备门 -// DiMdbNotification.taskAction(this, "TaskStartResetErrorTubeRackPutIn"); -// this.waitAction("TaskStartResetErrorTubeRackPutIn"); -// } -// -// this.getDevice().getIO().setValue("LightRed", 0); -// this.getDevice().getIO().setValue("LightGreen", 1); + this.setProgressMessage("设备初始化 : 定时刷新加热盘温度"); + device.heatingTurntable.temperatureMonitorStart(); + + UfCmdSnippetExecutor.execute("StatusLampRunning"); this.setProgressMessage("设备初始化 : 完成"); device.setStatus("ready"); UfMdbRuntimeVariable.setString("设备已就绪","device.message"); } -// -// // 设置蠕动泵 -// private void setupPeristalticPump() { -// int peristalticPumpCount = 1; -// var actuators = this.getDevice().getActuators().getAll(); -// for ( var actuator : actuators ) { -// if (actuator instanceof DiActPeristalticPump pump) { -// this.setProgressMessage("设备初始化 : 蠕动泵复位 " + peristalticPumpCount + "/16"); -// pump.setEnable(true); -// peristalticPumpCount++; -// } -// } -// -// Boolean enableSetup = this.getDevice().getEnv().getProperty("app.liquidPeristalticPumpPipeSetupEnable",Boolean.class); -// assert enableSetup != null; -// if ( !enableSetup ) { -// return ; -// } -// -// DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); -// DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class); -// -// this.setProgressMessage("设备初始化 : 初始化加液管路"); -// MoveDoorOpen.execute(this.getDevice()); -// DiMdbNotification.taskAction(this, "TaskStartResetPumpPipeSetupTubeRankPutIn"); -// this.waitAction("TaskStartResetPumpPipeSetupTubeRankPutIn"); -// MoveDoorClose.execute(this.getDevice()); -// -// // 加液管充满 -// for ( int i=0; i<8; i++ ) { + + // 设置蠕动泵 + private void setupPeristalticPump() { + for ( int i=0; i<16; i++ ) { +// this.setProgressMessage("设备初始化 : 初始化蠕动泵 " + (i+1) + "/16"); +// UfCmdSnippetExecutor.execute(String.format("PeristalticPumpEnable.%d",i)); + } + + Boolean enableSetup = UfApplication.getApp().getEnv().getProperty("app.liquidPeristalticPumpPipeSetupEnable",Boolean.class); + assert enableSetup != null; + if ( !enableSetup ) { + return ; + } + + this.setProgressMessage("设备初始化 : 初始化加液管路"); + UfCmdSnippetExecutor.execute("DoorOpen"); + UfMdbNotification.action("TaskStartResetPumpPipeSetupTubeRankPutIn", new HashMap<>()); + this.waitAction("TaskStartResetPumpPipeSetupTubeRankPutIn"); + UfCmdSnippetExecutor.execute("DoorClose"); + + // 加液管充满 + Device device = Device.getInstance(); + var tubes = List.of(0,4, 3,2, 15,11, 12,13, 1,5, 6,7, 14,10, 9,8); + for ( int i=0; i<8; i++ ) { // this.setProgressMessage("设备初始化 : 初始化加液管路 " + (i+1) + "/8"); -// if ( 0 == i%2 ) { -// liquidMotor.moveTo("LiquidArmPumpGroupOut"); -// liquidPlateMotor.moveTo("LiquidPlateSlotPumpOutGroup",i/2); -// } else { -// liquidMotor.moveTo("LiquidArmPumpGroupIn"); -// liquidPlateMotor.moveTo("LiquidPlateSlotPumpInGroup", i/2); -// } -// -// var pump0 = this.getActuator("LiquidPeristalticPump_"+i+"_0", DiActPeristalticPump.class); -// var pump1 = this.getActuator("LiquidPeristalticPump_"+i+"_1", DiActPeristalticPump.class); -// var pipeVolumeCircle0 = pump1.getLocationValue("LiquidPeristalticPumpPipeVolumeCircle",i, 0); -// var pipeVolumeCircle1 = pump1.getLocationValue("LiquidPeristalticPumpPipeVolumeCircle",i, 1); -// this.batchExecute(List.of( -// () -> pump0.moveBy(pipeVolumeCircle0), -// () -> pump1.moveBy(pipeVolumeCircle1) -// )); -// pump0.retract(); -// pump1.retract(); -// } -// -// liquidMotor.moveTo("LiquidArmStandby"); -// -// // 加液管充满, 需要取出试管架 -// MoveDoorOpen.execute(this.getDevice()); -// DiMdbNotification.taskAction(this, "TaskStartResetPumpPipeSetupTubeRankTakeOut"); -// this.waitAction("TaskStartResetPumpPipeSetupTubeRankTakeOut"); -// MoveDoorClose.execute(this.getDevice()); -// } -// +// var tubeList = tubes.subList(i*2, i*2+2); +// var pumpList = List.of(2*i, 2*i+1); +// device.liquidAddition.addLiquidToTubes(tubeList, pumpList, 10000); + } + + // 加液管充满, 需要取出试管架 + UfCmdSnippetExecutor.execute("DoorOpen"); + UfMdbNotification.action("TaskStartResetPumpPipeSetupTubeRankTakeOut", new HashMap<>()); + this.waitAction("TaskStartResetPumpPipeSetupTubeRankTakeOut"); + UfCmdSnippetExecutor.execute("DoorClose"); + } + /** * 清理试管架 * @issue : 无法获取加液位置是否存在试管架 @@ -173,43 +137,21 @@ public class StartResetTaskThread extends Thread { UfCmdSnippetExecutor.execute("DoorClose"); } } -// -// // 异常处理位试管架取出 -// public void actionErrorTubeRackTakeOut() { -// var action = this.getAction("TaskStartResetErrorTubeRackTakeOut"); -// action.finish(); -// } -// -// // 放入异常处理位试管架 -// public void actionErrorTubeRackPutIn() { -// var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); -// var slot = slotMan.getErrorSlot(); -// -// // 关闭设备门 -// DiActMotor doorMotor = this.getActuator(MyDevice.ACT_DOOR_MOTOR, DiActMotor.class); -// doorMotor.moveToIO(1, 1); -// -// var move = new MoveMoveTubeRackFromLiquidPlateToHeatPlate(); -// move.slotIndex = slot.index; -// move.setDevice(this.getDevice()); -// move.run(); -// slot.lock(); -// -// var action = this.getAction("TaskStartResetErrorTubeRackPutIn"); -// action.finish(); -// } -// -// // 蠕动泵管路初始化 -// public void actionPumpPipeSetupTubeRankPutIn() { -// var action = this.getAction("TaskStartResetPumpPipeSetupTubeRankPutIn"); -// action.finish(); -// } -// -// // 蠕动泵管路初始化 -// public void actionPumpPipeSetupTubeRankTakeOut() { -// var action = this.getAction("TaskStartResetPumpPipeSetupTubeRankTakeOut"); -// action.finish(); -// } + + // 放入异常处理位试管架 + public void setupErrorTubeRack() { + Integer errorSlotIndex = UfApplication.getApp().getEnv().getProperty("app.errorSlotIndex", Integer.class); + + this.setProgressMessage("设备初始化 : 放入异常处理试管架"); + UfCmdSnippetExecutor.execute("DoorOpen"); + UfMdbNotification.action("TaskStartResetErrorTubeRackPutIn", new HashMap<>()); + this.waitAction("TaskStartResetErrorTubeRackPutIn"); + // 关闭设备门 + UfCmdSnippetExecutor.execute("DoorClose"); + // 移动试管架至异常处理区 + UfCmdSnippetExecutor.execute(String.format("TubeRackMoveToHeatingTurntable.%d", errorSlotIndex)); + Device.getInstance().heatingTurntable.getSlotByIndex(errorSlotIndex).setTubeRackNo("ErrorSlot"); + } // wait for continue private void waitAction( String key ) { diff --git a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java index d0fcd0e..e209d46 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java @@ -3,6 +3,8 @@ import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; +import java.util.TimerTask; + @Component public class HeatingTurntableInstance { // 槽位列表 @@ -47,6 +49,22 @@ public class HeatingTurntableInstance { throw new RuntimeException("加热位已满, 无法分配新的加热位"); } + // 启动温度监控 + public void temperatureMonitorStart() { + for (HeatingTurntableSlot slot : slots) { + slot.refreshCurTemperature(); + } + var timerTask = new TimerTask() { + @Override + public void run() { + HeatingTurntableInstance.this.temperatureMonitorStart(); + } + }; + var timer = new java.util.Timer(); + timer.schedule(timerTask, 5000); + } + + // public void heating(Integer index, Integer temperature, Integer duration ) throws InterruptedException { // // 执行加热 // } diff --git a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java index 037e645..27dc55d 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java @@ -73,4 +73,9 @@ public class HeatingTurntableSlot { public void setTubeRackLocation( String location ) { this.tubeRackLocation = location; } + + // 刷新当前温度 + public void refreshCurTemperature() { + + } } diff --git a/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java index cb361c2..7b9355b 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java @@ -36,38 +36,34 @@ public class LiquidAdditionInstance { return this.liquids.get(index); } - - // 针对试管加液 - public void addLiquidToTubes(List tubes, String type, int volume ) { - var pumpIndexes = this.getPumpIndexForGroupOutAndIn(type); + // add liquid to tubes by given pump indexes + public void addLiquidToTubes(List tubes, List pumpIndexes, int volume ) { var pumpGroupOutIndex = pumpIndexes.get(0); var pumpGroupInIndex = pumpIndexes.get(1); for ( int batchIndex=0; batchIndex<4; batchIndex++ ) { - // 外圈加液 UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.Out." + batchIndex); - if ( this.checkTubeExists("GOUT", batchIndex, "TOUT", tubes) ) { // 外圈,外侧试管加液 + if ( this.checkTubeExists("GOUT", batchIndex, "TOUT", tubes) ) { UfCmdSnippetExecutor.execute( "LiquidAdditionPump" + pumpGroupOutIndex, Map.of("volume", volume) ); } - if ( this.checkTubeExists("GOUT", batchIndex, "TIN", tubes) ) { // 外圈,内侧试管加液 + if ( this.checkTubeExists("GOUT", batchIndex, "TIN", tubes) ) { UfCmdSnippetExecutor.execute( "LiquidAdditionPump" + pumpGroupInIndex, Map.of("volume", volume) ); } - // 内圈加液 UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.In." + batchIndex); - if ( this.checkTubeExists("GIN", batchIndex, "TOUT", tubes) ) { // 内圈,外侧试管加液 + if ( this.checkTubeExists("GIN", batchIndex, "TOUT", tubes) ) { UfCmdSnippetExecutor.execute( "LiquidAdditionPump" + pumpGroupOutIndex, Map.of("volume", volume) ); } - if ( this.checkTubeExists("GIN", batchIndex, "TIN", tubes) ) { // 内圈,内侧试管加液 + if ( this.checkTubeExists("GIN", batchIndex, "TIN", tubes) ) { UfCmdSnippetExecutor.execute( "LiquidAdditionPump" + pumpGroupInIndex, Map.of("volume", volume) @@ -75,10 +71,15 @@ public class LiquidAdditionInstance { } } - // 加液复位 UfCmdSnippetExecutor.execute("LiquidAdditionReset"); } + // 针对试管加液 + public void addLiquidToTubes(List tubes, String type, int volume ) { + var pumpIndexes = this.getPumpIndexForGroupOutAndIn(type); + this.addLiquidToTubes(tubes, pumpIndexes, volume); + } + // 检查试管是否存在 private Boolean checkTubeExists(String groupType, Integer batchIndex, String slotType, List tubes) { var slotIndexes = Map.of( diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 997974a..d9dfb2b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -32,4 +32,5 @@ mqtt-broker: transbot-topic : "transbot" app : - errorSlotIndex : 4 \ No newline at end of file + errorSlotIndex : 4 + liquidPeristalticPumpPipeSetupEnable : true \ No newline at end of file diff --git a/web b/web index 2b86529..bdddf3e 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 2b865293c1311ba5bcefddcb1df3ac83a97799ef +Subproject commit bdddf3ebad65ae4cccdf4d01b7ee9fb6b57c8965