📄 plc_run.c
字号:
;/****************************************Copyright (C)**************************************************
;** Email:luheding@126.com
;** QQ:614090042
;** 如有意见或不明可联系,但要注明来意.否则不回
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: PLC_RUN.c
;**版 本: V2.1
;**创 建 人: LuHeDing
;**最后修改日期: 2010年05月08日
;**描 述: PLC指令解释程序
;**
;********************************************************************************************************/
#include "..\Drive\PLC_PUBLIC.H"
/***********************************************
函数功能:PLC指令运行
***********************************************/
void PLC_PROG_RUN(void)
{ if(PLC_RUN_BIT==3){
if(PLC_PC>=PLC_PROG_END_ADD) PLC_PC=PLC_PROG_START_ADD2;
PLC_TEMP1=PLC_RAM16(PLC_PC);
switch (PLC_TEMP1){
/********************纯字指令************************************************/
case 0xFFF8: //ANB
{PLC_ACC_BIT = (PLC_ACC_BIT >> 1) & (PLC_ACC_BIT & 0x01);
PLC_PC+=2;}break;
case 0xFFF9: //ORB
{PLC_ACC_BIT = (PLC_ACC_BIT >> 1) | (PLC_ACC_BIT & 0x01);
PLC_PC+=2;}break;
case 0xFFFA: //MPS
{PLC_MPS_BIT = (PLC_MPS_BIT << 1) | (PLC_ACC_BIT & 0x01);
PLC_PC+=2;}break;
case 0xFFFB: //MRD
{PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (PLC_MPS_BIT & 0x01);
PLC_PC+=2;}break;
case 0xFFFC: //MPP
{PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (PLC_MPS_BIT & 0x01);
PLC_MPS_BIT >>= 1;
PLC_PC+=2;}break;
case 0xFFFD: //INV
{PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (~PLC_ACC_BIT & 0x01);
PLC_PC+=2;}break;
case 0xFFFF: //NOP
{PLC_PC+=2;}break;
/********************升降沿指令************************************************/
case 0x01CA:
{PLC_ACC_BIT <<= 1;
if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
PLC_ACC_BIT |=0x01;
PLC_PC+=4;}break; //LDP
case 0x01CB:
{PLC_ACC_BIT <<= 1;
if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF))
PLC_ACC_BIT |=0x01;
PLC_PC+=4;}break; //LDF
case 0x01CC:
{if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=4;}break; //ANDP
case 0x01CD:
{if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF))
PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=4;}break; //ANDF
case 0x01CE:
{if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
PLC_ACC_BIT |=0x01;
PLC_PC+=4;}break; //ORP
case 0x01CF:
{if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF))
PLC_ACC_BIT |=0x01;
PLC_PC+=4;}break; //ORF
case 0x0008://PLS Y M
{if(PLC_ACC_BIT&0x01)
{if(PLC_PL_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
{PLC_PL_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);
PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);
}
else{PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);}
}//END PLC_ACC_BIT
else{PLC_PL_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);}
PLC_PC+=4;}break; //PLS
case 0x0009://PLF Y M
{if(PLC_ACC_BIT&0x01)
{if(PLC_PL_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
{PLC_PL_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);}
}//END PLC_ACC_BIT
else
{if(PLC_PL_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF))
{PLC_PL_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);}
else{PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);}
}
PLC_PC+=4;}break; //PLF Y M//Y4 09 00 04 85
/********************复位&步进指令************************************************/
case 0x0002:
{if(PLC_ACC_BIT&0x01)PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);
else PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
PLC_PC+=4;}break; //OUT
case 0x0003:
{if(PLC_ACC_BIT&0x01)PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);
PLC_PC+=4;}break; //SET
case 0x0004:
{if(PLC_ACC_BIT&0x01)PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
PLC_PC+=4;}break; //RST
case 0x0005:
{if(PLC_ACC_BIT&0x01)
{if(PLC_STL_CMD==2)PLC_BIT_OFF(PLC_STL_ADD);
PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);}
else PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
PLC_PC+=4;}break; //OUT
case 0x0006:
{if(PLC_ACC_BIT&0x01)
{if(PLC_STL_CMD==2)PLC_BIT_OFF(PLC_STL_ADD);
PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);}
PLC_PC+=4;}break; //SET
case 0x0007:
{if(PLC_ACC_BIT&0x01)
{PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);}
PLC_PC+=4;}break; //RST
case 0xF7FF:
{PLC_RUN_BIT=3;//返回正常程序执行
PLC_STL_CMD=0;//复位STL标志
PLC_PC+=2;}break;//RET 步进返回
case 0x000C:
{if(PLC_RAM8(PLC_PC+3)==0x86)//RST T
{if(PLC_ACC_BIT&0x01)
{PLC_T_RST_ON(PLC_RAM8(PLC_PC+2));
PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2);
PLC_RAM16(PLC_T_START_ADD+(PLC_RAM8(PLC_PC+2)*2))=0;
PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
}//END PLC_ACC_BIT
else{if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2))
{PLC_T_RST_OFF(PLC_RAM8(PLC_PC+2));
PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
}//END ELSE
} //END RST T
else //RST C
{if(PLC_ACC_BIT&0x01)
{PLC_C_RST_ON(PLC_RAM8(PLC_PC+2));
PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2);
if(PLC_RAM8(PLC_PC+2)<200)//RST C0-199
{PLC_RAM16(PLC_C16_START_ADD+(PLC_RAM8(PLC_PC+2)*2))=0;
PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
}//END RST C0-199
else //RST C200-255
{PLC_RAM16(PLC_C32_START_ADD+((PLC_RAM8(PLC_PC+2)-200)*4))=0;
PLC_RAM16(PLC_C32_START_ADD+((PLC_RAM8(PLC_PC+2)-200)*4)+2)=0;
PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
}//END RST C200-255
}//ENDPLC_ACC_BIT
else{if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2))
{PLC_C_RST_OFF(PLC_RAM8(PLC_PC+2));
PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
}//END ELSE
}//END RST C
PLC_PC+=4;}break;
case 0x000D:
{if(PLC_ACC_BIT&0x01)
{if(PLC_RAM8(PLC_PC+5)==0x86)
PLC_RAM16(PLC_D_START_ADD+PLC_RAM8(PLC_PC+2)+(PLC_RAM8(PLC_PC+4)*0x100))=0;
else if(PLC_RAM8(PLC_PC+5)==0x88)
PLC_RAM16(PLC_D1000_START_ADD+PLC_RAM8(PLC_PC+2)+(PLC_RAM8(PLC_PC+4)*0x100))=0;
else if(PLC_RAM8(PLC_PC+5)==0x80)
PLC_RAM16(PLC_D8000_START_ADD+PLC_RAM8(PLC_PC+2)+(PLC_RAM8(PLC_PC+4)*0x100))=0;
else {PLC_PROG_ERROR(6501);}//操作的数据数型出错
}//END PLC_ACC_BIT
PLC_PC+=6;}break;
/********************功能指令************************************************/
/** **/
/********************程序流程************************************************/
case 0x0010:
{PLC_PC+=6;
if(PLC_ACC_BIT&0x01)
{PLC_PC=PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_RAM8(PLC_PC-4)));}
}break; //CJ
case 0x0012:
{PLC_PC+=6;
PLC_O_PC=PLC_PC; //保存PC
if(PLC_ACC_BIT&0x01)
{PLC_PC=PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_RAM8(PLC_PC-4)));}
}break; //CALL
case 0x0014:
{PLC_PC=PLC_O_PC; //返回CALL前PC
/*PLC_PC+=2;*/}break; //SRET
case 0x001C:
{PLC_END_PROG();}break; //FEND
/********************程序流程(P)*********************************************/
case 0x1010:
{PLC_PC+=6;
if(PLC_ACC_BIT&0x01)
{if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2-6)==0)
{PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2-6);
PLC_PC=PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_RAM8(PLC_PC-4)));}
}
else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2-6);}
}break; //CJP P1//10 10 02 88 00 80
case 0x1012:
{PLC_PC+=6;
PLC_O_PC=PLC_PC; //保存PC
if(PLC_ACC_BIT&0x01)
{if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2-6)==0)
{PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2-6);
PLC_PC=PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_RAM8(PLC_PC-4)));}
}
else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2-6);}
}break; //CALLP P1//12 10 02 88 00 80
/********************传送比较指令************************************************/
case 0x0024://CMP
{if(PLC_ACC_BIT&0x01){
PLC_TEMP1=PLC_ByteRead16(PLC_PC+2);
PLC_TEMP2=PLC_ByteRead16(PLC_PC+6);
PLC_TEMP3=PLC_ProgAddReturn(PLC_PC+10);
if(PLC_TEMP1>PLC_TEMP2)
{PLC_BIT_ON(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
else if(PLC_TEMP1==PLC_TEMP2)
{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_ON(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
else{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_ON(PLC_TEMP3+2);}
}//END PLC_ACC_BIT&0x01
PLC_PC+=14;}break; //CMP
case 0x0026://ZCP
{if(PLC_ACC_BIT&0x01){
PLC_TEMP1=PLC_ByteRead16(PLC_PC+2);
PLC_TEMP2=PLC_ByteRead16(PLC_PC+6);
PLC_TEMP3=PLC_ByteRead16(PLC_PC+10);
PLC_TEMP4=PLC_ProgAddReturn(PLC_PC+14);
if(PLC_TEMP1>PLC_TEMP3)
{PLC_BIT_ON(PLC_TEMP4);PLC_BIT_OFF(PLC_TEMP4+1);PLC_BIT_OFF(PLC_TEMP4+2);}
else if(PLC_TEMP2<PLC_TEMP3)
{PLC_BIT_OFF(PLC_TEMP4);PLC_BIT_OFF(PLC_TEMP4+1);PLC_BIT_ON(PLC_TEMP4+2);}
else{PLC_BIT_OFF(PLC_TEMP4);PLC_BIT_ON(PLC_TEMP4+1);PLC_BIT_OFF(PLC_TEMP4+2);}
}//END PLC_ACC_BIT&0x01
PLC_PC+=18;}break; //ZCP
case 0x0028://MOV
{if(PLC_ACC_BIT&0x01)
{PLC_ByteWrite16(PLC_PC+6,PLC_ByteRead16(PLC_PC+2));}
PLC_PC+=10;}break; //MOV
case 0x002E://BMOV(M8024)
{if(PLC_ACC_BIT&0x01){
PLC_TEMP5=PLC_ProgAddReturn(PLC_PC+2)+PLC_R_START_ADD;
PLC_TEMP6=PLC_ProgAddReturn(PLC_PC+6)+PLC_R_START_ADD;
PLC_TEMP3=PLC_ByteRead16(PLC_PC+10)*2;
for(PLC_TEMP4=0;PLC_TEMP3>PLC_TEMP4;PLC_TEMP4+=2)
{if(PLC_BIT_TEST(M8024)){PLC_RAM16(PLC_TEMP5+PLC_TEMP4)=PLC_RAM16(PLC_TEMP6+PLC_TEMP4);}
else {PLC_RAM16(PLC_TEMP6+PLC_TEMP4)=PLC_RAM16(PLC_TEMP5+PLC_TEMP4);}
}
}//END PLC_ACC_BIT&0x01
PLC_PC+=14;}break; //BMOV(M8024)
/********************(D)传送比较指令*********************************************/
case 0x0025://CMP
{if(PLC_ACC_BIT&0x01){
PLC_TEMP5=PLC_ByteRead32(PLC_PC+2);
PLC_TEMP6=PLC_ByteRead32(PLC_PC+10);
PLC_TEMP3=PLC_ProgAddReturn(PLC_PC+18);
if(PLC_TEMP5>PLC_TEMP6)
{PLC_BIT_ON(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
else if(PLC_TEMP5==PLC_TEMP6)
{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_ON(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
else{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_ON(PLC_TEMP3+2);}
}//END PLC_ACC_BIT&0x01
PLC_PC+=26;}break; //CMP
case 0x0027://ZCP
{if(PLC_ACC_BIT&0x01){
PLC_TEMP5=PLC_ByteRead32(PLC_PC+2);
PLC_TEMP6=PLC_ByteRead32(PLC_PC+10);
PLC_TEMPA=PLC_ByteRead32(PLC_PC+18);
PLC_TEMP4=PLC_ProgAddReturn(PLC_PC+26);
if(PLC_TEMP5>PLC_TEMPA)
{PLC_BIT_ON(PLC_TEMP4);PLC_BIT_OFF(PLC_TEMP4+1);PLC_BIT_OFF(PLC_TEMP4+2);}
else if(PLC_TEMP6<PLC_TEMPA)
{PLC_BIT_OFF(PLC_TEMP4);PLC_BIT_OFF(PLC_TEMP4+1);PLC_BIT_ON(PLC_TEMP4+2);}
else{PLC_BIT_OFF(PLC_TEMP4);PLC_BIT_ON(PLC_TEMP4+1);PLC_BIT_OFF(PLC_TEMP4+2);}
}//END PLC_ACC_BIT&0x01
PLC_PC+=34;}break; //ZCP
case 0x0029://MOV
{if(PLC_ACC_BIT&0x01)
{PLC_ByteWrite32(PLC_PC+10,PLC_ByteRead32(PLC_PC+2));}
PLC_PC+=18;}break; //MOV
/********************传送比较指令(P)********************************************/
case 0x1024:
{if(PLC_ACC_BIT&0x01){
if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2)==0)
{PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2);
PLC_TEMP1=PLC_ByteRead16(PLC_PC+2);
PLC_TEMP2=PLC_ByteRead16(PLC_PC+6);
PLC_TEMP3=PLC_ProgAddReturn(PLC_PC+10);
if(PLC_TEMP1>PLC_TEMP2)
{PLC_BIT_ON(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
else if(PLC_TEMP1==PLC_TEMP2)
{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_ON(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
else{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_ON(PLC_TEMP3+2);}
}}//END PLC_ACC_BIT&0x01
else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
PLC_PC+=14;}break; //CMP
case 0x1026:
{if(PLC_ACC_BIT&0x01){
if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2)==0)
{PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2);
PLC_TEMP1=PLC_ByteRead16(PLC_PC+2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -