10 changed files with 249 additions and 57 deletions
-
14src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java
-
12src/main/java/a8k/app/hardware/driver/OptModuleDriver.java
-
4src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java
-
64src/main/java/a8k/app/service/lowerctrl/TurnableMoveCtrlService.java
-
1src/main/java/a8k/app/service/param/optparam/OptModuleExtParamsMgr.java
-
17src/main/java/a8k/app/type/param/optpos/OptModuleExtParam.java
-
37src/main/java/a8k/app/utils/MinRotationAngle.java
-
104src/main/java/a8k/extui/page/driver/OptScannerCtrlPage.java
-
2src/main/resources/db/zapp_a8k_pos_parameter.csv
-
51src/main/resources/db/zapp_sub_module_reg_initial_value.csv
@ -0,0 +1,37 @@ |
|||||
|
package a8k.app.utils; |
||||
|
|
||||
|
public class MinRotationAngle { |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
// 示例输入 |
||||
|
int now = 350; |
||||
|
int target = -20; |
||||
|
|
||||
|
// 输出最快转动角度 |
||||
|
System.out.println(minRotationAngle(now,target,360)); // 输出 10 |
||||
|
} |
||||
|
|
||||
|
public static int minRotationAngle(int now,int target,int circleNum ) { |
||||
|
// 标准化位置,确保角度在 0 到 circleNum 之间 |
||||
|
target = target % circleNum; |
||||
|
now = now % circleNum; |
||||
|
|
||||
|
// 处理负数的情况,确保位置值在 0 到 circleNum 之间 |
||||
|
if (target < 0) target += circleNum; |
||||
|
if (now < 0) now += circleNum; |
||||
|
|
||||
|
// 计算顺时针和逆时针的差距 |
||||
|
int clockwise = (target - now) % circleNum; |
||||
|
if (clockwise < 0) clockwise += circleNum; // 确保差距为正值 |
||||
|
|
||||
|
int counterclockwise = (now - target) % circleNum; |
||||
|
if (counterclockwise < 0) counterclockwise += circleNum; // 确保差距为正值 |
||||
|
|
||||
|
// 判断并返回带方向的最小转动角度 |
||||
|
if (clockwise <= counterclockwise) { |
||||
|
return clockwise; // 顺时针方向 |
||||
|
} else { |
||||
|
return -counterclockwise; // 逆时针方向,返回负值 |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,104 @@ |
|||||
|
package a8k.extui.page.driver; |
||||
|
|
||||
|
import a8k.app.hardware.driver.OptModuleDriver; |
||||
|
import a8k.app.hardware.driver.StepMotorCtrlDriver; |
||||
|
import a8k.app.hardware.type.StepMotorMId; |
||||
|
import a8k.app.hardware.type.OptModuleRegIndex; |
||||
|
import a8k.app.type.exception.AppException; |
||||
|
import a8k.app.utils.ZJsonNode; |
||||
|
import a8k.extui.mgr.ExtApiPageMgr; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
@Slf4j |
||||
|
@RequiredArgsConstructor |
||||
|
public class OptScannerCtrlPage { |
||||
|
|
||||
|
final private OptModuleDriver optModuleDriver; |
||||
|
|
||||
|
|
||||
|
final private ExtApiPageMgr extApiPageMgr; |
||||
|
|
||||
|
StepMotorMId id = StepMotorMId.FeedingModXM; |
||||
|
Integer dpos = 10; |
||||
|
|
||||
|
|
||||
|
|
||||
|
public Object readAllRegs() throws AppException { |
||||
|
ZJsonNode node = new ZJsonNode(); |
||||
|
for (OptModuleRegIndex reg : OptModuleRegIndex.values()) { |
||||
|
try { |
||||
|
Integer val = optModuleDriver.getReg(reg); |
||||
|
node.get(reg.name()).set(val); |
||||
|
} catch (AppException e) { |
||||
|
node.get(reg.name()).set(e.getError().code); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
return node.get(); |
||||
|
} |
||||
|
|
||||
|
public void setReg(OptModuleRegIndex reg, Integer val) throws AppException { |
||||
|
optModuleDriver.setReg(reg, val); |
||||
|
} |
||||
|
|
||||
|
public void setStartAndStopVel(Integer v) throws AppException { |
||||
|
optModuleDriver.setReg(OptModuleRegIndex.kreg_a8k_opt_scan_vstart, v); |
||||
|
optModuleDriver.setReg(OptModuleRegIndex.kreg_a8k_opt_scan_vstop, v); |
||||
|
} |
||||
|
|
||||
|
public void setV1(Integer v) throws AppException { |
||||
|
optModuleDriver.setReg(OptModuleRegIndex.kreg_a8k_opt_scan_v1, v); |
||||
|
} |
||||
|
|
||||
|
public void setA1AndD1(Integer acc) throws AppException { |
||||
|
optModuleDriver.setReg(OptModuleRegIndex.kreg_a8k_opt_scan_a1, acc); |
||||
|
optModuleDriver.setReg(OptModuleRegIndex.kreg_a8k_opt_scan_d1, acc); |
||||
|
} |
||||
|
|
||||
|
public void setAmaxAndDmax(Integer acc) throws AppException { |
||||
|
optModuleDriver.setReg(OptModuleRegIndex.kreg_a8k_opt_scan_amax, acc); |
||||
|
optModuleDriver.setReg(OptModuleRegIndex.kreg_a8k_opt_scan_dmax, acc); |
||||
|
} |
||||
|
|
||||
|
public void setDefaultVel(Integer v) throws AppException { |
||||
|
optModuleDriver.setReg(OptModuleRegIndex.kreg_a8k_opt_scan_vdefault, v); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
public Integer readReg(OptModuleRegIndex reg) { |
||||
|
try { |
||||
|
return optModuleDriver.getReg(reg); |
||||
|
} catch (AppException e) { |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@PostConstruct |
||||
|
void init() { |
||||
|
var page = extApiPageMgr.newPage(this); |
||||
|
page.newGroup("寄存器配置"); |
||||
|
page.addFunction("设置起停速度", this::setStartAndStopVel).setParamVal("v", () -> readReg(OptModuleRegIndex.kreg_a8k_opt_scan_vstart)); |
||||
|
page.addFunction("设置V1", this::setV1).setParamVal("v", () -> readReg(OptModuleRegIndex.kreg_a8k_opt_scan_v1)); |
||||
|
page.addFunction("设置加速度", this::setA1AndD1).setParamVal("acc", () -> readReg(OptModuleRegIndex.kreg_a8k_opt_scan_a1)); |
||||
|
page.addFunction("设置最大加速度", this::setAmaxAndDmax).setParamVal("acc", () -> readReg(OptModuleRegIndex.kreg_a8k_opt_scan_amax)); |
||||
|
page.addFunction("设置默认速度", this::setDefaultVel).setParamVal("v", () -> readReg(OptModuleRegIndex.kreg_a8k_opt_scan_vdefault)); |
||||
|
|
||||
|
page.addFunction("设置寄存器", this::setReg); |
||||
|
page.addFunction("读取所有寄存器", this::readAllRegs); |
||||
|
|
||||
|
|
||||
|
|
||||
|
extApiPageMgr.addPage(page); |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue