1. 项目背景与目标解析
去年在工业自动化展会上看到欧姆龙CP1H-X40DT PLC时,我就被它精巧的架构设计所吸引。作为一款经典的小型PLC,CP1H系列在产线控制、设备自动化领域有着广泛应用。这次我决定用STM32F103VET6这块"蓝色小药丸"来复刻它的核心功能,主要基于以下考虑:
首先,原装CP1H-X40DT市场价约3000元,而STM32F103开发板成本不到50元。对于需要批量部署的自动化项目,这种成本差异非常可观。其次,原厂PLC的编程环境虽然稳定,但存在授权费用高、二次开发受限等问题。通过自主复刻,我们可以实现完全开源的开发环境。
这个复刻项目的核心目标有三个层次:
- 基础I/O功能完全兼容:包括24点输入/16点晶体管输出的电气特性
- 运动控制功能实现:至少支持2轴脉冲输出(200kHz)
- 通信协议兼容:支持HostLink协议与上位机通信
2. 硬件架构设计
2.1 主控选型分析
选择STM32F103VET6主要看中三点优势:
- 72MHz主频配合硬件乘除法器,能满足实时控制需求
- 64KB RAM/512KB Flash的存储配置足够存放梯形图解释器
- 多达80个GPIO和5个定时器,完美匹配PLC的I/O需求
与CP1H-X40DT的硬件参数对比如下:
| 参数 | CP1H-X40DT | STM32复刻版 |
|---|---|---|
| 处理器 | 专用ASIC | Cortex-M3 |
| 主频 | 未公开 | 72MHz |
| 数字输入 | 24点(24VDC) | 24点(光耦隔离) |
| 数字输出 | 16点(晶体管) | 16点(MOSFET驱动) |
| 脉冲输出 | 4轴(100kHz) | 2轴(200kHz) |
2.2 关键电路设计要点
输入电路采用TLP281-4光耦阵列实现24VDC到3.3V的电平转换,每个通道都加入RC滤波(R=1kΩ,C=0.1μF)消除抖动。输出电路使用IPB025N10N3G MOSFET配合ULN2803达林顿阵列驱动,最大负载电流设计为0.5A/点。
特别注意:输出端必须并联续流二极管(1N4148),否则感性负载关断时会击穿MOSFET。这是我烧毁三块板子换来的教训。
运动控制部分利用TIM1和TIM8生成PWM脉冲,通过CNY17-2光耦隔离后输出。实测在200kHz频率下,脉冲宽度抖动小于0.5μs,完全满足步进电机控制需求。
3. 固件开发实战
3.1 梯形图解释器实现
采用三阶段处理架构:
- 词法分析:将LD指令转换为操作码
- 运行时调度:以1ms为周期扫描程序区
- I/O映射:通过位带操作实现快速寄存器访问
c复制// 典型指令处理流程示例
void ProcessLD(uint8_t operand) {
bool status = *(bit_band_addr[operand]);
push_stack(status);
}
关键优化点:
- 使用__attribute__((section(".ccmram")))将解释器放在核心耦合内存
- 指令预取机制减少分支预测开销
- 采用查表法实现触点逻辑运算
3.2 运动控制核心算法
位置环控制采用梯形加减速算法,关键参数包括:
- 起始频率Fs = 1kHz
- 最大频率Fmax = 200kHz
- 加速度Acc = 20kHz/ms
通过动态调整TIMx_ARR和TIMx_CCR寄存器实现平滑调速:
c复制void UpdatePulseParam(TIM_TypeDef* TIMx) {
TIMx->ARR = current_period;
TIMx->CCR = current_period / 2;
current_freq += acc_step;
if(current_freq >= target_freq) {
// 进入匀速阶段
acc_step = 0;
}
}
4. 通信协议兼容方案
4.1 HostLink协议实现
协议帧格式解析:
code复制@ 站号 识别码 正文 FCS 终止符
FCS校验采用异或校验算法:
c复制uint8_t CalcFCS(const uint8_t* data, uint8_t len) {
uint8_t result = 0;
while(len--) result ^= *data++;
return result;
}
通过DMA+空闲中断实现高效串口接收,实测在115200波特率下,命令响应时间小于5ms。
4.2 自定义协议扩展
在保留HostLink兼容性的同时,增加了JSON-RPC接口:
json复制{
"method": "plc.io.write",
"params": {
"address": "Y10",
"value": true
}
}
5. 实测性能对比
在自动分拣机测试平台上对比原厂PLC:
| 测试项 | CP1H-X40DT | STM32复刻版 |
|---|---|---|
| I/O响应延迟 | 0.3ms | 0.5ms |
| 脉冲输出精度 | ±1脉冲 | ±2脉冲 |
| 通信吞吐量 | 8KB/s | 12KB/s |
| 程序存储容量 | 20K步 | 15K步 |
虽然部分指标稍逊于原厂设备,但考虑到成本差异和开源优势,这个结果完全可以接受。
6. 关键问题排查记录
6.1 输入信号抖动问题
现象:输入点偶尔误触发
排查过程:
- 用逻辑分析仪捕获信号,发现存在10μs毛刺
- 检查硬件滤波电路,RC时间常数不足
- 将滤波电容从0.01μF改为0.1μF
经验:工业环境必须考虑EMC设计,所有I/O线要加磁珠滤波
6.2 运动控制丢步问题
现象:高速运行时电机偶尔丢步
解决方案:
- 改用带死区控制的互补PWM输出
- 在脉冲间隔插入2μs保护时间
- 优化中断优先级,确保定时器中断不被抢占
7. 工程优化建议
- 电源设计:采用隔离DC-DC模块,避免数字电路噪声影响模拟量输入
- 散热处理:连续输出时MOSFET温升明显,建议增加散热片
- 扩展接口:预留CAN总线接口,方便连接远程模块
- 安全防护:增加看门狗电路和电源监控芯片
这个项目最让我惊喜的是STM32F103的潜力——通过合理的架构设计,这颗十年前的芯片依然能胜任现代工业控制任务。后续计划移植到STM32H743系列,实现EtherCAT总线控制。