三菱FX3U底层源码,PLSR源码 总体功能和指令可能支持在RUN中下载程序,支持注释的写入和读取,有脉冲输出与定位指令(包括PLSY /PWM/PLSR/PLSV/DRVI /DRVA 等指令)的代码, 但实际上下载进stm32都不支持,仅支持些简单功能。 应该是部分代码被修改了。 仅供参考。 支持波特率9600/19200/38400/57600/11520
最近在折腾三菱FX3U的底层源码移植,发现了个有意思的现象:明明源码里写着支持PLSR这类高端定位指令,真烧录到STM32之后却像被阉割了似的。这事儿让我想起早些年某些国产PLC玩的"功能预告片"套路——参数表写得天花乱坠,实际跑起来就露馅。
先看这个脉冲输出控制块的伪代码:
typedef struct {
uint16_t pulse_freq; // 脉冲频率
uint32_t target_pos; // 目标位置
uint8_t acc_time; // 加减速时间
uint8_t output_port; // 输出端口
} PLSR_CTRL_BLOCK;
void PLSR_Handler(void) {
// 理论上的梯形加减速算法
if(ctrl_block.acc_time > 0) {
// 此处应有加速度计算...然而空空如也
}
TIM_SetCompare1(TIM3, ctrl_block.pulse_freq); // 定时器配置倒是健在
}
这段代码明显是个半成品,加减速部分的算法实现直接失踪。更坑的是定时器中断优先级配置里,脉冲通道的中断等级比通信中断低两级,这就导致高速脉冲时容易丢脉冲——好比用老年机跑4K视频,卡成PPT太正常了。
三菱FX3U底层源码,PLSR源码 总体功能和指令可能支持在RUN中下载程序,支持注释的写入和读取,有脉冲输出与定位指令(包括PLSY /PWM/PLSR/PLSV/DRVI /DRVA 等指令)的代码, 但实际上下载进stm32都不支持,仅支持些简单功能。 应该是部分代码被修改了。 仅供参考。 支持波特率9600/19200/38400/57600/11520
通信协议栈倒是挺完整,波特率配置表看着专业:
const uint32_t BAUD_TABLE[] = {
9600, // 0x00
19200, // 0x01
38400, // 0x02
57600, // 0x03
115200 // 0x04
};
但实测发现修改波特率需要冷启动才能生效,运行时切换直接通信瘫痪。底层USART初始化函数里藏着个魔鬼细节:
void USART_Init(void) {
// 此处省略300行...
if(FLASH_Read(0x0800FF00) != 0xAA55AA55) { // 冷启动标志检测
USART_DeInit(); // 强制复位串口
NVIC_SystemReset(); // 直接重启系统
}
}
这种暴力校验机制,简直就是把"运行时更新"功能当摆设。更魔幻的是注释存储功能,虽然文件系统模块看起来像模像样:
void SaveComment(const char* comment) {
FRESULT res = f_open(&fil, "comment.txt", FA_WRITE);
if(res == FR_OK) {
f_printf(&fil, "%s\n", comment); // 标准库文件操作
f_close(&fil);
}
}
但实际上工程里压根没移植FatFS文件系统,注释写入操作直接掉进虚空。这种源码层面的"断头路"设计,堪比装修只刷了门面粉墙。
移植过程中最让我拍大腿的是脉冲序列生成逻辑。虽然PLSY指令的占空比调节代码完整:
void PLSY_Handler(uint32_t freq, uint8_t duty) {
TIM_OCInitTypeDef oc_config;
oc_config.TIM_Pulse = (100 - duty) * freq / 100; // 占空比计算
TIM_OC1Init(TIM3, &oc_config);
}
但相关的硬件抽象层(HAL)驱动里,定时器时钟源配置被注释掉了:
// TIM_InternalClockConfig(TIM3); // 疑似被注释的关键配置
这就导致所有脉冲指令都成了无源之水,输出脚安静如鸡。这种源码里的"定时炸弹",比明着报错更让人抓狂。
折腾一周后的结论:这套源码就像被扒光的圣诞树——主干还在,但装饰品全被薅走了。建议想深度开发的兄弟直接魔改定时器中断优先级,先把现有脉冲功能跑稳,至于那些花哨的定位指令...还是自己重写更靠谱。

7007

被折叠的 条评论
为什么被折叠?



