IEC61131-3 PLC编程入门(5) - 变量Variable(基础数据类型)与常量Constant

发表时间:2019-10-31 22:32作者:翌控科技网址:http://www.nxtrol.com/logiclab_manual_05.html

本章节我们开始学习IEC61131-3标准中的变量Variable与常量Constant的概念与用法。在早期的PLC产品中,由于系统资源的限制,对于一些需要高速临时存储的数据或者I/O信号直接通过地址方式访问,程序逻辑可读性较差,而不同体系(例如西门子与三菱的PLC)的PLC内部寄存器定义完全不一样,因此对于用户在学习过程中造成了较大困扰,而IEC61131-3标准则通过统一化的变量Variable、常量Constant与地址Address的定义将传统PLC中的寄存器概念进行了统一的管理。


我们开始还是稍稍了解下PLC中不同存储器的类型,熟悉计算机原理以及单片机编程的朋友们可以跳过该部分,可以直接查看PLC存储器实例分析


PLC设备本质上来说也是一个计算机系统,内部核心同样会由中央处理器CPURAMFlash存储器单元组成。而在程序中使用的变量Variable需要能够高速更新其内部的数据值,一般位于易失性存储器RAM中(Random Access Memory, 随机存取记忆体,PLC的数据区都是存放在PLC硬件的RAM中,其特点是掉电后数据不可保存,而访问速度极快,通常用于存放临时数据,PLC的数据区并不会太大,一般根据PLC型号大小大概在几十KB到几个MB之间),对于部分特殊的变量的值可以在掉电后依然保存一段时间,我们称之为保持型变量Retain Variable,基于特殊构造的硬件单元可以实现(通过电池+SRAM或者FRAM铁电存储器实现,其容量将更小,一般在4-8KB之间)。


如果我们期望将大量的数据值或者PLC的逻辑程序固化在设备中,我们就需要借助于非易失性存储器(Flash最主要的一种,嵌入式设备应用较多,硬盘,SD卡以及U盘等都是非易失性存储器,可以较长时间保存数据,断电后也不丢失,但是相对于RAM直接高速读写,Flash等非易失性存储器需要先进行擦除再进行写入数据,速度较慢。),需要高速读写的变量就不可以定义在非易失性存储器上,一般非易失性存储器空间相对较大,从几百KB到几个GB。正常情况下PLC厂商已经设计好将编译好的PLC代码下载到设备中的机制,应用人员不用担心PLC程序固化在非易失性存储器上的问题,按照PLC手册操作指南进行下载操作即可。并且大部分厂商控制器都可以支持通过功能块将变量Variable中的数据写入到非易失性存储器上,并且可以按照需求随时进行读取,这种需要保存的数据应用场合非常常见,比如说控制器现场的应用参数或者配方表等功能。


下图为典型的PLC产品的存储器结构图:

05_01.png


在前面章节中,我们经常将PLC与我们的大脑做比较,我们不妨来来看看一个简单的示例,这样大家是否能够有些新感觉:

05_02.png


PLC存储器实例分析


下图是某知名PLC厂商的产品参数手册,工作存储器指的就是前面介绍的易失性存储器,PLC所有的变量Variable都存放在该区域上,系统断电则变量数据全部丢失,装载存储器指的是非失性存储器,用于存储固化在设备上的PLC程序或者其他数据,断电可以保持数据不丢失,而较小的保持型存储器可以一直保持变量Variable掉电前的值。


当然该PLC设备还有过程映像区以及位存储器区都是带特定地址的变量Variable区域,都是使用的易失性存储器,掉电数据无法保存。

05_03_p.png



变量Variable定义


通过上面的基础介绍,我们回到变量Variable概念中来,PLC中的变量Variable就是RAM存储器单元,可以用于各种PLC算法逻辑运算操作,并且每个变量都有对应的符号名称,统称为变量名,通常由ASCII字母与基础的符号_,-以及数字组成(变量名第一个字符不可以使用符号以及数字),通过变量名可以简单直观对该变量的RAM存储器空间进行访问。


例如在LogicLab中,我们需要对两个值做加法,并且结果存放到另一个存储器空间中,我们可以有如下简单的实现,通过定义两个INT类型的变量AB,变量初始值分别为110,那么计算的结果存放到另一块存储器区域中,我们通过INT类型的变量C来表示:

05_04.png



基础变量Variable类型


变量可以有不同的数据类型分别表示该存储器区域中对应大小单元所表达的含义,不同的数据类型对应不同的存储器大小空间,常用变量类型如下图所示:

05_05.png



常量Constant定义


常量Constant用于在PLC逻辑代码中定义一个固定的值,PLC逻辑代码运行过程中不可以对其进行写入操作,如下定义变量C为常量属性则会编译报错,定义常量一般需要给出初始值(Init value),不然在不可以写入的情况下,其值默认为0,也就失去了意义。同时也可以直接用数值方式表示一个常量,功能块图FBD编程语言下直接在工具栏选择常量符号,在代码编辑器中直接通过鼠标左键输入常量,双击该常量可以通过不同的进制方式修改该常量值(如果是结构化文本ST编程语言,则直接输入常量值即可,我们将在后续构化文本ST编程语言章节详细说明):

05_06_p.png



可保持型变量与冷,暖,热启动


可保持型变量定义十分简单,仅仅需要在变量属性中勾选RETAIN即可,当变量具有RETAIN属性后,设备断电重新启动时,该变量的值为上次掉电前最后一个PLC运算周期的值,注意RETAIN属性的变量只能在全局变量表中定义,例如下图中的cnt变量:

05_07_p.png



PLC启动或者停止后重新启动时的变量值与下面三种启动模式有关:

  • 冷启动

    执行逻辑代码前所有变量值恢复为初始值(如若未设定初始值,则其默认值为0)。

  • 暖启动

    勾选了RETAIN属性的变量值保持其上次断电或者程序停止时的值,其他变量值恢复为初始值(如若未设定初始值,则其默认值为0)。PLC上电默认执行暖启动,如果暖启动失败则进行冷启动。

  • 热启动

    仅仅在调试模式下停止当前程序执行后,才可以执行热启动,所有的变量值维持不变,继续以当前的变量值参与逻辑运算。


局部变量与全局变量


变量从作用域上来区分,分为局部变量Local Variable与全局变量Global Variable

在程序Program中的变量表格中定义的变量默认为局部变量,只能在当前程序内使用,其他程序Program无法直接访问该变量,例如双击程序main后可以在其Local variables窗口中查看到目前已经有局部变量A,B,C的定义,变量A,B,C只能在当前的程序中使用:

05_09_p2.png

全局变量定义在工程中的全局变量表格中,双击可以打开该表格添加全局变量。全局变量可以被当前工程下面的所有程序Program、功能Function、功能块Function Block所引用,并且在当前工程中占用全局唯一的存储器空间:



05_10_p.png


在程序Program中使用全局变量无需在变量表格中进行定义,直接可以使用。下图中的程序mainmain1同时都使用了全局变量cnt,而全局变量cnt对应到PLC数据存储器的同一块存储器空间,因此main中对cnt进行的运算会直接影响main1中的cnt的值,反之亦然:


05_11_p2.png


实际工程应用中可以根据需要添加多个全局变量表格(多个全局变量表格中定义的全局变量不可以重名,否则可能会引起编译出错与存储器区域混乱),如下图所示:


05_12_p.png


无论是局部变量还是全局变量,我们都可以在变量表格与原始IEC61131-3标准中的变量文本定义模式之间切换,根据实际需求方便编辑(熟悉IEC61131-3标准的变量定义语法后,使用文本方式定义变量更加灵活方便),如下图所示:


05_13_p.png



变量地址Variable Address


前面我们使用的变量Variable都是用于PLC系统内部运算的变量,其存储器空间都是由LogicLab编译器进行自动分配。而在PLC系统中往往有一些特殊含义的存储器空间,比如:代表I/O输入的输入寄存器区域,可以用于获得外部硬件输入的信息;代表I/O输出的输出寄存器区域,可以用于向外部硬件输出运算的结果;代表通讯的寄存器区域,可以用于Modbus, CANopen, EtherCAT等等现场总线通讯;或者其他PLC厂商自定义的特殊含义寄存器区域。


因此为了访问这些特殊含义的存储器区域,我们是需要使用到变量地址Variable Address功能,强制让我们的变量与这些特殊的存储器区域关联起来,这样我们使用这些带地址Address的变量就可以完成我们期望实现的I/O与通讯访问功能。


由于使用LogicLab解决方案开发的PLC产品都包含有OEM厂商自己的特殊存储器地址空间定义,因此我们强烈建议您这边先查看所使用的PLC产品中对于I/O存储器地址空间,通讯存储器地址空间,以及系统内部特殊存储器地址空间的定义(一般情况下OEM厂商会基于LogicLab预先定义好所支持的特殊存储器地址空间与PLC变量的关联,因此用户一般并不需要很复杂的方式来自行定义变量的地址空间),下面我们还是简单介绍下变量地址定义的方法与基本原则,首先我们从一个实例开始添加变量A为模拟量输入,用于接收外部I/O的模拟量信号:

05_14_p.png


按照上面步骤,我们完成了变量A与外部I/O模拟量的输入关联,整个过程我们并没有涉及到IEC61131-3中的地址定义方法,完全由LogicLab工具降低定义地址的难度,其中需要注意的几个点为:

  1. 只有取消了自动分配地址才可以自行进行特殊存储器地址空间的定义

  2. 存储器区域有三种:输入Input(用于与外部输入信号关联),输出Output(用于与外部输出信号关联),内部存储器Memory(用于与通讯以及PLC内部特殊存储器区域关联)

  3. 特殊存储器地址可以指定到不同的Data block上,在输入Input、输出Output与内部存储器Memory上都有对应的Data block表示指定的功能

  4. Index偏移为对应的Data block上的单元偏移(注意此处并不是字节大小的偏移,在本示例中每个Index偏移都代表一个INT类型的变量)

  5. 如果是BOOL类型的变量,可以指定Bit位偏移


最终我们定义好该模拟量的输入后,LogicLab帮我们自动算好IEC61131-3标准中的地址,如下图所示:

05_15_p.png


上述地址定义示例最终获得到的是:%IW0.1这样的字符串,分别都具有下面特征:

  1. %I表示输入存储器区域地址,%Q表示输出存储器区域地址,%M表示通讯与内部特殊存储器区域地址


  2. 大小标识X/B/W/D分别表示1/8/16/32Bit大小的地址,并且地址大小标识必须与数据类型大小匹配,因此上图中就应该使用W表示16Bit地址大小标识,与INT变量类型大小一致


  3. Data block标识与Index偏移均由使用LogicLab解决方案的OEM厂商自行定义,请该厂商产品的使用手册


IEC61131-3标准化的变量类型与访问方式对于PLC产品的意义

PLC产品经过几十年的发展,逐步形成以欧系西门子主导的体系与日系三菱主导的体系并存局面。不同体系的PLC使用以及编程方式差距较大,特别是PLC内部的寄存器的定义,而IEC61131-3标准则将变量类型与访问方式进行了统一化的定义,特别是以变量名符号进行变量数据访问,逻辑程序可读性大大提升,特殊功能变量寄存器则由%I,%Q%M三种地址类型进行定义,因此支持IEC61131-3标准的控制器平台编程方式都是非常类似,大大降低学习以及应用成本,不同的应用逻辑可以很方便在不同的IEC61131-3标准的PLC产品上进行移植。


本章小结

在本章节中我们初步了解了PLC系统中的不同存储器的功能,基础数据类型的变量与常量的含义与应用方法。变量与常量为IEC61131-3标准的PLC系统中对传统PLC的内部寄存器区的归纳与总结,支持更多的基础变量类型,更贴近现代的高级语言编程思想。


对于变量地址相对较复杂,需要详细掌握其规则,参阅OEM厂商的PLC地址说明章节,我们就可以随心所欲定义这些地址到我们指定的变量上,完成对PLC外部信号,通信以及内部特殊功能的应用,可以给PLC应用工程师提供更灵活的空间实现较复杂的工业应用,同时也为熟悉高级语言编程的工程师一个更好的基础平台进一步熟悉IEC61131-3编程。


关注我们
产品中心
联系我们

服务电话:021-64190729

                 13764507241


咨询邮箱:support@nxtrol.com

关注我们微信公众号
获得最新技术与资讯