3.3 数据格式与数据类型
数据在用户程序中以变量形式存储,具有唯一性。根据访问方式的不同,变量分为全局变量和局部变量,全局变量在全局符号表或全局数据块中声明,局部变量在OB、FC和FB的变量声明表中声明。当块被执行时,变量永久地存储在过程映像区、位存储器区或数据块,或者它们动态地建立在局部堆栈中。
数据类型决定了数据的属性,如要表示元素的相关地址及其值的允许范围等,数据类型也决定了所采用的操作数。S7-1200 PLC中使用下列数据类型。
1)基本数据类型。
2)复杂数据类型,通过链接基本数据类型构成。
3)参数类型,使用该类型可以定义要传送到功能FC或功能块FB的参数。
4)由系统提供的系统数据类型,其结构是预定义的并且不可编辑。
5)由CPU提供的硬件数据类型。
3.3.1 数制
1.二进制数
二进制数的1位(bit)只有0和1两种不同的取值,可用来表示开关量(或称数字量)的两种不同的状态,如触点的断开和接通,线圈的通电和断电等。如果该位为1,则正逻辑情况下表示梯形图中对应的编程元件的线圈“通电”,其常开触点接通,常闭触点断开,反之相反。二进制常数以2#开始,如2#1111_0110_1001_0001是一个16位二进制常数。
2.十六进制数
十六进制数的16个数字是由0~9这10个数字以及A~F(对应于十进制数10~15)6个字母构成,其运算规则为逢16进1,在SIMATIC中B#16#、W#16#、DW#16#分别用来表示十六进制字节、十六进制字和十六进制双字常数,例如W#16#2C3F。在数字后面加“H”也可以表示十六进制数,例如16#2C3F可以表示为2C3FH。
十六进制与十进制的转换按照其运算规则进行,例如B#16#1F=1×16+15=31;十进制转换为十六进制则采用除16方法,1234=4×162+13×16+2=4D2H。十六进制与二进制的转换则注意十六进制中每个数字占二进制数的4位就可以了,如4D2H=0100_1101_0010。
3. BCD码
BCD码是将一个十进制数的每一位都用4位二进制数表示,即0~9分别用0000~1001表示,而剩余6种组合(1010~1111)则没有在BCD码中使用。
BCD码的最高4位二进制数用来表示符号,16位BCD码字的范围为-999~999。32位BCD码双字的范围为-9999999~9999999。
BCD码实际上是十六进制数,但是各位之间的关系是逢十进一。十进制数可以很方便地转换为BCD码,例如十进制数296对应的BCD码为W#16#296或2#0000_0010_1001_0110。
3.3.2 基本数据类型
S7-1200 PLC的基本数据类型见表3-4。
表3-4 S7-1200 PLC的基本数据类型
注:尽管BCD数字格式不能用作数据类型,但它们受转换指令支持,故将其列入此处。
由表3-4可以看出,字节、字和双字数据类型都是无符号数,其取值范围分别为B#16#00~FF、W#16#0000~FFFF和DW#16#0000_0000~FFFF_FFFF。字节、字和双字数据类型中的特殊形式是BCD数据以及以ASCII码形式表示一个字符的Char类型。
8位、16位和32位整数(SInt、Int、DInt)是有符号数,整数的最高位为符号位,最高位为0时为正数,为1时为负数。整数用补码来表示,正数的补码就是它的本身,将一个正数对应的二进制数的各位求反码后加1,可以得到绝对值与它相同的负数的补码。
8位、16位和32位无符号整数(USInt、UInt、UDInt)只取正值,使用时要根据情况选用正确的数据类型。
32位浮点数又称为实数(Real),浮点数表示的基本格式为1.m×2e,例如123.4可表示为1.234×102。如图3-12所示为浮点数的格式,可以看出,浮点数共占用一个双字(32位),其最高位(第31位)为浮点数的符号位,最高位为0时是正数,为1时是负数;8位指数占用第23~30位;因为规定尾数的整数部分总是为1,只保留了尾数的小数部分m(第0~22位)。标准浮点数格式为
S∗(1. f)∗2(e-127)
其中S=符号位,(0对应于+,1对应于-);f= 23位尾数,最高有效位MSB = 2-1及最低有效位LSB =2-23,e=二进制整数形式的指数(0<e<255)。
浮点数的表示范围为-3.402823×1038~-1.175495×10-38,1.175495×10-38~3.402823×1038。
图3-12 浮点数的格式
长实数(LReal)为64位数据,比32位实数有更大的取值范围。
浮点数的优点是用很小的存储空间(4B)可以表示非常大和非常小的数。PLC输入和输出的数值大多是整数(例如模拟量输入值和模拟量输出值),用浮点数来处理这些数据需要进行整数和浮点数之间的相互转换,需要注意的是,浮点数的运算速度比整数运算慢得多。
时间型数据(Time)为32位数据,其格式为T#多少天(day)多少小时(hour)多少分钟(minute)多少秒(second)多少毫秒(ms)。Time数据类型以表示毫秒时间的有符号双精度整数形式存储。
3.3.3 复杂数据类型
通过组合基本数据类型构成复杂数据类型,这对于组织复杂数据十分有用。用户可以生成适合特定任务的数据类型,将基本的、逻辑上有关联的信息单元组合成一个拥有自己名称的“新”单元,如电动机的数据记录,将其描述为一个属性(性能,状态)记录,包括速度给定值、速度实际值、起停状态等各种信息。另外,通过复杂数据类型可以使复杂数据在块调用中作为一个单元被传递,即在一个参数中传递到被调用块,这符合结构化编程的思想。这种方式使众多基本信息单元高效而简洁地在主调用块和被调用块之间传递,同时保证了已编制程序的高度可重复性和稳定性。
复杂数据类型见表3-5,包括以下几种:
1)DTL。
2)字符串(String)。它是最多由254个字符(Char)的一维数组。
3)数组(Array)。它将一组同一类型的数据组合在一起,形成一个单元。
4)结构(Struct)。它将一组不同类型的数据组合在一起,形成一个单元。
表3-5 复杂数据类型说明
1. DTL(长格式日期和时间)数据类型
DTL数据类型是一种12B的结构,以预定义的结构保存日期和时间信息,见表3-6。可以在块的临时存储器中或者在数据块中定义DTL。
表3-6 DTL举例
DTL变量的结构由若干元素构成,各元素可以有不同的数据类型和取值范围。指定值的数据类型必须与相应元素的数据类型相匹配。表3-7给出了DTL变量的结构元素及其属性。
表3-7 DTL变量的结构元素及其属性
2. String(字符串)
String数据类型的变量将多个字符保存在一个字符串中,该字符串最多由254个字符组成。每个变量的字符串最大长度可由方括号中的关键字String指定(如String[4])。如果省略了最大长度信息,则为相应的变量设置254个字符的标准长度。在内存中,String数据类型的变量比指定最大长度多占用两个字节,见表3-8。
表3-8 String变量的属性
可为String数据类型的变量分配字符。字符在单引号中指定。如果指定字符串的实际长度小于声明的最大长度,则剩余的字符空间留空。在值处理过程中仅考虑已占用的字符空间。
表3-9的字符串实例定义了一个最大字符数为10而当前字符数为3的字符串,这表示该String当前包含3个单字节字符,但可以扩展到包含最多10个单字节字符。
表3-9 字符串举例
3. Array(数组)
Array数据类型表示由固定数目的同一数据类型的元素组成的域。所有基本数据类型的元素都可以组合在Array变量中。Array元素的范围信息显示在关键字Array后面的方括号中。范围的下限值必须小于或等于上限值,见表3-10。
表3-10 数组的属性
表3-11的例子说明如何声明一维Array变量。
表3-11 数组举例
访Array元素通过下标访问来进行。第一个Array元素的下标为[1],第二个元素的下标为[2],第三个元素的下标为[3]。在本例中要访问第二个Array元素的值,需要在程序中指定“OP_Temp[2]”。
变量“Op_Temp”也可声明为Array[-1..1]of Int,则第一个Array元素的下标为[-1],第二个元素的下标为[0],第三个元素的下标为[1]。例如“#My_Bits[3]”表示引用数组“My_Bits”的第3位,“#My_Data[-2]”表示引用数组“My_Data”的第4个SInt元素。注意“#”符号由程序编辑器自动插入。
4. Struct(结构)
Struct数据类型的变量将值保存在一个由固定数目的元素组成的结构中。不同的结构元素可具有不同的数据类型。注意:不能在Struct变量中嵌套结构。Struct变量始终以具有偶地址的一个字节开始,并占用直到下一个字限制的内存。
关于复杂数据类型的使用将在6.4节中详细介绍。
3.3.4 参数类型
参数类型是为在逻辑块之间传递参数的形参(Formal Parameter,形式参数)定义的数据类型,包括Variant和Void两种。
Variant类型的参数是一个可以指向各种数据类型或参数类型变量的指针。Variant参数类型可识别结构并指向这些结构。使用参数类型Variant还可以指向Struct变量的各元素,见表3-12。Variant参数类型变量在内存中不占用任何空间。
表3-12 Variant参数类型的属性
Void数据类型不保存任何值。如果某个功能不需要任何返回值,则使用此数据类型。
3.3.5 系统数据类型
系统数据类型(SDT)由系统提供并具有预定义的结构,其结构由固定数目的可具有各种数据类型的元素构成,不能更改系统数据类型的结构。系统数据类型只能用于特定指令。表3-13给出了可用的系统数据类型及其用途。
表3-13 系统数据类型及其用途
(续)
3.3.6 硬件数据类型
硬件数据类型由CPU提供。可用硬件数据类型的数目取决于CPU。根据硬件配置中设置的模块存储特定硬件数据类型的常量。在用户程序中插入用于控制或激活已组态模块的指令时,可将这些可用常量用作参数。表3-14给出了可用的硬件数据类型及其用途。
表3-14 硬件数据类型及其用途
(续)
前面介绍了S7-1200 PLC中的各种数据类型,如果在一个指令中使用多个操作数,必须确保这些数据类型是兼容的。在分配或提供块参数时也是同样的道理。如果操作数不是同一数据类型,则必须执行转换。可选择两种转换方式,即显式转换和隐式转换。显式转换是指在执行实际指令之前使用显式转换指令;而隐式转换则是当操作数的数据类型是兼容的则自动执行隐式转换。