news 2026/8/9 22:02:15

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/8/8 9:24:27

Hunyuan模型部署报错?HY-MT1.8B device_map配置详解

Hunyuan模型部署报错&#xff1f;HY-MT1.8B device_map配置详解 1. 引言&#xff1a;从部署问题切入理解device_map机制 在实际部署 Tencent-Hunyuan/HY-MT1.5-1.8B 翻译模型时&#xff0c;许多开发者会遇到如下典型错误&#xff1a; RuntimeError: CUDA out of memory. Tri…

作者头像 李华
网站建设 2026/8/5 12:27:29

此电脑硬件升级指南

硬件升级前的准备工作评估当前硬件配置&#xff0c;包括CPU、内存、硬盘、显卡等关键组件的型号和性能。 明确升级目标&#xff0c;如提升游戏性能、加快多任务处理或改善存储速度。 检查主板兼容性&#xff0c;确保新硬件与现有主板接口&#xff08;如CPU插槽、内存插槽&#…

作者头像 李华
网站建设 2026/8/3 10:05:50

DeepSeek-R1功能测评:纯CPU推理的真实体验

DeepSeek-R1功能测评&#xff1a;纯CPU推理的真实体验 1. 引言&#xff1a;轻量级推理模型的现实需求 随着大语言模型在数学推导、代码生成和逻辑分析等复杂任务中的广泛应用&#xff0c;推理能力已成为衡量模型智能水平的核心指标。然而&#xff0c;主流高性能推理模型普遍依…

作者头像 李华
网站建设 2026/8/6 4:54:18

新手友好型工具:fft npainting lama上手无压力

新手友好型工具&#xff1a;fft npainting lama上手无压力 1. 引言 1.1 图像修复的现实需求 在数字图像处理领域&#xff0c;图像修复&#xff08;Image Inpainting&#xff09;是一项极具实用价值的技术。无论是去除照片中的水印、移除干扰物体&#xff0c;还是修复老照片上…

作者头像 李华
网站建设 2026/8/2 20:32:29

GPT-OSS-20B-WEBUI一文详解:支持的OpenAI API端点列表

GPT-OSS-20B-WEBUI一文详解&#xff1a;支持的OpenAI API端点列表 1. 技术背景与核心价值 随着大模型在推理效率和部署灵活性方面的需求日益增长&#xff0c;开源社区对高性能、低延迟的本地化推理方案提出了更高要求。GPT-OSS-20B-WEBUI 正是在这一背景下应运而生的一款面向…

作者头像 李华