回复:FC的参数传递

mkas

  • 帖子

    125
  • 精华

    2
  • 被关注

    12

论坛等级:侠士

注册时间:2013-08-04

普通 普通 如何晋级?

发布于 2015-09-18 09:12:35

4楼

展开查看
以下是引用白果在2015-09-18 09:01:03的发言 >3楼

以前也有看到M区和DB区参数调用区别的帖子,但也不太明白。你的例子中把DB区变量换成M区变量,程序可能就可以用了(但总觉得不很妥当),把OUT改为IN_OUT满足RS/SR指令要求才是根本吧。

以下是引用mkas在2015-09-18 08:35:20的发言 >2楼:白果大侠,为什么在...

引用2楼详细内容:

白果大侠,为什么在OB1中打开了DB块,在FC中的程序为什么又正常了呢?同样是SR指令。

以下是引用白果在2015-09-18 08:30:51的发言 >1楼:FC块以下是FC1...

引用1楼详细内容:

FC块

以下是FC1里的代码:
A #chufa //#chufa是FC1里定义的一个输入型形参。
S #baojing //#baojing是FC1里定义的一个输出型形参
A #stop //#stop是FC1里定义的一个输入形参
R #baojing
NOP 0



SR或RS指令在S和R端均为0时,保留上一次的SR输出,用Out类型不合适,改用IN_OUT。

手册中说调用FC时,参数的类型不同,在FC中处理的方式也不同,FC调用输出实参为数据块时的处理,与输出实参为M、I、Q、PQ不同。
在输出实参为M、I、Q、PQ时,FC输出形参(指针)指向实参实际存储地址,如果在FC中,没有对输出形参形成实质性操作,则形参指针所指向的实际存储区内容不会改变,对于参数传递过程而言,仅仅是调用时形参指向实参,调用结束时形参指针区域释放的一个过程。
在输出实参为DB块时,FC开始调用时,先在V区为该形参分配一个存储区(可能是位,也可能是字节或其它,根据形参参数类型而定),每一次调用FC,根据调用FC时所传递的实参类型不同,为输出形参分配的V区区域可能不同,比如一个FC有一个位输入形参,一个位输出形参,在第一次调用时,实参分别是I0.0,DB0.DBX0.0,则为输出形参分配的V区为V20.1;第二次调用FC,实参分别为DB0.DBX0.1,DB0.DBX0.2,则为输出形参分配的V区为V20.2,原来的V20.1被输入形参所对应的实参DB0.DBX0.1内容所填充。如果第二次调用FC时,实参为M0.1,DB0.DBX0.2,则为输出形参分配的V区仍为V20.1。
其后,FC在实际运行时,针对输出形参(数据块)的处理其实都是在对该V区进行处理,在FC结束调用后,不管在FC中有没有对该V区进行实质性处理,该V区的内容均会被拷贝至另一个存储区,比如L区,该L区与实参区对应,但不在同一区,此时并一直等到本次OB循环结束,该L区内容都不会被拷贝至实参区,所以这个时候实参区的内容还不会有变化。
等到下一个OB循环开始之前,该L区内容就会被拷贝至实参区。

如果正如手册所讲的,第一个程序就很好解释了,但是第二个程序就无法解释了。开始看到第一个程序时,再看手册上的内容,觉得自己找到答案了,结果遇到了第二个程序,就彻底凌乱了。。坐等大神解答!

好好学习,天天向上
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54617条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。