1. 项目背景与现状
作为一名在工业自动化领域摸爬滚打多年的工程师,我见证了国产PLC从无到有的艰难历程。三菱FX3U系列PLC作为日系品牌中的经典产品,在国内中小型自动化项目中占据着重要地位。近年来,随着国产化替代浪潮的推进,兼容FX3U指令集的国产PLC源码开发成为行业热点。
目前市面上已有多个国产PLC项目声称兼容FX3U指令集,但实际使用中普遍存在两个核心问题:一是部分特殊指令(如PID、高速计数器等)的执行结果与原装PLC存在偏差;二是通信协议(如MC协议)的兼容性不足导致上位机软件无法正常连接。这些问题严重制约了国产PLC在关键场景下的应用。
2. 关键Bug修复进展
2.1 高速计数器累计误差问题
在最新版本的源码中,我们重构了高速计数器的底层处理逻辑。原版本使用定时器中断方式采集脉冲信号,在脉冲频率超过50kHz时会出现累计误差。通过改用硬件捕获单元直接读取编码器信号,并增加脉冲丢失补偿算法,实测在200kHz频率下误差率从原来的0.3%降低到0.01%以内。
具体实现上,我们修改了以下关键代码段:
c复制// 原中断服务程序
void TIM2_IRQHandler(void) {
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
pulse_count += last_port_state;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
// 新版本使用硬件捕获
void TIM3_CC_IRQHandler(void) {
if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) {
pulse_count += (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) ? 1 : -1);
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
}
}
2.2 PID指令输出震荡问题
用户反馈在使用PID指令控制温控系统时,输出值会出现周期性震荡。经排查发现是微分项处理不当导致的典型问题。原代码中微分项
