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