我的关于"LD"指令和入栈操作的想法

发布: 2008-12-14 09:57 | 作者: liuzq71 | 来源: StmFans思蜕盟 OPELC 自由电子联盟


未命名456.JPG


在PLC应用程序中,只有唯一一条LD指令(也就是按从上往下的顺序,离ORB[ 或ANB]最近的那一条指令)与ORB(或ANB)对应,那么这条LD指令就需在运算前先将“以前的"逻辑值入栈,如上图中的第2,7和5条LD指令。

而象程序:
  LD        X001
    OUT    Y001
    LD        X002
    OUT    Y002
    END
这样的LD指令就无需入栈操作,即只有后面有ORB或ANB指令的LD指令才需做入栈操作。

LDI指令同理。

不知对也不对,请大家指正,3Q

[ 本帖最后由 liuzq71 于 2008-12-14 10:12 编辑 ]
jasonjee (2008-12-14 10:29:48)
ORB 和 ANB 指令的作用可以理解为将该指令之前的两个LD指令予以合并,将两个逻辑值合并为一个。
也就是说把两层逻辑堆栈的值 合为 一层。

对于你距离的程序的理解:
最初的两个LD经过ORB指令,合并为块A
然后第三第四个LD指令,经过ORB指令后,合并为块B
最后一个ANB指令,则将块A 与 块B 进行逻辑合并,得到一个逻辑值予以驱动输出。


也就是说,最后一个ANB 实际对应的是两个块,两个经过ORB合并后的逻辑值,并不对应任何一个LD指令。
而程序中的ORB指令,要说对应,则必须对应两条LD指令。
liuzq71 (2008-12-15 09:05:31)
能否详细地说一下呢?

[ 本帖最后由 liuzq71 于 2008-12-15 09:06 编辑 ]
jasonjee (2008-12-15 09:19:57)
LD之前的LD没有逻辑的输出,则这个LD需要压栈。

简单说,前一个LD有逻辑输入,没有逻辑输出,则下一个LD需要把前一个逻辑压栈
liuzq71 (2008-12-15 16:22:23)
那算法上如何实现啊?
bkkman (2008-12-15 19:30:25)
这样程序复杂程度就提高了,执行LD又多加一个判断.
好象并不合算.
trinove (2008-12-15 20:42:02)
说一个可以用的办法
设计一个标志位,遇到LD的时候置1,遇到输出指令的时候清0。
这样,遇到LD的时候,标志位为1,就压栈,为0就不压栈。

多一个判断是肯定会有的,如果全部都压栈的话,也可以运行,只是最后不好做逻辑检查。
liuzq71 (2008-12-19 20:14:08)
.....
if(INS_TYPE==I_LD)
{
    if( flag==0)
         flag=1;
     else
        push(STATUS); //STATUS是之前的逻辑值
     User_LD(参数); //LD指令的实现代码
   }
.......
if(INS_TYPE==I_OUT)
{
    if (flag) flag=0;   //也可以直接flag=0;
    User_OUT(参数);
}
.......
对不对?

[ 本帖最后由 liuzq71 于 2008-12-19 20:22 编辑 ]
liuzq71 (2008-12-19 20:24:40)
另外,LDP,LDF指令要不要和LD,LDI指令一样有入栈操作?
zxqq (2008-12-23 22:55:59)
当然要有,而且要有历史栈
wenunit (2009-1-07 10:13:05)
开个LD栈,所有的LD都入栈就行了。