zs8823
级别: 家园常客
精华主题: 0
发帖数量: 85 个
工控威望: 512 点
下载积分: 1359 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2023-06-30
查看zs8823的 主题 / 回贴
楼主  发表于: 2010-11-12 04:27
图片:
图片:
遇到一个问题,写了一个如图所示的子程序,在主程序中两次调用,但只有第一个调用有输入输出,第二个调用的输入好象未传入子程序,但输出完全与第一个输出同值且同步变化.不知道错在哪里,请高手指点,CPU226.
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 85 个
工控威望: 512 点
下载积分: 1359 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2023-06-30
查看zs8823的 主题 / 回贴
1楼  发表于: 2010-11-12 04:30
这是子程序截图.
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 85 个
工控威望: 512 点
下载积分: 1359 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2023-06-30
查看zs8823的 主题 / 回贴
2楼  发表于: 2010-11-14 19:45
引用
引用第3楼wjmdtt于2010-11-12 11:02发表的 :
你可将程序修改下.如设计为让子程序实时返回在主程序中处理6次问题试试.
同时你这个子程序计算我没看出有任何意义.网络2中都是原值过去过来不知你要实现个啥功能.

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

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

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

因输出值仅供显示参考所有没用准确算法,但第二个周期开始就是准确值了.LD16是个临时变量,用于累计输入值的变化量,清零的目的是在下个周期中重新累计.
zs8823
级别: 家园常客
精华主题: 0
发帖数量: 85 个
工控威望: 512 点
下载积分: 1359 分
在线时间: 29(小时)
注册时间: 2008-06-21
最后登录: 2023-06-30
查看zs8823的 主题 / 回贴
5楼  发表于: 2010-12-17 21:19
10楼楼主,非常感谢您的答案 !