S7子程序局部变量问题

[复制链接]
查看4638 | 回复15 | 2008-1-7 15:14:00 | 显示全部楼层 |阅读模式
子程序中局部变量表的符号可自己设置但是地址无法设置,如果调用2个子程序都有L0.0的话就会引起2个子程序混乱要如何解决呢?
loveplc | 2008-1-7 15:51:00 | 显示全部楼层
说的太笼统,程序贴出来
zhuziyue | 2008-1-7 16:16:00 | 显示全部楼层

[upload=bmp,1.bmp]UploadFile/2008-1/20081716112223905.bmp[/upload]
[upload=bmp,2.bmp]UploadFile/2008-1/20081716115020032.bmp[/upload]
局部变量表中 打开 和 输入 自己写上去的而 L0.0是S7自动分配的(结果2个都是L0.0并且无法修改),如果子程序1和2同时被调用的话只要1里面的L0.0被处发,1,2里面的都会有输出,如何解决呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
bhqt009 | 2008-1-7 16:47:00 | 显示全部楼层
你的想法错误,不会重复。系统自动排列,打开 L0.0 关闭就自动L0.1了,你写程序的时候是调用‘打开’‘关闭’的。
a23604531 | 2008-1-7 17:31:00 | 显示全部楼层
加油
zhuziyue | 2008-1-7 20:53:00 | 显示全部楼层

斑竹没有看明白阿!像你说的那样自动L0.1我就没有问题了,如果我在子程序1中写‘输入’系统自动给地址L0.0如果我继续在子程序1中写‘打开’的话当然系统会给出L0.1但是我又新建了子程序2在里面写了‘打开’系统却没有给我希望的L0.1而是给我的L0.0这样就出现了如果子程序1和2同时被调用的话只要1里面的L0.0被处发,1,2里面的Q0.1,Q0.2都会有输出,如何解决呢?

[em06][em06]
sun_grass | 2008-1-7 22:11:00 | 显示全部楼层

通过帖图片,让我们看看吧

wgsjzit | 2008-1-8 00:18:00 | 显示全部楼层
可以问西门子论坛版主: ye_w , 也可以访问他的博客,应该有这答案的.
bhqt009 | 2008-1-8 14:42:00 | 显示全部楼层

你没有实际去调试的,光理论搞了,如果你实际去做了,会发现系统不会报错的。

正在编译程序块...
主程序 (OB1)
SBR_0 (SBR0)
SBR_1 (SBR1)
INT_0 (INT0)
块大小 = 81(字节),0 个错误

正在编译数据块...
块大小 = 0(字节),0 个错误

正在编译系统块...
已编译的块有 0 个错误, 0 个警告

总错误数目:0

** 程序中的每个POU都有自己的局部变量表,配备64个字节的L内存。这些局部变量表允许您定义具有范围限制的变量:局部变量只在建立该变量的POU中才有效。相反,在每个POU中均有效的全局符号只能在符号表/全局变量表中定义。每个子程序调用的输入/输出参数的最大限制是16,如果您尝试下载的程序超过此一限制,会返回一则错误信息。在局部变量表中赋值时,您指定说明类型(TEMP、IN、IN_OUT或OUT)和数据类型(请参阅SIMATIC和IEC 1131-3数据类型),但不指定内存地址;程序编辑器自动在L内存区中为所有的局部变量指定内存位置。

上面都很罗嗦,一句话:跟中国人的名字差不多。可以有很多一样的名字,但是姓不一样就不会重复。这是允许的。不信,你点程序的【全部编译】按钮看一下结果。

有2种解释:一种就是程序调用1个子程序,结束后,自动释放占用的L,调用另外的再分配

另一种解释;POU变量符号表(名字)+SBRn(姓)来进行区分

zhuziyue | 2008-1-8 16:12:00 | 显示全部楼层

我是经过实际操作后才产生的问题,在局部变量表中赋值时,“指定说明类型(TEMP、IN、IN_OUT或OUT)和数据类型,但不指定内存地址”;这个很重要就是我不能指定内存地址,S7里面的好像所有的子程序算一个POU当我建立上面2个子程序后设置的第一个波尔参数(每个子程序调用的输入/输出参数的最大限制是16)都会给出L0.0,这样问题就出来了,2个子程序同时调用其中一个L0.0被触发另一个子程序的L0.0也同样触发了。但是在主程序和中断中同样有L0.0则不会触发应为不是同一个POU.

zhuziyue | 2008-1-8 16:16:00 | 显示全部楼层
这个问题出现在2个子程序同时被调用时出来的,如果只有1个子程序是不会出现的因为他的局部变量会自动写下去,L0.0 L0.1.....,如果我建立第2个子程序那么他会重L0.0重新开始,同时调用时就出现我说的问题了
yuanhu | 2008-1-9 01:17:00 | 显示全部楼层
学习
ye_w | 2008-1-10 13:09:00 | 显示全部楼层
变量需要定义为输入输出型
zhuziyue | 2008-1-12 16:44:00 | 显示全部楼层

我开始贴出程序上面变量,都是定义的输入输出阿,最关键的问题是如何解决调用2个程序的同时,出发1第个程序的L0.0而不会引起第2个程序的l0.0也动作

[em06]
zhuziyue | 2008-1-16 12:15:00 | 显示全部楼层

没人解答吗?

ye_w | 2008-1-16 19:57:00 | 显示全部楼层
2个子程序申明L地址根本就不会“打架的”,属于局部变量,2者根本不会影响,至于都要调用,执行当然有相应的结果输出,奇怪吗?
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则