diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..4c41736 --- /dev/null +++ b/.clang-format @@ -0,0 +1,9 @@ +# Defines the Chromium style for automatic reformatting. +# http://clang.llvm.org/docs/ClangFormatStyleOptions.html +Language: Cpp +BasedOnStyle: Google +ColumnLimit: 300 +AlignConsecutiveMacros: true +AlignConsecutiveDeclarations: true +AlignConsecutiveAssignments: true +AlignOperands: true \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a95cf63 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "a8000_protocol"] + path = a8000_protocol + url = zwsd@192.168.1.3:project_boditech_vidas_a8000_v3/a8000_protocol.git diff --git a/a8000_protocol b/a8000_protocol new file mode 160000 index 0000000..5081899 --- /dev/null +++ b/a8000_protocol @@ -0,0 +1 @@ +Subproject commit 5081899a39cbbfca1beb5da571b1df2f0ce46789 diff --git a/src/main/java/a8k/service/db/dao/ModulerParameterDao.java b/src/main/java/a8k/service/db/dao/ModulerParameterDao.java new file mode 100644 index 0000000..e12796b --- /dev/null +++ b/src/main/java/a8k/service/db/dao/ModulerParameterDao.java @@ -0,0 +1,17 @@ +package a8k.service.db.dao; + +import a8k.service.db.entity.ModuleParameter; + +import com.iflytop.uf.UfActiveRecord; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +public class ModulerParameterDao { + ModuleParameter getMotorParameter(int mid) { + var param = UfActiveRecord.findOne(ModuleParameter.class, Map.of("mid", mid)); + assert param != null; + return param; + } +} diff --git a/src/main/java/a8k/service/db/dao/MotorParameterDao.java b/src/main/java/a8k/service/db/dao/MotorParameterDao.java index 7518855..6eb1d29 100644 --- a/src/main/java/a8k/service/db/dao/MotorParameterDao.java +++ b/src/main/java/a8k/service/db/dao/MotorParameterDao.java @@ -1,6 +1,6 @@ package a8k.service.db.dao; -import a8k.service.db.entity.MotorParameter; +import a8k.service.db.entity.ModuleParameter; import com.iflytop.uf.UfActiveRecord; import org.springframework.stereotype.Component; @@ -9,8 +9,8 @@ import java.util.Map; @Component public class MotorParameterDao { - public MotorParameter getMotorParameter(int mid) { - var param = UfActiveRecord.findOne(MotorParameter.class, Map.of("mid", mid)); + public ModuleParameter getMotorParameter(int mid) { + var param = UfActiveRecord.findOne(ModuleParameter.class, Map.of("mid", mid)); assert param != null; return param; } diff --git a/src/main/java/a8k/service/db/entity/A8kTubeInfo.java b/src/main/java/a8k/service/db/entity/A8kTubeInfo.java index bed60a4..09ff0be 100644 --- a/src/main/java/a8k/service/db/entity/A8kTubeInfo.java +++ b/src/main/java/a8k/service/db/entity/A8kTubeInfo.java @@ -15,17 +15,21 @@ public class A8kTubeInfo extends UfActiveRecord { @UfActiveRecordField public Integer tubeNum; //试管数量 @UfActiveRecordField - public Double tubeSpacing; //试管之间的间隔 单位mm - @UfActiveRecordField - public Double tubeHight;//float mm 取试管帽高度(试管帽的下编研) - @UfActiveRecordField - public Double tubeHightWithCap;//float mm 取试管帽高度(试管帽的下编研) + public Double tubeSpacing; //试管之间的间隔 单位mm + + /** + * 摇匀模组使用 + */ @UfActiveRecordField - public String tubeCapHight;//试管帽高度 + public Double takeTubeCapPos;//float mm 取试管帽高度 + + /** + * Z轴使用 + */ @UfActiveRecordField - public Double sampleHeight;//float mm 取样高度 + public Double sampleBeginPos;//float mm 取样高度 @UfActiveRecordField - public Double sampleBottom;//float mm 取样低位 + public Double sampleEndPos;//float mm 取样低位 public static String getTableName() { return "A8kTubeInfo" + "Table"; diff --git a/src/main/java/a8k/service/db/entity/MotorParameter.java b/src/main/java/a8k/service/db/entity/ModuleParameter.java similarity index 66% rename from src/main/java/a8k/service/db/entity/MotorParameter.java rename to src/main/java/a8k/service/db/entity/ModuleParameter.java index c91e78a..70acb74 100644 --- a/src/main/java/a8k/service/db/entity/MotorParameter.java +++ b/src/main/java/a8k/service/db/entity/ModuleParameter.java @@ -3,7 +3,7 @@ package a8k.service.db.entity; import com.iflytop.uf.UfActiveRecord; import com.iflytop.uf.UfActiveRecordField; -public class MotorParameter extends UfActiveRecord { +public class ModuleParameter extends UfActiveRecord { @UfActiveRecordField Integer mid; //模块ID @@ -17,13 +17,17 @@ public class MotorParameter extends UfActiveRecord { public Integer moveToZeroOvertime;// 回零超时时间 @UfActiveRecordField + public Integer actionOvertime;// 执行动作的超时时间,该超时时间适用于当前模块在当前产品中所有动作的最大时间。 + + @UfActiveRecordField Integer defaultVelocity; //默认速度 @UfActiveRecordField Integer backToZeroVelocity; //回零速度 @UfActiveRecordField - Integer loseStepWarningJudgeDistance; //丢步异常警告距离 + public Integer loseStepWarningJudgeDistance; //丢步异常警告距离 + public static String getTableName() { return "MotorParameter" + "Table"; } diff --git a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java index c1307b8..5586533 100644 --- a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java +++ b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java @@ -1,5 +1,4 @@ package a8k.service.hardware; - import a8k.a8k_can_protocol.CmdId; import a8k.a8k_can_protocol.Errorcode; import a8k.a8k_can_protocol.ModuleId; @@ -9,6 +8,7 @@ import a8k.base_hardware.A8kCanBusService; import a8k.service.db.dao.A8kDirectCtrlPosDao; import a8k.service.db.dao.A8kTubeInfoDao; import a8k.service.db.dao.MotorParameterDao; +import a8k.service.db.entity.A8kDirectCtrlPos; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -51,6 +51,7 @@ public class MotorTubeRackMoveCtrlService { @Resource private A8kCanBusService a8kCanBusService; + // // 电机基础控制 // @@ -61,20 +62,29 @@ public class MotorTubeRackMoveCtrlService { public void moveToZero() throws HardwareException, InterruptedException { - this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{0}, 30*1000); - var motorParams = this.motorParameterDao.getMotorParameter(ModuleId.MotorTubeRackMoveModule); + + var beforePosResponse = this.a8kCanBusService.callcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_read_pos, new Integer[]{0}); + var beforePos = beforePosResponse.getContentI32(0); this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to_zero, new Integer[]{}, motorParams.moveToZeroOvertime); + var afterPosResponse = this.a8kCanBusService.callcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_read_pos, new Integer[]{0}); + var afterPos = afterPosResponse.getContentI32(0); + var distance = beforePos - afterPos; var response = this.a8kCanBusService.callcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kmodule_get_reg, new Integer[]{RegIndex.kreg_step_motor_dpos}); var dval = response.getContentI32(0); - if ( dval > MotorTubeRackMoveCtrlService.MOVE_TO_ZERO_MAX_DPOS ) { + if ( Math.abs(dval - distance) > motorParams.loseStepWarningJudgeDistance ) { throw new HardwareException(ModuleId.MotorTubeRackMoveModule, Errorcode.kstep_motor_lost_step); } //先通过move_to 指令移动到零点 //再通过 move_to_zero 进行归零(设置超时时间),超时时间,来源MotorParameterDao //最后读取 寄存器dval,判断move_to_zero移动了多少距离,如果dval过大,则抛出电机丢步异常。 + //1.记录运行前电机所在位置 + //2.使用move_to_zero移动到零点 + //3.读取电机运行完成后所在的位置 + //4.比较dpos和上面两个位置的差值 相差多少,如果超过2mm,即超过20则认为发生过阻转。 + } @@ -130,6 +140,12 @@ public class MotorTubeRackMoveCtrlService { * @param tubeIndex */ public void moveTubeToScanPos(String tubeType, Integer tubeIndex) { + var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); + var startPosInfo = this.directCtrlPosTableDao.getPos(A8kDirectCtrlPosDao.MotorTubeRackMotor_tubeScanPos); + var scanPos = startPosInfo.posX + tubeIndex * tubeInfo.tubeSpacing; + + var motorParams = this.motorParameterDao.getMotorParameter(ModuleId.MotorTubeRackMoveModule); + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{scanPos}, motorParams.actionOvertime); } /**