3.1.1什么是变量
我们的PLC(可编程逻辑控制器)其实可以把PLC理解成广义上的计算机,计算机可以做很多的事情,前提是人们得用计算机熟悉的语言告诉计算该做什么该怎么做。计算机熟悉的语言就是编程语言了,在真正的计算机上什么C语言啊,C++啊,Java啊,Python啊,C#啊等等都是计算机编程语言。相比于PLC编程,我们也要使用PLC熟悉的编程语言。而基于codesys开发的PLC支持PLCOpen规定的6种编程语言。此篇教程,我们主要讲ST编程。
我们在写程序完成我们想要的功能的过程中,就需要使用各种数据作为信息的承载体。而有些数据在程序使用之前就已经预先设定好了,在整个程序的运行过程中没有变化。这些量被称为常量constant。而有些量在程序运行当中数值可能会实时变化,可能被改变和赋值,这些量被称为变量。有请我们本章主角闪亮登场~变量
变量顾名思义就是一种在程序执行过程中,不断变化的量。不断变化其实也很好理解,就是指这个变量存储的数据值,在程序执行过程中根据程序流程在实时刷新变化。变量也分为很多很多种。像基本数据类型的变量,像功能块变量,像结构体变量,像数组变量等等。
变量是什么东东搞清楚了,咱们下一章简单讲讲变量的标识符
3.1.2 变量标识符
上一章节我们为大家介绍了变量的概念。那么变量又该怎么表示呢?这里就需要引入变量标识符的概念了。
其实也很好理解,我们日常生活中会有各种各样的名字,而这些名字就是我们人类社会中每一个变量个体的标识符。比如对于每个人类个体而言,我们都有自己的名字,对于我们养的宠物而言它们可能也有自己的名字。我们购买很多商品的时候,这些商品大都拥有自己的ID条码,这些条码ID就可以认为是这些“变量”的名字。
其实这些名字,就是这些变量的标识符,用来给人们区分的。下面用一个例子来大家简单讲一下。
1 2 3 4 5 6 7 8 9 10 |
//--代码作者: 朱子文------------------ FUNCTION_BLOCK YJ_BeepAlarm //---局部变量------------------------- VAR_INPUT ib_报警启动 : BOOL; ib_报警停止 : BOOL; if_报警周期 : REAL;//周期设置,单位ms if_报警占比 : REAL;//0-1,代表周期中高低电平的占空比 id_报警次数 : DINT;//报警次数为0,则报警输出一直输出报警信号 END_VAR |
下面是ST语言的关键字,用于表示当前段代码是什么类型的。比如下面这段代码,代表的就是YJ_BeepAlarm是一个功能块,在这个功能块中输入变量区有哪些变量参数输入进来,给当前功能块程序使用。
1 2 3 4 |
FUNCTION_BLOCK YJ_BeepAlarm VAR_INPUT END_VAR |
下面这段代码,就是上述说的输入变量区中的输入变量。这些输入变量拥有自己的名字,同时知道自己的类型。
比如“ib_报警启动”,“ib_报警停止”,”if_报警周期”,“if_报警占比”,“id_报警次数”这些都是变量的名字。而跟在它们后面的就是表示这个变量是什么类型的。就好比人类社会中,有“小米”、“小明”,“杰克”等名字,但是他到底人呢还是宠物呢亦或是手机品牌的名字呢,都是需要我们进行分类进行限定的。
在程序编程中,我们也需要做这些限制,也就是我们每一个变量名字(标识符)后面,都有自己的数据类型。关于数据类型的分类,我们将在3.4章节为大家介绍。
1 2 3 4 5 |
ib_报警启动 : BOOL; ib_报警停止 : BOOL; if_报警周期 : REAL;//周期设置,单位ms if_报警占比 : REAL;//0-1,代表周期中高低电平的占空比 id_报警次数 : DINT;//报警次数为0,则报警输出一直输出报警信号 |
在codesys编程中,codesys平台是支持中文编程的,具体设置方法请参考1.4章节。使用中文编程在大多数编程语言中,并不支持。所以codesys在中国本地化方面,是很人性化的。我们可以使用codesys用中文编程。
这里插一句题外话,我相信随着中国国力的提升,我相信未来支持中文编程的语言会越来越多的……
3.1.3变量声明的格式
&
ensp; 本章节内容参考codesysV3基础用户手册。
变量声明就是指定变量的名称、类型和赋初始值,变量的声明非常重要,未经声明的变量是不能通过编译的,所以也无法在程序中使用。用户可以在程序组织单元(POU)、全局变量列表(GVL)和自动声明对话框中进行变量的声明。在CoDeSys 中变量声明分为两类,普通变量声明和直接变量。
1) 普通变量声明
最常用的变量声明,不需要和硬件外设或通讯进行关联的变量,仅供项目内部逻辑使用。普通声明须符合以下规则:
< 标识符 > : < 数据类型 > {:=< 初值 >};
{}中为可选部分。
如nTest:BOOL;,nTest:BOOL:=TRUE;
2) 直接变量声明
在CoDeSys 应用中,当需要和可编程逻辑控制器的I/O 模块进行变量映射或和外部设备进行网络通讯时,需要采用此声明方法。
使用关键字AT 把变量直接联结到确定地址,直接变量须符合以下规则:
AT<地址>:
< 标识符 > AT < 地址 > : < 数据类型 > {:=< 初始化值 >};
{}中为可选部分。
使用“%”开始,岁后是位置前缀符号和大小前缀符号,如果有分级,则用整数表示分级,并用小数点符号“.”表示,如%IX0.0,%QW0。直接变量声明的具体格式如图4.X 所示。
位置前缀的定义:
* I:表示输入单元。
* Q:表示输出单元。
* M:表示存储区单元。
大小前缀的定义如表4-X 所示。
前缀符号 | 定义 | 约定数据类型 |
---|---|---|
X | 位(bit) | BOOL |
B | 字节(BYTE) | BYTE |
W | 字(WORD) | WORD |
D | 双字(DWORD) | DWORD |
L | 长字(LWORD) | LWORD |
* | — | 未特定位置的内部变量,系统自动分配。 |
【例4.X】在程序中定义了变量双字型Var1,如需拿取该变量其中的一部分数据,将其转换成布尔/字节/字类型的变量,其首地址为多少,该如何换算:
VAR
Var1 AT%ID48:DWORD;
END_VAR
%I 说明了该变量属于输入单元,具体的地址为%ID48。该地址对应的内存映射详见表4-x 所示。字地址%IW96 和%IW97 两个字组合后对应%ID48,因为48* 2(字节)后的字节首地址为96。同样的道理,字节地址%IB192、%IB 193、%IB 194 和%IB 195 这四个字节变量组合后对应%ID48,因为48 * 4(字节) 后对应的字节首地址正好为192。表4.x 列出了CoDeSys V3.x 在寻址时,根据数据类型的大小(X:bit,B:byte,W:word,D:dword)。
%IX | 96.0 – 96.7 | 96.8 – 192.15 | 97.0 – 97.7 | 97.8 – 97.15 |
---|---|---|---|---|
%IB | 192 | 193 | 194 | 195 |
%IW | 96 | 96 | 97 | 97 |
%ID | 48 | 48 | 48 | 48 |
映射关系:
1) %MX12.0:是%MB12 的第一位。
2) %IW4:表示输入字单元4(字节单元8 和9)。
3) %Q*:输出在一个为特定的位置。
4) %IX1.3:表述输入第1 字节单元的第三位。
这里介绍的计算方法只适用于CoDeSys V3.x 的,CoDeSys V2.x 的计算方法略有不同。
转载请注明:燕骏博客 » 第三章:3.1变量的表示与声明
赞赏作者微信赞赏支付宝赞赏