1. 三菱FX3U源码移植实战:从理想丰满到现实骨感
最近在折腾三菱FX3U PLC的底层源码移植到STM32平台,整个过程就像在玩一个功能寻宝游戏——官方源码里标注着各种高级功能,但实际移植后却发现大部分都是"仅供参考"。作为一名有十年工控开发经验的工程师,我想把这次踩坑经历完整记录下来,给后来者提供一份真实参考。
先说说这个源码包的背景。三菱FX3U作为经典的小型PLC,其脉冲定位功能在自动化设备中应用广泛。官方提供的底层源码理论上支持运行时程序下载、注释读写以及PLSY/PWM/PLSR等高级脉冲指令,但实际移植到STM32F407平台后,这些高级功能集体"罢工",只剩下最基础的通信和IO控制还能正常工作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 源码功能解析与实际效果对比
2.1 脉冲输出功能的理想与现实
源码中最吸引人的就是各种脉冲输出指令的实现,包括:
- PLSY:固定频率脉冲输出
- PWM:脉宽调制输出
- PLSR:带加减速的脉冲序列
- DRVI/DRVA:相对/绝对定位指令
查看脉冲控制模块的代码结构,设计看起来相当专业:
c复制typedef struct {
uint16_t pulse_freq; // 脉冲频率Hz
uint32_t target_pos; // 目标位置脉冲数
uint8_t acc_time; // 加减速时间ms
uint8_t output_port; // 输出端口号
} PLSR_CTRL_BLOCK;
但实际移植后发现,PLSR指令的加减速算法完全是空壳:
c复制void PLSR_Handler(void) {
// 理论上的梯形加减速算法
if(ctrl_block.acc_time > 0) {
// 此处应有加速度计算...然而空空如也
}
TIM_SetCompare1(TIM3, ctrl_block.pulse_freq);
}
更严重的问题是定时器中断优先级配置不当。在stm32f4xx_it.c中,TIM3的中断优先级被设为1,而USART中断优先级是0,这会导致高速脉冲输出时被通信中断打断:
c复制// 错误的中断优先级配置
