diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java index 578d4d2..f34135a 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java @@ -148,6 +148,17 @@ public class DiDevice { return (String)((Map)config).get(lastKey); } + // get config + public T getConfig(String path, Class clazz) { + String[] parts = path.split("\\."); + Object config = this.config; + for ( int i=0; i)config).get(parts[i]); + } + String lastKey = parts[parts.length-1]; + return clazz.cast(((Map)config).get(lastKey)); + } + // execute device command protected DiCommandResponse call( DiCommand cmd, Integer mid, Object... args ) { DiCommandRequest request = null; diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceRegisterManager.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceRegisterManager.java index 6d51b83..8ace6af 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceRegisterManager.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceRegisterManager.java @@ -1,8 +1,14 @@ package com.my.graphiteDigesterBg.diframe; +import com.my.graphiteDigesterBg.diframe.connection.DiConSerialPort; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.HashMap; import java.util.List; import java.util.Map; public class DiDeviceRegisterManager { + // logger + public static final Logger LOG = LoggerFactory.getLogger(DiDeviceRegisterManager.class); // device instance private final DiDevice device; // id => actuator @@ -40,6 +46,7 @@ public class DiDeviceRegisterManager { public void resetAllByModuleId( Integer mid ) { for ( DiDeviceRegister register : this.registers.values() ) { if ( register.mid.equals(mid) ) { + LOG.info("[Register:${}] {}@{} = {}", register.key, register.index, register.mid, register.defaultValue); this.device.call(DiCommand.MODULE_SET_REG, register.mid, register.index, register.defaultValue); } } @@ -49,4 +56,10 @@ public class DiDeviceRegisterManager { public void get( String id ) { this.registers.get(id); } + + // get value + public Integer getValue(Integer mid, Integer index) { + DiCommandResponse response = this.device.call(DiCommand.MODULE_GET_REG, mid, index); + return response.readInteger(0); + } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/connection/DiConSerialPort.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/connection/DiConSerialPort.java index 09871d9..7a1e8d8 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/connection/DiConSerialPort.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/connection/DiConSerialPort.java @@ -43,12 +43,11 @@ public class DiConSerialPort implements DiDeviceConnection { @Override public void connect() { - Environment env = this.device.getEnv(); - String path = env.getProperty("device.connection.path"); + String path = this.device.getConfig("connection.path"); if ( null == path ) { throw new RuntimeException("device option 'device.connection.path' is required."); } - Integer baudRate = env.getProperty("device.connection.baudRate", Integer.class); + Integer baudRate = this.device.getConfig("connection.baudRate", Integer.class); if ( null == baudRate ) { throw new RuntimeException("device option 'device.connection.baudRate' is required."); } @@ -95,7 +94,7 @@ public class DiConSerialPort implements DiDeviceConnection { } }; this.receivedDataTimer = new Timer(); - Integer frameTimeout = this.device.getEnv().getProperty("device.connection.frameTimeout", Integer.class, 1000); + Integer frameTimeout = this.device.getConfig("connection.frameTimeout", Integer.class); this.receivedDataTimer.schedule(timerTask, frameTimeout); } @@ -133,7 +132,7 @@ public class DiConSerialPort implements DiDeviceConnection { } } if ( null == request ) { - throw new RuntimeException("unknown message id: " + messageId); + return ; // 可能是超时了, 已经被处理掉了 ~~~ } request.response = this.receivedData; request.isResponseReceived = true; @@ -149,6 +148,18 @@ public class DiConSerialPort implements DiDeviceConnection { byte[] data = request.parameter.array(); this.connection.writeBytes(data, data.length); LOG.info("Command => {} : [{}]", request.parameterText, DiByteBuffer.toHex(request.parameter)); + + // setup timeout timer + TimerTask callTimeoutTimerTask = new TimerTask() { + @Override + public void run() { + DiConSerialPort.this.handleCallTimeout(request); + } + }; + Timer callTimeoutTimer = new Timer(); + Integer callTimeout = this.device.getConfig("connection.callTimeout", Integer.class); + callTimeoutTimer.schedule(callTimeoutTimerTask, callTimeout); + synchronized ( request ) { try { request.wait(); @@ -158,4 +169,23 @@ public class DiConSerialPort implements DiDeviceConnection { } LOG.info("Command <= {}", DiByteBuffer.toHex(request.response)); } + + // handle call timeout + private void handleCallTimeout(DiCommandRequest request) { + if ( request.isResponseReceived ) { + return ; + } + request.timeoutCount ++; + if ( request.timeoutCount > 3 ) { + synchronized ( request ) { + request.errorCode = 8000; + request.notify(); + } + return ; + } + + byte[] data = request.parameter.array(); + this.connection.writeBytes(data, data.length); + LOG.info("Command (Retry:{}) => {} : [{}]", request.timeoutCount, request.parameterText, DiByteBuffer.toHex(request.parameter)); + } } 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 6fdfdad..6135465 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java @@ -37,6 +37,35 @@ public class TaskStartReset extends DiTaskBase { slot.coverOpen(); } + // 搬运机械臂左右移动初始化 + DiActMotor transLrMotor = this.getActuator(MyDevice.ACT_TRANSFER_LR_MOTOR, DiActMotor.class); + transLrMotor.setEnable(true); + registers.resetAllByModuleId(transLrMotor.getMid()); + transLrMotor.activeConfig(); + transLrMotor.reset(); + + // 搬运机械臂上下移动初始化 + DiActMotor transUdMotor = this.getActuator(MyDevice.ACT_TRANSFER_UD_MOTOR, DiActMotor.class); + transUdMotor.setEnable(true); + registers.resetAllByModuleId(transUdMotor.getMid()); + transUdMotor.activeConfig(); + transUdMotor.reset(); + + // 加液转盘 + DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); + liquidPlateMotor.setEnable(true); + registers.resetAllByModuleId(liquidPlateMotor.getMid()); + liquidPlateMotor.activeConfig(); + liquidPlateMotor.reset(); + + // 加热盘转盘 + DiActMotor heatPlateMotor = this.getActuator(MyDevice.ACT_HEAT_PLATE_MOTOR, DiActMotor.class); + heatPlateMotor.setEnable(true); + registers.resetAllByModuleId(heatPlateMotor.getMid()); + heatPlateMotor.activeConfig(); + heatPlateMotor.reset(); + + // this.setStatus(TaskStatus.FINISHED); } } diff --git a/src/src/main/resources/device.yml b/src/src/main/resources/device.yml index d6f4bf3..bdd5bd7 100644 --- a/src/src/main/resources/device.yml +++ b/src/src/main/resources/device.yml @@ -2,7 +2,8 @@ connection : class : com.my.graphiteDigesterBg.diframe.connection.DiConSerialPort path : COM7 baudRate : 921600 - frameTimeout : 1000 + frameTimeout : 200 + callTimeout : 5000 mode : binary # text | hex | binary # device registers registers : @@ -17,6 +18,60 @@ registers : - {key: "LiquidMotorRunToZeroDec" , mid : 41, index : 1074, defaultValue : 30} - {key: "LiquidMotorLookZeroEdgeSpeed" , mid : 41, index : 1075, defaultValue : 25} - {key: "LiquidMotorLookZeroEdgeDec" , mid : 41, index : 1076, defaultValue : 30} + - {key: "LiquidMotorStepMotorIHold" , mid: 41, index: 1058, defaultValue: 1 } + - {key: "LiquidMotorStepMotorIRun" , mid: 41, index: 1059, defaultValue: 2 } # 加热盘 Slot Cover - {key: "HeatingPlateSlot1CoverServeMotorDefaultVelocity" , mid : 12, index : 1054, defaultValue : 150} - - {key: "HeatingPlateSlot1CoverServeMotorDefaultTorque" , mid : 12, index : 1077, defaultValue : 330} \ No newline at end of file + - {key: "HeatingPlateSlot1CoverServeMotorDefaultTorque" , mid : 12, index : 1077, defaultValue : 330} + # 搬运机械臂左右 + - {key: "TransferArmLRMotorShaft" , mid : 31, index : 1051, defaultValue : 1} + - {key: "TransferArmLRMotorOneCirclePulse" , mid : 31, index : 1052, defaultValue : 10000} + - {key: "TransferArmLRMotorOneCirclePulseDenominator" , mid : 31, index : 1053, defaultValue : 18} + - {key: "TransferArmLRMotorDefaultVelocity" , mid : 31, index : 1054, defaultValue : 40} + - {key: "TransferArmLRMotorDefaultAcc" , mid : 31, index : 1055, defaultValue : 1} + - {key: "TransferArmLRMotorDefaultDec" , mid : 31, index : 1056, defaultValue : 1} + - {key: "TransferArmLRMotorRunToZeroSpeed" , mid : 31, index : 1073, defaultValue : 50} + - {key: "TransferArmLRMotorRunToZeroDec" , mid : 31, index : 1074, defaultValue : 30} + - {key: "TransferArmLRMotorLookZeroEdgeSpeed" , mid : 31, index : 1075, defaultValue : 25} + - {key: "TransferArmLRMotorLookZeroEdgeDec" , mid : 31, index : 1076, defaultValue : 30} + - {key: "TransferArmLRMotorStepMotorIHold" , mid : 31, index : 1058, defaultValue : 1} + - {key: "TransferArmLRMotorStepMotorIRun" , mid : 31, index : 1059, defaultValue : 2} + # 搬运机械臂上下 + - {key: "TransferArmUDMotorShaft" , mid : 21, index : 1051, defaultValue : 0} + - {key: "TransferArmUDMotorOneCirclePulse" , mid : 21, index : 1052, defaultValue : 40} + - {key: "TransferArmUDMotorOneCirclePulseDenominator" , mid : 21, index : 1053, defaultValue : 1} + - {key: "TransferArmUDMotorDefaultVelocity" , mid : 21, index : 1054, defaultValue : 300} + - {key: "TransferArmUDMotorDefaultAcc" , mid : 21, index : 1055, defaultValue : 100} + - {key: "TransferArmUDMotorDefaultDec" , mid : 21, index : 1056, defaultValue : 100} + - {key: "TransferArmUDMotorRunToZeroSpeed" , mid : 21, index : 1073, defaultValue : 50} + - {key: "TransferArmUDMotorRunToZeroDec" , mid : 21, index : 1074, defaultValue : 100} + - {key: "TransferArmUDMotorLookZeroEdgeSpeed" , mid : 21, index : 1075, defaultValue : 25} + - {key: "TransferArmUDMotorLookZeroEdgeDec" , mid : 21, index : 1076, defaultValue : 100} + - {key: "TransferArmUDMotorStepMotorIHold" , mid : 21, index : 1058, defaultValue : 1} + - {key: "TransferArmUDMotorStepMotorIRun" , mid : 21, index : 1059, defaultValue : 5} + # 加液转盘 + - {key: "LiquidPlateMotorShaft" , mid : 51, index : 1051, defaultValue : 1} + - {key: "LiquidPlateMotorOneCirclePulse" , mid : 51, index : 1052, defaultValue : 10000} + - {key: "LiquidPlateMotorOneCirclePulseDenominator" , mid : 51, index : 1053, defaultValue : 18} + - {key: "LiquidPlateMotorDefaultVelocity" , mid : 51, index : 1054, defaultValue : 40} + - {key: "LiquidPlateMotorDefaultAcc" , mid : 51, index : 1055, defaultValue : 2} + - {key: "LiquidPlateMotorDefaultDec" , mid : 51, index : 1056, defaultValue : 2} + - {key: "LiquidPlateMotorRunToZeroSpeed" , mid : 51, index : 1073, defaultValue : 50} + - {key: "LiquidPlateMotorRunToZeroDec" , mid : 51, index : 1074, defaultValue : 30} + - {key: "LiquidPlateMotorLookZeroEdgeSpeed" , mid : 51, index : 1075, defaultValue : 25} + - {key: "LiquidPlateMotorLookZeroEdgeDec" , mid : 51, index : 1076, defaultValue : 30} + - {key: "LiquidPlateMotorStepMotorIHold" , mid : 51, index : 1058, defaultValue : 1} + - {key: "LiquidPlateMotorStepMotorIRun" , mid : 51, index : 1059, defaultValue : 2} + # 加热盘 + - {key: "HeatingPlateMotorShaft" , mid : 11, index : 1051, defaultValue : 0} + - {key: "HeatingPlateMotorOneCirclePulse" , mid : 11, index : 1052, defaultValue : 10000} + - {key: "HeatingPlateMotorOneCirclePulseDenominator" , mid : 11, index : 1053, defaultValue : 30} + - {key: "HeatingPlateMotorDefaultVelocity" , mid : 11, index : 1054, defaultValue : 150} + - {key: "HeatingPlateMotorDefaultAcc" , mid : 11, index : 1055, defaultValue : 10} + - {key: "HeatingPlateMotorDefaultDec" , mid : 11, index : 1056, defaultValue : 10} + - {key: "HeatingPlateMotorRunToZeroSpeed" , mid : 11, index : 1073, defaultValue : 50} + - {key: "HeatingPlateMotorRunToZeroDec" , mid : 11, index : 1074, defaultValue : 30} + - {key: "HeatingPlateMotorLookZeroEdgeSpeed" , mid : 11, index : 1075, defaultValue : 25} + - {key: "HeatingPlateMotorLookZeroEdgeDec" , mid : 11, index : 1076, defaultValue : 30} + - {key: "HeatingPlateMotorStepMotorIHold" , mid : 11, index : 1058, defaultValue : 0} + - {key: "HeatingPlateMotorStepMotorIRun" , mid : 11, index : 1059, defaultValue : 15}