通过ob35循环中断,周期为10ms,在ob35中编写如图的程序,将采集的数据相应保存在DB数据块中的数组中(DB1如下图),想实现的效果是第一个10ms的数据存入DB_VAR1,第二个10ms的数据存入DB_VAR2,以此类推,存满后循环到DB_VAR1继续储存。在plcsim仿真,发现除了DB1.DBW2有数值,一直在变,其他的都为0,好像是程序没有起到循环储存作用京(指针没动),数据只储存在DB1.DBW2了,想知道哪里出错了,帮忙改正下。
注:因为采集的数据为real,而数组为int,所以要real转int,程序4那有一段就是这个程序,请顺便帮我看看对不对。
在此先谢过各位大佬了。
问题补充:
十分抱歉,我的疏忽,我的ob35的程序如下图,是一个调用fb71的程序,fb71用于产生模拟工业现场信号的正弦波信号,它的具体程序都在我上个问题。
我按照您说的方法做了,在ob100里加了对应程序(如下图,ob100中的其他程序也在我上个问题,是赋值给fb71各个参数的),但还是没用,我监视了DB1,还是怎样子,求助。
图片说明:
最佳答案
1、MD20 这个指向当前数据存储的指针在哪初始化的? 是在 0B35 网络的网络 1 中吗?这部分你没有贴出。
将初始化这个指针的部挪到 OB100 上电初始化组织块,或者有条件地初始化。
我在 OB100 用了无条件初始化
L P#0.0
T MD20
2、贴出的最左边的图中,网络2,判断指针是否越界部分 L P#202.0,改成 L P#200.0,这样才可以结合你的程序中第三张图数据块的定义,才可使得指针不越界,否则寻址越界会造成 CPU 停机。
按上面所说修改后应当是可以的,我在 TIA 中做了测试。
另外下次提这样的问题时,请复制代码,并分好段,这样也方便大家帮助你找问题。
3、完整的程序如下:
第一部分
OB100:初始化部分
L P#0.0
T MD20
第二部分 OB35
网络1
A(
L P#2.0
T MD30
SET
SAVE
CLR
A BR
)
JNB _001
L P#200.0 //这改了,与你原程序不一样的地方
T MD40
_001: NOP 0
网络2
L MD20
L MD40
<D
= L20.0
A L20.0
JNB _002
L MD20
L MD30
+D
T MD20
_002: NOP 0
A L20.0
NOT
JNB _003
L P#0.0
T MD20
_003: NOP 0
网络3
OPN DB2
A(
L DB2.DBD12
RND
T MD100
AN OV
SAVE
CLR
A BR
)
JNB _004
OPN DB1
L MD100
T DBW [ MD20]
_004: NOP 0
测试如图
图片说明:
提问者对于答案的评价:
大佬回答得挺好的,但我对MD20进行了如你说的那样初始化,但依然是老样子,没有解决问题,不过提供了思路,还是非常感谢大佬的。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc286408.html