plc_run.c
来自「以前做的一个仿PLC程序」· C语言 代码 · 共 898 行 · 第 1/3 页
C
898 行
{PLC_BitReset(PLC_ProgAddReturn(PLC_PC+2),PLC_ProgAddReturn(PLC_PC+6));}
else {PLC_PROG_ERROR(6501);}//操作的数据数型出错
}//END PLC_ACC_BIT
PLC_PC+=10;}break; //ZRST
/********************数据处理(P)*********************************************/
case 0x1060: //ZRSTP
{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);
if(PLC_TEMP1==0x02)
{PLC_TEMP2=PLC_ProgAddReturn(PLC_PC+6)+1;
if(PLC_TEMP2>=0x0C00&&PLC_TEMP2<=0x0CDF){PLC_TEMP2+=2;}
PLC_ByteReset(PLC_ProgAddReturn(PLC_PC+2),PLC_TEMP2);}
else if(PLC_TEMP1==0x0b)
{PLC_BitReset(PLC_ProgAddReturn(PLC_PC+2),PLC_ProgAddReturn(PLC_PC+6));}
else {PLC_PROG_ERROR(6501);}//操作的数据数型出错
}//END
}//END PLC_ACC_BIT
else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
PLC_PC+=10;}break; //ZRSTP
/********************高速指令************************************************/
case 0x0082:
{PLC_BIT_OFF(M8029);
if(PLC_ACC_BIT&0x01)
{PLC_PLSY_RUN(PLC_ByteRead16(PLC_PC+2),PLC_ByteRead16(PLC_PC+6),PLC_ProgAddReturn(PLC_PC+10));}
else {PLC_PLSY_STOP(PLC_ProgAddReturn(PLC_PC+10));}
PLC_PC+=14;}break; //PLSY
case 0x0084://PWM
{if(PLC_ACC_BIT&0x01)
{PLC_PWM_RUN(PLC_ByteRead16(PLC_PC+2),PLC_ByteRead16(PLC_PC+6),PLC_ProgAddReturn(PLC_PC+10));}
else {PLC_PWM_STOP(PLC_ProgAddReturn(PLC_PC+10));}
PLC_PC+=14;}break; //PWM
/********************(D)高速指令*********************************************/
case 0x0083:
{PLC_BIT_OFF(M8029);
if(PLC_ACC_BIT&0x01)
{PLC_PLSY_RUN(PLC_ByteRead32(PLC_PC+2),PLC_ByteRead32(PLC_PC+10),PLC_ProgAddReturn(PLC_PC+18));}
else {PLC_PLSY_STOP(PLC_ProgAddReturn(PLC_PC+18));}
PLC_PC+=26;}break; //PLSY
/********************方便指令************************************************/
case 0x0094://ALT
{if(PLC_ACC_BIT&0x01){
PLC_TEMP1=PLC_ProgAddReturn(PLC_PC+2);
if(PLC_BIT_TEST(PLC_TEMP1)){PLC_BIT_OFF(PLC_TEMP1);}
else {PLC_BIT_ON(PLC_TEMP1);}
}//END PLC_ACC_BIT
PLC_PC+=6;}break; //ALT
/********************方便指令(P)*********************************************/
case 0x1094://ALT(P)
{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_ProgAddReturn(PLC_PC+2);
if(PLC_BIT_TEST(PLC_TEMP1)){PLC_BIT_OFF(PLC_TEMP1);}
else {PLC_BIT_ON(PLC_TEMP1);}
}//END 测试执行标志
}//END PLC_ACC_BIT
else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
PLC_PC+=6;}break; //ALT(P)
/********************接点比较************************************************/
case 0x01D0:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead16(PLC_PC+2)==PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //LD=
case 0x01D2:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead16(PLC_PC+2)>PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //LD>
case 0x01D4:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead16(PLC_PC+2)<PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //LD<
case 0x01D8:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead16(PLC_PC+2)!=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //LD<>
case 0x01DA:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead16(PLC_PC+2)<=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //LD<=
case 0x01DC:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead16(PLC_PC+2)>=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //LD>=
case 0x01E0:
{if(PLC_ByteRead16(PLC_PC+2)==PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=10;}break; //AND=
case 0x01E2:
{if(PLC_ByteRead16(PLC_PC+2)>PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=10;}break; //AND>
case 0x01E4:
{if(PLC_ByteRead16(PLC_PC+2)<PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=10;}break; //AND<
case 0x01E8:
{if(PLC_ByteRead16(PLC_PC+2)!=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=10;}break; //AND<>
case 0x01EA:
{if(PLC_ByteRead16(PLC_PC+2)<=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=10;}break; //AND<=
case 0x01EC:
{if(PLC_ByteRead16(PLC_PC+2)>=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=10;}break; //AND>=
case 0x01F0:
{if(PLC_ByteRead16(PLC_PC+2)==PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //OR=
case 0x01F2:
{if(PLC_ByteRead16(PLC_PC+2)>PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //OR>
case 0x01F4:
{if(PLC_ByteRead16(PLC_PC+2)<PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //OR<
case 0x01F8:
{if(PLC_ByteRead16(PLC_PC+2)!=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //OR<>
case 0x01FA:
{if(PLC_ByteRead16(PLC_PC+2)<=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //OR<=
case 0x01FC:
{if(PLC_ByteRead16(PLC_PC+2)>=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
PLC_PC+=10;}break; //OR>=
/********************(D)接点比较************************************************/
case 0x01D1:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead32(PLC_PC+2)==PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //LD=
case 0x01D3:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead32(PLC_PC+2)>PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //LD>
case 0x01D5:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead32(PLC_PC+2)<PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //LD<
case 0x01D9:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead32(PLC_PC+2)!=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //LD<>
case 0x01DB:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead32(PLC_PC+2)<=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //LD<=
case 0x01DD:
{PLC_ACC_BIT <<= 1;
if(PLC_ByteRead32(PLC_PC+2)>=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //LD>=
case 0x01E1:
{if(PLC_ByteRead32(PLC_PC+2)==PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=18;}break; //AND=
case 0x01E3:
{if(PLC_ByteRead32(PLC_PC+2)>PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=18;}break; //AND>
case 0x01E5:
{if(PLC_ByteRead32(PLC_PC+2)<PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=18;}break; //AND<
case 0x01E9:
{if(PLC_ByteRead32(PLC_PC+2)!=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=18;}break; //AND<>
case 0x01EB:
{if(PLC_ByteRead32(PLC_PC+2)<=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=18;}break; //AND<=
case 0x01ED:
{if(PLC_ByteRead32(PLC_PC+2)>=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=18;}break; //AND>=
case 0x01F1:
{if(PLC_ByteRead32(PLC_PC+2)==PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //OR=
case 0x01F3:
{if(PLC_ByteRead32(PLC_PC+2)>PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //OR>
case 0x01F5:
{if(PLC_ByteRead32(PLC_PC+2)<PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //OR<
case 0x01F9:
{if(PLC_ByteRead32(PLC_PC+2)!=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //OR<>
case 0x01FB:
{if(PLC_ByteRead32(PLC_PC+2)<=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //OR<=
case 0x01FD:
{if(PLC_ByteRead32(PLC_PC+2)>=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
PLC_PC+=18;}break; //OR>=
/********************结束指令************************************************/
case 0x000F:{PLC_END_PROG();}break; //END
/********************常规指令************************************************/
/** **/
/********************常规指令************************************************/
default: //default(1)
{PLC_CMD=PLC_TEMP1&0xF000;
switch (PLC_CMD)//switch(2)
{case 0x2000: //LD
{PLC_ACC_BIT <<= 1;
if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF))PLC_ACC_BIT |=0x01;
PLC_PC+=2;}break;
case 0x3000: //LDI
{PLC_ACC_BIT <<= 1;
if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF));
else PLC_ACC_BIT |=0x01;
PLC_PC+=2;}break;
case 0x4000: //AND
{if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF))PLC_ACC_BIT &=0x01;
else PLC_ACC_BIT &=0xfe;
PLC_PC+=2;}break;
case 0x5000: //ANI
{if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF))PLC_ACC_BIT &=0xfe;
else PLC_ACC_BIT &=0x01;
PLC_PC+=2;}break;
case 0x6000: //OR
{if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF))PLC_ACC_BIT |=0x01;
PLC_PC+=2;}break;
case 0x7000: //ORI
{if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF));
else PLC_ACC_BIT |=0x01;
PLC_PC+=2;}break;
case 0xB000:
{PLC_PC+=2;}break;
case 0xC000:
{if(PLC_ACC_BIT & 0x01){PLC_BIT_ON(PLC_TEMP1&0x0FFF);}
else{PLC_BIT_OFF(PLC_TEMP1&0x0FFF);}
PLC_PC+=2;}break;
case 0xD000:
{if(PLC_ACC_BIT & 0x01){PLC_BIT_ON(PLC_TEMP1&0x0FFF);}
PLC_PC+=2;}break;
case 0xE000:
{if(PLC_ACC_BIT & 0x01){PLC_BIT_OFF(PLC_TEMP1&0x0FFF);}
PLC_PC+=2;}break;
case 0xF000://STL
{if((PLC_TEMP1&0x0fff)>0x03ff){PLC_PROG_ERROR(1916);}
else{
if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF)&&PLC_O_BIT_TEST(PLC_TEMP1&0x0FFF))
{PLC_STL_CMD=2;PLC_ACC_BIT =0x01;
PLC_STL_ADD=PLC_TEMP1&0x0FFF;}
else if(PLC_O2_BIT_TEST(PLC_TEMP1&0x0FFF)==0&&PLC_O_BIT_TEST(PLC_TEMP1&0x0FFF))
{PLC_RUN_BIT=4;PLC_STL_CMD=1;}
else{PLC_RUN_BIT=4;PLC_STL_CMD=3;}
}//END else
PLC_PC+=2;}break;
default: //default(2)
{PLC_CMD=PLC_TEMP1&0xFF00;
switch (PLC_CMD)//switch(3)
{case 0x0600:{
if(PLC_ACC_BIT & 0x01)
{PLC_T_C_BIT_ON(PLC_TEMP1&0x00ff);
if(PLC_T_RST_TEST(PLC_TEMP1&0x00ff)==0)
{if(PLC_RAM16(PLC_T_START_ADD+((PLC_TEMP1&0x00FF)*2))>=PLC_ByteRead16(PLC_PC+2))//测试量与计数值是否一致
{PLC_T_OUT_BIT_ON(PLC_TEMP1&0x00ff);}
else {PLC_T_OUT_BIT_OFF(PLC_TEMP1&0x00ff);}
}//END
}//END PLC_ACC_BIT
else {PLC_T_C_BIT_OFF(PLC_TEMP1&0x00ff);
PLC_T_OUT_BIT_OFF(PLC_TEMP1&0x00ff);
PLC_RAM16(PLC_T_START_ADD+((PLC_TEMP1&0x00FF)*2))=0;}//清除计时
PLC_PC+=6;}break;
case 0x0E00:{if((PLC_TEMP1&0x00FF)<200)
{if(PLC_ACC_BIT & 0x01)
{if(PLC_C_C_BIT_TEST(PLC_TEMP1&0x00FF)==0)
{PLC_C_C_BIT_ON(PLC_TEMP1&0x00FF);
if(PLC_C_RST_TEST(PLC_TEMP1&0x00FF)==0)
{PLC_RAM16(PLC_C16_START_ADD+((PLC_TEMP1&0x00FF)*2))+=1;//加1
if(PLC_RAM16(PLC_C16_START_ADD+((PLC_TEMP1&0x00FF)*2))>=PLC_ByteRead16(PLC_PC+2))//测试量与计数值是否一致
{PLC_C_OUT_BIT_ON(PLC_TEMP1&0x00FF);}
else {PLC_C_OUT_BIT_OFF(PLC_TEMP1&0x00FF);}
}//END
}//END
}//END PLC_ACC_BIT
else{PLC_C_C_BIT_OFF(PLC_TEMP1&0x00FF);}
PLC_PC+=6;}
else{//C200-C255
PLC_PC+=10;}
}break;//END OUT C
default:{PLC_PROG_ERROR(6505);}break; //指令出错
}//END switch(3)
}break;//END default(2)
}//END switch(2)
}break;//END default(1)
}//END switch(1)
/***********************************************/
}//结束PLC_RUN_BIT==3
else if(PLC_RUN_BIT==4){PLC_STL_RUN();}//
else if(PLC_RUN_BIT==1){PLC_PROG_TEST();}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?