登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:200 SMART子程序L区的疑问。

点击:4593 回复:8

附件 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
20-08-31 22:58
20-09-01 10:39
目前只是把BOOL变量改成IN_OUT,不知道其它类型变量会不会影响。
20-09-01 10:43
按说每个块里的L变量互不干涉
20-09-02 23:32

引用 bnnyygy 在 2020/9/1 10:39:22 发言【内容省略】

L区得先赋值后运算
一直不知道IN-OUT变量存在的意义,原来是先读取再输出,学习了
20-09-03 03:16
其实,2个子程序都是只调用了一次,为何会这样,我真的不懂。
单独调用2个程序,都是OK的,说明程序逻辑没大毛病,一起调用就不行,
其它品牌好像没这个问题,搞不懂。
好像子程序定时器,上升沿也不能用还是怎么的,规矩太多。。
20-09-03 12:28
就是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变量类型。
20-09-03 15:19
大神,再问个问题。
我想把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
20-09-04 09:37
这些要多试多看资料
20-09-06 22:56

工控新闻

更多新闻资讯