PLC结构化文本(ST)——方法(Method)

news/2024/9/21 1:37:40/文章来源:https://www.cnblogs.com/JSheng/p/18393155

PLC Structured Text Object Oriented Programming

PLC结构化文本(ST)——方法(Method)

什么是方法

一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。---C#方法

方法是语句的集合,它们在一起执行一个功能。

  • 方法是解决一类问题的步骤的有序组合
  • 方法包含于类或对象中
  • 方法在程序中被创建,在其他地方被引用
    ---Java方法

PLC ST中的方法定义与上述类似,并无其它区别。国内PLC工程师在写ST代码时,使用最多的是PROGRAM(PRG)ACTION(ACT),显而易见这些程序块只适合面向过程编程(OPP),这里不讨论OPP和OOP哪种编程方式好,各有各的应用场景和范围。

这里只介绍OOP中的方法,当然方法Method并不是只可以在面向对象编程时才能使用,其实IEC61131-3新增的OOP功能及特性并不局限某种编程模式,换句话说在OPP中也可以使用属性、接口、方法等。只不过混合使用会让程序变得复杂难懂显得不伦不类。

建议:在PLC程序设计时,面向过程编程(OPP)不要掺杂面向对象编程(OOP)的功能特性,反之亦然。

如何创建方法

  • 1.FB创建方法Method
    FBCreateMethod

DefinedMethod

这里使用TwinCAT3程序编译器创建方法,使用CODESYS源生平台或CODESYS其它二次开发平台都是可以的。作者工作中使用TwinCAT3较多,所以后面的文章基本全部使用TwinCAT3作为工具编写例程。

//变量声明区
METHOD eat
VAR_INPUT
END_VAR
-----------------
// 代码编辑区
  • 2.PRG创建方法Method
    PrgCreateMethod

PrgDefinedMethod

//变量声明区
METHOD test
VAR_INPUT
END_VAR
-----------------
// 代码编辑区

Tips : 在使用ST面向对象编程时,一般只有一个PRG程序且不会给它创建Method方法块。所以后续介绍OOP时不会使用PRG + Method这种方式。

方法特点

  • 1.局部临时变量特点:
    在方法内部声明的变量为本地临时变量,FB及FB其它成员无法访问。比如在VAR...END_VAR内部声明的整型变量eatTimes仅作用于eat当前方法,其它任何地方无法访问。
METHOD eat
VAR_INPUT
END_VAR
VAReatTimes : INT; // 吃饭次数
END_VAR
-----------
eatTimes := eatTimes + 1;// 临时变量,一个周期后初始化为0

Tips : 方法(Method)和函数(Function)类似,内部声明的变量为局部临时变量,每次退出(Return)之后变量会重新初始化。因此示例中eatTimes := eatTimes + 1并不会跟想象中的一样累加。

  • 2.方法内部声明静态变量(STAT
    在方法内部声明静态变量可以实现上述效果,每次程序退出时(Return)并不会重新初始化静态变量。
METHOD eat
VAR_INPUT
END_VAR
VAR_STATeatTimes : INT; // 吃饭次数
END_VAR
----------
eatTimes := eatTimes + 1; // 静态变量,一个周期后仍然保持当前值.

Tips :PRGFB声明的内部变量默认都是静态变量,FUNMETHOD声明的内部变量默认都是临时变量。VAR_TEMP声明临时变量,VAR_STAT声明静态变量。

方法调用

// main 主程序中实例化
PROGRAM MAIN
VARdog : FB_Dog; // 实例化FB_Dog,dog对象bTest : BOOL;
END_VAR
-----------
IF bTest THENdog.eat();bTest := FALSE;
END_IF

实例化FB_Dog,使用对象dog点出eat方法。

Tips : 此处的方法默认为PUBLIC,方法修饰符PUBLIC、PRIVATE、PROTECTED、INTERNAL以及ABSTRACT以后会在后续章节介绍。

总结

方法Method是FunctionBlock的内部成员,方法内部声明的变量为局部临时变量,方法调用可以使用对象.方法名方式,也可以FB内部方法成员之间相互调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/791487.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

闲话假期特供

小假期鲜花前 出于一些众所周知的原因,我们获得了一周假期离校时间,所以就打算和同学们一起去玩点什么。 Day 0 || 8.23 早起搬宿舍。 到了 GGrun 发现他开始就没把床垫搬过去,于是还要搬回去,并借走了我的车,然后我忘了直到放假后才想起来,希望 GGrun 没忘。 10:00 因为…

PostgreSQL的安装与配置(包含多种可能遇到的报错或者无法安装问题)

1.Windows安装 1. 官网下载安装包,EDB: Open-Source, Enterprise Postgres Database Management (enterprisedb.com) 2.按照提示步骤进行安装(文件路径很重要!!!) 这是PostgreSQL的安装目录(自定义目录安装的一定要命名清楚,不要和后面的data混淆) 这个全选这个是存储…

福州大学第19届206智能车队摄像头培训 三、帧率和快门时间

总钻风MT9V034灰度摄像头的帧率与快门原理原文于2023.10.25发布于本人CSDN主页,现同步至cnblogs 1.摄像头帧率 某天看了学弟学妹们练习PID编写的程序,为了降低串口通信的频率在int main() while(1)内用了delay函数。实际上在未来实际应用中是不可取的。 在平时的单片机工程中…

神经网络之卷积篇:详解简单卷积网络示例(A simple convolution network example)

详解简单卷积网络示例 假设有一张图片,想做图片分类或图片识别,把这张图片输入定义为\(x\),然后辨别图片中有没有猫,用0或1表示,这是一个分类问题,来构建适用于这项任务的卷积神经网络。针对这个示例,用了一张比较小的图片,大小是39393,这样设定可以使其中一些数字效果…

3分钟了解CDN

CDN CDN的全称是Content Delivery Network,即内容分发网络。CDN的全称是Content Delivery Network,即内容分发网络CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器 通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低…

新手朋友在安装pbootcms经常遇到一些错误(PbootCMS 常见问题及解决方法)

Parse error: syntax error, unexpected :, expecting {问题描述:在 www\core\function\handle.php 文件第 130 行出现了语法错误,提示意外的冒号。 原因分析:此错误通常出现在尝试在较旧的 PHP 版本上运行需要 PHP 7.x 或更高版本的代码时。PHP 7 引入了一些新的语法特性,…

【VMware VCF】VCF 5.2:配置管理域 vSAN 延伸集群。

VMware vSAN 解决方案中,根据集群的配置类型分为 vSAN 标准集群、vSAN 延伸集群以及双主机集群(延伸集群特例)。我们最常见的使用方式应该是 vSAN 标准集群,也就是 vSAN HCI 超融合集群,至少由 3 台 ESXi 主机所组成,这些 ESXi 主机安装位属于同一个数据中内,将本地磁盘…

Datawhale X 李宏毅苹果书AI夏令营深度学习入门(三)

一.实践方法论 (一)模型偏差 模型偏差可能会影响模型训练。若模型过于简单,一个有未知参数的函数代θ1 得到一个函数 fθ1(x),同理可得到另一个函数 fθ2(x),把所有的函数集合起来得到一个函数的集合。但是该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不…

PlugIR:开源还不用微调,首尔大学提出即插即用的多轮对话图文检索 | ACL 2024

即插即用的PlugIR通过LLM提问者和用户之间的对话逐步改进文本查询以进行图像检索,然后利用LLM将对话转换为检索模型更易理解的格式(一句话)。首先,通过重新构造对话形式上下文消除了在现有视觉对话数据上微调检索模型的必要性,从而使任意黑盒模型都可以使用。其次,构建了…

「代码随想录算法训练营」第五十二天 | 图论 part10

目录Floyd算法题目:97. 小明逛公园A * 算法题目:126.骑士的攻击最短路算法总结 Floyd算法 Floyd算法用于求解多源最短路问题(求多个起点到多个终点的多条最短路径)。在前面学习的dijkstra算法、Bellman算法都是求解单源最短路的问题(即只能有一个起点)。 注意:Floyd算法…

定义一个正则表达式,使用finditer从表达式内取值后存储到列表中

演示代码:responce = requests.get(url = url_web,headers=head) url_obj = re.compile(r<a class="media-content" target="_blank" href="(?P<url>.*?)" title=".*?" ,re.S) list_url = url_obj.finditer(responce.tex…