《S7-300中UDT与STRUCT型数据总结》由会员分享,可在线阅读,更多相关《S7-300中UDT与STRUCT型数据总结(17页珍藏版)》请在金锄头文库上搜索。
1、UDT 型说明:从数据类型的意义上说 UDT 并不被 CPU 所识别,而是在离线程序中自定义(组合)的数据类型。 S7 程序的自定义数据类型并不能装载到 S7 CPU 中。UDT 是由递增的编辑器创建并编辑或由源文件的编译而生成。 当在块调用中进行变量传递时是不能将 UDT 作为内存地址区域来传递的。因此推荐将传递的变量指定为字节数据类型并与其数据长度相一致,或者使用UDT 的符号名来定义 IN, OUT 和 IN_OUT 参数,因为系统将自动生成相对应的地址。下表介绍了如何创建和参数化 UDT 类型变量的过程。 我们将以两组各十台相同的电机为例。 UDT1 对应这些电机的所有输入变量。序号步
2、骤1 在 STEP 7 项目中插入自定义数据类型。如图 01 鼠标选中“block” 文件夹并点击右键,再弹出菜单中选择命令“Insert New Object Data Type” 。图 012 在“Properties - Data Type”对话框中输入 UDT1 的符号名(这里以“Motor” 为例)后点击 OK 确认。图 023 打开 UDT1 并输入相关数据类型的变量及其初始值。图 03 为 UDT1 变量声明的例子。图 034 然后通过菜单命令“Insert S7 Block Data Block”在 STEP 7 项目中添加一个数据块 DB1 ,并在“Properties -
3、Data Block”属性对话框中为其定义符号名(例如此例为“Halle_Motoren” (Hall - Motors))。点击 OK 确认。 图 045 打开 DB1 将变量数据类型定义为 UDT1 (符号名“Motor”)。 例如图 05 所示:两个数组( ARRAY)变量,每组包括10 个以 UDT1 为数据类型的变量( 编号 1 到 10)。图 05由于此例两组电机是独立的,所以在 DB1 中要为每一组电机创建数据结构。例如第一组的数据结构定义为数据类型为 UDT1 的数组“ Array1.10 ”,符号名为“Halle_1_Motor”。6 选择菜单命令“View Data Vie
4、w” 可显示所有 DB1 数据。图 06注意事项:在数据块中变量定义为 UDT 情况下只能对实际值进行编辑。即可以在数据块的数据视图中输入变量的当前值。初始值“Initial Value”纵栏显示的是在定义 UDT 变量时所设的初值。只是在 DB 块第一次存储时将初值作为当前值。7 为 FC 或 FB 定义 UDT 1 类型的 IN 参数创建 FB 或 FC 时,可以定义 UDT 1 (Motor )类型的 IN 参数,如图 07 所示。例如,与操作语句:“U #Eingabe.Einschalten” (A #Input.Switch On) Eingabe:FC1 的 IN 参数变量 Ei
5、nschalten: UDT1 中的一个变量名图 07UDT 数据类型同样适用于 OUT 和 IN_OUT 参数,方法同上。8 数据块 DB1 的寻址及编程图 08 所示为变量定义为 UDT1 类型数据结构的 DB1 的编程例子。例如与操作:U “Halle_Motoren”.Halle_1_Motor2.Einschalten (“U Hall_Motors.Hall_1_Motor2.Switch On) Halle_Motoren: DB1 的符号名 Halle_1_Motor2: DB 块数组 2 的变量 Einschalten: UDT1 中的一个变量名图 089 在 FC 或 FB
6、 中参数化 IN 参数当调用 FC1 时, UDT 类型的输入变量必须赋值,例如可以用如下语句将第一组电机地址指针赋给输入参数。 “Halle_Motoren”.Halle_1_Motor1 (“Hall_Motors”.Hall_1_Motor1)图 09这种参数化过程同样适用于定义为 UDT 类型的 OUT 和 IN_OUT 参数的其它变量。10 在交叉参考表中可以显示 S7 用户程序所用地址及应用(例如 DB1 )的列表。 图 10数据块“unlinked”属性注意事项:如果在 DB 块中定义了 UDT 数据类型并且将 DB “unlinked”属性激活,对于 STEP 7 V5.2 /
7、 V5.3,如果对 UDT 作了修改,STEP 7 会应用“Check block consistency”功能自动调整数据块,此时“unlinked”的属性可能会失效。当块一致性检查完成后,确保 DB 的“unlinked”属性依然有效,否则可作相应设置。 STEP 7 在线帮助可提供更多相关信息: “User-Defined Data Types (UDT) ” “Entering and Displaying the Structure of Data Blocks Referencing a UDT” “Entering the Data Structure of Shared Dat
8、a Blocks”关键词:块例程,自定义数据类型一、案例说明1、控制对象 4 个控制方式相同的电机。2、单个电机控制要求(1)按下启动按钮 -电机启动,并开始计时 -到达设定时间后发出电机维护提示(2)按下停止按钮 -电机停止,并停止计时,但并不将时间清零。(3)电机运行时间小于设定值,时间不能复位,电机运行时间达到或。超过设定值后按下复位按钮时间置 0,电机维护提示消失。(4)当电机发生故障时,电机停止运行,并发出报警,故障处理完毕后必须手动确认复位报警信号才能再次启动电机。 (5)任何时间电机停止,计时停止,电机运行,继续计时,时间只能有复位按钮可以清零。3、要求将四个电机的所有参数放在
9、1 个 DB 块中,方便管理和做上位接口二、案例分析根据控制要求得出单个电机所需 I/O输入:启动、停止、故障复位、计时复位、电机维护周期、电机故障报警输出:运行、故障报警、已运行时间、电机维护提示根据案例说明 3 中的要求我们需要自定义结构 UDT 和 DB 块的配合使用三、编程1、首先建立 UDT 结构如下图所示2、建立存放参数的 DB 块,并建立以上图为结构的四个电机的数据 3、建立 FB1 块进行编程,首先建立接口如下图所示程序如下 4、为四个电机分别建立 FB1 程序的背景 DB 块,从 DB2 到 DB5 如下所示5、 OB1 中编写程序如下图所示 四、仿真监控变量表监控 DB 块
10、监控Struct(结构性类型)是由不同数据类型组成的、属于复合型数据类型,它是用来定义一组相关的数据,其长度由用户定义,它与数组(Array)类型相反(ARRAY 是由相同类型的数据组成的数组) 。许多关于结构类型的书籍中提到的关于电机控制系统中,把一个电机所有控制元素,如运行速度、额度电流、起动电流和运行方向等作为参数或逻辑块的局部变量,并且在全局数据块中声明,这样利用它可以结构化大量的数据并且可以用符号进行处理,由于访问结构的元素包含结构的名称,使程序更容易读,指令编写更清晰。如电机的一组不同类型的数据(称为元素)组成的结构命名为Motor_Data,并且放在共享数据块 DB1 中,为了用
11、符号访问结构中的一个元素,需要给数据块分配一个符号名,如 Drive_1. 结构的关键字是STRUCT“,结构的结束用 END_STRUCT. 这样在打开数据块 DB1(符号名 Drive_1) ,可以看到上面变量声明表为:Address(地址) Name(名称) Type(类型)Initial Value(初始值)0.0 Struct0.0 Motor_Data(电机数据) Struct0.0 Operating_speed(运行速度) INT2.0 Rated_current(额定电流) REAL6.0 Start_current (起动电流) REAL10.0 Max_temperatu
12、re (最大温度)REAL14.0 Turning_direction (转动方向)BOOL=16.0 END_STRUCT=16.0 END_STRUCT如果访问上述结构中的某个元素,如 Rated_current(额度电流) ,可以直接用下列指令:L “Drive_1”.Motor_data.Rated_current其中, “Drive_1”是数据块的符号名,该数据块包含结构、结构名称(用点分割)在数据块的后面。结构的元素名(用点分割)跟在结构名的后面。1. Struct 是什么数据类型结构,属于自定义的数据类型,和 C 或 C+或 VC 中的结构定义一样。2. 在什么样的情况下需要用到 Struct 数据类型举个简单的例子,一个电机需要运行、报警、手动启动、手动停止、自动启动、自动停止、联锁信号、电机电流信号等;楼主可以将上述信号定义在一个结构中,这样有 100 个电机,分别定义 100 个结构名称,即可完成 100 台电机的相关参数定义,比你 100 台电机的每个参数分别定义简单多了。不过结构的缺点是占用内存空间较大。最大的区别是 UDT 定义的是一种数据类型,不分配变量不传送到S7 中去,但是 STRUCT 定义的是一个具体的数据。