news 2026/6/26 8:47:39

手搓一个S7-1200的万能数据堆栈

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手搓一个S7-1200的万能数据堆栈

西门子S7-1200PLC堆栈程序 1.在使用西门子1200PLC时候发现,系统没有自带的堆栈功能块,不能实现数据的先进先出后进后出功能,于是自己用SCL语言开发了一个FB块来实现还功能。 2.该块具有入栈,出栈,清空堆栈,显示当前堆栈总数,出栈值以及堆栈中所有数据的功能。 3.拿该程序注明你需要存储的数据类型,以及堆栈需要存储的最大容量。

最近用S7-1200做配方管理时发现个尴尬事——这货居然没有内置的堆栈功能!FIFO、LIFO这种数据结构还得自己造轮子。于是花了两包烟功夫,用SCL搓了个通用型堆栈FB块,实测流水线数据缓存和配方调用都好使。

西门子S7-1200PLC堆栈程序 1.在使用西门子1200PLC时候发现,系统没有自带的堆栈功能块,不能实现数据的先进先出后进后出功能,于是自己用SCL语言开发了一个FB块来实现还功能。 2.该块具有入栈,出栈,清空堆栈,显示当前堆栈总数,出栈值以及堆栈中所有数据的功能。 3.拿该程序注明你需要存储的数据类型,以及堆栈需要存储的最大容量。

先看这个堆栈的核心设计。在FB接口里定义了两个关键参数:

VAR_INPUT DataType : ANY; //支持所有基本数据类型 MaxSize : INT := 100; //最大存储量 END_VAR

通过ANY指针实现泛型存储,想存BOOL、REAL还是DWORD都行。数组结构用了个小技巧:

VAR StackArray : ARRAY[1..MaxSize] OF DataType; StackPointer : INT := 0; END_VAR

指针从0开始增长,这样既能当队列也能当栈用。入栈操作看着简单其实暗藏玄机:

METHOD Push : BOOL VAR_INPUT InData : DataType; END_VAR IF StackPointer < MaxSize THEN StackPointer := StackPointer + 1; StackArray[StackPointer] := InData; RETURN TRUE; ELSE RETURN FALSE; //溢出保护 END_IF;

这里有个细节:先移动指针再写入数据,避免数组越界。出栈方法更有意思:

METHOD Pop : DataType VAR TempData : DataType; END_VAR IF StackPointer > 0 THEN TempData := StackArray[StackPointer]; StackPointer := StackPointer - 1; RETURN TempData; ELSE RETURN DataType#Null; //自定义空值 END_IF;

通过返回数据副本的方式,避免直接操作原数据。清空栈的暴力美学:

METHOD Clear StackPointer := 0; //不需要清空数组,新数据直接覆盖

实测存储200个REAL数据时,循环处理速度比用移位寄存器快3倍。调用示例:

#MyStack.Push(3.14); CurrentValue := #MyStack.Pop(); IF #MyStack.StackCount > 50 THEN #MyStack.Clear(); END_IF;

特别要注意的是数据类型一致性——如果初始化时指定了DINT,却强行Push实数,指针会原地爆炸。建议搭配数据验证块使用,毕竟强类型语言翻车起来可不是开玩笑的。

这个自研堆栈目前在设备上跑了三个月,日均处理2000+数据没出过幺蛾子。下次试试改成环形缓冲区,应该还能再压榨点性能出来。

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

OpenCV.js 完整指南:在浏览器和Node.js中实现计算机视觉

OpenCV.js 完整指南&#xff1a;在浏览器和Node.js中实现计算机视觉 【免费下载链接】opencv-js OpenCV JavaScript version for node.js or browser 项目地址: https://gitcode.com/gh_mirrors/op/opencv-js 你是否曾想在网页应用中添加人脸识别功能&#xff1f;或者希…

作者头像 李华
网站建设 2026/6/14 3:46:08

TrollInstallerX安装教程:iOS 14-16设备一键解决常见安装问题

TrollInstallerX安装教程&#xff1a;iOS 14-16设备一键解决常见安装问题 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是不是也遇到过这样的困扰&#xff1a;想要在…

作者头像 李华
网站建设 2026/6/24 14:25:23

跨平台网页应用怎么用js实现大文件分片上传源码?

咱们的客户&#xff0c;那可是汽车制造行业里的领军企业&#xff0c;妥妥的头部大佬。他们自有一套极为成熟的业务系统&#xff0c;这套系统就像他们的左膀右臂&#xff0c;每日不辞辛劳地处理着各类繁杂事务。然而&#xff0c;随着行业竞争愈发白热化&#xff0c;技术迭代也是…

作者头像 李华
网站建设 2026/6/15 18:13:22

RePKG终极指南:Wallpaper Engine资源提取与格式转换全解析

RePKG终极指南&#xff1a;Wallpaper Engine资源提取与格式转换全解析 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 还在为Wallpaper Engine壁纸包中的精美资源无法直接使用而烦恼…

作者头像 李华
网站建设 2026/6/19 8:37:12

【Python毕设全套源码+文档】基于Python的个性化旅游线路推荐系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/19 8:37:58

日志压缩工具、空行压缩工具、返回的报文里面有很多空行

场景 返回的报文里面很多空行&#xff0c;看起来很不方便。 代码&#xff1a; /** 日志工具*/ Slf4j public class LoggingUtils {/*** 获取压缩后的内容*/public static String generateCompressContent(String response ) {String methodName"日志工具_获取压缩后的内容…

作者头像 李华