add function

This commit is contained in:
CSSC-WORK\murmur 2024-12-23 15:52:28 +08:00
parent dee9ff6204
commit 4e8fd78421
2 changed files with 205 additions and 52 deletions

View File

@ -11,6 +11,8 @@ DeviceStatus deviceStatus = {
.initStatus = 1
};
uint8_t isValveMovingBackToOrigin = 0;
DeviceParam dp = {
.pump = {
{"pump1", 4, 60, 100, 100},
@ -176,8 +178,9 @@ void updateInitStatus(InitStatus_t status) {
*
* @param txBuf
* @param txLen
* @return 0: :
*/
void writeCMD(uint8_t *txBuf, uint16_t txLen) {
static uint8_t writeCMD(uint8_t *txBuf, uint16_t txLen) {
printf("writeCMD: ");
for(uint16_t i = 0; i < txLen; i++) {
printf("%02X ", txBuf[i]);
@ -189,7 +192,7 @@ void writeCMD(uint8_t *txBuf, uint16_t txLen) {
transDataToMotorValve(txBuf, txLen);
uint8_t rxBuf[30] = {0};
uint16_t rxLen = txLen;
uint8_t rst = HAL_UART_Receive(&huart2, rxBuf, rxLen, 50);
uint8_t rst = HAL_UART_Receive(&huart2, rxBuf, rxLen, READ_ACK_TIMEOUT);
if(memcmp(rxBuf, txBuf, 2) != 0) {
log_e("writeCMD error");
printf("%d readCMD: ", rst);
@ -197,7 +200,9 @@ void writeCMD(uint8_t *txBuf, uint16_t txLen) {
printf("%02X ", rxBuf[i]);
}
printf("\r\n");
return 1;
}
return 0;
}
/**
@ -210,7 +215,7 @@ void writeCMD(uint8_t *txBuf, uint16_t txLen) {
void sendMsgToHost(uint8_t *txBuf, uint16_t txLen) {
// 发送数据
// HAL_UART_Transmit_DMA(&huart1, txBuf, txLen);
// transDataToHost(txBuf, txLen);
transDataToHost(txBuf, txLen);
}
@ -270,12 +275,12 @@ uint16_t ReadPump1Reg(uint8_t index, uint16_t reg) {
writeCMD(data, 8);
uint8_t rxBuf[30] = {0};
uint16_t rxLen = 8;
uint8_t rst = HAL_UART_Receive(&huart2, rxBuf, rxLen, 50);
uint8_t rst = HAL_UART_Receive(&huart2, rxBuf, rxLen, READ_ACK_TIMEOUT);
return rxBuf[3]<<8|rxBuf[4];
}
uint8_t ReadPump2Reg(uint8_t index, uint16_t reg) {
uint8_t data[8] = {0};
uint32_t ReadPump2Reg(uint8_t index, uint16_t reg) {
uint8_t data[12] = {0};
data[0] = index;
data[1] = RTU_FUNC_READ_HOLD_REG;
FillBigEndian16(&data[2], reg);
@ -285,7 +290,12 @@ uint8_t ReadPump2Reg(uint8_t index, uint16_t reg) {
// 小端序填充
memcpy(&data[6], &crc, 2);
writeCMD(data, 8);
writeCMD(data, 12);
uint8_t rxBuf[30] = {0};
uint16_t rxLen = 12;
uint8_t rst = HAL_UART_Receive(&huart2, rxBuf, rxLen, READ_ACK_TIMEOUT*2);
// 逻辑需进一步完善
return rxBuf[6]<<24|rxBuf[7]<<16|rxBuf[8]<<8|rxBuf[9];
}
/*
@ -307,7 +317,7 @@ uint8_t WritePump1Reg(uint8_t id, uint16_t reg, int16_t value) {
// 小端序填充
memcpy(&data[6], &crc, 2);
writeCMD(data, 8);
return writeCMD(data, 8);
}
/*
@ -331,7 +341,7 @@ uint8_t WritePump2Reg(uint8_t id , uint16_t reg, int32_t value) {
// 小端序填充
memcpy(&data[11], &crc, 2);
writeCMD(data, 13);
return writeCMD(data, 13);
}
/*
@ -354,7 +364,7 @@ uint8_t WritePump2Reg(uint8_t id , uint16_t reg, int32_t value) {
* @return 0: :
*/
static uint8_t SetPumpJogAcc(uint8_t index, uint16_t acc) {
WritePump1Reg(index, RTU_PUMP_CMD_JA, acc*PUMP_ACCEL_RPS);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_JA, acc*PUMP_ACCEL_RPS);
}
/**
@ -365,7 +375,7 @@ static uint8_t SetPumpJogAcc(uint8_t index, uint16_t acc) {
* @return 0: :
*/
static uint8_t SetPumpJogDec(uint8_t index, uint16_t dec) {
WritePump1Reg(index, RTU_PUMP_CMD_JL, dec*PUMP_DECEL_RPS);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_JL, dec*PUMP_DECEL_RPS);
}
/**
@ -376,14 +386,14 @@ static uint8_t SetPumpJogDec(uint8_t index, uint16_t dec) {
* @return 0: :
*/
static uint8_t SetPumpJogSpeed(uint8_t index, uint16_t speed) {
WritePump1Reg(index, RTU_PUMP_CMD_JS, speed*PUMP_SPEED_RPS);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_JS, speed*PUMP_SPEED_RPS);
}
// Jog=慢跑
// CJ=start jogging
// 写入命令操作码寄存器(40125)数据0x0096(CJ)即执行启动Jog控制
static uint8_t StartPumpJog(uint8_t index) {
WritePump1Reg(index, RTU_PUMP_CMD_CO, 0x0096);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_CO, 0x0096);
}
// SJ=stop jogging
@ -391,7 +401,7 @@ static uint8_t StartPumpJog(uint8_t index) {
// CJ与SJ一一对应单次SJ无法停止所有全部CJ
// 直接停止泵需要使用SK命令
static uint8_t StopPumpJog(uint8_t index) {
WritePump1Reg(index, RTU_PUMP_CMD_CO, 0x00D8);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_CO, 0x00D8);
}
/*
@ -415,7 +425,7 @@ static uint8_t StopPumpJog(uint8_t index) {
* @return 0: :
*/
static uint8_t SetPumpStepAcc(uint8_t index, uint16_t acc) {
WritePump1Reg(index, RTU_PUMP_CMD_AC, acc*PUMP_ACCEL_RPS);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_AC, acc*PUMP_ACCEL_RPS);
}
/**
*
@ -425,7 +435,7 @@ static uint8_t SetPumpStepAcc(uint8_t index, uint16_t acc) {
* @return 0: :
*/
static uint8_t SetPumpStepDec(uint8_t index, uint16_t dec) {
WritePump1Reg(index, RTU_PUMP_CMD_DE, dec*PUMP_DECEL_RPS);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_DE, dec*PUMP_DECEL_RPS);
}
/**
*
@ -438,8 +448,7 @@ static uint8_t SetPumpStepDec(uint8_t index, uint16_t dec) {
static uint8_t SetPumpStepSpeed(uint8_t index, uint16_t speed) {
// 速度类寄存器参数设定值单位为 1/240 rps
speed = speed * PUMP_SPEED_RPS;
WritePump1Reg(index, RTU_PUMP_CMD_VE, speed);
return 0;
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_VE, speed);
}
/**
*
@ -449,7 +458,7 @@ static uint8_t SetPumpStepSpeed(uint8_t index, uint16_t speed) {
* @return 0: :
*/
static uint8_t SetPumpStepTarget(uint8_t index, int32_t target) {
WritePump2Reg(dp.pump[index].id, RTU_PUMP_CMD_DI, target);
return WritePump2Reg(dp.pump[index].id, RTU_PUMP_CMD_DI, target);
}
/**
@ -460,7 +469,7 @@ static uint8_t SetPumpStepTarget(uint8_t index, int32_t target) {
* @return 0: :
*/
static uint8_t StartPumpRelativeMove(uint8_t index) {
WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_CO, 0x0066);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_CO, 0x0066);
}
/**
@ -471,7 +480,7 @@ static uint8_t StartPumpRelativeMove(uint8_t index) {
* @return 0: :
*/
static uint8_t StartPumpAbsoluteMove(uint8_t index) {
WritePump1Reg(index, RTU_PUMP_CMD_CO, 0x0067);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_CO, 0x0067);
}
/**
@ -482,7 +491,7 @@ static uint8_t StartPumpAbsoluteMove(uint8_t index) {
* @return 0: :
*/
static uint8_t StopPump(uint8_t index) {
WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_CO, 0x00E1);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_CO, 0x00E1);
}
/**
@ -492,7 +501,7 @@ static uint8_t StopPump(uint8_t index) {
* @return 0: :
*/
uint8_t ReadPumpHWReg(uint8_t index) {
ReadPump1Reg(index, RTU_PUMP_CMD_HW);
return ReadPump1Reg(dp.pump[index].id, RTU_PUMP_CMD_HW);
}
/**
*
@ -502,7 +511,7 @@ uint8_t ReadPumpHWReg(uint8_t index) {
* @return 0: :
*/
uint8_t SetPumpBR(uint8_t index, uint16_t br) {
WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_BR, br);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_BR, br);
}
/**
*
@ -512,7 +521,7 @@ uint8_t SetPumpBR(uint8_t index, uint16_t br) {
* @return 0: :
*/
uint8_t SetPumpPR(uint8_t index, uint16_t pr) {
WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_PR, pr);
return WritePump1Reg(dp.pump[index].id, RTU_PUMP_CMD_PR, pr);
}
/**
@ -618,19 +627,20 @@ void UpdatePumpStatus() {
uint8_t InitPump(void) {
// 初始化泵
log_e("InitPump");
SetPumpJogAcc(dp.pump[0].id, dp.pump[0].maxAccel);
SetPumpJogDec(dp.pump[0].id, dp.pump[0].maxDecel);
SetPumpJogSpeed(dp.pump[0].id, dp.pump[0].maxSpeed);
SetPumpStepAcc(dp.pump[0].id, dp.pump[0].maxAccel);
SetPumpStepDec(dp.pump[0].id, dp.pump[0].maxDecel);
SetPumpStepSpeed(dp.pump[0].id, dp.pump[0].maxSpeed);
uint8_t rst = 0;
rst |= SetPumpJogAcc(dp.pump[0].id, dp.pump[0].maxAccel);
rst |= SetPumpJogDec(dp.pump[0].id, dp.pump[0].maxDecel);
rst |= SetPumpJogSpeed(dp.pump[0].id, dp.pump[0].maxSpeed);
rst |= SetPumpStepAcc(dp.pump[0].id, dp.pump[0].maxAccel);
rst |= SetPumpStepDec(dp.pump[0].id, dp.pump[0].maxDecel);
rst |= SetPumpStepSpeed(dp.pump[0].id, dp.pump[0].maxSpeed);
SetPumpJogAcc(dp.pump[1].id, dp.pump[1].maxAccel);
SetPumpJogDec(dp.pump[1].id, dp.pump[1].maxDecel);
SetPumpJogSpeed(dp.pump[1].id, dp.pump[1].maxSpeed);
SetPumpStepAcc(dp.pump[1].id, dp.pump[1].maxAccel);
SetPumpStepDec(dp.pump[1].id, dp.pump[1].maxDecel);
SetPumpStepSpeed(dp.pump[1].id, dp.pump[1].maxSpeed);
rst |= SetPumpJogAcc(dp.pump[1].id, dp.pump[1].maxAccel);
rst |= SetPumpJogDec(dp.pump[1].id, dp.pump[1].maxDecel);
rst |= SetPumpJogSpeed(dp.pump[1].id, dp.pump[1].maxSpeed);
rst |= SetPumpStepAcc(dp.pump[1].id, dp.pump[1].maxAccel);
rst |= SetPumpStepDec(dp.pump[1].id, dp.pump[1].maxDecel);
rst |= SetPumpStepSpeed(dp.pump[1].id, dp.pump[1].maxSpeed);
uint16_t reg4001 = ReadPumpAlarm(0);
DecodePumpAlarmMsg(reg4001);
@ -641,6 +651,8 @@ uint8_t InitPump(void) {
DecodePumpAlarmMsg(reg4001);
reg4002 = ReadPumpStatus(1);
DecodePumpStatusMsg(reg4002);
return rst;
}
@ -684,6 +696,60 @@ void (*writeValve2Reg)(uint8_t index, uint16_t reg, uint32_t value) = WritePump2
void (*readValve1Reg)(uint8_t index, uint16_t reg) = ReadPump1Reg;
void (*readValve2Reg)(uint8_t index, uint16_t reg) = ReadPump2Reg;
/**
* 1
*
* @param index
* @param reg
* @return
*/
uint16_t ReadValve1InputReg(uint8_t index, uint16_t reg)
{
uint8_t data[8] = {0};
data[0] = index;
data[1] = RTU_FUNC_READ_INPUT_REG;
FillBigEndian16(&data[2], reg);
FillBigEndian16(&data[4], 1);
uint16_t crc = CalculateCRC16(data, 6);
// 小端序填充
memcpy(&data[6], &crc, 2);
writeCMD(data, 8);
uint8_t rxBuf[30] = {0};
uint16_t rxLen = 8;
uint8_t rst = HAL_UART_Receive(&huart2, rxBuf, rxLen, READ_ACK_TIMEOUT);
return rxBuf[3]<<8|rxBuf[4];
}
/**
* 2
*
* @param index
* @param reg
* @return
*/
uint32_t ReadValve2InputReg(uint8_t index, uint16_t reg)
{
uint8_t data[8] = {0};
data[0] = index;
data[1] = RTU_FUNC_READ_INPUT_REG;
FillBigEndian16(&data[2], reg);
FillBigEndian16(&data[4], 2);
uint16_t crc = CalculateCRC16(data, 6);
// 小端序填充
memcpy(&data[6], &crc, 2);
writeCMD(data, 8);
uint8_t rxBuf[30] = {0};
uint16_t rxLen = 9;
uint8_t rst = HAL_UART_Receive(&huart2, rxBuf, rxLen, READ_ACK_TIMEOUT);
return rxBuf[3]<<24|rxBuf[4]<<16|rxBuf[5]<<8|rxBuf[6];
}
/**
*
*
@ -692,7 +758,7 @@ void (*readValve2Reg)(uint8_t index, uint16_t reg) = ReadPump2Reg;
* @return 0: :
*/
static uint8_t SetValveCOMMMode(uint8_t index, uint16_t mode) {
WritePump1Reg(dp.valve[index].id, RTU_VALVE_CMD_CTL_MODE, mode);
return WriteValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_CTL_MODE, mode);
}
/**
@ -703,7 +769,7 @@ static uint8_t SetValveCOMMMode(uint8_t index, uint16_t mode) {
* @return 0: :
*/
static uint8_t SetValveRunMode(uint8_t index, uint16_t mode) {
WritePump1Reg(dp.valve[index].id, RTU_VALVE_CMD_RUN_MODE, mode);
return WriteValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_RUN_MODE, mode);
}
// PP=轮廓位置模式
@ -715,7 +781,7 @@ static uint8_t SetValveRunMode(uint8_t index, uint16_t mode) {
* @return 0: :
*/
static uint8_t SetValvePPPos(uint8_t index, uint32_t pos) {
writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_PP_POS, pos);
return writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_PP_POS, pos);
}
/**
@ -726,7 +792,7 @@ static uint8_t SetValvePPPos(uint8_t index, uint32_t pos) {
* @return 0: :
*/
static uint8_t SetValvePPSpeed(uint8_t index, uint32_t speed) {
writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_PP_SPEED, speed);
return writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_PP_SPEED, speed);
}
/**
@ -737,7 +803,7 @@ static uint8_t SetValvePPSpeed(uint8_t index, uint32_t speed) {
* @return 0: :
*/
static uint8_t SetValvePPAcc(uint8_t index, uint32_t acc) {
writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_PP_ACCEL, acc);
return writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_PP_ACCEL, acc);
}
/**
@ -748,7 +814,7 @@ static uint8_t SetValvePPAcc(uint8_t index, uint32_t acc) {
* @return 0: :
*/
static uint8_t SetValvePPDec(uint8_t index, uint32_t dec) {
writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_PP_DECEL, dec);
return writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_PP_DECEL, dec);
}
// HM=原点回归模式
@ -760,7 +826,7 @@ static uint8_t SetValvePPDec(uint8_t index, uint32_t dec) {
* @return 0: :
*/
static uint8_t SetValveHomeDetectMode(uint8_t index, uint16_t mode) {
writeValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_MODE, mode);
return writeValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_MODE, mode);
}
/**
@ -771,7 +837,7 @@ static uint8_t SetValveHomeDetectMode(uint8_t index, uint16_t mode) {
* @return 0: :
*/
static uint8_t SetValveHomeSwtSpeed(uint8_t index, uint32_t speed) {
writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_SWT_SPEED, speed);
return writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_SWT_SPEED, speed);
}
/**
@ -782,7 +848,7 @@ static uint8_t SetValveHomeSwtSpeed(uint8_t index, uint32_t speed) {
* @return 0: :
*/
static uint8_t SetValveHomeOriSpeed(uint8_t index, uint32_t speed) {
writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_ORI_SPEED, speed);
return writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_ORI_SPEED, speed);
}
/**
@ -793,7 +859,7 @@ static uint8_t SetValveHomeOriSpeed(uint8_t index, uint32_t speed) {
* @return 0: :
*/
static uint8_t SetValveHomeAcc(uint8_t index, uint32_t acc) {
writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_ACCEL, acc);
return writeValve2Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_ACCEL, acc);
}
/**
@ -804,7 +870,7 @@ static uint8_t SetValveHomeAcc(uint8_t index, uint32_t acc) {
* @return 0: :
*/
static uint8_t SetValveFunc(uint8_t index, uint16_t func) {
writeValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_FUNC, func);
return writeValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_FUNC, func);
}
/**
@ -815,7 +881,7 @@ static uint8_t SetValveFunc(uint8_t index, uint16_t func) {
* @return 0: :
*/
static uint8_t SetValveHomeTorque(uint8_t index, uint16_t torque) {
writeValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_TORQUE, torque*10);
return writeValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_TORQUE, torque*10);
}
/**
@ -826,9 +892,54 @@ static uint8_t SetValveHomeTorque(uint8_t index, uint16_t torque) {
* @return 0: :
*/
static uint8_t SetValveHomeTime(uint8_t index, uint16_t time) {
writeValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_TIME, time*10);
return writeValve1Reg(dp.valve[index].id, RTU_VALVE_CMD_HOME_TIME, time*10);
}
/**
*
*
* @param index
* @return ()
*/
static uint32_t ReadValvePos(uint8_t index) {
return ReadValve2InputReg(index, RTU_VALVE_CMD_POS);
}
/**
*
* @return 0: 1: 2:
*/
static uint8_t valveCheckBTOResult(uint8_t index, uint32_t startTime)
{
static uint32_t ts = HAL_GetTick();
if (HAL_GetTick() - startTime > 1000*20) {
// 超时=失败
return 2;
}
uint16_t rst = ReadValve1InputReg(index,RTU_VALVE_CMD_SC);
// 如果原点回归完成状态字第12位会从0变为1
// 如果原点回归失败状态字第13位会从0变为1。
// 此外也可以附加判断电机当前位置是否在0附近的200个脉冲以内。
if(rst & 0x0001<<12) {
// 成功
uint32_t pos = ReadValvePos(index);
if(pos > 200 || pos < (VALVE_PULSE_PER_ROUND-200)) {
// 位置超出范围
return 2;
}
return 0;
}
if(rst & 0x0001<<13) {
// 失败
return 2;
}
// 运动中,未超时
return 1;
}
/**
*
*
@ -874,7 +985,7 @@ uint8_t ValveBackToOrigin(uint8_t index,uint8_t direction) {
* @param index
* @return 0: :
*/
uint8_t ValveRunInit(uint8_t index) {
uint8_t ValvePPInit(uint8_t index) {
printf("set mode to PP\r\n");
// 1.配置模式:
// 00B1h=0、运行模式 03C2h=0x01使设备工作在轮廓位置模式
@ -955,9 +1066,49 @@ void InitDeviceStatus() {
updateInitStatus(INIT_SUCCESS);
}
void updateValveStatus(uint8_t index)
{
// 检查是否回归成功
static uint32_t st = HAL_GetTick();
if (isValveMovingBackToOrigin)
{
uint8_t rst = valveCheckBTOResult(index,st);
switch (rst)
{
case 0:
log_i("BTO success!");
updateInitStatus(INIT_SUCCESS);
break;
case 1:
log_d("BTO moving...");
updateInitStatus(INIT_IN_PROGRESS);
break;
case 2:
log_e("BTO failure!!!");
updateInitStatus(INIT_FAILED);
default:
break;
}
}
else
{
st = HAL_GetTick();
}
// 获取实时角度
// 获取运动状态
}
// 初始化处理
static uint8_t HandleInit(void) {
// 实现初始化逻辑
// 1.更新状态为“初始化中”
// 2.执行初始化流程,按协议要求执行,不含默认的初始化内容
// 3.检查初始化结果,更新状态“成功”或“失败”
InitDeviceStatus();
return 1;
}
@ -1287,6 +1438,6 @@ void runValveDemo(void) {
// 阀门1正转120度
printf("ValveRunToAngle(0, 120)\n");
ValveRunInit(0);
ValvePPInit(0);
ValveRunToAngle(0, 120);
}

View File

@ -18,6 +18,7 @@
// 帧头帧尾定义
#define FRAME_HEADER 0xA55A5AA5
#define FRAME_TAIL 0x5AA5A55A
#define READ_ACK_TIMEOUT 50
// 功能码定义
#define HOST_CMD_STATUS_QUERY 0x0001 // 状态查询
@ -300,6 +301,7 @@ static const uint8_t statusInfo[16][60]={
#define RTU_VALVE_CMD_SC 0x0381 // 阀门运行状态
#define RTU_VALVE_CMD_AL 0x037F // 阀门运行告警
#define RTU_VALVE_CMD_POS 0x03C8 // 阀门运行位置,用户单位
#define RTU_VALVE_CMD_SPEED 0x03D0 // 阀门当前速度,用户单位/s
#define RTU_VALVE_CMD_HOME_MODE 0x0416 // 阀门原点回归方式
#define RTU_VALVE_CMD_HOME_SWT_SPEED 0x0417 // 阀门回归寻找开关的速度