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