news 2026/9/8 3:31:21

CPU224/226 PLC与STM32单片机的源码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CPU224/226 PLC与STM32单片机的源码

cpu224/226 PLC STM32单片机源码.

最近在翻仓库盘的时候翻出来一套老项目源码,正好是CPU224 PLC和STM32F103混搭的工控方案。这套代码虽然写着S7-200的指令,但底层居然用STM32实现了部分PLC运行时,有点缝合怪那味儿了。今天就带大家看看这种跨平台实现里藏着哪些骚操作。

先看个典型的自锁电路实现。PLC梯形图里常见的起保停逻辑,在STM32里是这么玩的:

// 输入信号处理 #define START_BUTTON GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) #define STOP_BUTTON GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) // 输出控制 GPIO_WriteBit(GPIOB, GPIO_Pin_5, control_output); // 自锁逻辑核心 static uint8_t motor_state = 0; void run_motor_logic(void) { if(START_BUTTON && !motor_state) { motor_state = 1; // 启动置位 } if(STOP_BUTTON && motor_state) { motor_state = 0; // 停止复位 } }

这个实现最有趣的地方在于用位操作模拟了PLC的扫描周期——每次主循环执行时更新状态,比起传统PLC的顺序扫描,STM32这里其实是事件驱动架构。实测中发现这种写法容易受按键抖动影响,后来加了个20ms的软件去抖才稳定。

定时器功能是另一个重头戏。PLC里的TON指令在单片机里得自己造轮子:

typedef struct { uint32_t preset; uint32_t accumulator; uint8_t enable; uint8_t done; } TON_Timer; void update_timers(TON_Timer *tmr) { if(tmr->enable) { if(tmr->accumulator < tmr->preset) { tmr->accumulator++; } else { tmr->done = 1; } } else { tmr->accumulator = 0; tmr->done = 0; } } // 在1ms中断中调用 void SysTick_Handler(void) { static uint8_t tick_counter = 0; if(++tick_counter >= 10) { // 10ms时间基准 tick_counter = 0; update_timers(&motor_delay_tmr); } }

这个定时器结构体活生生把PLC的T37之类定时器搬到了C语言里。注意这里用系统滴答中断做时间基准,但实际项目中遇到过堆栈溢出——中断服务里处理太多逻辑直接把系统干趴了,后来改用DMA+定时器硬件触发才解决。

说到硬核操作,当年为了兼容PLC的PWM输出功能,在STM32上整了个绝活:

void config_plc_pwm(uint8_t channel, uint32_t frequency) { TIM_OCInitTypeDef oc_init; TIM_TimeBaseInitTypeDef tb_init; // 时基配置 tb_init.TIM_Period = SystemCoreClock / frequency - 1; tb_init.TIM_Prescaler = 0; TIM_TimeBaseInit(TIM2, &tb_init); // 输出比较配置 oc_init.TIM_OCMode = TIM_OCMode_PWM1; oc_init.TIM_OutputState = TIM_OutputState_Enable; oc_init.TIM_Pulse = tb_init.TIM_Period / 2; // 50%占空比 TIM_OC1Init(TIM2, &oc_init); TIM_Cmd(TIM2, ENABLE); }

这段代码最骚的是直接用系统时钟当PWM源,实测能输出高达36MHz的方波(虽然实际项目只用到10kHz)。但有个坑爹问题——修改频率时会闪波,后来发现是没同步更新影子寄存器,加上TIMGenerateEventUG()才解决。

cpu224/226 PLC STM32单片机源码.

源码里还藏着些黑历史:比如用GPIO模拟串口和上位机通信,结果115200波特率下误码率感人;又比如拿FSMC总线驱动LED数码管,结果发现74HC595根本不吃这套...这些祖传bug现在看着好笑,但当年可是实打实掉过头发。

整套方案最值钱的其实是IEC61131-3运行时的那部分C代码,虽然现在看有些粗糙,但实现了基本的指令集解释器。比如处理MOV指令的函数:

void handle_mov(uint8_t *operands) { uint16_t src_addr = *(uint16_t*)&operands[0]; uint16_t dst_addr = *(uint16_t*)&operands[2]; // 根据地址类型处理 if(src_addr >= V_REG_BASE) { uint16_t val = get_vregister(src_addr); set_register(dst_addr, val); } else { // 处理立即数或其它存储区 // ... } }

这种内存操作看着危险但高效,直到某次现场升级后设备集体宕机——原来是操作数越界把堆栈踩了。后来加了边界检查才算稳当。

这套源码现在看可能有点过时,但其中硬件抽象的思路依然有价值。比如用宏定义统一硬件接口:

#define PLC_DI(n) (GPIO_ReadInputDataBit(DI_PORT, DI_PIN[n])) #define PLC_DO(n,v) GPIO_WriteBit(DO_PORT, DO_PIN[n], v) #define PLC_AI(n) read_adc_channel(n)

这种写法让上层逻辑完全不用关心底层是STM32还是别的芯片,后来移植到GD32平台时省了不少事。

翻完这些代码,突然理解为什么老工程师说"PLC本质就是个带硬件的状态机"。如今虽然都改用codesys或者OpenPLC了,但这种从底层造轮子的经历,对理解自动化控制原理还是大有裨益。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 16:13:57

Vllm-v0.11.0模型微调指南:低成本体验完整训练流程

Vllm-v0.11.0模型微调指南&#xff1a;低成本体验完整训练流程 你是不是也遇到过这种情况&#xff1a;手头有个不错的小样本数据集&#xff0c;想试试对大模型做微调验证想法&#xff0c;但公司GPU资源紧张&#xff0c;排队等一周都轮不到&#xff1f;或者自己本地显卡太小&am…

作者头像 李华
网站建设 2026/9/6 17:31:07

直接搞通信才是上位机的灵魂,界面那玩意儿自己后面加。OPC这玩意儿在工业现场就跟吃饭喝水一样常见,先说DA再搞UA,咱们玩点真实的

C# opc ua/da通信源代码示例&#xff0c;应用简单直接可使用。 工业上位机必备代码&#xff0c;不含界面&#xff0c;不含界面&#xff0c;不含界面&#xff0c;重要的事说三遍先上OPC DA的硬核代码&#xff0c;这玩意儿用Com组件得劲。注意引用Interop.OPCAutomation.dll&…

作者头像 李华
网站建设 2026/8/28 15:43:33

11 套 QT_c++ 和 C# 工业上位机 MES 编程实战分享

11套QT_c和C#工业上位机MES编程全部都是现场应用。 1,C#多工位力位移监控&#xff01; 完整应用&#xff0c;vs2015开发&#xff0c;用到dx控件&#xff0c;我会赠送。 这是一个工业应用&#xff0c;下位机为plc。 设备启动后上下位机通信完成全自动动作。 tcpip扫码&#xff…

作者头像 李华
网站建设 2026/9/5 14:55:49

Qwen3-4B-Instruct-2507智能笔记:学术资料自动整理

Qwen3-4B-Instruct-2507智能笔记&#xff1a;学术资料自动整理 1. 引言&#xff1a;小模型大能量&#xff0c;学术场景的轻量化革命 随着大模型在科研、教育和知识管理领域的深入应用&#xff0c;研究者对高效、低成本、可本地部署的AI工具需求日益增长。传统大模型虽然性能强…

作者头像 李华
网站建设 2026/8/31 0:42:59

Qwen3-VL MoE架构实战:大规模云端服务部署参数详解

Qwen3-VL MoE架构实战&#xff1a;大规模云端服务部署参数详解 1. 引言 随着多模态大模型在视觉理解、语言生成和跨模态推理能力上的持续突破&#xff0c;Qwen3-VL 系列的发布标志着阿里云在视觉-语言智能领域的又一次重大跃进。作为 Qwen 系列中迄今最强大的视觉语言模型&am…

作者头像 李华