⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plc_progtest.c

📁 以前做的一个仿PLC程序
💻 C
📖 第 1 页 / 共 2 页
字号:
;/****************************************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 + -