📄 instruction_define.cpp
字号:
//指令定义模块
#include "StdAfx.h"
#include "PLC_DEMO.h"
#include "PLC_DEMODoc.h"
#include "PLC_DEMOView.h"
#include "Instruction_define.h"
#include "Runprogram.h"
#include "Phrase_check.h"
bool WX[160];//字输入寄存器
bool WY[160];//字输出寄存器
bool WR[1000];//通用字寄存器(内部寄存器)
bool T[9];//定时器
bool stack[10];//栈
int sp;//栈顶
bool DT[100];//通用数据寄存器
bool objectregister[3];//中间寄存器,存放中间结果
int objectsign;//中间寄存器指向标志
extern int instructionnumber;//指令数
extern int isrunsign;//正执行的指令
extern bool isend;//指令结束标志
extern instructionframe instructionstore[300];//指令存储器
extern CString str;
bool parforDF[300];//for DF and DF/ 指令存储前一触发信号状态
extern CPLC_DEMOView *fortime;
bool *firstaddress,*aimaddress;
int tran16arraytoconst(bool *);
void getfirst16address();
void produceaddress() //计算下一指令地址
{
if(instructionstore[isrunsign].instructionname==21)
{
if(!objectregister[objectsign])
{
for(int i=isrunsign+1;i<instructionnumber;i++)
{
if((instructionstore[i].instructionname==22)
&&(instructionstore[i].thenumber==
instructionstore[isrunsign].thenumber))
{
isrunsign=i;
break;
}
}
if(i==instructionnumber)
{
str.Format("逻辑错误:没有和 MCE 指令对应的指令");
AfxMessageBox(str);
}
else isrunsign=i+1;
}
else isrunsign+=1;
}
else if(instructionstore[isrunsign].instructionname==23)
{
if(!objectregister[objectsign])
{
for(int i=0;i<instructionnumber;i++)
{
if((instructionstore[i].instructionname==24)
&&(instructionstore[i].thenumber==
instructionstore[isrunsign].thenumber))
{
isrunsign=i;
break;
}
}
if(i==instructionnumber)
{
str.Format("逻辑错误:没有和 JP 指令对应的指令");
AfxMessageBox(str);
}
else isrunsign=i+1;
}
else isrunsign+=1;
}
else if(instructionstore[isrunsign].instructionname==113)
{
getfirst16address();
int sum=tran16arraytoconst(firstaddress);
if(sum<=0)
isrunsign+=1;
else
for(int i=0;i<instructionnumber;i++)
{
if((instructionstore[i].instructionname==22)
&&(instructionstore[i].thenumber==
instructionstore[isrunsign].thenumber))
{
isrunsign=i;
break;
}
}
}
else if(instructionstore[isrunsign].instructionname==114)
{
if(!objectregister[objectsign])
isrunsign+=1;
else
{
for(int i=0;i<instructionnumber;i++)
{
if((instructionstore[i].instructionname==115)
&&(instructionstore[i].thenumber==
instructionstore[isrunsign].thenumber))
{
isrunsign=i;
break;
}
}
}
}
else if(instructionstore[isrunsign].instructionname==116)
{
for(int i=0;i<instructionnumber;i++)
{
if((instructionstore[i].instructionname==114)
&&(instructionstore[i].thenumber==
instructionstore[isrunsign].thenumber))
{
isrunsign=i+1;
break;
}
}
}
else isrunsign+=1;
}
void instruction1() //ST指令
{
if(objectsign==2)
objectsign=0;
else objectsign+=1;
switch(instructionstore[isrunsign].relaysort)
{
case 'X':objectregister[objectsign]=WX[instructionstore[isrunsign].relaynumber];break;
case 'Y':objectregister[objectsign]=WY[instructionstore[isrunsign].relaynumber];break;
case 'R':
{
if(instructionstore[isrunsign].relaynumber==600)
WR[instructionstore[isrunsign].relaynumber]
=(WR[instructionstore[isrunsign].relaynumber]?false:true);
objectregister[objectsign]=WR[instructionstore[isrunsign].relaynumber];
break;
}
case 'T':objectregister[objectsign]=T[instructionstore[isrunsign].relaynumber];break;
}
}
void instruction3() //OT指令
{
switch(instructionstore[isrunsign].relaysort)
{
case 'Y':WY[instructionstore[isrunsign].relaynumber]=
objectregister[objectsign];break;
case 'R':WR[instructionstore[isrunsign].relaynumber]=
objectregister[objectsign];break;
}
}
void instruction4() ///指令
{
objectregister[objectsign]=!objectregister[objectsign];
}
void instruction5() //AN指令
{
switch(instructionstore[isrunsign].relaysort)
{
case 'X':objectregister[objectsign]=
(objectregister[objectsign])&&(WX[instructionstore[isrunsign].relaynumber]);
break;
case 'Y':objectregister[objectsign]=
(objectregister[objectsign])&&(WY[instructionstore[isrunsign].relaynumber]);
break;
case 'R':objectregister[objectsign]=
(objectregister[objectsign])&&(WR[instructionstore[isrunsign].relaynumber]);
break;
case 'T':objectregister[objectsign]=
(objectregister[objectsign])&&(T[instructionstore[isrunsign].relaynumber]);
break;
}
}
void instruction6() //AN/指令
{
switch(instructionstore[isrunsign].relaysort)
{
case 'X':objectregister[objectsign]=
(objectregister[objectsign])&&(!WX[instructionstore[isrunsign].relaynumber]);
break;
case 'Y':objectregister[objectsign]=
(objectregister[objectsign])&&(!WY[instructionstore[isrunsign].relaynumber]);
break;
case 'R':objectregister[objectsign]=
(objectregister[objectsign])&&(!WR[instructionstore[isrunsign].relaynumber]);
break;
case 'T':objectregister[objectsign]=
(objectregister[objectsign])&&(!T[instructionstore[isrunsign].relaynumber]);
break;
}
}
void instruction7() //OR指令
{
switch(instructionstore[isrunsign].relaysort)
{
case 'X':objectregister[objectsign]=
(objectregister[objectsign])||(WX[instructionstore[isrunsign].relaynumber]);
break;
case 'Y':objectregister[objectsign]=
(objectregister[objectsign])||(WY[instructionstore[isrunsign].relaynumber]);
break;
case 'R':
if(instructionstore[isrunsign].relaynumber==600)
WR[instructionstore[isrunsign].relaynumber]
=(WR[instructionstore[isrunsign].relaynumber]?false:true);
objectregister[objectsign]=
(objectregister[objectsign])||(WR[instructionstore[isrunsign].relaynumber]);
break;
case 'T':objectregister[objectsign]=
(objectregister[objectsign])||(T[instructionstore[isrunsign].relaynumber]);
break;
}
}
void instruction8() //OR/指令
{
switch(instructionstore[isrunsign].relaysort)
{
case 'X':objectregister[objectsign]=
(objectregister[objectsign])||(!WX[instructionstore[isrunsign].relaynumber]);
break;
case 'Y':objectregister[objectsign]=
(objectregister[objectsign])||(!WY[instructionstore[isrunsign].relaynumber]);
break;
case 'R':objectregister[objectsign]=
(objectregister[objectsign])||(!WR[instructionstore[isrunsign].relaynumber]);
break;
case 'T':objectregister[objectsign]=
(objectregister[objectsign])||(!T[instructionstore[isrunsign].relaynumber]);
break;
}
}
void instruction9() //ANS指令
{
if(objectsign==0)
{
objectregister[2]=((objectregister[0])&&(objectregister[2]));
objectsign=2;
}
else
{
objectregister[objectsign-1]=((objectregister[objectsign-1])&&(objectregister[objectsign]));
objectsign-=1;
}
}
void instruction10() //ORS指令
{
if(objectsign==0)
{
objectregister[2]=((objectregister[0])||(objectregister[2]));
objectsign=2;
}
else
{
objectregister[objectsign-1]=((objectregister[objectsign-1])||(objectregister[objectsign]));
objectsign-=1;
}
}
void instruction11() //PSHS指令
{
stack[sp]=objectregister[objectsign];
sp+=1;
}
void instruction12() //RDS指令
{
objectregister[objectsign]=stack[sp-1];
}
void instruction13() //POPS指令
{
objectregister[objectsign]=stack[sp-1];
sp-=1;
}
void instruction14() //DF指令
{
if ((parforDF[isrunsign]==false)&&(objectregister[objectsign]
==true))
{
objectregister[objectsign]=true;
parforDF[isrunsign]=true;
}
else
{
parforDF[isrunsign]=objectregister[objectsign];
objectregister[objectsign]=false;
}
}
void instruction15() //DF/指令
{
if ((parforDF[isrunsign]==true)&&(objectregister[objectsign]
==false))
{
objectregister[objectsign]=true;
parforDF[isrunsign]=false;
}
else
{
parforDF[isrunsign]=objectregister[objectsign];
objectregister[objectsign]=false;
}
}
void instruction16() //SET指令
{
if (objectregister[objectsign])
{
switch (instructionstore[isrunsign].relaysort)
{
case 'Y':WY[instructionstore[isrunsign].relaynumber]=true;break;
case 'R':WR[instructionstore[isrunsign].relaynumber]=true;break;
}
}
}
void instruction17() //RET指令
{
if (!objectregister[objectsign])
{
switch (instructionstore[isrunsign].relaysort)
{
case 'Y':WY[instructionstore[isrunsign].relaynumber]=false;break;
case 'R':WR[instructionstore[isrunsign].relaynumber]=false;break;
}
}
}
void instruction19() //KP指令
{
if (objectregister[objectsign])
{
switch (instructionstore[isrunsign].relaysort)
{
case 'Y':WY[instructionstore[isrunsign].relaynumber]=false;break;
case 'R':WR[instructionstore[isrunsign].relaynumber]=false;break;
}
}
else
{
int os;
if(objectsign==0)
os=2;
else os=objectsign-1;
if (objectregister[os])
{
switch (instructionstore[isrunsign].relaysort)
{
case 'Y':WY[instructionstore[isrunsign].relaynumber]=true;break;
case 'R':WR[instructionstore[isrunsign].relaynumber]=true;break;
}
}
}
}
void instruction20() //TMX指令
{
if(!objectregister[objectsign])
{
fortime->KillTimer(instructionstore[isrunsign].relaynumber);
T[instructionstore[isrunsign].relaynumber]=false;
}
bool object=objectregister[objectsign];
instruction14();
if (objectregister[objectsign])
{
fortime->SetTimer(instructionstore[isrunsign].relaynumber,
100*instructionstore[isrunsign].thenumber,NULL);
}
objectregister[objectsign]=object;
}
void instruction25() //ED指令
{
isend=true;
}
int tran16arraytoconst(bool *a)
{
int sum=0;
for(int i=15;i>=0;i--)
{
if (*(a+i)==true)
sum=2*sum+1;
else sum=2*sum;
}
return(sum);
}
int tran32arraytoconst(bool *a)
{
long sum=0;
for(int i=31;i>=0;i--)
{
if (*(a+i)==true)
sum=2*sum+1;
else sum=2*sum;
}
return(sum);
}
int getconst1()
{
int sum;
switch(instructionstore[isrunsign].register1)
{
case '1':sum=
tran16arraytoconst(&WX
[(instructionstore[isrunsign].register1number)*16]);
break;
case '2':sum=
tran16arraytoconst(&WY
[(instructionstore[isrunsign].register1number)*16]);
break;
case '3':sum=
tran16arraytoconst(&WR
[(instructionstore[isrunsign].register1number)*16]);
break;
case '4':sum=
tran16arraytoconst(&DT
[(instructionstore[isrunsign].register1number)*16]);
break;
case '5':sum=instructionstore[isrunsign].register1number;
break;
}
return(sum);
}
int getconst2()
{
int sum;
switch(instructionstore[isrunsign].register2)
{
case '1':sum=
tran16arraytoconst(&WX
[(instructionstore[isrunsign].register2number)*16]);
break;
case '2':sum=
tran16arraytoconst(&WY
[(instructionstore[isrunsign].register2number)*16]);
break;
case '3':sum=
tran16arraytoconst(&WR
[(instructionstore[isrunsign].register2number)*16]);
break;
case '4':sum=
tran16arraytoconst(&DT
[(instructionstore[isrunsign].register2number)*16]);
break;
case '5':sum=instructionstore[isrunsign].register2number;
break;
}
return(sum);
}
int getconst3()
{
long sum;
switch(instructionstore[isrunsign].register1)
{
case '1':sum=
tran32arraytoconst(&WX
[(instructionstore[isrunsign].register1number)*16]);
break;
case '2':sum=
tran32arraytoconst(&WY
[(instructionstore[isrunsign].register1number)*16]);
break;
case '3':sum=
tran32arraytoconst(&WR
[(instructionstore[isrunsign].register1number)*16]);
break;
case '4':sum=
tran32arraytoconst(&DT
[(instructionstore[isrunsign].register1number)*16]);
break;
case '5':sum=instructionstore[isrunsign].register1number;
break;
}
return(sum);
}
int getconst4()
{
long sum;
switch(instructionstore[isrunsign].register2)
{
case '1':sum=
tran32arraytoconst(&WX
[(instructionstore[isrunsign].register2number)*16]);
break;
case '2':sum=
tran32arraytoconst(&WY
[(instructionstore[isrunsign].register2number)*16]);
break;
case '3':sum=
tran32arraytoconst(&WR
[(instructionstore[isrunsign].register2number)*16]);
break;
case '4':sum=
tran32arraytoconst(&DT
[(instructionstore[isrunsign].register2number)*16]);
break;
case '5':sum=instructionstore[isrunsign].register2number;
break;
}
return(sum);
}
void instruction26()
{
int sum1,sum2;
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1==sum2)
objectregister[objectsign==2?0:objectsign+=1]=true;
else objectregister[objectsign==2?0:objectsign+=1]=false;
}
objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction27()
{
int sum1,sum2;
if( objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1>sum2)
objectregister[objectsign==2?0:objectsign+=1]=true;
else objectregister[objectsign==2?0:objectsign+=1]=false;
}
objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction28()
{
int sum1,sum2;
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1<sum2)
objectregister[objectsign==2?0:objectsign+=1]=true;
else objectregister[objectsign==2?0:objectsign+=1]=false;
}
objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction29()
{
int sum1,sum2;
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1!=sum2)
objectregister[objectsign==2?0:objectsign+=1]=true;
else objectregister[objectsign==2?0:objectsign+=1]=false;
}
objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction30()
{
int sum1,sum2;
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1>=sum2)
objectregister[objectsign==2?0:objectsign+=1]=true;
else objectregister[objectsign==2?0:objectsign+=1]=false;
}
objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction31()
{
int sum1,sum2;
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1<=sum2)
objectregister[objectsign==2?0:objectsign+=1]=true;
else objectregister[objectsign==2?0:objectsign+=1]=false;
}
objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction32()
{
int sum1,sum2;
if(objectregister[objectsign==0?2:objectsign-1])
{
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1==sum2)
objectregister[objectsign]=true;
else objectregister[objectsign]=false;
}
}
}
void instruction33()
{
int sum1,sum2;
if(objectregister[objectsign==0?2:objectsign-1])
{
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1>sum2)
objectregister[objectsign]=true;
else objectregister[objectsign]=false;
}
}
}
void instruction34()
{
int sum1,sum2;
if(objectregister[objectsign==0?2:objectsign-1])
{
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1<sum2)
objectregister[objectsign]=true;
else objectregister[objectsign]=false;
}
}
}
void instruction35()
{
int sum1,sum2;
if(objectregister[objectsign==0?2:objectsign-1])
{
if(objectregister[objectsign])
{
sum1=getconst1();
sum2=getconst2();
if(sum1!=sum2)
objectregister[objectsign]=true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -