S7-300
实验四 复杂数据类型_3
1) 目的
掌握复杂数据类型:DATE_AND_TIME / STRING / STRUCT / ARRAY / UDT / FB / SFB。
2) 实验内容
①创建一个DB14,添加一个STRUCT类型的变量。
②#Var2为字符串’1357′ ,当#Var1为”True”时,调用标准库\IEC功能块中的FC37将其转化为DI型数据,保存在#Var3中。
③将#Var3转化为BCD码,保存在#Var4中。
④使用标准库\TI-S7转换块中的FC99,计算#Var4中为”1″的位的个数,并保存在#Var5中。
⑤根据以上STRUCT设计一个UDT数据类型UDT1,在DB12定义一个类型为UDT1的变量#Para。调用标准库\系统功能块中的SFC20将DB14的值复制到DB12中。
⑥创建一个FB1,它具有若干输入、输出参数。在FB2中调用FB1,将FB1的多个背景数据块存储在FB2的背景数据块中。
⑦在FB1中调用标准库\系统功能块中的SFB4,将其背景数据块存储在FB2的背景数据块中。利用标准库\系统功能块中的SFC46,当激活该定时器5s后CPU停机。
3) 实验流程
1 创建DB14
创建一个类型为STRUCT的变量,如下图所示。
图1-创建STRUCT变量
2 当#Var1为”True”时
在OB1中调用标准库\IEC功能块中的FC37将其转化为DINT型数据,保存在#Var3中,编程如下图所示。
图2-调用FC37
在变量表VAT_1来监视变量,将STRING拆分为4个字节来监控,可查看程序执行结果如下图所示。
图3-将STRING拆分为四个字节
3 将#Var3转化为BCD码
在OB1中使用DTB指令将#Var3转化为BCD码,保存在#Var4中,编程如下图所示。
图4-将#Var3转化为BCD码
在变量表VAT_1来监视变量,可查看程序执行结果如下图所示。
图5-执行结果
4 FC99
在OB1中调用标准库\TI-S7转换块中的FC99,计算#Var4中为”1″的位的个数,并保存在#Var5中,编程如下图所示。
图6-调用FC99
在变量表VAT_1来监视变量,将Var4的显示格式改为BIN,可查看程序执行结果如下图所示。
图7-执行
5 设计一个UDT数据类型UDT1
根据上述的STRUCT设计一个UDT数据类型UDT1,在DB12定义一个类型为UDT1的变量#Para,如下图所示
图8-UDT1展开
图9-UDT1收缩
在DB12中的数据视图中查看UDT1。
图10-查看UDT1
在OB1中调用标准库\系统功能块中的SFC20,将源DB14数据复制到目标DB12中,编程如下图所示。
图11-调用SFC20
监视DB14和DB12的变量,可查看程序执行结果如下图所示。(可以通过数据表观察,也能进入数据块中观察,注意在线)
图12-执行结果
6 创建一个FB1
在FB1中创建3个输入和3个输出参数,如下图所示。
图13-创建一个FB1
创建一个FB2和DB20,将DB20设置为FB2的背景DB。类似的创建FB1,但需注意的是不需要为FB1单独创建背景DB。(也可通过在OB1调用FB20时选择生成DB20,则DB20自动变成FB2的专属数据块)
在FB2的STAT中创建FB1类型的变量,如下图所示。
图14-创建FB1类型变量
在FB2中声明1个FB1的”局部实例”后,在编程元素的目录下的多重实例下找到上述新建的STAT1的”局部实例”,在FB2中可多次调用该”局部实例”,为其管脚赋不同的参数,这样就将FB1的多个背景数据块存储在FB2的背景数据块中,如下图所示。
图15-申明局部变量
则FB2本身数据存储于DB20上半部分,调用的FB1的数据存储于下半部分,如图所示:
图16-结果
这样就节约了DB资源,充分利用了DB,因为一个DB能存储64K,这就可以一个DB多用,减少一些存储少量数据的DB块。
7 调用SFB4
在FB1中调用标准库\系统功能块中的SFB4,即接通延时指令,注意的是不需要为SFB4单独创建背景数据块,在FB1的STAT中声明1个SFB4的”局部实例”,如下图所示。
图17-申明局部变量
在FB1中声明1个SFB4的”局部实例”后,在编程元素的目录下的多重实例下找到上述新建的stat2的”局部实例”,在FB1中可多次调用该”局部实例”,为其管脚赋不同的参数(如同FB2调用FB1),这样就将SFB4的多个背景数据块存储在FB2的背景数据块中,如下图所示。
图18-展示
在OB1中调用标准库\系统功能块中的SFC46,当激活该定时器15s后CPU停机,编程如下图所示。
图19-调用SFC46
15S定时时长到后,CPU由RUN变为STOP状态,程序执行结果如下图所示。
图20-执行结果
4)总结
1. 多重背景DB实验中,首先要在FB2中STAT中声明数据类型为FB1的局部实例,然后在多重实例处调用该局部实例,即实现了FB1的多个背景数据块存储在FB2的背景数据块中。同时则FB2本身数据存储于自己DB块的上半部分,调用的FB1的背景数据块的数据存储于下半部分。DB能存储64K数据。
2. 修改DB块后要保存,然后同时得对OB1等进行保存后,才能引用DB块中的数据。修改FB后,在OB1中记得更新FB再保存再运行。
3. Move指令只能转移四个字节及其以下的数据,对于超过4字节的复杂数据就可以用SFC20来转移,它能转移一个区域。
4. 对每个DB块命名一个Symbolic name 是非常有用的,当我们在FB/FC/OB1中编写程序是需要调用DB块中的数据时,会非常的边界,可以输入DB 的Symbolic name就能够弹出其下属的所有数据,然后就可以选择,就不用去输入其很长的具体地址,并且也不易出错,报红概率低。但是需要注意在命名是最好有体系有规律的命名,这样才好管理数据,否则易混。
图21-Symbolic name
敬请期待下一篇参数类型篇01
PS:友情提醒,所有文章都是一个系列,是连贯的,顺着看效果更好~
作者简介
谭俊豪:重庆大学机械工程学院学士,西门子中国公司培训生
本文为原创文章,于头条首发,欢迎转载,请注明出处和作者!