📄 plc_progtest.c
字号:
;/****************************************Copyright (C)**************************************************
;**
;**
;**
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: PLC_ProgTest.c
;**版 本: V2.1
;**创 建 人: LuHeDing
;**最后修改日期: 2010年05月08日
;**描 述: PLC程序运行前测试(用于检测程序中有无错误)
;**
;********************************************************************************************************/
#include "..\Drive\PLC_PUBLIC.H"
/***********************************************
函数功能:PLC指令测试
***********************************************/
void PLC_PROG_TEST(void)
{if(PLC_RUN_BIT==1){PLC_RESET_RAM();PLC_RUN_BIT=2;D8065=0;D8068=0;}
if(PLC_RUN_BIT==2){ //测试运行标志
PLC_PC=PLC_PROG_START_ADD2;//初始PLC_PC指针
while (PLC_PC<PLC_PROG_END_ADD)
{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_RAM8(PLC_PC+3)&0xf0)!=0x80)PLC_PROG_ERROR(6501);PLC_PC+=4;}break; //PLS Y M
case 0x0009:{if((PLC_RAM8(PLC_PC+3)&0xf0)!=0x80)PLC_PROG_ERROR(6501);PLC_PC+=4;}break; //PLF Y M
/********************复位&步进指令************************************************/
case 0x0002:{if(PLC_RAM8(PLC_PC+3)!=0x8f)PLC_PROG_ERROR(6501);PLC_PC+=4;}break; //OUT M8000
case 0x0003:{if(PLC_RAM8(PLC_PC+3)!=0x8f)PLC_PROG_ERROR(6501);PLC_PC+=4;}break; //SET M8000
case 0x0004:{if(PLC_RAM8(PLC_PC+3)!=0x8f)PLC_PROG_ERROR(6501);PLC_PC+=4;}break; //RST M8000
case 0x0005:{if(PLC_RAM8(PLC_PC+3)>0x83) PLC_PROG_ERROR(6501);PLC_PC+=4;}break; //OUT S
case 0x0006:{if(PLC_RAM8(PLC_PC+3)>0x83) PLC_PROG_ERROR(6501);PLC_PC+=4;}break; //SET S
case 0x0007:{if(PLC_RAM8(PLC_PC+3)>0x83) PLC_PROG_ERROR(6501);PLC_PC+=4;}break; //RST S
case 0xF7FF:{PLC_STL_CMD=0;PLC_PC+=2;}break;//RET 步进返回
case 0x000C:
{if(PLC_RAM8(PLC_PC+3)!=0x86&&PLC_RAM8(PLC_PC+3)!=0x8e)PLC_PROG_ERROR(6501);
PLC_PC+=4;}break; //RST T0||RST C0
case 0x000D:
{PLC_ProgDataTest(PLC_PC+2,1);
if(PLC_ProgTypeReturn(PLC_PC+2)!=0x02)//RST D0-D8255
{PLC_PROG_ERROR(6501);}//操作的数据数型出错
PLC_PC+=6;}break; //RST D0
/********************功能指令************************************************/
/** **/
/********************程序流程************************************************/
case 0x0010:
{if(PLC_P_TEST(PLC_RAM8(PLC_PC+2)/2)==0&& //如果测试位没启动
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))==0)//如果没有地址
{PLC_P_ON(PLC_RAM8(PLC_PC+2)/2); //启动测试位
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))=(PLC_PC-PLC_PROG_START_ADD2);}//保存现调用的地址
PLC_PC+=6;}break; //CJ
case 0x0012:
{if(PLC_P_TEST(PLC_RAM8(PLC_PC+2)/2)==0&& //如果测试位没启动
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))==0)//如果没有地址
{PLC_P_ON(PLC_RAM8(PLC_PC+2)/2); //启动测试位
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))=PLC_PC-PLC_PROG_START_ADD2;}//保存现调用的地址
PLC_PC+=6;}break; //CALL
case 0x0014:
{if(PLC_P_TEST(PLC_RAM8(PLC_PC+2)/2)==0&& //如果测试位没启动
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))==0)//如果没有地址
{PLC_P_ON(PLC_RAM8(PLC_PC+2)/2); //启动测试位
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))=PLC_PC-PLC_PROG_START_ADD2;}//保存现调用的地址
PLC_PC+=2;}break; //SRET
case 0x001C:{PLC_PC+=2;}break; //FEND
/********************程序流程(P)************************************************/
case 0x1010:
{if(PLC_P_TEST(PLC_RAM8(PLC_PC+2)/2)==0&& //如果测试位没启动
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))==0)//如果没有地址
{PLC_P_ON(PLC_RAM8(PLC_PC+2)/2); //启动测试位
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))=(PLC_PC-PLC_PROG_START_ADD2);}//保存现调用的地址
PLC_PC+=6;}break; //CJP P1//10 10 02 88 00 80
case 0x1012:
{if(PLC_P_TEST(PLC_RAM8(PLC_PC+2)/2)==0&& //如果测试位没启动
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))==0)//如果没有地址
{PLC_P_ON(PLC_RAM8(PLC_PC+2)/2); //启动测试位
PLC_RAM16(PLC_R_START_ADD+0x5700+PLC_RAM8(PLC_PC+2))=PLC_PC-PLC_PROG_START_ADD2;}//保存现调用的地址
PLC_PC+=6;}break; //CALL P1//12 10 02 88 00 80
/********************传送比较指令************************************************/
case 0x0024:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //CMP
case 0x0026:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //ZCP
case 0x0028:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //MOV
case 0x002E:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //BMOV(M8024)
/********************(D)传送比较指令*********************************************/
case 0x0025:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //CMP
case 0x0027:{PLC_ProgDataTest(PLC_PC+2,8);PLC_PC+=34;}break; //ZCP
case 0x0029:{PLC_ProgDataTest(PLC_PC+2,4);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:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //CMP
case 0x1027:{PLC_ProgDataTest(PLC_PC+2,8);PLC_PC+=34;}break; //ZCP
case 0x1029:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //MOV
/********************四则.逻辑运算*******************************************/
case 0x0038:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
case 0x003A:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
case 0x003C:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //MUL(*)
case 0x003E:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //DIV(/)
case 0x0040:{PLC_ProgDataTest(PLC_PC+2,1);PLC_PC+=6;}break; //INC(++)
case 0x0042:{PLC_ProgDataTest(PLC_PC+2,1);PLC_PC+=6;}break; //DEC(--)
case 0x0044:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //WAND
case 0x0046:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //WOR
case 0x0048:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //WXOR
/********************(D)四则.逻辑运算*******************************************/
case 0x0039:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
case 0x003B:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
case 0x003D:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //MUL(*)
case 0x003F:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //DIV(/)
case 0x0041:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //INC(++)
case 0x0043:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //DEC(--)
case 0x0045:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //WAND
case 0x0047:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //WOR
case 0x0049:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //WXOR
/********************四则.逻辑运算(P)*******************************************/
case 0x1038:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
case 0x103A:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
case 0x103C:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //MUL(*)
case 0x103E:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //DIV(/)
case 0x1040:{PLC_ProgDataTest(PLC_PC+2,1);PLC_PC+=6;}break; //INC(++)
case 0x1042:{PLC_ProgDataTest(PLC_PC+2,1);PLC_PC+=6;}break; //DEC(--)
case 0x1044:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //WAND
case 0x1046:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //WOR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -