来自西门子技术支持热线的故事:功能块使用问题

已锁定

西门子Auto

官方工程师

  • 帖子

    126
  • 精华

    16
  • 被关注

    233

论坛等级:侠圣

注册时间:2007-08-03

普通 普通 如何晋级?

来自西门子技术支持热线的故事:功能块使用问题

9737

33

2010-08-16 09:03:28

编写控制程序作为自控工程师来说是家常便饭,在调试过程中遇到问题在所难免,这回聊聊在热线中常遇到的这样一类问题:
在OB1中多次调用同一个FC,为什么只有第一个执行输出正常?
在以前项目中使用正常的FC,拿到另一个项目使用,实现的功能完全相同,但是执行结果就是不正确?
这类问题的共同点就是在特定的条件下执行正常,例如使用M地址做实参正常,用DB地址做实参就错误。
通过下面这段程序我们模拟重现这类问题。
FC5程序实现的功能是:当Bool_Input为false时用Int_Input整数值更新输出int_Output,当Bool_Input为true时,停止更新输出值,保持最后的输出值。
FUNCTION FC 5 : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
Bool_input : BOOL ;
int_Input : INT ;
END_VAR
VAR_OUTPUT
int_Output : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
L P##int_Output;
LAR1 ; //int_Output地址
A #Bool_input;
JC _000;
L #int_Input;
T #int_Output;
_000: BEU ;
END_FUNCTION
在OB1中调用很正常,而且使用不同M地址多次调用也没有问题,看上去似乎很完美呵呵,如果将实参地址都更换为不同的DB地址试试呢,将第一个FC5 修改为int_Output:=DB1.DBW0,第二个FC5修改为int_Output:=DB1.DBW2,当M10.0=true,M10.1=false时,你会发现DB1.DBW0和DB1.DBW2里的值一样,会跟着MW4变化!
CALL FC 5
Bool_input:=M10.0
int_Input :=MW0
int_Output:=MW2 //DB1.DBW0
CALL FC 5
Bool_input:=M10.1
int_Input :=MW4
int_Output:=MW6 //DB1.DBW2

问题出在哪呢?从程序来看,当Bool_Input=false时,int_Input赋值给int_Output,而Bool_input=true时,程序直接就从FC5返回了,没有对int_Output做任何操作。通过查看in_Output地址可以发现,在使用M区地址时,int_Output使用的地址就是实参地址M区地址,而使用DB区地址时,int_Output使用的地址是V区地址,也就是OB1的L区地址,由于系统对于L区地址是动态分配的,即调用FC时临时分配L区,从FC返回时释放L区,这就导致同一个L区可能被多个FC读写,也就是说L区中变量的内容是不确定的。而由于系统不会自动对M区地址进行操作,所以使用M区地址时完全正常。

解决问题的方法就是在使用临时变量时,先赋值再使用。在这段程序中只要将int_Output修改为输入输出参数就行了。
VAR_IN_OUT
int_Output : INT ;
END_VAR
调用FC时系统将DB1.DBW0中的值先保存在V区(给临时变量赋值),从FC中返回时将V区的值再保存到DB1.DBW0中,这样即使多次调用FC也不会出错。

FAQ常问问题: 为什么函数会偶尔在OUT参数中产生错误的返回值?当指定输入输出参数时需要注意些什么 ?
http://support.automation.siemens.com/CN/view/zh/189227
来自西门子技术支持热线的故事:功能块使用问题 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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