sige 1 year ago
parent
commit
e0f3c3c3ab
  1. BIN
      app.db
  2. 8
      src/main/java/com/iflytop/digester/StartResetTaskThread.java
  3. 5
      src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableInstance.java
  4. 7
      src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlot.java
  5. 41
      src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java
  6. 1
      src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java
  7. 16
      src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java
  8. 6
      src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbOption.java
  9. 7
      src/main/resources/application-dev.yml

BIN
app.db

8
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();

5
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 {
// // 执行加热
// }
}

7
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);
}
}

41
src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java

@ -40,34 +40,33 @@ public class LiquidAdditionInstance {
public void addLiquidToTubes(List<Integer> tubes, List<Integer> 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<String,Object> 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<String,Object> 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<String,Object> 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<String,Object> 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<Integer> tubes) {
var slotIndexes = Map.of(

1
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);

16
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);

6
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);
}
}

7
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

Loading…
Cancel
Save