- 12
- 0
- 约7.2千字
- 约 11页
- 2016-08-28 发布于河南
- 举报
功能块使用问题
? 主题:来自西门子技术支持热线的故事:功能块使用问题 ?
编写控制程序作为自控工程师来说是家常便饭,在调试过程中遇到问题在所难免,这回聊聊在热线中常遇到的这样一类问题:在OB1中多次调用同一个FC,为什么只有第一个执行输出正常?? 在以前项目中使用正常的FC,拿到另一个项目使用,实现的功能完全相同,但是执行结果就是不正确?? 这类问题的共同点就是在特定的条件下执行正常,例如使用M地址做实参正常,用DB地址做实参就错误。通过下面这段程序我们模拟重现这类问题。FC5程序实现的功能是:当Bool_Input为false时用Int_Input整数值更新输出int_Output,当Bool_Input为true时,停止更新输出值,保持最后的输出值。FUNCTION? FC? 5? :? VOIDTITLE? =VERSION? :? 0.1VAR_INPUT? ? Bool_input? :? BOOL? ; ? ? int_Input? :? INT? ; END_VARVAR_OUTPUT? ? int_Output? :? INT? ; END_VARBEGINNETWORKTITLE? =? ? ? ? ? ? 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参数中产生错误的返回值?当指定输入输出参数时需要注意些什么? ?? ? /CN/view/zh/189227
2010-08-16 09:03:28
????
楼主
? abc123
游民
经验值: 55 发帖数: 4 金????币: 55所发精华帖
? 主题:回复:来自西门子技术支持热线的故事:功能块使用问题 ?
不光临时变量需
原创力文档

文档评论(0)