diff --git a/app.db b/app.db index 18c4003..36558e4 100644 Binary files a/app.db and b/app.db differ diff --git a/src/main/java/com/iflytop/digester/StartResetTaskThread.java b/src/main/java/com/iflytop/digester/StartResetTaskThread.java index 21b7252..9fe1b9f 100644 --- a/src/main/java/com/iflytop/digester/StartResetTaskThread.java +++ b/src/main/java/com/iflytop/digester/StartResetTaskThread.java @@ -23,9 +23,15 @@ public class StartResetTaskThread extends Thread { var device = Device.getInstance(); device.setStatus("preparing"); this.setProgressMessage("设备初始化..."); -// + // UfCmdSnippetExecutor.execute("StartResetInitDevices"); +// // 加热盘初始化 +// UfCmdSnippetExecutor.execute("StartResetInitHeatingPlateMotor"); +// // 加液盘初始化 +// UfCmdSnippetExecutor.execute("StartResetInitLiquidPlateMotor"); +// // 加热位密封盖初始化 // this.setupHeatingSlotCover(); +// // 蠕动泵初始化 // this.setupPeristalticPump(); // if ( this.isErrorTubeRackRequired ) { // this.setupErrorTubeRack(); diff --git a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java index e209d46..ceb6ad5 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java @@ -63,9 +63,4 @@ public class HeatingTurntableInstance { 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 27dc55d..a05638e 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java @@ -1,4 +1,5 @@ package com.iflytop.digester.deviceinstance; +import com.iflytop.digester.underframework.UfActuatorCmdExecutor; import com.iflytop.digester.underframework.UfCmdSnippetExecutor; import java.util.ArrayList; @@ -76,6 +77,10 @@ public class HeatingTurntableSlot { // 刷新当前温度 public void refreshCurTemperature() { - + var actuatorKey = String.format("HeatingPlateSlotHeater.%d", this.index); + var commandKey = "holding_register_read"; + var commandParams = Integer.valueOf(0x2010).toString(); + String valString = UfActuatorCmdExecutor.execute(actuatorKey,commandKey, commandParams); + this.curTemperature = Integer.parseInt(valString); } } diff --git a/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java index 7b9355b..ddd3ac4 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java @@ -40,34 +40,33 @@ public class LiquidAdditionInstance { public void addLiquidToTubes(List tubes, List pumpIndexes, int volume ) { var pumpGroupOutIndex = pumpIndexes.get(0); var pumpGroupInIndex = pumpIndexes.get(1); + var type = liquids.get(pumpGroupOutIndex/2).type; + var rotateDistance = this.convertVolumeToPumpRotationDistance(type, volume); for ( int batchIndex=0; batchIndex<4; batchIndex++ ) { + // 外圈 UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.Out." + batchIndex); if ( this.checkTubeExists("GOUT", batchIndex, "TOUT", tubes) ) { - UfCmdSnippetExecutor.execute( - "LiquidAdditionPump" + pumpGroupOutIndex, - Map.of("volume", volume) - ); + var snippetKey = "LiquidAdditionPump." + pumpGroupOutIndex; + Map snippetParams = Map.of("volume", rotateDistance); + UfCmdSnippetExecutor.execute(snippetKey, snippetParams); } if ( this.checkTubeExists("GOUT", batchIndex, "TIN", tubes) ) { - UfCmdSnippetExecutor.execute( - "LiquidAdditionPump" + pumpGroupInIndex, - Map.of("volume", volume) - ); + var snippetKey = "LiquidAdditionPump." + pumpGroupInIndex; + Map snippetParams = Map.of("volume", rotateDistance); + UfCmdSnippetExecutor.execute(snippetKey, snippetParams); } - + // 内圈 UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.In." + batchIndex); if ( this.checkTubeExists("GIN", batchIndex, "TOUT", tubes) ) { - UfCmdSnippetExecutor.execute( - "LiquidAdditionPump" + pumpGroupOutIndex, - Map.of("volume", volume) - ); + var snippetKey = "LiquidAdditionPump." + pumpGroupOutIndex; + Map snippetParams = Map.of("volume", rotateDistance); + UfCmdSnippetExecutor.execute(snippetKey, snippetParams); } if ( this.checkTubeExists("GIN", batchIndex, "TIN", tubes) ) { - UfCmdSnippetExecutor.execute( - "LiquidAdditionPump" + pumpGroupInIndex, - Map.of("volume", volume) - ); + var snippetKey = "LiquidAdditionPump." + pumpGroupInIndex; + Map snippetParams = Map.of("volume", rotateDistance); + UfCmdSnippetExecutor.execute(snippetKey, snippetParams); } } @@ -80,6 +79,14 @@ public class LiquidAdditionInstance { this.addLiquidToTubes(tubes, pumpIndexes, volume); } + // 转换体积为蠕动泵旋转距离 + private Integer convertVolumeToPumpRotationDistance( String type, int volume ) { + var oneCirclePulse = 100; + var volumePerCircle = UfMdbOption.getDouble(String.format("PumpVolumePerCircle.%s",type), 1.0); + var circleCount = (int) (volume / volumePerCircle); + return circleCount * oneCirclePulse; + } + // 检查试管是否存在 private Boolean checkTubeExists(String groupType, Integer batchIndex, String slotType, List tubes) { var slotIndexes = Map.of( diff --git a/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java b/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java index b2ebc0c..00719d9 100644 --- a/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java +++ b/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java @@ -84,6 +84,7 @@ public class UfCmdSnippetExecutor { // 编译参数为模板 freemarker.template.Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); + cfg.setNumberFormat("0"); Template template = null; try { template = new Template("", cmdParams, cfg); diff --git a/src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java b/src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java index 525f7a9..3b2a4b5 100644 --- a/src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java +++ b/src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java @@ -52,10 +52,13 @@ public class UfZcancmderWebsocket extends UfConnectionBase { } @Override public void onClose(int i, String s, boolean b) { - UfZcancmderWebsocket.this.log("close"); + UfZcancmderWebsocket.this.handleOnClose(); } @Override public void onError(Exception e) { + if ( null == e ) { + e = new RuntimeException("unknown error"); + } UfZcancmderWebsocket.this.log(e.getMessage()); } }; @@ -156,7 +159,11 @@ public class UfZcancmderWebsocket extends UfConnectionBase { UfMdbActuator actuator = UfMdbActuator.findOne(UfMdbActuator.class, actuatorCmd.actuatorId); LOG.info("[Command-Executor:{}] {}({}) => {}", actuator.name, actuatorCmd.cmdKey, actuatorCmd.parameters, cmd); if ( !this.client.isOpen() ) { - throw new RuntimeException("ZCanCmder 连接已断开"); + try { + this.client.connectBlocking(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } } TimerTask task = new TimerTask() { @@ -208,6 +215,11 @@ public class UfZcancmderWebsocket extends UfConnectionBase { return cmd; } + // handle on close + public void handleOnClose() { + UfZcancmderWebsocket.this.log("close"); + } + // handle on text message private void handleOnTextMessage( String text ) { ByteBuffer message = TsByteBuffer.fromHex(text); diff --git a/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbOption.java b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbOption.java index fcff2fa..457702e 100644 --- a/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbOption.java +++ b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbOption.java @@ -28,4 +28,10 @@ public class UfMdbOption extends UfActiveRecord { var option = UfMdbOption.getString(key, defaultValue.toString()); return Integer.parseInt(option); } + + // get option + public static Double getDouble(String key, Double defaultValue ) { + var option = UfMdbOption.getString(key, defaultValue.toString()); + return Double.parseDouble(option); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 4447f9d..b2c3a9c 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -13,12 +13,13 @@ device: connections: - name : zcancmder key : zcancmder - enable : true + enable : false type : ZcancmderWebsocket - uri: ws://192.168.8.10:19005 +# uri: ws://192.168.8.10:19005 + uri : ws://127.0.0.1:19005 - name : modbus key : modbus - enable : false + enable : true type : ModbusRTUOverTCP host: 127.0.0.1 port: 502