西门子(中国)有限公司(SLC)

注册 登录

  签到     订阅   每日登录:+1西币 +1经验值我的支持中心

信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。

技术论坛


 【万泉河】重新发现FB块之INOUT

返回主题列表
作者 主题
万泉河
至圣

经验值: 21848
发帖数: 9939
精华帖: 114
楼主    2018-08-05 23:57:33
主题:【万泉河】重新发现FB块之INOUT 推荐帖


我们都知道,FB/FC的外部接口类型中有IN, OUT和INOUT三种。


其中的IN和OUT都很简单直接, 分别对应了输入和输出。


而对INOUT接口类型, 其实一直以来了解并不清楚。 以前给人上课的时候,有学员问起, 也就简单说是IN和OUT功能的组合,既能输入,又能输出,搪塞过去了。


而自己内心其实并不明白有什么用处。 所以在设计FB块的时候, 对INOUT数据接口是从来不用的。


后来学会了PCS7,看到它的库函数的控制字, OP_DWCMD通常都使用INOUT数据类型,便也有样学样,在自己做的FB函数的时候, 也把和WINCC通讯的接口数据放在INOUT。反正对于FB来说,可以不在管脚上接入实参。翘空使用倒也方便。


对于PCS7来说,使用CFC编程, 语法限制,是不允许往INOUT接口上接线的。 倒也正好印证了WINCC的功能。WINCC读写的是管脚对应的背景数据块的数据,如果和IN数据一样接线了,数据被强制写入了, 就无法在WINCC上面更改了。


而其实, 如果把WINCC接口数据安排在IN数据接口,只要调用时不要接入实参, 效果是一样的。 子程序中对IN变量的复位等write操作,结果也会正确体现在WINCC变量中。


或者STAT静态变量, 也同样可以。


但最近,在与朋友聊天的过程中, 突然意识到,自己以往对INOUT数据类型的认识, 肤浅了。


从头做一个实验,FB内简单功能:


然后调用2次,并监控:


发现,FB在两次调用中对MW10数据读取后均进行了修改。 影响到了MW10原本的值。 而且有趣的是, 监控程序设计的对输入时的值和调用完成后的返回值均显示了。 第一段输入时为0, 返回值1;第二段输入时值为1, 而返回值则为101 。


在这里INOUT的功能, 分明相当于高级语言里面的传地址, 对应VB里的ByRef。而IN接口其实是ByVal。


既然传的是地址, 那本质上只是一个指针,而数据的类型就可以无限复杂,可以通过这一个指针的地址, 把一个复杂的对象引入到函数中。


复杂到可以是Struct,可以是UDT,Pointer乃至Any。


但是很遗憾, STEP7 V5.5对FB类型却不能支持。 而FB才是名副其实的对象---Object


而事实上, 非但STEP7 V5.5不支持FB对象,即便到TIA PORTAL环境, V13 SP1, V14也一概不支持。


但好消息是, 到V15,支持了!就是在刚刚我要寻找这个功能的时候, 西门子发布的最新版本, 支持真正的面向对象了!


FB的INOUT管脚,数据类型可以选择已有的FB函数,这意味着什么呢?


意味着可以把一个设备当作一个完整的实参,送给一个大FB了。


比如一个反应釜的大设备, 包含了进口阀,出口阀,搅拌电机, 温度测量等对象, 那么在设计反应釜对象的逻辑时,可以直接使用已有的底层的设备对象,直接把相应的设备的实例的名字输入到反应釜FB中。 程序逻辑中不管是要发出启动指令, 还是读取运行状态, 都可以直接访问相应的值, 一个管脚接口搞定。


而至于电机和阀设备,使用的外部输入输出点是多少, 这里就完全不需要关心了。


FB块这个样子:


调用则这样子:


越来越有IT范了!


而美中不足总有的。 比如我一套反应设备,所服务的对象不是固定的, 而是根据调度指令要切换的。这在柔性制造中很常见。 比如示例图中的NM-4131, 还要切换到NM-4231,NM-4331, NM-4431,貌似就没有办法实现了。 比如我想建立一个数组NM[4],接口处替换以NM[i],在目前的版本的portal软件中, 我找不到解决的办法。


上个月, 曾经出过一道题目,<【求助】PORTAL编程题,可能与指针和间接寻址有关> 相信大多数人一头雾水,不知道我真正目的是什么?


现在该知道我说的是什么了吧?




微信公众号:万泉河知识分享
您收到0封站内信:
×
×