PLC结构化文本(ST)——临时&静态&实例-变量(TEMP&STAT&INST)

PLC Structured Text Object Oriented Programming

PLC结构化文本(ST)——临时&静态&实例-变量(TEMP&STAT&INST)

临时变量(VAR_TEMP)

  • 临时变量在每次调用POU时都会初始化。
  • 用在程序(PRG)功能块(FB) 中。
  • 方法(Method)函数(Function) 中的内部变量都是临时变量。
PROGRAM MAIN
VAR
    iResult : UINT; // STATIC
END_VAR
VAR_TEMP
    iCounter : UINT; // TEMP
END_VAR
----------------------------
iCounter := iCounter + 1; // 无法实现累加,每次调用都会被初始化。
iResult  := iResult + 1; // 可以正常累加。

静态变量(VAR_STAT)

  • 静态变量只在POU的第一次调用时被初始化。
  • 静态变量声明赋值后,值不会丢失。
  • 可用在 方法(Method)函数(Function) 中。
  • 程序(PRG)功能块(FB) 中声明的变量都是静态的。
FUNCTION F_Counter : UINT
VAR
    iTemp : UINT; // TEMP
END_VAR
VAR_STAT
    iCounter : UINT; // STATIC
END_VAR
----------------------------
iCounter := iCounter + 1; // 静态变量,可以实现累加。
iTemp := iTemp + 1; // 临时变量,每次调用都会被初始化,无法实现累加,因此每个周期计算后的值都是1。
F_Counter := iCounter;

Tips : 需要强调一点,若在功能块内部(非方法内部)声明静态变量,并且在程序中实例化了多次(创建多个对象),此时需要注意不同对象的静态变量地址是相同的,也就是说如果同一个类型的不同实例,改变其中一个静态变量值,其它实例的对应静态变量值也会跟着改变。这就是C#Java中的单例。有关静态变量单例的详细内容自行谷歌百度。

实例变量(VAR_INST)

  • 实例变量(VAR_INST) 只能方法(Method) 中使用,可以在方法的声明区在线监控实例变量值。
  • 不保存实例变量(VAR_INST)在方法栈中,但在功能块的实例栈中。
  • 实例变量与功能块实例的其它变量一样,每次调用方法时不会重新初始化。
METHOD M_Counter : INT
VAR_INPUT
    iVar : INT;
END_VAR
VAR_INST
    iCounter : INT := 0;
END_VAR
iCounter := iCounter + 1; // 可以实现自增,iCounter只有首次调用会被初始化。
M_Counter := iCounter;

总结

在使用临时变量、静态变量和实例变量时,需要清楚对应POU的内部变量原本的类型以及变量的生命周期。


__EOF__

  • 本文作者: Jsheng
  • 本文链接: https://www.cnblogs.com/JSheng/p/18400179
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • posted @   J_Sheng  阅读(224)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · DeepSeek-R1本地部署如何选择适合你的版本?看这里
    · 开源的 DeepSeek-R1「GitHub 热点速览」
    · 传国玉玺易主,ai.com竟然跳转到国产AI
    · 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
    · 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
    点击右上角即可分享
    微信分享提示