• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 86 个
工控威望: 513 点
下载积分: 1361 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2024-08-23
查看zs8823的 主题 / 回贴
楼主  发表于: 2010-11-12 04:27
图片:
图片:
遇到一个问题,写了一个如图所示的子程序,在主程序中两次调用,但只有第一个调用有输入输出,第二个调用的输入好象未传入子程序,但输出完全与第一个输出同值且同步变化.不知道错在哪里,请高手指点,CPU226.
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 86 个
工控威望: 513 点
下载积分: 1361 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2024-08-23
查看zs8823的 主题 / 回贴
1楼  发表于: 2010-11-12 04:30
这是子程序截图.
wjmdtt
级别: 略有小成
精华主题: 0
发帖数量: 124 个
工控威望: 261 点
下载积分: 1301 分
在线时间: 84(小时)
注册时间: 2009-07-20
最后登录: 2024-09-25
查看wjmdtt的 主题 / 回贴
2楼  发表于: 2010-11-12 10:56
我觉得像是一个扫描周期内调用子程序并不一定能完成6次计数运行.因此第二次调用后返回值一样,因你返回值用的是:
LD C100........也即必须C100计数到后才输出.因此就只有第一次起作用.
wjmdtt
级别: 略有小成
精华主题: 0
发帖数量: 124 个
工控威望: 261 点
下载积分: 1301 分
在线时间: 84(小时)
注册时间: 2009-07-20
最后登录: 2024-09-25
查看wjmdtt的 主题 / 回贴
3楼  发表于: 2010-11-12 11:02
你可将程序修改下.如设计为让子程序实时返回在主程序中处理6次问题试试.
同时你这个子程序计算我没看出有任何意义.网络2中都是原值过去过来不知你要实现个啥功能.
[ 此帖被wjmdtt在2010-11-12 11:34重新编辑 ]
醉湮邃虞
醉湮邃虞话老黑
级别: 略有小成
精华主题: 0
发帖数量: 229 个
工控威望: 409 点
下载积分: 1577 分
在线时间: 209(小时)
注册时间: 2009-01-16
最后登录: 2015-03-18
查看醉湮邃虞的 主题 / 回贴
4楼  发表于: 2010-11-12 12:14
个人感觉,是对局部变量的理解问题,子程序每个网络都有错误。

程序中大量使用了局部变量,你把所有的局部变量变为全局变量就应该会好。

网络1:L20.0 开始执行时,状态并不确定
网络2:大量的局部变量,除DQSL外,均未赋值就使用,幸亏你没除法,否则会严重错误。
网络3:输出DQLS,在C100断开时是无效输出
       而此时对L20.0  赋值及LD16的清零,(截图无后面)如果该子程序中没有后续使用,则毫无意义。
[ 此帖被醉湮邃虞在2010-11-12 12:25重新编辑 ]
棋牌比赛免费得实物,闲暇好去处
http://www.jj.cn/indexTG.html?promoterid=108502812
cgyu5892483
级别: 探索解密
精华主题: 0
发帖数量: 27 个
工控威望: 180 点
下载积分: 576 分
在线时间: 22(小时)
注册时间: 2009-03-26
最后登录: 2024-10-30
查看cgyu5892483的 主题 / 回贴
5楼  发表于: 2010-11-12 13:53
反复调用子程序时,调用计数,系统时钟,系统脉冲等指令需要慎重。
程序扫描是从左至右,从上至下,看主程序:执行第一个调用子程序后,立马进入下一个子程序调用,那问题就来了:
LD4是输出,并且在扫描到C100为ON时才输出,下一步是L20.0为ON,下一步跳出第一个子程序并进入第二个子程序,此时L20.0在扫描周期内被置位为ON,C100复位。也就是说主程序没进入第二个周期,C100就被复位了。所以第二个子程序永远只能读到第一个子程序的块输出。
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 86 个
工控威望: 513 点
下载积分: 1361 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2024-08-23
查看zs8823的 主题 / 回贴
6楼  发表于: 2010-11-14 19:45
引用
引用第3楼wjmdtt于2010-11-12 11:02发表的 :
你可将程序修改下.如设计为让子程序实时返回在主程序中处理6次问题试试.
同时你这个子程序计算我没看出有任何意义.网络2中都是原值过去过来不知你要实现个啥功能.

写这个子程序的原因是工程中现有程序步数已经快到上限,为了避免超上限只能用子程序调用.这个程序是将压垫称每秒钟的数量变化累计到一个临时变量里,到6秒钟时乘以10送到输出变量,供上位机界面中动态显示每分钟流向称体的物料的流量,因结果仅供参考调整下料闸板,故算法不要求特别精确.
dutian2328
级别: 探索解密
精华主题: 0
发帖数量: 25 个
工控威望: 108 点
下载积分: 560 分
在线时间: 5(小时)
注册时间: 2010-08-23
最后登录: 2014-04-02
查看dutian2328的 主题 / 回贴
7楼  发表于: 2010-11-14 20:03
路过学习
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 86 个
工控威望: 513 点
下载积分: 1361 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2024-08-23
查看zs8823的 主题 / 回贴
8楼  发表于: 2010-11-14 20:23
多谢各位指点!! 但还是想不明白.
如4楼所言C100是个全局变量,第6秒时在第一个子程序中被置ON使第一个子程序输出,但第一个子程序和第二个子程序中的L20.0因为是局部变量应该是两个不同的值,所以我觉得C100在第二个子程序中应该是又被+1了,但未被复位直到下个周期在前一个子程序中被复位后,进入第二个子程序中直接+1,想到这里就有问题了:C100在一个周期中被加了两次是不是?如果是,那么最后结果乘10就应该改为乘20了,但是调试中发现第一个子程序输出的值按乘10计算与实际接近....
不知道就这个思路有没有更好的解决办法?
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 86 个
工控威望: 513 点
下载积分: 1361 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2024-08-23
查看zs8823的 主题 / 回贴
9楼  发表于: 2010-11-14 20:29
引用
引用第4楼醉湮邃虞于2010-11-12 12:14发表的 :
个人感觉,是对局部变量的理解问题,子程序每个网络都有错误。

程序中大量使用了局部变量,你把所有的局部变量变为全局变量就应该会好。

网络1:L20.0 开始执行时,状态并不确定
.......

因输出值仅供显示参考所有没用准确算法,但第二个周期开始就是准确值了.LD16是个临时变量,用于累计输入值的变化量,清零的目的是在下个周期中重新累计.
醉湮邃虞
醉湮邃虞话老黑
级别: 略有小成
精华主题: 0
发帖数量: 229 个
工控威望: 409 点
下载积分: 1577 分
在线时间: 209(小时)
注册时间: 2009-01-16
最后登录: 2015-03-18
查看醉湮邃虞的 主题 / 回贴
10楼  发表于: 2010-11-15 10:53
PLC中为子程序开辟了60个字节的可用存贮区域,但这60个字节是所有子程序共享的空间,并不是每个子程序独享。
也就是说,局部变量只保持一个扫描周期赋值的数据,要保证局部变量有效,必须保证每个扫描周期都有赋值,特别
是OUT类型变量,OUT类型变量如果前面有条件,则当条件为假时,输出的是无效值。而赋值之前对OUT类型变量的
读取也是无效的。
故此若这样写程序,只有一个子程序,有可能能工作,若存在其他子程序,也用到了局部变量,则程序就会
不正常。
类似的变量还有 AC0 AC1 AC2 AC3 AC4 .....
这类变量使用前一定要赋值,一段程序结束后该变量应该没用才对。
你也可以把输出变量和中间变量,用IN-OUT类型来定义,效果会大大改变。
给你个试验程序:
子程序一:定义AA OUT WORD
1+AA  >  AA
子程序二:
MOVW 100 > LW0
在主程序中分别 调用这两个子程序,你会发现,程序一的输出值,恒为101,而不是需要的每个扫描周期+1值(快速变化值)。


                
        
[ 此帖被醉湮邃虞在2010-11-15 11:19重新编辑 ]
棋牌比赛免费得实物,闲暇好去处
http://www.jj.cn/indexTG.html?promoterid=108502812
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 86 个
工控威望: 513 点
下载积分: 1361 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2024-08-23
查看zs8823的 主题 / 回贴
11楼  发表于: 2010-12-17 21:19
10楼楼主,非常感谢您的答案 !
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go