第一节 HMI和PLC系统中的变量及数据类型
一、变量和数据
在博途自动化工程软件系统中创建HMI设备项目或PLC设备项目时,软件系统会自动在HMI(PLC)变量编辑器文件夹中生成一个默认变量表用来定义变量。在前两章的HMI项目的画面及画面对象的编辑组态实例中,可以看到使用变量来作为画面对象的属性参数、使用变量动态化画面及画面对象等。变量用于存放数据信息(数值或文本字符),用于在程序中准确描述反映各种项目工艺过程量和实现项目的工艺控制任务。
无论是编辑组态HMI项目,还是PLC项目,当需要使用数据(变量)时,通常要先在变量表中创建(定义/声明/添加)变量(即使直接在程序中创建的变量,系统也会自动将它登录在变量表中),然后在HMI(PLC)程序中运用变量进行数据计算、数据交换和数据处理等。
一旦在变量表中添加一个变量并为之定义名称,软件系统就会在设备的存储器区指定一个存储单元,用来存放数值或字符。当工程项目需要定义许许多多的变量时,系统软件就会在存储区域开辟成百上千的存储单元,变量名称是识别区分存储单元的标志符号,因此变量名称必须是唯一的,在变量表中,不允许变量重名,否则,软件系统会在组态编辑时报错。对于初学者要理解,在PLC和HMI控制系统中,变量实质上就是被指定的存放数据的存储器单元。存储单元中的数据就是变量的值,之所以叫变量,是因为存储单元的数据是可以随时变化的。这同数学函数中的变量概念完全一致,工艺控制系统中有许多具有量化关系的过程控制量,有的数学关系清晰,有的数学关系模糊,为了准确执行工艺控制过程,通常要设计建立一套包含过程控制量及其数学关系的解决方案,也称为控制任务的数学模型,用编制的PLC(HMI)程序自动执行控制任务,这些工作通常是从创建变量开始的。
二、常用数制及数制的运算
1.常用数制及相互转换
在工艺工程计算时,常采用十进制数进行运算,这也是我们日常生活习惯的用法。十进制数制有0~9共十个数字,运算时逢十进一。
在HMI和PLC控制系统的CPU(中央处理运算单元)内部存储和运算采用的是二进制的编码和算法。这是由数字电子电路的特性决定的。二进制只有0、1两个数字元素,各种数据信息用二进制数进行编码。用二进制计数时逢二进一。例如对于十进制的数0、1、2、6、12、15等六个数,如果用4位二进制数编码表示则为0000、0001、0010、0110、1100、1111。可以看到4位二进制数有16种编码组合,最大可表示的数为15。更大的数可以使用8位、16位、32位或64位二进制数表示。数字电路技术可以完美地保存、表现和处理常用的1位、4位、8位、16位、32位或64位二进制数。
一个16位二进制数0101 1110 0011 1010,相当于十进制的多少数呢?二进制数从右到左的位号依次编为第0位、第1位、第2位、…、第15位。就像十进制的个位、十位、百位……,每一位的权重不同,十进制数从个位向左依次为100、101、102、103……。二进制数的各位的权重从最低位0位向左(高位)依次为20、21、22、23……。计算上述的二进制数转换到十进制数则为1×214+1×212+1×211+1×210+1×29+1×25+1×24+1×23+1×21=24122。位数为1的位号用1乘以权重数,然后相加在一起即可。
依据不同的二进制数编码规则,在数字电路(大规模集成电路或数字芯片)中可以用二进制数表达整数、浮点数、正负数、日期、时间、字符、字符串(语句)以及各种特殊数字或符号等。这是将人的思维、构想付诸机器(技术发展使其存储信息容量越来越大,处理速度越来越快)去描述、执行、实现的重要基础。
在PLC、HMI控制技术学习和程序编制、调试时,经常会看到使用八进制、十六进制、BCD码等数制格式。为了区分十进制数,通常为其他数制的数添加前缀,如2#0101 1110 0011 1010表示二进制数、8#560表示八进制数、16#2E7B表示十六进制数、BCD#289表示BCD编码格式的数据等。
八进制数只有8个数字元素,即0、1、2、3、4、5、6、7。计数时逢8进1(不会出现十进制数中的8、9数字)。同样,一个八进制数如8#560,等于十进制数368,计算方法为8#560=5×82+6×81+0×80=368。
十六进制数有16个数字元素,即0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,计数时逢16进1。用A、B、C、D、E、F表示数值10、11、12、13、14、15。如16#2E7B等。
PLC、HMI等设备内部最基础的数据存储和运算都是以0/1表示的二进制数的存储和运算,二进制数位数多,难以记忆、识读、书写(键盘输入),容易出错。而用八进制数、十六进制数表示二进制数比较方便,一位十六进制数可以表示四位二进制数,这样一个16位(或32、64位)的二进制数用4位(8、16位)十六进制数表示,记忆和识读就方便多了,所以在组态编制、调试程序时,常用十六进制数、八进制数表示二进制数。例如2#0101 1110 0011 1010=16#5E3A,可以看到用4位十六进制数5E3A可以表示16位二进制数。同样可用一个6位八进制数表示一个16位二进制数,如2#0 101 111 000 110 010=8#057062。
二进制数和十六进制数、八进制数是如何转换的呢?
表3-1-1为4位二进制数与十六进制数的16个数字元素、BCD编码数对应代码表。常被称为8421码。将一个二进制数,例如2#0101 1110 0011 1010从右边最低位0位开始,每四位一组编排,按照表3-1-1的对应规则,将每四位二进制数转换成8421码的十六进制数,即完成了二进制数向十六进制数的转换。0101(16#5)、1110(16#E)、0011(16#3)、1010(16#A),于是,2#0101 1110 0011 1010=16#5E3A。
同样原理,二进制数转换成八进制数时,将二进制数从右向左每三位排在一起,将三位二进制数对应的八进制数值代换三位二进制数,即可完成转换工作。例如16位二进制数2#0 101 111 000 110 010,因2#0=8#0、2#101=8#5、2#111=8#7、2#000=8#0、2#110=8#6、2#010=8#2,于是2#0 101 111 000 110 010=8#057062=8#57062。
十六进制数、八进制数向二进制数转换也很好理解。十六进制数的每一位按照8421编码规则,可以分解成4位二进制数,排列顺序不变,所形成的二进制数即完成十六进制数向二进制数的转换。八进制数亦然。
BCD型数据是用4位二进制数表示十进制数,如表3-1-1所示。4位二进制数有16种组合,取其中的10种组合表示十进制数的0~9共10个数字,其余6种组合在BCD编码中弃之不用。这样8位二进制数可以表示0~99,16位二进制数可以表示0~9999等,例如BCD编码的数1001 0110表示十进制的96,16位BCD码的二进制数0011 0110 0000 0010表示3602。
例如S7-300/400、S7-1500支持的S5TIME类型定时器常采用16位二进制BCD编码的数据格式。
IEC定时器不再使用BCD编码数据,直接采用32位二进制整数,获得广泛应用。
表3-1-1 4位二进制数与十六进制数16个元素、BCD编码数对应代码表
2.数制的运算
二进制数相加以最低位0位为基准,依次向左对位相加,逢二进一。例如8位二进制无符号整数的加运算:
为了表示数值的正负号,对于有符号数,规定最高位为符号位,0表示正(+),1表示负(-)。例如8位有符号整数1011 1010表示-58,为避免出现运算溢出等错误,规定8位有符号整数的值域范围-128~127。8位无符号整数的值域范围0~255。
二进制数的减运算要用到原码、反码和补码的概念。例如0110 1010的反码是将各位取反,原位为1则改为0,原位为0则改为1,于是原码0110 1010的反码为1001 0101。反码+1就得到原码的补码。于是原码0110 1010的补码为1001 0110。
参与二进制数减运算的二进制数是以其补码的形式进行加运算完成的。正的二进制数的补码是它本身,负的二进制数的补码是其正二进制数的取反+1。例如下面两个8位二进制数的减运算。
在HMI、PLC设备项目程序中经常使用二进制数的逻辑运算。逻辑运算主要有与(AND)、或(OR)、非(NOT)和异或(XOR)等运算。运算规则如下所述。
3.计算器辅助数制转换和运算
在实际编程调试时,也常用PC操作系统的附件计算器运算和处理多种数制数据,见图3-1-1和图3-1-2。
图3-1-1 附件计算器的程序员工作模式
图3-1-2 计算器使用
可选择数据的长度,如8位(字节)、16位(字)、32位(双字)和64位(四字或长字)。
可以操作各种数制数据的相互转换。例如十进制数转换成二进制数,首先点选十进制工作模式,然后输入十进制数,再点选二进制模式,当前显示为二进制表示的输入数。其他数制间转换操作同理。
想查看一个二进制数对应的十进制值,需输入二进制数,但位数较多的二进制数输入时易出错。在十进制模式,鼠标单击二进制数显示区的二进制数任意位,可以看到该位数值在0/1间转换,在此输入(改变)二进制数,上方显示区可看到对应的十进制数值。
可以操作任意数制数的算术和逻辑运算。例如1011 AND 0110。也可进行移位操作。
三、PLC项目程序中的符号访问和绝对访问
当程序在运行过程中读写某个变量时,软件运行系统(或操作系统)会根据变量名称在变量存储区域找到那个变量单元并使用(读/写)其值,这种根据变量名称在变量存储区寻找并读/写变量的方法叫符号寻址或符号访问。
在设计组态HMI和PLC集成控制系统时,作为通信伙伴的HMI设备和PLC设备也是通过相互一一对应的变量实现两个设备之间的数据传送和交换的。要在HMI设备变量表中清晰指明HMI变量与PLC变量一一对应(映射)的关系。因此,对于HMI和PLC集成控制系统,既要掌握了解HMI设备的变量表和用法,又要熟悉掌握PLC设备的变量表和数据块的用法。不同于HMI项目,PLC项目程序中既有变量的符号寻址或符号访问,也有变量的绝对寻址、绝对访问的概念。
PLC变量存储区的最基本工作单元是位(Bit),8个二进制的位组成一个字节(Byte),2个字节组成一个字(Word),2个字组成一个双字(Double Word)。这里的位、字节、字和双字等是描述存储单元大小(长短)的单位。PLC中的存储单元是按照字节(Byte)依次编排的,如图3-1-3所示。以M存储区为例:MB0表示存储单元的第一个字节,后面单元排列依次标记为MB1、MB2…,M是存储区域的标志符号,一般用于存储中间计算数据(很像传统逻辑控制电路中的中间继电器的作用,只是中间继电器只能表示1位的变量数据,通常通电表示1,断电表示0,继而其触点闭合表示1,断开表示0),B表示字节(Byte)。用MB0、MB1…标记存储单元的具体地址称为绝对地址,当程序用MB0、MB1…的标记读写存储单元时,也称为绝对访问。
图3-1-3 数据存储区位、字节、字与双字之间的关系(图中以I存储区为例)
可以访问存储区的位单元,如用M0.0表示第1单元的第0位,M12.6则表示第12字节单元的第6位。
同样可以访问字单元和双字单元,如用MW12表示M存储区的第12字单元,也就是指向第12和第13字节单元,用字符W(Word)表示字。用MD12表示M存储区的第12双字单元,它包含第12~第15四个字节单元,也可以说包含第12和第14两个字单元,用字符D(Double Word)表示双字。
依据这样的存储单元命名规则,存储区的任何一个存储单元,无论是位单元、字节单元、字单元还是双字单元都有一个确切的地址,即绝对地址。当我们在PLC变量中添加一个新变量时,既要给该变量编制一个名称(变量符号),又要给该变量安排一个具体的绝对地址。当PLC程序运行时,需要访问变量,既可以根据变量名称在众多变量中找到所需变量(符号寻址、符号访问),也可以根据变量的绝对地址找到变量(绝对寻址、绝对访问)。
PLC设备还有I、Q、D、T、C等数据存储区,虽然都可作为数据存储区,但是作用不同。I存储区称为输入映像存储区,用来接收从DI、AI硬件模块传送过来的信息数据,针对不同类型的接收数据,可以表示为I0.1、IB10、IW20、ID20等代表位、字节、字和双字数据变量;Q存储区称为输出映像存储区,用来存放需要输出到DQ、AQ硬件模块的信息数据,同样可以表示为Q0.1、QB10、QW20、QD20等。在I、Q、M存储区保存的变量是在PLC变量表中创建的。
D存储区称为数据块存储单元,由于现场工艺数据比较复杂,为提高处理数据的效率,PLC专门建立了被称为数据块的存储区域,每个数据块都有唯一的名称和编号,作为地址便于寻址和访问。数据块存储单元也是以字节顺序编排的,当读写数据块中的变量数据时,用绝对地址DB1.DBX2.0表示编号为1的数据块的第2字节的第0位,用DB2.DBB20表示2号数据块的第20字节,同理用DB3.DBW12、DB2.DBD20表示数据块的字和双字存储单元的地址。数据块用DB(Data Block)符号+编号数字表示。数据块在PLC设备的程序块编辑器中创建。
四、变量的数据类型
1.HMI变量的数据类型
HMI变量的数据类型本质上同PLC变量的数据类型是一回事。HMI变量数据类型的应用相对PLC变量的使用要简单一些。
在编辑组态HMI项目时使用的变量分为内部变量和外部变量两种。内部变量是指在HMI设备项目内部使用的变量,不参与HMI设备与其他设备组网连接所发生的变量通信(数据交换等)等操作。反之,在HMI设备和PLC设备的集成控制系统中,HMI变量通过网络一一对应(映射)连接PLC变量,参与数据传送和交换,这类HMI变量称为外部变量。
无论HMI变量,还是PLC变量,其存储区中的变量数据长短大小不一,但以位为最基本单元,最小的数据只有一位,数据值只能表示二进制的0或1,数据位长的可以是4位、8位、16位、32位或64位,甚至更长,所能表示的数据值范围(值域)就很宽。这些是由变量的数据类型不同决定的。
由于现场工艺控制系统的数据应用种类繁多,例如生产线产量计件,可用整数;温度控制时,如果控制精度为±1℃(如256℃),则可用带符号的整数,如果控制精度为±0.1℃(如68.6℃),则必须用实数(浮点数),同样是温度控制,有些场合温度的变化范围较小(如0~120℃),而有些则较大(如0~1200℃),在变量表中定义变量数据类型时,没有必要将一个值变化范围较小的变量安排给一个较大(位数较多)的存储单元,系统操作变量时,既浪费存储单元容量,又影响运算速度。当定义添加的变量非常多时,这种浪费所带来的影响就非常大了。
工艺控制工程中的数据应用场合、应用要求千差万别,为了满足要求,同时还必须适应半导体存储器的特点和要求,适应PLC和HMI设备数据计算和处理效率的要求,PLC和HMI系统为变量规定了一系列的数据类型。当用户使用变量时,要评估所用变量的取值范围,对照HMI和PLC系统定义的数据类型,为所添加的变量选择合适的数据类型。
在HMI变量表中添加变量时,如果定义的是内部变量,则必须为其选择数据类型。HMI设备内部变量的常用数据类型如表3-1-2所示。可以看到位数越多的数据类型所表示的数据取值范围越大,例如Int型数据表示带正负号的16位整数,值域为-32768~32767,程序中所用变量值如刚好在此范围内,就可以为该变量选用Int数据类型,若使用DInt类型也是可以的,但显然浪费存储资源,更重要的是CPU运算速度也大受影响,是不可取的。这也是进行数据类型划分的意义。
表3-1-2 HMI设备内部变量常用数据类型
HMI的外部变量的数据类型取决于与之连接的PLC变量的数据类型,不需要在变量表中定义,当在为HMI外部变量连接到具体的PLC变量时,软件系统会根据所连的PLC变量的数据类型确定当前HMI变量的数据类型。
2.PLC变量的常用数据类型
PLC变量数据类型比HMI划分得更多更细,新型S7-1200/1500 PLC比S7-300/400 PLC的数据类型又增加了一些,以S7-1500 PLC支持的数据类型最多。这样做的目的是提升PLC程序的运算速度和执行效率。许多知名PLC厂商也都采取这样的做法。
PLC变量通常在变量表和数据块中创建,如图3-1-4所示。在组态HMI设备的外部变量连接属性时,通常在PLC设备的变量表和数据块中找到对应连接(映射)的变量数据。
图3-1-4 PLC变量数据的创建和保存
在组态HMI、PLC集成控制系统时,连接通信PLC变量是一个重要的组态工作。这里对PLC变量及常用数据类型介绍如下。
PLC常用的数据类型如表3-1-3、表3-1-4所示。
表3-1-3 S7-300/400 PLC设备变量常用数据类型
表3-1-4 S7-1200/1500 PLC设备变量的常用数据类型
LWord、LInt、ULInt、LReal、LTIME、LTOD和LDT数据类型只能通过符号名寻址。
二进制数、整数、浮点数等数据类型也称为基本数据类型,含义比较好理解。日期时间数据类型的应用详见后续章节,自定义数据类型等将在后面章节结合实例进行介绍。