📄 plc_stl.c
字号:
;/****************************************Copyright (C)**************************************************
;** Email:luheding@126.com
;** QQ:614090042
;** 如有意见或不明可联系,但要注明来意.否则不回
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: PLC_STL.c
;**版 本: V2.1
;**创 建 人: LuHeDing
;**最后修改日期: 2010年05月08日
;**描 述: PLC专用于STL指令中的程序解释
;**
;********************************************************************************************************/
#include "..\Drive\PLC_PUBLIC.H"
/***********************************************
函数功能:PLC指令运行
***********************************************/
void PLC_STL_RUN(void)
{ PLC_TEMP1=PLC_RAM16(PLC_PC); //取指令
switch (PLC_TEMP1){
/********************纯字指令************************************************/
case 0xFFF8: {PLC_PC+=2;}break;//ANB
case 0xFFF9: {PLC_PC+=2;}break;//ORB
case 0xFFFA: {PLC_PC+=2;}break;//MPS
case 0xFFFB: {PLC_PC+=2;}break;//MRD
case 0xFFFC: {PLC_PC+=2;}break;//MPP
case 0xFFFD: {PLC_PC+=2;}break;//INV
case 0xFFFF: {PLC_PC+=2;}break;//NOP
/********************升降沿指令************************************************/
case 0x01CA:{PLC_PC+=4;}break; //LDP
case 0x01CB:{PLC_PC+=4;}break; //LDF
case 0x01CC:{PLC_PC+=4;}break; //ANDP
case 0x01CD:{PLC_PC+=4;}break; //ANDF
case 0x01CE:{PLC_PC+=4;}break; //ORP
case 0x01CF:{PLC_PC+=4;}break; //ORF
case 0x0008:
{if(PLC_STL_CMD==1)
{PLC_TEMP1=PLC_RAM16(PLC_PC+2)&0x0FFF;
if(PLC_PL_BIT_TEST(PLC_TEMP1))
{PLC_PL_BIT_OFF(PLC_TEMP1);
PLC_BIT_OFF(PLC_TEMP1);}
}
PLC_PC+=4;}break;
case 0x0009:
{if(PLC_STL_CMD==1)
{PLC_TEMP1=PLC_RAM16(PLC_PC+2)&0x0FFF;
if(PLC_PL_BIT_TEST(PLC_TEMP1))
{PLC_PL_BIT_OFF(PLC_TEMP1);
PLC_BIT_OFF(PLC_TEMP1);}
}
PLC_PC+=4;}break;
/********************复位&步进指令************************************************/
case 0x0002:{if(PLC_STL_CMD==1)PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);PLC_PC+=4;}break;
case 0x0003:{PLC_PC+=4;}break;
case 0x0004:{PLC_PC+=4;}break;
case 0x0005:{PLC_PC+=4;}break;
case 0x0006:{PLC_PC+=4;}break;
case 0x0007:{PLC_PC+=4;}break;
case 0xF7FF:{PLC_RUN_BIT=3;PLC_STL_CMD=0;PLC_PC+=2;}break;
case 0x000C:
{if(PLC_STL_CMD==1){
if(PLC_RAM8(PLC_PC+3)==0x86)
{PLC_T_RST_OFF(PLC_RAM8(PLC_PC+2));
PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
else
{PLC_C_RST_OFF(PLC_RAM8(PLC_PC+2));
PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
}//END PLC_STL_CMD==1
PLC_PC+=4;}break;
case 0x000D:{PLC_PC+=6;}break;
/********************功能指令************************************************/
/** **/
/********************程序流程************************************************/
case 0x0010:{PLC_PC+=6;}break; //CJ
case 0x0012:{PLC_PC+=6;}break; //CALL
case 0x0014:{PLC_PC+=2;}break; //SRET
case 0x001C:{PLC_PROG_ERROR(6505);}break; //FEND //无步进返回指令
/********************程序流程(P)************************************************/
case 0x1010:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break;
case 0x1012:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break;
/********************传送比较指令************************************************/
case 0x0024:{PLC_PC+=14;}break; //CMP
case 0x0026:{PLC_PC+=18;}break; //ZCP
case 0x0028:{PLC_PC+=10;}break; //MOV
case 0x002E:{PLC_PC+=14;}break; //BMOV(M8024)
/********************(D)传送比较指令*********************************************/
case 0x0025:{PLC_PC+=26;}break; //CMP
case 0x0027:{PLC_PC+=34;}break; //ZCP
case 0x0029:{PLC_PC+=18;}break; //MOV
/********************传送比较指令(P)********************************************/
case 0x1024:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //CMP
case 0x1026:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //ZCP
case 0x1028:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //MOV
case 0x102E:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //BMOV(M8024)
/********************(D)传送比较指令(P)******************************************/
case 0x1025:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //CMP
case 0x1027:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=34;}break; //ZCP
case 0x1029:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=18;}break; //MOV
/********************四则.逻辑运算*******************************************/
case 0x0038:{PLC_PC+=14;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
case 0x003A:{PLC_PC+=14;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
case 0x003C:{PLC_PC+=14;}break; //MUL(*)
case 0x003E:{PLC_PC+=14;}break; //DIV(/)
case 0x0040:{PLC_PC+=6;}break; //INC(++)
case 0x0042:{PLC_PC+=6;}break; //DEC(--)
case 0x0044:{PLC_PC+=14;}break; //WAND
case 0x0046:{PLC_PC+=14;}break; //WOR
case 0x0048:{PLC_PC+=14;}break; //WXOR
/********************(D)四则.逻辑运算*******************************************/
case 0x0039:{PLC_PC+=26;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
case 0x003B:{PLC_PC+=26;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
case 0x003D:{PLC_PC+=26;}break; //MUL(*)
case 0x003F:{PLC_PC+=26;}break; //DIV(/)
case 0x0041:{PLC_PC+=10;}break; //INC(++)
case 0x0043:{PLC_PC+=10;}break; //DEC(--)
case 0x0045:{PLC_PC+=26;}break; //WAND
case 0x0047:{PLC_PC+=26;}break; //WOR
case 0x0049:{PLC_PC+=26;}break; //WXOR
/********************四则.逻辑运算(P)*******************************************/
case 0x1038:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
case 0x103A:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
case 0x103C:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //MUL(*)
case 0x103E:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //DIV(/)
case 0x1040:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break; //INC(++)
case 0x1042:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break; //DEC(--)
case 0x1044:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //WAND
case 0x1046:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //WOR
case 0x1048:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //WXOR
/********************(D)四则.逻辑运算(P)*******************************************/
case 0x1039:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
case 0x103B:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
case 0x103D:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //MUL(*)
case 0x103F:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //DIV(/)
case 0x1041:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=10;}break; //INC(++)
case 0x1043:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=10;}break; //DEC(--)
case 0x1045:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //WAND
case 0x1047:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //WOR
case 0x1049:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //WXOR
/********************数据处理************************************************/
case 0x0060:{PLC_PC+=10;}break; //ZRST
/********************数据处理(P)*********************************************/
case 0x1060:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=10;}break; //ZRSTP
/********************高速指令************************************************/
case 0x0082:{if(PLC_STL_CMD==1){PLC_PLSY_STOP(PLC_ProgAddReturn(PLC_PC+10));}PLC_PC+=14;}break; //PLSY(M8029)
case 0x0084:{if(PLC_STL_CMD==1){PLC_PWM_STOP(PLC_ProgAddReturn(PLC_PC+10));}PLC_PC+=14;}break; //PWM
/********************(D)高速指令*********************************************/
case 0x0083:{if(PLC_STL_CMD==1){PLC_PLSY_STOP(PLC_ProgAddReturn(PLC_PC+18));}PLC_PC+=26;}break; //PLSY(M8029)
/********************方便指令************************************************/
case 0x0094:{PLC_PC+=6;}break; //ALT
/********************方便指令(P)*********************************************/
case 0x1094:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break; //ALT(P)
/********************接点比较************************************************/
case 0x01D0:{PLC_PC+=10;}break; //LD=
case 0x01D2:{PLC_PC+=10;}break; //LD>
case 0x01D4:{PLC_PC+=10;}break; //LD<
case 0x01D8:{PLC_PC+=10;}break; //LD<>
case 0x01DA:{PLC_PC+=10;}break; //LD<=
case 0x01DC:{PLC_PC+=10;}break; //LD>=
case 0x01E0:{PLC_PC+=10;}break; //AND=
case 0x01E2:{PLC_PC+=10;}break; //AND>
case 0x01E4:{PLC_PC+=10;}break; //AND<
case 0x01E8:{PLC_PC+=10;}break; //AND<>
case 0x01EA:{PLC_PC+=10;}break; //AND<=
case 0x01EC:{PLC_PC+=10;}break; //AND>=
case 0x01F0:{PLC_PC+=10;}break; //OR=
case 0x01F2:{PLC_PC+=10;}break; //OR>
case 0x01F4:{PLC_PC+=10;}break; //OR<
case 0x01F8:{PLC_PC+=10;}break; //OR<>
case 0x01FA:{PLC_PC+=10;}break; //OR<=
case 0x01FC:{PLC_PC+=10;}break; //OR>=
/********************(D)接点比较************************************************/
case 0x01D1:{PLC_PC+=18;}break; //LD=
case 0x01D3:{PLC_PC+=18;}break; //LD>
case 0x01D5:{PLC_PC+=18;}break; //LD<
case 0x01D9:{PLC_PC+=18;}break; //LD<>
case 0x01DB:{PLC_PC+=18;}break; //LD<=
case 0x01DD:{PLC_PC+=18;}break; //LD>=
case 0x01E1:{PLC_PC+=18;}break; //AND=
case 0x01E3:{PLC_PC+=18;}break; //AND>
case 0x01E5:{PLC_PC+=18;}break; //AND<
case 0x01E9:{PLC_PC+=18;}break; //AND<>
case 0x01EB:{PLC_PC+=18;}break; //AND<=
case 0x01ED:{PLC_PC+=18;}break; //AND>=
case 0x01F1:{PLC_PC+=18;}break; //OR=
case 0x01F3:{PLC_PC+=18;}break; //OR>
case 0x01F5:{PLC_PC+=18;}break; //OR<
case 0x01F9:{PLC_PC+=18;}break; //OR<>
case 0x01FB:{PLC_PC+=18;}break; //OR<=
case 0x01FD:{PLC_PC+=18;}break; //OR>=
/********************结束指令************************************************/
case 0x000F:
{PLC_PROG_ERROR(9999); //无步进返回指令
}break; //END
/********************常规指令************************************************/
default: //default(1)
{PLC_CMD=PLC_TEMP1&0xF000; //分离指令
switch (PLC_CMD)//switch(2)
{case 0x2000:{PLC_PC+=2;}break;
case 0x3000:{PLC_PC+=2;}break;
case 0x4000:{PLC_PC+=2;}break;
case 0x5000:{PLC_PC+=2;}break;
case 0x6000:{PLC_PC+=2;}break;
case 0x7000:{PLC_PC+=2;}break;
case 0xB000:{PLC_PC+=2;}break;
case 0xC000:
{if(PLC_STL_CMD==1){PLC_BIT_OFF(PLC_TEMP1&0x0FFF);}
PLC_PC+=2;}break;
case 0xD000:{PLC_PC+=2;}break;
case 0xE000:{PLC_PC+=2;}break;
case 0xF000:
{if((PLC_TEMP1&0x0fff)>0x03ff){PLC_PROG_ERROR(1916);} //指令与操作数出错
else {PLC_RUN_BIT=3;//返回正常程序中测试S
PLC_STL_CMD=0;}
}break;
default: //default(2)
{PLC_CMD=PLC_TEMP1&0xFF00; //分离指令
switch (PLC_CMD)//switch(3)
{case 0x0600://OUT
{if(PLC_STL_CMD==1)
{PLC_T_OUT_BIT_OFF(PLC_TEMP1&0x0FFF);
PLC_T_C_BIT_OFF(PLC_TEMP1&0x0FFF);}
PLC_PC+=6;}break;
case 0x0E00:
{if((PLC_TEMP1&0x00FF)<200)
{if(PLC_STL_CMD==1)
{PLC_C_OUT_BIT_OFF(PLC_TEMP1&0x0FFF);
PLC_C_C_BIT_OFF(PLC_TEMP1&0x0FFF);}
PLC_PC+=6;}
else{
PLC_PC+=10;}
}break;
default:{PLC_PROG_ERROR(6505);}break; //指令出错
}//END switch(3)
}break;//END default(2)
}//END switch(2)
}break;//END default(1)
}//END switch(1)
/***********************************************/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -