FX3U PLC源代码,stm32芯片。 全套硬件,软件源码,可以直接用GX Works2编程直接写入。 带读保护版本。 是以太网之前的最高版本。 产品功能描述:用梯形图语言编写应用程序,可以直接使用三菱编程软件GX Developer或者GX Works2编程、下载、调试、监视(可以监视中写入方便调试),不需要软件转换,和正规PLC一样的下载方式。 资料包含:原理图、PCB图、程序源码

最近在玩一个挺有意思的玩意儿——基于STM32F407芯片实现的FX3U兼容型PLC。这可不是市面上常见的仿制品,而是真能从GX Works2里直接下载梯形图程序的全套解决方案。硬件部分最骚的是PCB上直接集成了三菱编程口的电平转换电路,连USB-SC09-FX编程线都省了,直接插USB线就能开搞。

看原理图时发现个彩蛋:STM32的GPIO口配置成开漏模式时,电平转换芯片的DIR引脚居然是用PWM信号动态控制的。这样搞既省了方向控制线,又能保证485通信时不丢包。对应的初始化代码长这样:

// STM32串口3配置
void USART3_Config(void) {
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);
    
    // 关键在这两句配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 开漏输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    // ...
    TIM_SetCompare1(TIM3, 50); // 自动方向控制的PWM占空比
}

梯形图解释器的核心在ladder.c文件里,处理触点逻辑的代码简直暴力美学。比如处理常开触点就一个宏定义搞定:

#define CONTACT_X(addr) (input_status[addr>>3] & (1<<(addr&0x07)))

但真正牛逼的是步进指令SFTR的实现。用环形缓冲区处理移位操作,配合DMA搬运数据,实测比原厂PLC还快3个扫描周期:

void SFTR_Handler(uint16_t param) {
    // 参数解析略...
    memmove(&shift_buf[1], &shift_buf[0], sizeof(shift_buf)-1);
    shift_buf[0] = CONTACT_X(start_addr);
    // 触发DMA搬运到输出映像区
    DMA_Cmd(DMA2_Stream5, ENABLE);
}

读保护机制玩得更花,不是简单的Flash写保护。每次下载时会生成动态密钥,结合STM32的UID做AES加密。想要破解?得先搞定芯片内置的读保护选项字节,这玩意儿一旦使能,连J-Link都读不出固件。

实测监控模式下的在线修改功能有点魔性,修改定时器设定值时居然不用暂停PLC运行。翻代码发现用了双缓冲机制,修改值先写入影子寄存器,等当前扫描周期结束才切换。这骚操作让在线调试流畅得像德芙巧克力。

最后吐个槽:原厂PLC的RUN指示灯是呼吸灯效果,这项目里用PWM实现时差点翻车。最后发现得把PWM频率调到200Hz以上才能避免肉眼可见的闪烁,果然硬件工程师的浪漫都是细节堆出来的。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐