您现在所在的是:

PLC论坛

回帖:8个,阅读:4223 [上一页] [1] [下一页]
20901
bnnyygy
文章数:5988
年度积分:1567
历史总积分:20901
注册时间:2012/3/15
发站内信
2018论坛分享达人
发表于:2020/8/31 22:58:56
#0楼
附件 3.jpg
附件 子程序1.jpg
附件 2.jpg




主程序调用2个子程序,

子程序1:编码器值转换。输出有2个BOOL,标志编码器方向OK,Z脉冲OK。

(局部变量L12.0 L12.1,主程序对应输出为M10.0 M10.1)

子程序2:动作值输出,输入一个BOOL,(L12.0),输出一个BOOL,(L12.1)


问题:同时调用2个子程序会出现M10.0 M10.1状态会是子程序2的状态,但是是子程序1的输出啊。图1状态表波形图可以看到

难道是我子程序姿势不对?L区重叠了?



单独调用程序1 2个BOOL输出状态OK,
[此贴子已经被作者于2020/8/31 23:07:23编辑过]
20901
bnnyygy
文章数:5988
年度积分:1567
历史总积分:20901
注册时间:2012/3/15
发站内信
2018论坛分享达人
发表于:2020/9/1 10:39:22
#1楼
20901
bnnyygy
文章数:5988
年度积分:1567
历史总积分:20901
注册时间:2012/3/15
发站内信
2018论坛分享达人
发表于:2020/9/1 10:43:14
#2楼
目前只是把BOOL变量改成IN_OUT,不知道其它类型变量会不会影响。
8776
xupeng2008
文章数:1913
年度积分:50
历史总积分:8776
注册时间:2009/5/14
发站内信
发表于:2020/9/2 23:32:49
#3楼
按说每个块里的L变量互不干涉
10559
243604901
文章数:3738
年度积分:83
历史总积分:10559
注册时间:2012/8/18
发站内信
2016国庆活动(三)
发表于:2020/9/3 3:16:08
#4楼
以下是引用bnnyygy2020/9/1 10:39:22的发言:
http://blog.sina.com.cn/s/blog_669692a60101fy1m.html


变量改成IN OUT就OK了。
L区得先赋值后运算
一直不知道IN-OUT变量存在的意义,原来是先读取再输出,学习了
此帖发自手机工控论坛
非淡泊无以明志,非宁静无以致远。
20901
bnnyygy
文章数:5988
年度积分:1567
历史总积分:20901
注册时间:2012/3/15
发站内信
2018论坛分享达人
发表于:2020/9/3 12:28:15
#5楼
其实,2个子程序都是只调用了一次,为何会这样,我真的不懂。

单独调用2个程序,都是OK的,说明程序逻辑没大毛病,一起调用就不行,


其它品牌好像没这个问题,搞不懂。


好像子程序定时器,上升沿也不能用还是怎么的,规矩太多。。
18550
qjj740210
文章数:4779
年度积分:1319
历史总积分:18550
注册时间:2005/9/24
发站内信
2018春节活动(二)
2017国庆活动(二)
2017春节活动(二)
2016国庆活动(二)
西门子触摸屏(一)
三菱电机活动(二)
西门子logo体验(三)
西门子PLC体验(二)
2013辞旧迎新
发表于:2020/9/3 15:19:16
#6楼
回复 #5楼 bnnyygy
就是4楼说的,对于L局部变量,先赋值再使用。关于这个问题,西门子工程师有过官方的理论解释:
为什么子程序的输出不正常?
这里首先举例一个子程序SBR_0,该子程序的接口声明一个INT类型的IN变量‘Pressure’和一个BOOL类型的OUT变量‘OPEN’,子程序中只有一个程序段,在程序段1中编写当输入Pressure数值大于500时将输出OPEN置位,如图5. 子程序输出不正常 所示。
附件 12232.jpg
图5. 子程序输出不正常
这样的子程序被调用后,当输入Pressure达到过500时,输出OPEN被置位;但当输入Pressure从未达到过500时,输出OPEN一直保持为一个未知的状态,可能是1,也可能是0。由于子程序的局部变量仅在本次调用时有效,且每次获取到的局部变量资源有一定的随机性,有可能已经具有一个随机的数据存储在该局部变量地址中,因此对于OUT类型的接口变量,必须保证每次调用程序都对其进行写操作,否则就是编程逻辑的不严密。当然,用户也可以考虑使用IN_OUT变量类型代替OUT变量类型。
苦逼的奋斗者
20901
bnnyygy
文章数:5988
年度积分:1567
历史总积分:20901
注册时间:2012/3/15
发站内信
2018论坛分享达人
发表于:2020/9/4 9:37:33
#7楼
回复 #6楼 qjj740210
大神,再问个问题。
我想把modbus块封装起来,有一个问题,

MBUS_MSG块引脚
DataPtr DWORD &VB
读写地址,这个是间接寻址,我在块外面怎么写参数
比如,我外面给定2000,它能读写地址到VB2000么?

在子程序写全局变量地址好像不合适啊...
附件 QQ图片20200904093410.jpg

附件 QQ图片20200904093424.jpg

已解决。

IN 变量是DWORD.

主程序调用子程序用&VB****没报错,也OK了,刚才一直用&VD一直报错。
[此贴子已经被作者于2020/9/4 11:08:38编辑过]
7677
hnhyczj
文章数:3755
年度积分:113
历史总积分:7677
注册时间:2011/8/27
发站内信
发表于:2020/9/6 22:56:54
#8楼
这些要多试多看资料

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004