我的关于"LD"指令和入栈操作的想法
发布: 2008-12-14 09:57 | 作者: liuzq71 | 来源: StmFans思蜕盟 OPELC 自由电子联盟
在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 编辑 ]


也就是说把两层逻辑堆栈的值 合为 一层。
对于你距离的程序的理解:
最初的两个LD经过ORB指令,合并为块A
然后第三第四个LD指令,经过ORB指令后,合并为块B
最后一个ANB指令,则将块A 与 块B 进行逻辑合并,得到一个逻辑值予以驱动输出。
也就是说,最后一个ANB 实际对应的是两个块,两个经过ORB合并后的逻辑值,并不对应任何一个LD指令。
而程序中的ORB指令,要说对应,则必须对应两条LD指令。
[ 本帖最后由 liuzq71 于 2008-12-15 09:06 编辑 ]
简单说,前一个LD有逻辑输入,没有逻辑输出,则下一个LD需要把前一个逻辑压栈
好象并不合算.
设计一个标志位,遇到LD的时候置1,遇到输出指令的时候清0。
这样,遇到LD的时候,标志位为1,就压栈,为0就不压栈。
多一个判断是肯定会有的,如果全部都压栈的话,也可以运行,只是最后不好做逻辑检查。
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 编辑 ]