PLSR(脉冲输出指令)系统是基于STM32 HAL库和UCOSII实时操作系统的多段脉冲输出控制系统,兼容信捷PLC的PLSR指令规范。系统支持10段独立配置的脉冲输出,每段可设置不同的频率、脉冲数、加减速算法和等待条件。
typedef struct {
PLSR_WaitType_t wait_type; // 等待条件类型
uint32_t wait_time_ms; // 等待时间(ms)
uint32_t act_time_ms; // ACT时间(ms)
uint8_t condition_flag; // 条件标志
uint8_t ext_event_flag; // 外部事件标志
} PLSR_WaitCondition_t;
typedef struct {
uint32_t accel_time_ms; // 加速时间(ms)
uint32_t decel_time_ms; // 减速时间(ms)
PLSR_AccelAlgorithm_t accel_algorithm; // 加减速算法
} PLSR_AccelConfig_t;
typedef struct {
uint8_t section_num; // 段号(1-10)
uint32_t target_freq; // 目标频率(Hz)
uint32_t target_pulse; // 目标脉冲数
uint8_t next_section; // 下一段号(0表示结束)
PLSR_SectionState_t section_state; // 段状态
PLSR_AccelConfig_t accel_config; // 加减速配置
PLSR_WaitCondition_t wait_condition; // 等待条件
} PLSR_SectionConfig_t;
typedef struct {
PLSR_RouteState_t route_state; // 路径状态
uint8_t current_section_num; // 当前段号
uint32_t current_freq; // 当前频率
uint32_t target_freq; // 目标频率
uint32_t pulse_count; // 当前脉冲计数
uint32_t start_freq; // 起始频率
uint32_t end_freq; // 结束频率
uint8_t output_port; // 输出端口选择
PLSR_Mode_t mode; // 模式(相对/绝对)
PLSR_Direction_t direction; // 方向
// 运行状态参数
PLSR_RunState_t run_state; // 运行状态
uint32_t accel_step_count; // 加速步数计数
uint32_t decel_step_count; // 减速步数计数
uint32_t const_pulse_count; // 匀速脉冲计数
uint32_t freq_step; // 频率步长
uint32_t wait_start_tick; // 等待开始时间
uint32_t act_start_tick; // ACT开始时间
PLSR_SectionConfig_t section[PLSR_MAX_SECTIONS]; // 段配置数组
} PLSR_RouteConfig_t;
PLSR_SetSectionCondition()
设置PLSR_SetExtEvent()
设置// 初始化PWM和计数器
PLSR_PWM_Init();
// 配置TIM6更新频率(微秒)
PLSR_TIM6_SetUpdateFreq(1000); // 1ms更新频率
// 初始化路径配置
PLSR_Route_Init(&g_plsr_route);
// 设置基本参数
g_plsr_route.start_freq = 1000; // 起始频率1kHz
g_plsr_route.end_freq = 0; // 结束频率0Hz
g_plsr_route.mode = PLSR_MODE_RELATIVE; // 相对模式
g_plsr_route.direction = PLSR_DIR_FORWARD; // 正向
// 配置第1段
g_plsr_route.section[0].target_freq = 5000; // 目标频率5kHz
g_plsr_route.section[0].target_pulse = 10000; // 目标脉冲10000个
g_plsr_route.section[0].next_section = 2; // 下一段为第2段
g_plsr_route.section[0].accel_config.accel_time_ms = 2000; // 加速时间2s
g_plsr_route.section[0].accel_config.decel_time_ms = 1500; // 减速时间1.5s
g_plsr_route.section[0].accel_config.accel_algorithm = PLSR_ACCEL_CURVE; // S曲线
g_plsr_route.section[0].wait_condition.wait_type = PLSR_WAIT_PLUSEEND; // 脉冲结束切换
// 配置第2段
g_plsr_route.section[1].target_freq = 3000; // 目标频率3kHz
g_plsr_route.section[1].target_pulse = 5000; // 目标脉冲5000个
g_plsr_route.section[1].next_section = 0; // 结束(下一段为0)
g_plsr_route.section[1].wait_condition.wait_type = PLSR_WAIT_TIME;
g_plsr_route.section[1].wait_condition.wait_time_ms = 500; // 等待500ms
// 启动路径执行
PLSR_Route_Start(&g_plsr_route);
// 检查运行状态
if (PLSR_Route_IsRunning(&g_plsr_route)) {
// 路径正在执行
}
// 设置外部事件
PLSR_SetExtEvent(1);
// 设置段条件标志
PLSR_SetSectionCondition(&g_plsr_route, 2, 1);
// 获取当前脉冲计数
uint32_t current_pulse = PLSR_Counter_GetCount();
// 获取当前PWM频率
uint32_t current_freq = PLSR_PWM_GetFrequency();
// 停止路径执行
PLSR_Route_Stop(&g_plsr_route);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM6) {
// PLSR路径控制处理
PLSR_Route_Process(&g_plsr_route);
// 系统时钟递增
g_plsr_system_tick++;
}
}
// 获取系统时钟
uint32_t tick = PLSR_GetSystemTick();
// 获取当前段号
uint8_t section = g_plsr_route.current_section_num;
// 获取运行状态
PLSR_RunState_t state = g_plsr_route.run_state;
// 获取脉冲计数
uint32_t pulse = g_plsr_route.pulse_count;
A: 检查TIM6更新频率设置,建议不要设置过快
A: 检查next_section设置和等待条件配置
A: 调整加减速时间或选择合适的算法
A: 确认外部事件标志设置正确
如有技术问题,请检查:
注意: 本文档基于重构后的PLSR系统V2.0版本,与之前版本不兼容。使用前请仔细阅读并理解各个功能模块的工作原理。