功能块使用问题.docx
- 文档编号:30722128
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:15
- 大小:47.05KB
功能块使用问题.docx
《功能块使用问题.docx》由会员分享,可在线阅读,更多相关《功能块使用问题.docx(15页珍藏版)》请在冰豆网上搜索。
功能块使用问题
主题:
来自西门子技术支持热线的故事:
功能块使用问题
编写控制程序作为自控工程师来说是家常便饭,在调试过程中遇到问题在所难免,这回聊聊在热线中常遇到的这样一类问题:
在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参数中产生错误的返回值?
当指定输入输出参数时需要注意些什么 ?
2010-08-1609:
03:
28
楼主
abc&123
游民
经验值:
55
发帖数:
4
金 币:
55
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
不光临时变量需要先给值再使用,所有变量都一样
将欲取之必先与之
道可道,非常道;名可名,非常名。
无,天地之始;有,万物之母。
2010-08-1819:
28:
02
1楼
海阔天空1999
游民
经验值:
110
发帖数:
17
金 币:
110
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
"先给值再使用"是什么意思 应该怎么给值呢?
新手请教
2010-08-1900:
33:
31
2楼
zhangli0
侠圣
经验值:
6258
发帖数:
5205
金 币:
2579
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
"先给值再使用"就是在使用这个变量前先给这个变量赋值。
如要使用L0.0:
L MD10
LD MD14
>=R
=L 0.0//先赋值
A L 0.0//再使用
JCN M1
你需要做的工作
M1:
nop 0
活到老,学到老!
为了生活学习吧!
2010-08-1907:
04:
01
3楼
冬日
侠圣
经验值:
3207
发帖数:
2252
金 币:
377
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
通过查看in_Output地址可以发现,在使用M区地址时,int_Output使用的地址就是实参地址M区地址,而使用DB区地址时,int_Output使用的地址是V区地址,也就是OB1的L区地址
-----这算西门子的Bug吗?
Ifanythingcangowrong,itwill.
2010-08-1909:
10:
28
4楼
我家牛
侠圣
经验值:
2403
发帖数:
1660
金 币:
263
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
quote:
以下是引用冬日在2010-08-19 09:
10:
28的发言:
通过查看in_Output地址可以发现,在使用M区地址时,int_Output使用的地址就是实参地址M区地址,而使用DB区地址时,int_Output使用的地址是V区地址,也就是OB1的L区地址
-----这算西门子的Bug吗?
偶觉得算!
学习ing!
2010-08-1911:
38:
39
5楼
HUANGZE75
侠圣
经验值:
5323
发帖数:
4315
金 币:
1023
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
因为FC没有背景数据块,不能使用静态变量,所以复制过来其他地方用,可能会存在很多问题,如地址冲突,FB因为自带背景数据块,还可以使用静态变量,在FB内全部使用局域变量,就可以在其他地方调用不会存在什么问题。
2010-08-1913:
00:
58
6楼
西门子Auto
游民
经验值:
275
发帖数:
53
金 币:
275
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
quote:
以下是引用冬日在2010-08-19 09:
10:
28的发言:
通过查看in_Output地址可以发现,在使用M区地址时,int_Output使用的地址就是实参地址M区地址,而使用DB区地址时,int_Output使用的地址是V区地址,也就是OB1的L区地址
-----这算西门子的Bug吗?
这个不能算是Bug,完全描述DB地址需要使用到6个字节,前两个字节为DB号,后四个字节为偏移地址(参考Pointer结构),而ACCU只有4个字节无法完全描述DB地址,所以系统先将db区数据内容保存到V区再将值传递给FC形参,而M区地址只要4个字节就能描述(前两个字节为0,参考Pointer结构),所以直接将地址传递给形参。
2010-08-1914:
30:
02
7楼
西门子Auto
游民
经验值:
275
发帖数:
53
金 币:
275
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
quote:
以下是引用海阔天空1999在2010-08-19 00:
33:
31的发言:
"先给值再使用"是什么意思 应该怎么给值呢?
新手请教
你需要什么值就给什么值,而不能由系统随机的赋值
2010-08-1914:
32:
29
8楼
qiq
侠圣
经验值:
1121
发帖数:
713
金 币:
71
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
又学了会一个知识点。
2010-08-2708:
38:
34
10楼
冬日
侠圣
经验值:
3207
发帖数:
2252
金 币:
377
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
quote:
以下是引用西门子Auto在2010-08-19 14:
30:
02的发言:
quote:
以下是引用冬日在2010-08-19 09:
10:
28的发言:
通过查看in_Output地址可以发现,在使用M区地址时,int_Output使用的地址就是实参地址M区地址,而使用DB区地址时,int_Output使用的地址是V区地址,也就是OB1的L区地址
-----这算西门子的Bug吗?
这个不能算是Bug,完全描述DB地址需要使用到6个字节,前两个字节为DB号,后四个字节为偏移地址(参考Pointer结构),而ACCU只有4个字节无法完全描述DB地址,所以系统先将db区数据内容保存到V区再将值传递给FC形参,而M区地址只要4个字节就能描述(前两个字节为0,参考Pointer结构),所以直接将地址传递给形参。
我还是觉得算,没有说明书特别指明功能块不能用DB数据。
Ifanythingcangowrong,itwill.
2010-08-2719:
35:
45
11楼
Step7_Profibus
侠客
经验值:
962
发帖数:
776
金 币:
342
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
那以后就选择FB块得了
止于至善——独学而无友,则孤陋而寡闻。
2010-08-2822:
54:
05
12楼
liwenqun
侠圣
经验值:
6633
发帖数:
5256
金 币:
933
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
quote:
以下是引用我家牛在2010-08-19 11:
38:
39的发言:
quote:
以下是引用冬日在2010-08-19 09:
10:
28的发言:
通过查看in_Output地址可以发现,在使用M区地址时,int_Output使用的地址就是实参地址M区地址,而使用DB区地址时,int_Output使用的地址是V区地址,也就是OB1的L区地址
-----这算西门子的Bug吗?
偶觉得算!
这完全是编程逻辑错误 怎么算是Bug呢?
2010-08-3119:
09:
01
14楼
未尽
侠客
经验值:
892
发帖数:
648
金 币:
692
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
确如楼主所说,在编程应用中,一些莫名其妙的问题其实不是PLC本身的问题,而是我们对PLC的内部机制不够了解。
就像这个临时变量的问题,是一些新手常犯的毛病。
我的理解,临时变量堆栈区其实就是PLC系统提供给我们使用的草稿纸,PLC并不负责管理它。
每次应用,一定要确认上面的东东是这次写上去的,这就是所谓先写后用了。
好好生活,天天向上!
2010-09-0810:
40:
01
15楼
GAGA
新手
经验值:
34
发帖数:
12
金 币:
34
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
就是先要在临时变量区先定义你要使用的变量,然后再使用,使用完成后再赋值给M区。
。
。
。
2010-09-0814:
20:
36
16楼
冬日
侠圣
经验值:
3207
发帖数:
2252
金 币:
377
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
quote:
以下是引用liwenqun在2010-08-31 19:
09:
01的发言:
quote:
以下是引用我家牛在2010-08-19 11:
38:
39的发言:
quote:
以下是引用冬日在2010-08-19 09:
10:
28的发言:
通过查看in_Output地址可以发现,在使用M区地址时,int_Output使用的地址就是实参地址M区地址,而使用DB区地址时,int_Output使用的地址是V区地址,也就是OB1的L区地址
-----这算西门子的Bug吗?
偶觉得算!
这完全是编程逻辑错误 怎么算是Bug呢?
我不明白为什么是逻辑错误!
我建立一个FC,有个out的输出参数,这个参数既然允许我使用DB区的地址,我就用了,在FC没有对out进行改变的情况下为什么给我一个随机值?
西门子的解释只能告诉我们为什么,我也明白为什么,安装好step7软件后说明书里就有提到要特别注意这点,但不代表这就不是他的Bug。
Ifanythingcangowrong,itwill.
2010-09-1302:
09:
37
17楼
学而时习之
侠客
经验值:
794
发帖数:
421
金 币:
294
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
既然是Output类型参数,那么该类型参数应该只写不读
如果希望保持上周期的输出值,则变成先读后写,就应该使用in_out类型参数
不以物喜,不以己悲.GoodGoodStudyDayDayUp
2010-09-1520:
41:
20
18楼
冬日
侠圣
经验值:
3207
发帖数:
2252
金 币:
377
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
quote:
以下是引用学而时习之在2010-09-15 20:
41:
20的发言:
既然是Output类型参数,那么该类型参数应该只写不读
如果希望保持上周期的输出值,则变成先读后写,就应该使用in_out类型参数
我不读也不写,保持原值不可以吗?
Ifanythingcangowrong,itwill.
2010-09-1523:
45:
10
19楼
法布雷加斯
游民
经验值:
184
发帖数:
129
金 币:
184
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
希望能有更多的技术支持进来分享,怎么就一个呢。
这样大家多学学。
2010-09-1710:
10:
53
20楼
wumingshi
侠客
经验值:
870
发帖数:
620
金 币:
440
所发精华帖
主题:
回复:
来自西门子技术支持热线的故事:
功能块使用问题
太长见识了
2010-12-0822:
20:
11
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 功能块 使用 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)