1. FX3U PLC学习方案概述
作为一名工业自动化领域的从业者,我深知学习PLC底层原理的重要性。市面上的PLC学习板要么功能阉割严重,要么价格昂贵,让很多学习者望而却步。这套基于STM32F103C8T6的FX3U PLC学习方案,完美解决了这些问题。
这套方案最吸引人的地方在于它完整还原了FX3U PLC的核心功能,包括:
- 完整的IO点映射(X/Y输入输出)
- M辅助继电器功能
- T定时器功能
- 支持三菱MC协议
- 兼容GX Works2编程软件
提示:方案中的PCB设计保留了原装FX3U的RJ11编程口,这意味着你可以使用任何兼容的编程线缆,无需购买昂贵的原装线。
2. 硬件设计解析
2.1 核心硬件架构
这套学习板的硬件设计采用了"STM32+外围电路"的架构:
- 主控芯片:STM32F103C8T6(72MHz Cortex-M3内核)
- 输入电路:光耦隔离输入(对应X0-X15)
- 输出电路:ULN2003驱动LED(对应Y0-Y15)
- 通信接口:MAX232电平转换芯片(用于RS232通信)
硬件设计亮点:
- 完全兼容FX3U的物理接口
- 预留了扩展接口(ADC/DAC)
- 电源部分采用LM2596稳压,支持宽电压输入(9-24V)
2.2 PCB设计要点
AD11设计的PCB文件包含以下关键特性:
- 双层板设计,尺寸100mm×80mm(完美适配免费打样)
- 所有关键信号线都做了阻抗匹配
- 电源部分采用星型布线,减少干扰
- 关键芯片周围预留了测试点
焊接建议:
- 先焊接电源部分,测试电压正常后再焊接其他元件
- STM32芯片建议最后焊接,使用焊锡膏辅助
- 光耦元件注意方向,PCB上有明确标识
3. 软件实现详解
3.1 软元件内存映射
核心数据结构采用结构体方式组织,极大简化了编程:
c复制typedef struct {
uint8_t X[16]; // X输入,对应X0-X15
uint8_t Y[16]; // Y输出,对应Y0-Y15
uint16_t M[256]; // M辅助继电器,M0-M255
uint16_t T[64]; // T定时器当前值
uint16_t D[256]; // D数据寄存器
} FX3U_SoftDev;
FX3U_SoftDev fx3u_soft; // 全局软元件实例
这种设计有三大优势:
- 内存占用固定,便于管理
- 访问效率高,直接通过数组下标操作
- 与FX3U的软元件编号完全对应
3.2 MC协议实现
精简版MC协议实现了最常用的功能:
- 软元件读取(如读取Y点状态)
- 软元件写入(如设置M继电器)
- 批量读写操作
协议处理流程:
- 接收ASCII格式的命令帧
- 解析命令类型和软元件地址
- 操作对应的内存区域
- 返回响应帧
关键代码片段:
c复制void HandleMCProtocol(uint8_t* cmd) {
// 解析命令类型
uint8_t cmdType = cmd[1];
// 解析软元件类型和地址
uint8_t elementType = cmd[2];
uint16_t address = ParseAddress(&cmd[3]);
// 执行对应操作
switch(cmdType) {
case '0': // 读操作
ReadElement(elementType, address);
break;
case '1': // 写操作
WriteElement(elementType, address, cmd[7]);
break;
}
}
4. 开发环境搭建
4.1 软件安装指南
资料包中包含以下开发工具:
- Keil MDK-ARM(带注册机)
- Altium Designer 11(精简版)
- GX Works2(三菱PLC编程软件)
安装注意事项:
- Keil安装时需要以管理员身份运行
- AD11安装后需要手动添加元件库
- GX Works2需要输入提供的序列号
4.2 工程配置要点
Keil工程需要特别关注以下配置:
- 芯片型号选择STM32F103C8
- 勾选"Use MicroLIB"选项
- 设置正确的晶振频率(8MHz)
- 配置USART参数(波特率9600,8N1)
5. 进阶开发指导
5.1 定时器精度调整
默认使用TIM3实现10ms定时器,要改为1ms精度:
- 修改TIM3初始化:
c复制TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_InitStruct.TIM_Period = 999; // 1ms @72MHz
TIM_InitStruct.TIM_Prescaler = 71;
TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
- 调整定时器中断处理:
c复制void TIM3_IRQHandler(void) {
if(TIM_GetITStatus(TIM3, TIM_IT_Update)) {
for(int i=0; i<64; i++) {
if(fx3u_soft.T[i] > 0) fx3u_soft.T[i]--;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
5.2 模拟量扩展
利用预留的ADC引脚添加模拟量输入:
- 硬件连接:
- 电位器中间引脚接PA0
- 两端分别接3.3V和GND
- 软件配置:
c复制void ADC1_Init(void) {
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Init(ADC1, &ADC_InitStruct);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
6. 常见问题排查
6.1 通信问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| GX Works2无法连接 | 波特率不匹配 | 检查双方波特率设置(默认9600) |
| 通信时断时续 | 电平转换芯片故障 | 更换MAX232芯片 |
| 接收数据乱码 | 地线未连接 | 确保PLC和电脑共地 |
6.2 程序下载问题
常见下载错误及解决方法:
-
"No target connected":
- 检查ST-Link连接
- 确认BOOT0跳线设置正确
- 尝试复位芯片后再下载
-
"Flash download failed":
- 降低下载速度(尝试改为400kHz)
- 检查芯片供电是否稳定
- 尝试全片擦除后再下载
7. 学习路径建议
对于不同基础的学习者,我建议以下学习路线:
7.1 完全新手路线
- 先焊接电源部分并测试
- 逐步焊接其他元件
- 使用提供的示例程序测试基本功能
- 从简单的点动控制梯形图开始学习
7.2 有PLC基础的学习路线
- 直接使用成品板
- 研究C源码实现原理
- 尝试修改定时器精度
- 添加自定义功能指令
7.3 进阶开发者路线
- 研读MC协议实现细节
- 添加新的软元件类型
- 实现更复杂的指令集
- 优化内存管理策略
这套方案最让我欣赏的是它的开放性和可扩展性。不同于商业PLC的黑箱设计,你可以深入到每一个细节,真正理解PLC的工作原理。我在实际使用中发现,通过修改源码实现自定义功能的过程,对理解工业控制系统的底层机制特别有帮助。
