From 8db8c95ddcd9dd3107f917e5d5c852ade85c610e Mon Sep 17 00:00:00 2001 From: sige Date: Thu, 18 Apr 2024 13:23:19 +0800 Subject: [PATCH] ~ --- app.db | Bin 348160 -> 360448 bytes .../com/iflytop/digester/DigestionTaskThread.java | 116 ++++++++++++++------- .../003a4049-43a8-4685-b725-0ef981a63d09.vsidx | Bin 22708 -> 0 bytes .../0c5d8c00-190b-4149-adea-d196cfb732c1.vsidx | Bin 49341 -> 0 bytes .../32a71717-b8c7-4106-8f15-99bbd922817c.vsidx | Bin 0 -> 22592 bytes .../3ffb981f-6afa-4d2f-a956-f6e71b0a3ff7.vsidx | Bin 0 -> 47973 bytes .../digester/camera/.vs/baslerCamera/v17/.suo | Bin 53760 -> 46592 bytes .../camera/.vs/baslerCamera/v17/Browse.VC.db | Bin 32145408 -> 32145408 bytes .../iflytop/digester/camera/DiComBaslerCamera.cpp | 2 +- .../digester/controller/CameraController.java | 29 +++++- .../digester/controller/TestController.java | 25 +++++ .../deviceinstance/LiquidAdditionInstance.java | 12 +++ .../deviceinstance/TransferRobotArmInstance.java | 6 +- .../digester/model/MdbDigestionSolution.java | 6 ++ .../digester/model/MdbDigestionTaskLog.java | 9 ++ .../connection/UfZcancmderWebsocket.java | 38 +++++-- src/main/resources/application-dev.yml | 2 +- web | 2 +- 18 files changed, 196 insertions(+), 51 deletions(-) delete mode 100644 src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/003a4049-43a8-4685-b725-0ef981a63d09.vsidx delete mode 100644 src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/0c5d8c00-190b-4149-adea-d196cfb732c1.vsidx create mode 100644 src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/32a71717-b8c7-4106-8f15-99bbd922817c.vsidx create mode 100644 src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/3ffb981f-6afa-4d2f-a956-f6e71b0a3ff7.vsidx create mode 100644 src/main/java/com/iflytop/digester/controller/TestController.java diff --git a/app.db b/app.db index b3fb896a990ea1c70104544decfcfcc644c439f6..8eeab885920241343b0c35d432d7080692cccda8 100644 GIT binary patch delta 10480 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 QZ$}Tq4t?^B#QCZJ0gQO!q5uE@ diff --git a/src/main/java/com/iflytop/digester/DigestionTaskThread.java b/src/main/java/com/iflytop/digester/DigestionTaskThread.java index 7eeecf9..d9efb9e 100644 --- a/src/main/java/com/iflytop/digester/DigestionTaskThread.java +++ b/src/main/java/com/iflytop/digester/DigestionTaskThread.java @@ -4,6 +4,7 @@ import com.iflytop.digester.model.MdbDigestionTask; import com.iflytop.digester.model.MdbDigestionSolution; import com.iflytop.digester.model.MdbDigestionTaskLog; import com.iflytop.digester.underframework.dao.model.UfMdbNotification; +import com.iflytop.digester.underframework.dao.model.UfMdbOption; import com.iflytop.digester.underframework.dao.record.UfActiveRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,14 +108,15 @@ public class DigestionTaskThread extends Thread { lastRound = rounds.remove(rounds.size() - 1); } - // 执行第一轮 - if ( null != firstRound ) { - this.executeRound(firstRound); - } - // 执行中间轮 - for (var round : rounds) { - this.executeRound(round); - } +// // 执行第一轮 +// if ( null != firstRound ) { +// this.updateTaskStatus("FirstRound", "执行第一轮配置"); +// this.executeRound(firstRound); +// } +// // 执行中间轮 +// for (var round : rounds) { +// this.executeRound(round); +// } // 执行最后一轮 if ( null != lastRound ) { this.executeLastRound(lastRound); @@ -224,6 +226,7 @@ public class DigestionTaskThread extends Thread { // 执行消解每轮配置 private void executeRound( MdbDigestionSolution.DigestionSolutionRound digestionRound ) throws InterruptedException { + this.updateTaskStatus("RoundStart", "配置轮次开始执行"); var device = Device.getInstance(); // 加液 @@ -232,6 +235,7 @@ public class DigestionTaskThread extends Thread { for ( var liquid : digestionRound.liquids ) { this.updateTaskStatus("Liquid", String.format("加液 %s %d", liquid.type, liquid.volume)); liquidAddition.addLiquidToTubes(tubes, liquid.type, liquid.volume); + liquidAddition.shake(digestionRound.shakingCount); } // 搬运到加热转盘 @@ -245,10 +249,12 @@ public class DigestionTaskThread extends Thread { // 移至加液区, 以便执行下一轮 device.transferArm.moveTubeRackToLiquidPlate(this.heatingSlot.index); + this.updateTaskStatus("RoundFinish", "配置轮次执行结束"); } // 执行消解最后一轮配置 private void executeLastRound( MdbDigestionSolution.DigestionSolutionRound digestionRound ) throws InterruptedException { + this.updateTaskStatus("LastRound", "执行最后一轮配置开始"); this.isPrecheckFinished = false; var device = Device.getInstance(); @@ -257,13 +263,15 @@ public class DigestionTaskThread extends Thread { for ( var heating : digestionRound.heatings ) { totalDurationCount += heating.duration; } - long preCheckDuration = totalDurationCount - 10; - if ( 0 >= preCheckDuration ) { - preCheckDuration = 0; + Integer preCheckTimeOption = UfMdbOption.getInteger("DigestionLastRoundPreCheckTime", 10); + long preCheckTime = totalDurationCount - preCheckTimeOption; + if ( 0 >= preCheckTime ) { + preCheckTime = 0; } var preCheckTimerTask = new TimerTask() { @Override public void run() { + DigestionTaskThread.this.updateTaskStatus("LastRoundPreCheck", "末轮预检查开始"); try { // 检查试管 DigestionTaskThread.this.tubeCheckAndMove(); @@ -275,17 +283,22 @@ public class DigestionTaskThread extends Thread { DigestionTaskThread.this.precheckLock.notifyAll(); } } catch (Exception e) { + DigestionTaskThread.this.updateTaskStatus("LastRoundPreCheck", String.format("末轮预检查异常: %s", e.getMessage())); throw new RuntimeException(e); + } finally { + DigestionTaskThread.this.updateTaskStatus("LastRoundPreCheck", "末轮预检查结束"); } } }; var preCheckTimer = new Timer(); - preCheckTimer.schedule(preCheckTimerTask, preCheckDuration * 60 * 1000); + this.updateTaskStatus("LastRound",String.format("预检将于%d秒后执行", preCheckTime * 60)); + preCheckTimer.schedule(preCheckTimerTask, preCheckTime * 60 * 1000); // 加热 for ( var heating : digestionRound.heatings ) { - this.updateTaskStatus("heating", String.format("加热 %d℃ %d分钟", heating.temperature, heating.duration)); + this.updateTaskStatus("Heating", String.format("加热 %d℃ %d分钟", heating.temperature, heating.duration)); this.heatingSlot.heating(heating.temperature, heating.duration); + this.updateTaskStatus("Heating", "加热完成"); } // 等待预检查完成 @@ -298,6 +311,7 @@ public class DigestionTaskThread extends Thread { throw new RuntimeException(e); } } + this.updateTaskStatus("PreCheckWait", "预检完成"); } // 加水定容 @@ -318,45 +332,73 @@ public class DigestionTaskThread extends Thread { // 释放加热位 this.heatingSlot.setTubeRackNo(null); } + this.updateTaskStatus("LastRound", "执行最后一轮配置结束"); } - // 执行消解异常处理配置 + /** + * 执行消解异常处理配置 + * @param errorRound - 异常处理配置 + * @throws InterruptedException - + */ private void executeErrorRound( MdbDigestionSolution.DigestionSolutionErrorRound errorRound ) throws InterruptedException { + String errorTubeIndexListStr = String.join(",", this.errorTubeIndexes.stream().map(Object::toString).toArray(String[]::new)); + this.updateTaskStatus("ErrorRound", String.format("异常轮次开始 : [%s]", errorTubeIndexListStr)); + var device = Device.getInstance(); + var errorSlot = device.heatingTurntable.getErrorSlot(); - // 移至加液区 - device.transferArm.moveTubeRackToLiquidPlate(this.heatingSlot.index); +// this.updateTaskStatus("ErrorRound", "移动异常试管架至加液区"); +// device.transferArm.moveTubeRackToLiquidPlate(errorSlot.index); +// +// var liquidAddition = device.liquidAddition; +// for ( var liquid : errorRound.liquids ) { +// this.updateTaskStatus("ErrorRoundLiquidAdd", String.format("异常加液 %s %d", liquid.type, liquid.volume)); +// liquidAddition.addLiquidToTubes(this.errorTubeIndexes, liquid.type, liquid.volume); +// } +// this.updateTaskStatus("ErrorRoundLiquidAdd", "异常摇匀"); +// liquidAddition.shake(errorRound.shakingCount); +// +// this.updateTaskStatus("ErrorRound", "移动异常试管架至加热区"); +// device.transferArm.moveTubeRackToHeatingTurntable(errorSlot.index); +// +// for ( var heating : errorRound.heatings ) { +// this.updateTaskStatus("ErrorRoundHeating", String.format("异常加热 %d℃ %d分钟", heating.temperature, heating.duration)); +// this.heatingSlot.heating(heating.temperature, heating.duration); +// } +// +// this.updateTaskStatus("ErrorRound", "移动异常试管架至加液区"); +// device.transferArm.moveTubeRackToLiquidPlate(errorSlot.index); - // 加液 - var liquidAddition = device.liquidAddition; - for ( var liquid : errorRound.liquids ) { - this.updateTaskStatus("liquid", String.format("异常加液 %s %d", liquid.type, liquid.volume)); - liquidAddition.addLiquidToTubes(this.errorTubeIndexes, liquid.type, liquid.volume); - } - - // 搬运到加热转盘 - device.transferArm.moveTubeRackToHeatingTurntable(this.heatingSlot.index); + // 拍照检查是否存在消解完成的试管 + this.takeShotAndCheckFinishedTubes(); - // 加热 - for ( var heating : errorRound.heatings ) { - this.updateTaskStatus("heating", String.format("异常加热 %d℃ %d分钟", heating.temperature, heating.duration)); - this.heatingSlot.heating(heating.temperature, heating.duration); + // 如果不存在消解完成的试管则本轮次结束 + if (this.finishedErrorTubeIndexes.isEmpty()) { + return ; } - // 移至加液区 - device.transferArm.moveTubeRackToLiquidPlate(this.heatingSlot.index); - // 拍照检查是否存在消解完成的试管 - this.takeShotAndCheckFinishedTubes(); - // 将试管架放入异常处理区域 - device.transferArm.moveTubeRackToHeatingTurntable(this.heatingSlot.index); +// this.updateTaskStatus("ErrorRound", "移动异常试管架至加热区"); +// device.transferArm.moveTubeRackToHeatingTurntable(errorSlot.index); + // 等待放入空试管架 + device.door.open(); this.waitForEmptyTubeRackPutIn(); - // 取出消解完成的试管 + device.door.close(); + + String finishedTubeIndexListStr = String.join(",", this.finishedErrorTubeIndexes.stream().map(Object::toString).toArray(String[]::new)); + this.updateTaskStatus("ErrorRound", String.format("取出消解完成的试管 : %s", finishedTubeIndexListStr)); device.transferArm.takeOutTubesFromErrorSlot(this.finishedErrorTubeIndexes); + // 等待取出试管架 + device.door.open(); this.waitForTubeRackTakeOut(); + device.door.close(); + // 更新异常试管索引列表 this.errorTubeIndexes.removeAll(this.finishedErrorTubeIndexes); + + String remainTubeIndexListStr = String.join(",", this.errorTubeIndexes.stream().map(Object::toString).toArray(String[]::new)); + this.updateTaskStatus("ErrorRound", String.format("异常轮次执行结束, 异常试管剩余 : [%s]", remainTubeIndexListStr)); } // 等待放入试管架 @@ -435,7 +477,7 @@ public class DigestionTaskThread extends Thread { } catch (InterruptedException e) { throw new RuntimeException(e); } - } + } // @TODO : 这里记录下试管索引 this.updateTaskStatus("TubeCheck", "异常试管已确认"); } diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/003a4049-43a8-4685-b725-0ef981a63d09.vsidx b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/003a4049-43a8-4685-b725-0ef981a63d09.vsidx deleted file mode 100644 index 19e646496cbfd8ca5236134789f085672af711b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22708 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 bB!mM)mP zq*|FvT0WJiSi0blti|Wz#k)`JJ8AyYh5s{EkC=1h;w6g?`dmd*x^wKHf%|L#s#YAn zbncRM>wDn+d-wU@wrb7%>O~8yTDe5`u}fNJPoBH<@CAoe%vsQ~bm>}ke(&ZPkNow2 z*{W-(x(@wXDLu7U^Z&Z4M-Cd$Tr+p};qyK{!Kx0QzhM80>cxwz7tC!rq+-FMd9C!+ z<+#pQEZ_To*{YwR>i!EBd|J2FQfFLn*@16tFsfE8nLB6x;<>Bo=;Tl8uij8poqOcs zwd?5ILqGWM?_S$5tU7~*U8*8CU#-{BjERo9sEt0}(iy;p81 zzPfn-bzAkcr5lU`9451VI?`(4I&3!4cIja)hs{0qhu3TnpS$Ti9~Q{uO;I z$XVqDSIs_q!%}rYg|?pym#(HJ3Qs+8gR|e^kPZt@1G>e^l4oVFXRs{IcCbQtLS)&`@h9|$YP z%wI6Ke*V(KDrYZUwBT^fu)~f#j9_))=07>{|88r&=A+A^*`N9F+UbMS{|}ddBj)rS z(7$5-=Pdr1RR8_>o>TtMRsFnuO4c;JdTqAq1%q+t<)MgtlHZ7!LAzdd_j&4P!l3y*PWl?fjxvp-tPi-V2gnUv!lu(7M3Tb&E zt&C*O`6T4r5%^q`zix|E&?`!Ql4zIeDUDV|>6_(rOrI2ynT1@gUX*iGS90Q|yQ33j zgzBp_cQ-$)fP}XyQ`{;Qve-m_laf*<=d?{5OSf`?xM*KYca$>owHnnS*R`S26xmI+ zqHAroNE>aP3LOyme*3gh5uHz#8QZ1e7HQ*7skm(_$R-`rvSQj&RXUTou}s~TTDtC{ zyPZ>;PL#