变量
什么是变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。变量可以通过变量名访问,为了在数据运算过程中使用、标识这些变量,每个变量都需要有一个名字,即变量名。控制算法组态中所用到的变量的名称和数据类型必须是事先明确的,这就需要首先对用到的变量进行定义,这个定义过程叫做变量声明。
变量分类
根据变量地址、数据类型、掉电保持、常量、作用域等属性的不同,对变量可以进行如下划分:如下图所示:
- 地址:有直接地址属性的变量和无直接地址属性的变量
- 数据类型:标准类型变量、自定义类型变量、功能块变量。
标准类型包括:布尔型(BOOL)、字节型(BYTE)、字型(WORD)、双字型(DWORD)、长字型(LWORD)、短整型(SINT)、无符号短整型(USINT)、整型(INT)、长整型(LINT)、无符号整型(UINT)、无符号长整型(ULINT)、32位整型(DINT)和无符号32位整型(UDINT)、64位整型(LINT)和无符号64位整型(ULINT);另外还有实型(REAL)、长实型(LREAL)、字符串(STRING)、数组(ARRAY)和时间日期型(TIME、TIME_OF_DAY、DATE、DATE_AND_TIME、LTIME、LTIME_OF_DAY、LDATE、LDATE_AND_TIME)
自定义类型包括:结构体(STRUCT)、枚举(ENUM)、数组别名(ARRAY)
功能块实例变量:作为功能块的实例,其保留有独立的功能块数据映像,使功能块多次调用时其多个实例可以保留各自的数据副本。
- 掉电保持:有掉电保持属性的变量和无掉电保持属性的变量。具有掉电保持属性可以时数据在控制器掉电后重新上电时,其数据值恢复到掉点前的数值。
- 常量:有常量属性的变量和无常量属性的变量。有常量属性的变量在只能作为右值参与逻辑运算。
- 全局变量和局部变量:全局变量可以在整个设备中使用,但是同一设备中的全局变量不可重名;局部变量只可以在所属的POU中使用,在不同POU中的局部变量可以重名。
- 网络变量:为可以进行网络间数据通信的变量。
- 注释:变量注释的最大长度为256字节。
变量命名
变量的区分与识别主要靠变量名,变量的命名需要符合命名规范。
变量名的命名规范
- 变量名由字母、数字和下划线组成,支持中文变量名,不得包含空格或特殊字符
- 变量名由字母或下划线开头
- 变量名不能是关键字等系统保留字
- 变量名大小写不敏感。例如,Varname和VARNAME为相同的变量
- 变量名的最大长度不可超出软件配置的限制
变量定义
变量在使用前首先需要对变量进行定义。变量的定义主要有手动定义和自动声明两种方式:
手动定义变量
手动定义变量是指在变量定义窗口,通过右键菜单或快捷键来定义变量的方式,其操作入口如下:
- 在变量定义视图的空白处,右键点击,选择右键菜单 插入
2.在变量定义视图的空白处,右键点击,输入快捷键 Ctrl + I
如下图所示:
操作插入变量命令后,会在当前变量定义列表的最后添加一个定义的变量,名称默认为"global+n"。
双击变量的名称栏,将变量名改为"globalVarBool02",修改变量的各属性为设定值,即完成变量的手动定义:
自动声明变量
手动定义变量是指在程序逻辑编辑过程中,当出现一个符合变量名规则的新标识符时,系统会自动弹出对话框,提示用户进行变量定义。如下图所示:
如上图,当在编辑程序逻辑"newName := 100;" 其中"newName"符合标识符规则并且未在设备中定义过,那么在光标离开其所在行时,软件将会自动识别出这种情况自动弹出右侧的"自动声明"对话框。在该对话框中,变量的名称是不可修改的。默认情况下,变量会定义在当前POU中;如需要将变量定义为全局变量,那么需要打开“范围”下拉框选择VAR_GLOBAL,之后在"对象"下拉框选择需要的全局变量组即可。
依次输入变量的各属性,点击确定,可完成变量的自动定义。
如在程序编辑区域进行多行编辑,当焦点切换后有多个标识符被识别,则会依次弹出多个"自动声明"对话框提示用户进行变量定义。
在程序编辑区,如需要对变量的属性进行修改,也可通过打开变量声明对话框的方式来操作:
选中程序编辑区中变量文本(文本语言)或变量对应的图形元件(图形语言),点击Shift + F2 ,可再次打开该变量的自动声明对话框,更新变量属性后点击确定,完成对变量属性的修改。
全局变量与局部变量
根据作用域的不同,变量分为全局变量和局部变量两类。
全局变量
全局变量是定义后可以在整个设备中使用,同一设备中的全局变量不可重名。
全局变量需要定义在全局变量组中。
定义全局变量:
全局变量的定义方法可参见变量定义部分内容
当全局变量与局部变量重名时,程序中优先识别局部变量,即此时访问的非全局变量,而是同名的局部变量。 | |
---|---|
局部变量
局部变量是在POU中定义的变量,与全局变量的作用域不同:
- 对于PRG型的POU,其局部变量可以通过"POU名.变量名"的在本POU外访问。
- 对于FB和FUN型的POU,其局部变量不可在本POU外访问。
局部变量类别:
按照用途的不同,局部变量(PRG型POU除外)可以分:
输入变量(VAR_INPUT):本功能块或函数通常以输入变量作为输入进行逻辑计算;
输出变量(VAR_OUTPUT):作为本功能块逻辑运算结果向外部的输出;
输入输出变量(VAR_INOUT):同时兼有输入变量和输出变量的特性,外部变量调用本功能块时是引用方式访问调用,功能块运算返回后将影响输入输出变量连接的外部变量的值;
内部变量(VAR):内部变量不与外部变量连接,只在它所属的块中有效,通常作为逻辑运算时所需要的临时变量。
- 对于FB型的POU,其局部变量可以是输入变量(VAR_INPUT)、输出变量(VAR_OUTPUT)、输入输出变量(VAR_INOUT)或内部变量(VAR)。
- 对于FUN型的POU,其局部变量可以是输入变量(VAR_INPUT)、输入输出变量(VAR_INOUT)或内部变量(VAR)。
定义局部变量:
1.FB定义局部变量
打开FB型POU,在变量定义窗口,在空白处点击右键,打开右键菜单,如下两种方式添加一个局部变量:
- 在变量定义视图的空白处,右键点击,选择右键菜单 插入
2.在变量定义视图的空白处,右键点击,输入快捷键 Ctrl + I
添加变量完毕后,鼠标双击变量的类别输入框,在下拉框中选择所需的局部变量类型,如下图所示:
确定(回车或失去鼠标焦点)后,即可完成FB局部变量的定义。
如果采用自动声明的方式,在自动声明对话框中双击"范围"栏,在在下拉框中选择所需的局部变量类型(此处如果选择VAR_GLOBAL那么将会定义到全局变量组中),如下图所示:
确定(回车或失去鼠标焦点)后,即可完成FB局部变量的类别选择。
1.FUN定义局部变量
打开FUN型POU,在变量定义窗口,在空白处点击右键,打开右键菜单,如下两种方式添加一个局部变量:
- 在变量定义视图的空白处,右键点击,选择右键菜单 插入
2.在变量定义视图的空白处,右键点击,输入快捷键 Ctrl + I
添加变量完毕后,鼠标双击变量的类别输入框,在下拉框中选择所需的局部变量类型,如下图所示:
确定(回车或失去鼠标焦点)后,即可完成FUN局部变量的定义。
如果采用自动声明的方式,在自动声明对话框中双击"范围"栏,在在下拉框中选择所需的局部变量类型,如下图所示:
确定(回车或失去鼠标焦点)后,即可完成FUN局部变量的类别选择。
局部变量定义方法可参见变量定义部分内容
PLC地址变量
可以在不定义变量的情况下,用"直接表示变量"(也成为直接地址变量)直接使用。
一个单元素变量直接表示由特殊符号"%"串联而成,"直接表示变量"具体的构成规则如下:
--"%"号 和 --位置前缀I、Q或M 和 --大小前缀X、B、W、D或L 和 --一个或多个无符号整数,对位的访问可以用"."分级。
直接表示变量可以在PRG、FB、FUN或资源配置中使用。下表定义了直接表示变量的特性:
序号 | 特性描述 | 举例 | 解释 |
---|---|---|---|
位置 | |||
1 | 输入位置 I | %IW100 | 输入位置200字节偏移的字 |
2 | 输出位置 Q | %QB7 | 输出位置7字节偏移的字节 |
3 | 存储器位置 M | %MD40 | 存储器位置160字节偏移的双字 |
大小 | |||
4 | 位的大小 (BIT) | %IX4.1 | 输入数据类型BOOL |
5 | 字节的大小 (BYTE) | %IB4 | 输入数据类型BYTE |
6 | 字的大小 (WORD) | %IW4 | 输入数据类型WORD |
7 | 双字的大小 (DWORD) | %ID4 | 输入数据类型DWORD |
8 | 四字的大小(LWORD) | %IL4 | 输入数据类型LWORD |
寻址 | |||
9 | 简单寻址 | %IB0 | 1级寻址 |
10 | 用"."的寻址 | %IX11.2 | 2级寻址 |
内存分布示意图如下所示:
%IB0 | %IB1 | %IB2 | %IB3 | %IB4 | %IB5 | %IB6 | %IB7 | …… | %IB8188 | %IB8189 | %IB8190 | %IB8191 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
%IW0 | %IW1 | %IW2 | %IW3 | …… | %IW4094 | %IW4095 | ||||||
%ID0 | %ID1 | …… | %ID2047 | |||||||||
%IL0 | …… |
当用户定义的变量与直接表示变量的地址重叠时,意味着变量的内存地址重叠,修改用户定义变量或修改直接表示变量的值均会影响另一方的值。 | |
---|---|
初值设置
变量初始值默认为空,如果标准类型,则按照0初始化,如果是其他类型,则按照类型的初始值初始化。
首次下装工程,用户逻辑将以初始值运算。当控制器复位后,除掉电保护属性的数据外,其它数据恢复为初始值。
您可以直接输入变量的初始值(初值格式参见数据类型详细介绍),也可以在“初值”对话框中批量设置。操作如下:
在变量定义区,双击变量的初值,将进入编辑状态。
单击按钮,将弹出初值对话框,列出各数据元素(以数组为例),双击初值,进行修改
单击确定
变量辅助操作
批量定义变量
手动定义变量的方式还支持批量定义变量,操作方法如下:
在变量定义视图的空白处,右键点击,选择右键菜单 定义多个变量...
会弹出如下图的对话框:
在上图的对话框中依次输入变量名称的前缀,变量名索引的下限和上限(依次下限和上限确定本次操作定义变量的个数),变量的类型以及地址和初始值等。点击确定后,可完成批量定义变量操作。
全局变量和局部变量均支持批量定义变量的功能。
过滤
如当前窗口定义的变量多时,可以通过过滤功能使视图只显示满足用户设置条件的变量。
在右键点击变量定义视图,选择右键菜单 过滤器设置.*..*
在弹出的过滤器设置对话框中,设置过滤条件,如下图设置过滤条件位变量要具有掉电保持属性:
过滤条件的设置可以使组合条件,如在上图变量要有保持属性的基础上,加上变量的类型限定位BOOL或DWORD类型,如下图所示:
点击确定后,即完成过滤条件的设定。此时再在右键点击变量定义视图,选择右键菜单 过滤
如上图所示,此时的变量定义窗口中是显示符合过滤条件设定的变量。
浏览交叉引用表
在右键点击变量定义视图的选中变量,选择右键菜单 浏览交叉引用表 可打开交叉引用表视图,显示该变量的交叉引用情况。
交叉引用的使用方法可参见查看交叉引用表部分内容
添加到监视列表
在右键点击变量定义视图的选中变量,选择右键菜单 添加到监视列表 → 选择待添加到的监视列表 可将变量添加到对应的监视列表中。
添加到监视列表的使用方法可参见监视列表部分内容
输入助手
您可以通过输入助手选择数据类型或者变量。
类型输入助手如下图所示:
- 类型输入助手“类别”分为标准类型、用户自定义类型,根据您所操作的对象自动引导
- 文本搜索:在文本搜索区域开始输入一个搜索字符串时,包含要搜索字符串的所有对象将要列出来
变量输入助手如下图所示:
- 变量输入助手“类别”分为变量、函数、功能块实例、功能块、关键字、转换操作符等,根据您所操作的对象自动引导
- 文本搜索:在文本搜索区域开始输入一个搜索字符串时,包含要搜索字符串的所有对象将要列出来
- 过滤器:限制搜索的变量类型,包含:全局变量、当前POU、其他程序、常量、地址
输入助手可在不同位置打开,打开位置不同,显示内容不同,如下:
- 变量定义区
双击变量的数据类型,将显示数据类型选择按钮,单击按钮,将弹出数据类型选择下拉框,单击“输入助手”命令,将弹出输出助手对话框。
对话框显示用户可定义的数据类型:标准类型(标准数据类型)和用户自定义类型(工程和库中自定义的结构体、枚举、数组)。
- 图形语言程序区
双击元件,单击按钮,将弹出输入助手对话框。
输入输出类型元件:对话框显示用户可选择的变量
块元件:如果双击函数名称,对话框显示功能块、函数、操作符、转换操作符;如果双击功能块示例名称,对话框显示功能块实例变量
- 文本语言程序区
右键单击“输入助手”命令,将弹出输出助手对话框。
对话框显示用户可选择的变量、函数、功能块实例、功能块、关键字、转换操作符
- 监视列表
右击“名称”列的表格区域,选择“输入助手”命令,将弹出输出助手对话框。 对话框显示用户可选择的变量。
- IO映射配置
双击“名称”列的表格区域,单击按钮,将弹出输入助手对话框。对话框显示用户可选择的变量。
- 任务
任务类型选择“状态”或者“事件”后,单击按钮,将弹出输入助手对话框。对话框显示用户可选择的变量。