;/****************************************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
评论2