STEP7中FC的应用.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
STEP7中FC的应用

FC参数处理过程解析: 实例: 新建一个FC块,编写一个简单的按钮启停程序,如下图所示: 2个bool型输入变量IN1,IN2;一个bool型输出变量OUT1; 以及完成简单的按钮启停程序如下: 在OB1中调用FC1,实参输入为M区变量,观察结果如下: 如图:M250.0有输入时,M250.2输出为1;M250.3没有输入,M250.4输出为0,结果符合程序预期,运行正确; 在OB1中再次调用FC1,赋给实参为DB区的变量,如下图所示: 注意,如上图:但把DB3.DBX0.0置1时,DB3.DBX0.2有输出;但同时发现,Network 2中,DB3.DBX0.4也输出了1,这是为什么呢,本来不应该有输出的啊? 问题提出:为什么同样的FC,当参数为M区变量和DB区变量时,执行的结果会不同呢,FC对于参数的调用机制是怎么样的? 问题解答: 在STEP 7 V5.4编程手册中,我们可以找到这样的描述: 在编程调用块时,请确保写入声明为OUTPUT的参数。否则,输出值为随机值!对于功能块,该值为最后一个调用指定的实例DB中的数值;对于功能,该值为位于L堆栈的数值。注意以下几点: 调用FC时,初始化所有OUTPUT参数; 尽量不要使用任何置位和复位指令,这些指令取决于RLO,当RLO的值为0时,将保持随机值; 如果在块内跳转,那么确保没有跳过写入OUTPUT参数的位置。 结论: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区内容就会被拷贝至实参区。 根据以上内容,结合本例分析: 1:第一次调用FC1时,在V区为形参分配一个存储区,本例中实参为DB3.DBX0.0,DB3.DBX0.1,输出实参为DB3.DBX0.2,则为形参分配的V区为V20.1,V20.2,V20.3;程序执行完毕后,V20.3值为1,并输出给DB3.DBX0.2; 2: 第二次调用FC1时,同样为形参分配的V区为V20.1,V20.2,V20.3,但程序并未对OUT1变量进行初始化操作,此时V20.3的值仍然为1,即OUT1保持为第一次调用后的V20.3的值,所以第二次调用FC1时,输出DB3.DBX0.4也变为了1! 解决办法: 在FC1中对OUT1进行初始化操作,如下图所示: 把OUT1变量改为IN/OUT类型。 以上2点适用于所有FC调用,切记。

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档