西门子plc复杂数据类型包括日期和实践(DATE_AND_TIME)、字符串(String)、数组(Array)、结构(Struct)和用户定义的数据类型(UDT)。 1、日期和时间 日期和时间(DATE_AND_TIME)占8个字节的BCD码,第1~6个字节分别存储年、月、日、时、分和秒,毫秒存储在整个第7个字节和第8个字节的高4位,星期存放在第8个字节的低4位,星期日代码为1,星期一 ~ 星期六的代码为2~7.例如2010年7月27日12点30分25.123秒可以表示为DT#10-07-27-12:30:25.123。 通过调用程序编辑器文件夹“LibrariesStandard LibrariesIEC Function Block”中的IEC功能(参见下图) 调用SFC0”SET_CLK”可以设置和启动CPU时钟的时间和日期。调用SFC1”READ_CLK“可以读取CPU系统时钟当前的日期和时间。 2、字符串 字符串(String)是字符(Char)组成的一堆数组,每个字节存放一个字符。第1字节是字符串的大字符长度,第2个字节是字符串当前有效字符的个数,字符从第3个字节开始存放,一个字符串多有254字符。字符串的默认长度为254B,如下图所示,在DB3中定义字符串Fault的长度为20个字符,它只占用从DB3.DBB20开始的22B,其初始值只有4个字符“over”。String变量中未使用的字节地址被初始化为B#16#00. 可以使用标准库的IEC苦衷的21个功能来处理字符串变量,见下表,包括字符串与其他数据类型的转换、字符串比较和字符串编辑,具体方法参见在线帮助。
3、数组 数组(ARRAY)是同一类型的数据组合而成的一个单元,数组的维数多为6维。下图给出一个二维数组ARRAY [1..2,1..3]的内部结构,它共有6个字节的元素,图中每一个小格为二进制的1位,每个元素占一行(一个字节)。ARRAY后面的方括号的数字用来定义每一维的起始元素和结束元素在该维中的编号,可以取-32768~32767之间的整数。每维之间的数字用逗号隔开,每一堆开始和结束的编号用两个小数点隔开。如果有一维有N个元素,该维的起始元素和结束元素的编号可以采用1和N,例如ARRAY [1..100]
4、结构 结构(STRUCT)可以是不同类型的数据组合,可以用基本数据类型、负载数据类型(包括数组和结构),和用户定义数据类型(UDT)做为结构的元素,例如一个结构可以由数组和结构组成,结构可以潜逃8层。用户可以把过程控制中有关数据统一组织在一个结构中,作为一个数据单元来使用,而不是使用大量单个的元素,为统一处理不同类型的数据和参数提供了方便。 5、用户定义数据类型 用户定义数据类型(User-Defined Data Types)简称UDT,是一种特殊的数据结构,用户只需要对它定义一次,定义好了可以在用户程序中作为数据类型使用,可以用它来产生大量的具有相同数据结构的数据块,用这些数据来输入用于不同目的的实际数据。例如生成用于颜料混合配方的UDT后,可以用它来生成用于不同颜色配方的数据组合。用户定义数据类型有基本数据类型和复杂数据类型组成。定义好以后可以在符号表中为它指定一个符号名,使用UDT可以节约录入数据的时间。 举例说明: 1、数组的生成和使用 (1)生成数组 可以在数据块中定义数组,也可以在逻辑块的变量声明表中定义它。下面介绍在数据块中定义的方法,在SIMATIC管理器中用菜单命令:【插入】-【S7块】-【数据块】生成数据块DB3,双击打开DB3,默认显示方式为声明视图方式如下图所示:声明视图用于定义、删除和修改共享数据块中的变量,指定它们的名称、数据类型和初始值。行和后一行标有STRUCT和EDN_STRUCT,这两行中间有一个自动生成的临时占位符变量。
按如下图输入
在类型INT所在行的地址列自动生成*2.0,表示一个数组占用2B,地址列+12表示该数组的6个元素一共占用12B,地址列的内容自动生成,可以给每个变量加上注释,数组个元素维press[1,1],第6个元素为press[2,3], (2)给数组元素赋初始值 Step7根据变量的数据类型给出默认的初始值,用户可以修改初始值,定义数组时可以在ARRAY所在的行的初始值中给元素赋初始值,如上图所示。执行菜单命令【视图】-【数据视图】,切换到数据视图方式,将显示数组和结构中个元素的初始值和实际值如下图所示
(3)访问数组中的数据 例如:”TANK” .press[2,1]。其中TANK是数据块DB3的符号名,press是数组名称,它们用英语的句号分开。方括号中的是数组元素的下表,该元素是数组的第4个元素如下图。
(4)用数组传递参数,如果在块的变量声明表中声明形参的类型为ARRAY,可以将整个数组作为参数来传递,在调用块时可以将每个数组元素赋值给统一数据类型的参数,如下图。
(5)用数组定义数据块的大小 数据块的大小与数据块中定义的变量的个数和数据类型有关,如果需要一个容量很大的数据块,可以用数组来定义数据块的大小,如果在数据块中只定义一个数组ARRAR[1..500],数组元素的数据类型为字,则该数据块的大小为100B。可以用地址和任意的简单数据了诶行来方位该数据块中的存储单元。若方位数据块中未定义的地址,将会出现错误信息“读取时发生区域长度错误”。 (6)设置数据块参数:鼠标右键点击数据块,选择对象属性,出现如下图所示,具体如何设置参见帮助。
(7)使用程序状态功能监视数据块 点击数据块工具栏上的监视按钮,自动切换到“数据视图”显示方式,数据块内的存储单元在线的数值在实际值列中显示,程序状态被激活后,不能切换“声明视图”方式。 2、结构的生成和使用 (1)结构的生成 可以在数据块中或逻辑块的声明表中定义结构,下面介绍在数据块中定义的方法,在上面DB3数据块中,再定义一个结构,名为stack的结构由3个不同数据类型的变量组成。如下图所示:
在“ARRAY”下面的INT,按回车键,在该单元下面生成一个空白行,在名称输入stack,在类型列单元点右键选择复杂数据类型,选择STRUCT,(也可以直接输入STRUCT),按回车后再改行下面出现新的行,按如图输入。在END_STRUCT点回车,在出现的新的行中定义一个名为fault的字符串,如上图所示,字符串长度占20个字符 在上图中stack所在行的地址列中的+12表示结构在数据块中的起始地址为DBB12,结构中各元素的地址列中的+2.0等表示在结构中的相对起始地址,=8.0表示该结构一共占用8B,后一行地址行的=42.0表示DB块中的数组、结构和字符串一共占用42B, (2)访问结构中的元素 可以用结构中的元素的地址或符号地址来访问结构中的元素,访问结构中的数据时,需要指出结构所在的数据块的名称、结构名称,以及结构元素名称,数据块tank内结构stack的元素amount应表示为”tank”.stack.amount。因为amount从数据块tank(DB3)的第12号字节开始存放,它的地址为DB3.DBW12. (3)用结构传递参数 如果在块的变量声明表中,声明形参的类型为数组或结构,可以将整个数组或结构而不是它们的每个元素作为参数来传递,调用块时也可以将某个数组或结构的元素赋值给同一类型的参数。 将复杂数据类型的变量作为参数传递时,作为形参和实参的两个变量必须具有相同的数据结构,例如两个结构应具有相同数据类型的结构元素和相同的排列顺序。 3、用户定义数据类型的生成和使用 在SIMATIC管理器的左面窗口”块“,执行菜单命令【插入】-【S7块】-【数据类型】,生成新的UDT,在生成UDT的元素时,可以设置它的初始值和加上注释,如下图
从表面上看UDT1与stack完全相同,但是它们有本质区别。 结构(STRUCT)是在数据块声明视图方式或逻辑块的变量声明表中与别的变量一起定义的,但是UDT必须在特殊的数据块内单独定义,并单独存放在一个数据块中。生成UDT后,在定义变量时将它作为一个数据类型来多次使用,例如:在变量声明表中定义一个变量,其数据类型为UDT1,名称为ProData如下图
上图可以看出,UDT在数据块中的使用方法与其他数据类型(如INT)是一样的。 UDT可以在逻辑块(FC、FB、OB)的变量生命表中作为基本数据类型或复杂数据类型来使用,或者在数据块(DB)作为变量的数据类型来使用。
|