
西门子S7-1200PLC自定义堆栈程序
## 手搓一个S7-1200的万能数据堆栈
最近用S7-1200做配方管理时发现个尴尬事——这货居然没有内置的堆栈功能!FIFO、LIFO这种数据
结构还得自己造轮子。于是花了两包烟功夫,用SCL搓了个通用型堆栈FB块,实测流水线数据缓存和配方调
用都好使。
先看这个堆栈的核心设计。在FB接口里定义了两个关键参数:
```scala
VAR_INPUT
DataType : ANY; //支持所有基本数据类型
MaxSize : INT := 100; //最大存储量
END_VAR
```
通过ANY指针实现泛型存储,想存BOOL、REAL还是DWORD都行。数组结构用了个小技巧:
```scala
VAR
StackArray : ARRAY[1..MaxSize] OF DataType;
StackPointer : INT := 0;
END_VAR
```
指针从0开始增长,这样既能当队列也能当栈用。入栈操作看着简单其实暗藏玄机:
```scala
METHOD Push : BOOL
VAR_INPUT
InData : DataType;
END_VAR
IF StackPointer < MaxSize THEN
StackPointer := StackPointer + 1;
StackArray[StackPointer] := InData;
RETURN TRUE;