当前位置: 首页 > article >正文

F3U源码STM32仿三菱PLC底层实现

项目概述这个项目实现了基于STM32的仿三菱PLC底层系统提供了类似三菱FX系列PLC的功能包括梯形图编程、I/O处理、通信协议等核心功能。系统架构-----------------------|应用层||(梯形图程序/ST语言)|----------------------||执行引擎 v----------------------|PLC运行时系统||-------------------|||任务调度器|||-------------------|||I/O管理器|||-------------------|||通信协议栈|||-------------------|||数据存储区|||-------------------|----------------------||硬件抽象 v----------------------|STM32 HAL层|----------------------||寄存器访问 v----------------------|STM32 MCU|-----------------------核心功能实现1. 任务调度器// plc_scheduler.c#includeplc_scheduler.h#includestm32f3xx_hal.h#defineMAX_TASKS8#defineTICK_PERIOD_MS1typedefstruct{void(*task_func)(void);uint32_tinterval;uint32_tlast_run;}Task;staticTask task_list[MAX_TASKS];staticuint8_ttask_count0;staticvolatileuint32_tsystem_tick0;// SysTick中断处理函数voidSysTick_Handler(void){system_tick;}voidscheduler_init(void){// 配置SysTick为1ms中断HAL_SYSTICK_Config(SystemCoreClock/1000);HAL_NVIC_SetPriority(SysTick_IRQn,0,0);}voidscheduler_add_task(void(*task)(void),uint32_tinterval_ms){if(task_countMAX_TASKS){task_list[task_count].task_functask;task_list[task_count].intervalinterval_ms;task_list[task_count].last_run0;task_count;}}voidscheduler_run(void){while(1){uint32_tcurrent_ticksystem_tick;for(inti0;itask_count;i){if((current_tick-task_list[i].last_run)task_list[i].interval){task_list[i].task_func();task_list[i].last_runcurrent_tick;}}// 进入低功耗模式__WFI();}}2. I/O管理器// plc_io.c#includeplc_io.h#includemain.h// 输入/输出映像寄存器staticuint8_tinput_image[16]{0};staticuint8_toutput_image[16]{0};// 特殊功能寄存器#defineM_SF_BASE0x1000staticuint16_tspecial_registers[M_SF_SIZE];voidio_init(void){// 初始化GPIOMX_GPIO_Init();// 初始化特殊寄存器for(inti0;iM_SF_SIZE;i){special_registers[i]0;}}voidupdate_input_image(void){// 更新数字输入input_image[0](GPIOC-IDRGPIO_IDR_0)?1:0;// X0input_image[1](GPIOC-IDRGPIO_IDR_1)?1:0;// X1// ... 其他输入点// 更新模拟输入// ADC读取代码...}voidupdate_output_image(void){// 更新数字输出HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,output_image[0]?GPIO_PIN_SET:GPIO_PIN_RESET);// Y0HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,output_image[1]?GPIO_PIN_SET:GPIO_PIN_RESET);// Y1// ... 其他输出点}uint8_tread_input(uint8_taddress){if(addresssizeof(input_image)){returninput_image[address];}return0;}voidwrite_output(uint8_taddress,uint8_tvalue){if(addresssizeof(output_image)){output_image[address]value;}}3. 通信协议栈 (Modbus RTU)// plc_modbus.c#includeplc_modbus.h#includeusart.h#defineMODBUS_SLAVE_ADDR0x01#defineMODBUS_BUFFER_SIZE256staticuint8_trx_buffer[MODBUS_BUFFER_SIZE];staticuint8_ttx_buffer[MODBUS_BUFFER_SIZE];staticuint16_trx_index0;voidmodbus_init(void){// 初始化USARTMX_USART2_UART_Init();// 启用接收中断HAL_UART_Receive_IT(huart2,rx_buffer[0],1);}voidprocess_modbus_frame(uint8_t*frame,uint16_tlength){if(length4)return;uint8_taddrframe[0];uint8_tfuncframe[1];if(addr!MODBUS_SLAVE_ADDR)return;switch(func){case0x03:// 读保持寄存器handle_read_holding_registers(frame,length);break;case0x06:// 写单个寄存器handle_write_single_register(frame,length);break;// 其他功能码...}}voidhandle_read_holding_registers(uint8_t*frame,uint16_tlength){uint16_tstart_addr(frame[2]8)|frame[3];uint16_treg_count(frame[4]8)|frame[5];// 准备响应tx_buffer[0]MODBUS_SLAVE_ADDR;tx_buffer[1]0x03;tx_buffer[2]reg_count*2;// 填充寄存器值for(inti0;ireg_count;i){uint16_treg_valueread_holding_register(start_addri);tx_buffer[3i*2](reg_value8)0xFF;tx_buffer[4i*2]reg_value0xFF;}// 计算CRCuint16_tcrccalculate_crc(tx_buffer,3reg_count*2);tx_buffer[3reg_count*2]crc0xFF;tx_buffer[4reg_count*2](crc8)0xFF;// 发送响应HAL_UART_Transmit(huart2,tx_buffer,5reg_count*2,100);}4. 梯形图执行引擎// plc_ladder.c#includeplc_ladder.h#includeplc_io.h// 梯形图元素类型typedefenum{LD,// 常开触点LDI,// 常闭触点AND,// 与ANI,// 与非OR,// 或ORI,// 或非OUT,// 输出线圈SET,// 置位RST,// 复位TON,// 通电延时定时器TOF,// 断电延时定时器CTU,// 加计数器CTD// 减计数器}LadderElementType;// 梯形图网络typedefstruct{LadderElementType type;uint16_toperand1;uint16_toperand2;uint16_tnext;}LadderNetwork;// 预定义的梯形图程序constLadderNetwork ladder_program[]{{LD,0x0000,0,1},// 常开触点X0{OR,0x0010,0,2},// 或X1{AND,0x0001,0,3},// 与X1{OUT,0x0100,0,0},// 输出Y0{LD,0x0002,0,5},// 常开触点X2{TON,0x0200,100,0},// 定时器T0, 10秒{LD,0x0200,0,7},// 常开触点T0{OUT,0x0101,0,0},// 输出Y1{LD,0x0003,0,9},// 常开触点X3{CTU,0x0300,10,0},// 计数器C0, 10次{LD,0x0300,0,11},// 常开触点C0{OUT,0x0102,0,0}// 输出Y2};voidexecute_ladder_network(uint8_tnetwork_id){constLadderNetwork*netladder_program[network_id];staticuint8_trung_state0;switch(net-type){caseLD:rung_stateread_input(net-operand1);break;caseLDI:rung_state!read_input(net-operand1);break;caseAND:rung_stateread_input(net-operand1);break;caseANI:rung_state!read_input(net-operand1);break;caseOR:rung_state|read_input(net-operand1);break;caseORI:rung_state|!read_input(net-operand1);break;caseOUT:write_output(net-operand1,rung_state);break;caseTON:// 定时器处理break;caseCTU:// 计数器处理break;// 其他元素处理...}if(net-next){execute_ladder_network(net-next);}}voidexecute_ladder_program(void){for(inti0;isizeof(ladder_program)/sizeof(LadderNetwork);i){execute_ladder_network(i);}}主程序结构// main.c#includestm32f3xx_hal.h#includeplc_scheduler.h#includeplc_io.h#includeplc_modbus.h#includeplc_ladder.hintmain(void){HAL_Init();SystemClock_Config();// 初始化各模块io_init();modbus_init();scheduler_init();// 添加任务scheduler_add_task(update_input_image,10);// 10msscheduler_add_task(execute_ladder_program,20);// 20msscheduler_add_task(update_output_image,10);// 10msscheduler_add_task(modbus_poll,5);// 5ms// 启动调度器scheduler_run();while(1){}}参考代码 F3U源码STM32 仿三菱plc底层源码www.youwenfan.com/contentcss/183137.html项目特点模块化设计各功能模块分离便于维护和扩展实时调度基于优先级的任务调度机制硬件抽象统一的硬件访问接口梯形图支持兼容三菱FX系列PLC编程风格通信协议支持Modbus RTU等工业协议资源管理优化的内存使用和处理器负载开发环境IDE: STM32CubeIDEMCU: STM32F303xC编译器: GCC ARM Embedded调试器: ST-Link V2扩展方向添加更多PLC指令和功能块实现HMI通信接口增加SD卡存储支持添加以太网通信功能实现在线监控和调试接口

相关文章:

F3U源码STM32仿三菱PLC底层实现

项目概述 这个项目实现了基于STM32的仿三菱PLC底层系统,提供了类似三菱FX系列PLC的功能,包括梯形图编程、I/O处理、通信协议等核心功能。 系统架构 ----------------------- | 应用层 | | (梯形图程序/ST语言) | -----------------…...

强化学习数据长啥样?手把手教你用ViTables“透视”d4rl的CartPole/Hopper数据集

强化学习数据解剖指南:用ViTables透视d4rl数据集的内在逻辑 当你第一次打开一个强化学习数据集时,那种面对未知结构的茫然感我深有体会。去年在研究Hopper环境时,我花了整整三天才搞明白数据集里那些数字究竟代表什么。直到发现了ViTables这个…...

AI Agent团队架构演进:从1个扩到8个再砍回4个

标题 **从 1 到 8 再到 4:我的 AI Agent 团队架构演进实录**标签 AI Agent LLM 自动化 系统架构 工程实践封面图建议 一张简洁的架构图(1→8→4 的演进过程)---正文> 这是一篇关于真实踩坑的文章。不是教程,是复盘。背景三个月…...

Gephi图形导出PDF不显示节点标签

Gephi图形导出SVG、PNG均正常,但是导出PDF不显示节点标签,此时只需将节点标签字体设为英文字体即可...

FUTURE POLICE语音模型卷积神经网络前端处理优化:提升噪声环境识别率

FUTURE POLICE语音模型卷积神经网络前端处理优化:提升噪声环境识别率 你有没有试过在嘈杂的街道上对着手机说话,结果语音助手完全听不懂你在说什么?或者工厂里的工人想用语音指令操作设备,却因为机器轰鸣声而频频失败&#xff1f…...

DeepChat在Visual Studio中的智能开发插件

DeepChat在Visual Studio中的智能开发插件 1. 引言 作为一名开发者,你是否曾经在编码时遇到过这样的困扰:写了一半的代码突然卡壳,不知道下一步该怎么实现;或者遇到一个奇怪的错误提示,花了半天时间也找不到解决方案…...

Hackadmin-RTB-2 WP记录

信息搜集永远的第一步不知道666是个什么东西,可以访问一下无法访问dirsearch扫下目录依次访问一下看看有没有交互点开始找漏洞扫一下有没有注入点没扫出来并且扫phpmyadmin也没有扫出来虽然目前的两个页面可交互的地方都没有办法通过sql注入进行脱库,但是…...

挖到宝了!沃尔沃项目EPLAN工程模板全集,10套超值大放送

超值大型10套 EPLAN 工程:沃尔沃项目模板全集,高效设计一触即达 超大型I EPLAN电气工程图纸I 沃尔沃项目EPLAN图纸模板合集 另外:再10套PDF图纸(已打包一起) 1. 参考车企设备通用标准图纸层级分类(高层代号分类)&#…...

一键部署QWEN-AUDIO:赛博可视化界面,让文字秒变超自然语音

一键部署QWEN-AUDIO:赛博可视化界面,让文字秒变超自然语音 1. 引言:语音合成的未来已来 想象一下,你正在为一个重要项目准备演示文稿,需要为每张幻灯片配上专业解说。传统方法要么自己录音,要么花钱请配音…...

COCO2017数据集实战:如何利用官方API统计各类别的图片和标注框数量

COCO2017数据集深度解析:用Python API实现类别统计与可视化分析 计算机视觉领域的研究者和开发者们,一定对COCO数据集不陌生。作为目前最流行的目标检测基准数据集之一,COCO2017以其丰富的标注类别和高质量的图像数据,成为算法开发…...

告别出图焦虑!用Cadence Allegro导出Gerber文件的5个关键检查点与高效技巧

告别出图焦虑!Cadence Allegro导出Gerber文件的5个关键检查点与高效技巧 作为一名PCB工程师,你是否曾在深夜赶项目时,因为Gerber文件导出错误而被迫返工?或是面对复杂的多层板设计,对导出流程的每一步都如履薄冰&#…...

Prompt Engineering入门指南:从入门到精通的实战笔记

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕人工智能这个话题展开,希望能为你带来一些启…...

【首发实测】RTX 4060 成功捕获 Karpathy 的“自动科研助手”!5分钟跑完 3500 万 Token,进化开始!

【首发实测】RTX 4060 成功捕获 Karpathy 的“自动科研助手”!5分钟跑完 3500 万 Token,进化开始! Baseline 跑通,坐标 4060 笔记本 经过一波三折的环境折腾(解决 Windows 不支持 Triton、修改镜像源、手动魔改 train.py),我终于在我的 RTX 4060 Laptop 上成功跑通了 …...

Wireshark实战:如何从流量包中揪出黑客的蛛丝马迹(附真实案例解析)

Wireshark实战:从流量包中还原黑客攻击全链条 网络安全的世界里,数据包就像犯罪现场的指纹。作为网络取证领域的瑞士军刀,Wireshark能让我们像侦探一样,从海量流量中抽丝剥茧还原攻击过程。今天我们就通过一个真实案例&#xff0c…...

从PyInstaller到NSIS:一个全栈项目打包避坑指南当Vue遇上FastAPI,如何优雅地打包成Windows安装程序

从PyInstaller到NSIS:一个全栈项目打包避坑指南当Vue遇上FastAPI,如何优雅地打包成Windows安装程序前言最近完成了一个印章提取工具的开发,前端使用Vue 3,后端是Python FastAPI。项目开发阶段一切顺利,但到了打包交付环…...

效率系列(九) macOS 前端开发环境优化与个性化配置指南

1. 为什么需要优化macOS前端开发环境? 作为一个长期在macOS上折腾前端开发的"老司机",我深刻体会到开发环境配置对工作效率的影响。你可能遇到过这些场景:终端反应迟钝、代码补全不智能、项目切换时环境冲突...这些问题看似不大&am…...

Python 集成视频录制(Selenium):让 UI 自动化问题无处隐藏

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中…...

推荐系统工程师必看:如何高效追踪RecSys/KDD/SIGIR顶会论文中的工业落地技术?

推荐系统工程师必看:如何高效追踪RecSys/KDD/SIGIR顶会论文中的工业落地技术? 在算法驱动的互联网时代,推荐系统工程师的竞争力不仅在于代码能力,更在于对技术前沿的敏锐嗅觉。每年RecSys、KDD、SIGIR三大顶会产出的上千篇论文中&…...

PyTorch版本选不对,GPU再强也白费!手把手教你根据CUDA 12.x选对Torch版本

PyTorch版本选不对,GPU再强也白费!手把手教你根据CUDA 12.x选对Torch版本 每次打开PyTorch官网,看到密密麻麻的版本号是不是瞬间头大?CUDA 12.7驱动下到底该选12.1还是12.6的PyTorch?torchvision版本又该怎么配&#x…...

用Substance Painter制作写实金属锈蚀效果:从智能材质到粒子笔刷的完整流程

用Substance Painter制作写实金属锈蚀效果:从智能材质到粒子笔刷的完整流程 在次世代游戏和影视资产制作中,金属锈蚀效果的真实度往往决定了场景的沉浸感。许多3D美术师都曾遇到过这样的困境:明明使用了高精度模型和4K贴图,但金属…...

亚洲美女-造相Z-Turbo可部署方案:单卡3090/4090即可运行的轻量文生图服务

亚洲美女-造相Z-Turbo可部署方案:单卡3090/4090即可运行的轻量文生图服务 1. 快速了解造相Z-Turbo 造相Z-Turbo是一个专门针对亚洲女性形象生成的文生图模型,基于Z-Image-Turbo的LoRA版本进行优化。这个模型最大的特点是轻量高效,单张RTX 3…...

告别手动复制粘贴:影刀RPA内置包 + Xpath + MySQL 打造你的第一个数据自动化流水线

影刀RPAXpathMySQL:零代码构建企业级数据自动化流水线 每天早晨9点,市场部的张经理都要重复同样的工作:打开5个行业数据网站,手动复制表格数据到Excel,清洗格式后导入MySQL数据库。这种机械操作不仅消耗2小时有效工作时…...

PyTorch实战:手把手教你为图像修复任务定制Feature Loss(附VGG16/19、ResNet对比)

PyTorch实战:图像修复任务中的定制化特征损失函数设计指南 修复一张褪色的老照片时,我们常遇到这样的困境:过度强调像素级匹配会导致修复区域出现不自然的色块,而单纯依赖高层语义又可能丢失原图的纹理细节。这正是传统L1/L2损失函…...

2026最权威AI论文平台榜单:这几款被高校和导师悄悄推荐

AI论文平台正在重塑学术研究与写作的效率与质量。随着人工智能技术的不断突破,越来越多高校与科研机构开始关注并引入合规、高效、智能的AI论文工具。依托权威检测平台数据、多所高校师生实测反馈以及用户真实使用体验,本文将深度盘点2026年最受推崇的AI…...

图像压缩入门:从哈夫曼编码到算术编码,哪种更适合你的项目?

图像压缩算法实战指南:哈夫曼编码与算术编码的深度对比 在数字图像处理领域,数据压缩技术扮演着至关重要的角色。无论是社交媒体上的照片分享,还是医疗影像的远程传输,高效的压缩算法都能显著减少存储空间和带宽需求。本文将聚焦两…...

告别复杂配置!丹青幻境Z-Image Atelier在边缘设备一键部署实战

告别复杂配置!丹青幻境Z-Image Atelier在边缘设备一键部署实战 1. 项目概述:当东方美学遇见边缘计算 丹青幻境Z-Image Atelier是一款独具匠心的AI艺术创作工具,它将先进的图像生成技术与东方美学完美融合。不同于传统AI工具冰冷的科技感&am…...

深入解析ARM Cortex-M的软复位机制:从NVIC_SystemReset到系统重启

1. ARM Cortex-M软复位机制的核心价值 第一次在STM32项目里遇到系统死机时,我盯着黑屏的调试终端手足无措。直到发现NVIC_SystemReset这个"救命按钮",才明白软复位对嵌入式系统就像汽车的安全气囊——平时看不见,关键时刻能救命。不…...

销售客户推荐难?RPA自动找相似客户,拓展更易成功

RPA技术在客户推荐中的应用RPA(Robotic Process Automation)技术能自动化执行重复性任务,包括客户数据分析和推荐。通过分析现有客户数据,RPA可以识别相似客户特征,帮助销售团队精准定位潜在客户。数据收集与清洗RPA工…...

XShell突然罢工?别慌!手把手教你用FinalShell无缝衔接你的服务器管理工作流

XShell突然罢工?别慌!手把手教你用FinalShell无缝衔接你的服务器管理工作流 作为一名长期与服务器打交道的工程师,最怕的莫过于主力工具突然罢工。上周三凌晨两点,我在处理线上故障时,XShell毫无征兆地崩溃&#xff0…...

黑丝空姐-造相Z-Turbo在网络安全领域的模拟应用:生成测试用例图像

黑丝空姐-造相Z-Turbo在网络安全领域的模拟应用:生成测试用例图像 最近和几个做安全测试的朋友聊天,他们都在抱怨同一个问题:做系统健壮性测试,尤其是人脸识别或者界面安全测试的时候,找合适的测试数据太麻烦了。要么…...