zs8823
级别: 家园常客
精华主题: 0
发帖数量: 84 个
工控威望: 513 点
下载积分: 1361 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2024-12-02
查看zs8823的 主题 / 回贴
楼主  发表于: 2010-11-12 04:27
图片:
图片:
遇到一个问题,写了一个如图所示的子程序,在主程序中两次调用,但只有第一个调用有输入输出,第二个调用的输入好象未传入子程序,但输出完全与第一个输出同值且同步变化.不知道错在哪里,请高手指点,CPU226.
醉湮邃虞
醉湮邃虞话老黑
级别: 略有小成
精华主题: 0
发帖数量: 229 个
工控威望: 409 点
下载积分: 1577 分
在线时间: 209(小时)
注册时间: 2009-01-16
最后登录: 2015-03-18
查看醉湮邃虞的 主题 / 回贴
1楼  发表于: 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
醉湮邃虞
醉湮邃虞话老黑
级别: 略有小成
精华主题: 0
发帖数量: 229 个
工控威望: 409 点
下载积分: 1577 分
在线时间: 209(小时)
注册时间: 2009-01-16
最后登录: 2015-03-18
查看醉湮邃虞的 主题 / 回贴
2楼  发表于: 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