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

📄 console.c.svn-base

📁 给MOTO 360 单片机 开发的MODBUS协议 直流奥特寻协议。。要用SDS编译
💻 SVN-BASE
字号:
/*******************************************************************************************
* MODBUS Master/Slaver Module (For Test)                                                        
* Coded by XUWANSU                                                                         
* 2007/6/26                                                                                 
*******************************************************************************************/
#include "MODBUS_REG.h"
#include "MODBUSFDL.H"
#include "DPRam.h"
#include "modbus.H"
#include "dc_aotexun.h"

#include  <string.h>
#include  <stdio.h>
#include  <math.h>
/*******************************************************************************************/
#define CMD_C_RETRUN1 "SCC1 TASK NUM= %d\n"
#define CMD_C_RETRUN2 "SCC2 TASK NUM= %d\n"
#define CMD_C_RETRUN3 "SCC3 TASK NUM= %d\n"
#define CMD_C_RETRUN4 "SCC4 TASK NUM= %d\n"

#define error_0     "COMMAND OK!\n"
#define error_1     "ERROR COMMAND!\n"
#define error_2     "COMMAND S ERROR!\n"
#define error_3     "COMMAND W ERROR!\n"
#define error_4     "COMMAND Z ERROR!\n"


volatile char PARSEBUF[10][16];
volatile char SCC_PARAM[4][128];
volatile char error_flag;
volatile unsigned char DEBUG_STS;


void parse_S(char *ptr);
void parse_D(char *ptr);
void parse_W(char *ptr);
void parse_X(char *ptr);
void parse_Z(char *ptr);
short parse(char *ptr);
void console(void);

//-----------------------------------------------------------------------------------
//数据区起始地址及数量的可变定义
volatile unsigned char  *g_HRDATA;
//-----------------------------------------------------------------------------------

void console(void)
{
    char *ptr;
    char buf[1024];
    unsigned short sbuf[16];
    unsigned short j;
    int ii;

    READY_DIAG_INF=0;
    while(READY_DIAG_INF);

    READY_WORDLINE=0;
    while(READY_WORDLINE);

    memset(DIAG_INF,0,DIAG_INF_LEN);

    if (strcmp(WORDLINE,"?")==0)
    {		
        //打印四个端口的配置信息
        sprintf(buf, "%s\n %s\n %s\n %s\n", SCC_PARAM[0], SCC_PARAM[1], SCC_PARAM[2], SCC_PARAM[3]);
        strncpy(DIAG_INF, buf, DIAG_INF_LEN);
        goto bk_error;
    }

    if (strcmp(WORDLINE,"R")==0)
    {
        TASK_START_FLAG=1;	 	 	             
        goto bk;
    }

    if (strcmp(WORDLINE,"P")==0)
    {
        TASK_START_FLAG=0; 	 	 	          
        for (ii=0;ii<4;ii++)
        {	
            SCC_TASK_PTR[ii]=0;
            SCC_BUSY[ii]=0;
            SCC_TASKID[ii]=0;
            SCC_BUSY_TICKS[ii]=0;
        }

        goto bk;
    }

    ptr=strchr(WORDLINE,'=');
    if (ptr)
    {
        memcpy(buf,WORDLINE,ptr-WORDLINE);
        buf[ptr-WORDLINE]=0;

        if (strcmp(buf,"S")==0)
        {
            parse_S(ptr+1);
            if(error_flag>0) goto bk_error;
            else goto bk;
        }

        if (strcmp(buf,"W")==0)
        { 
            parse_W(ptr+1);
            if(error_flag>0) goto bk_error;
            else goto bk;
        }

        if (strcmp(buf,"D")==0)
        {  
            parse_D(ptr+1);
            goto bk;
        }


        if (strcmp(buf,"T")==0)          //listen mode
        {  
            if (parse(ptr+1)!=1) goto error_command;
            sbuf[0]=atoi(PARSEBUF[0]);
            DEBUG_STS=sbuf[0];
            sprintf(DIAG_INF,"T=%d\n",DEBUG_STS);
            goto bk_error;    
        }
        if (strcmp(buf,"Z")==0)
        {  
            parse_Z(ptr+1);
            if(error_flag>0) goto bk_error;
            goto bk;
        }
        if (strcmp(buf,"X")==0)
        {  
            parse_X(ptr+1);
            if(error_flag>0) goto bk_error;
            goto bk;
        }



        if (strcmp(buf,"C")==0)
        {
            if (strcmp(ptr+1,"COM1")==0)
            {
                j=compile_com(0);      			
                sprintf(DIAG_INF,CMD_C_RETRUN1,j);
                goto bk_error;				
            }

            if (strcmp(ptr+1,"COM2")==0)
            {
                j=compile_com(1);
                sprintf(DIAG_INF,CMD_C_RETRUN2,j);
                goto bk_error;				
            }

            if (strcmp(ptr+1,"COM3")==0)
            {
                j=compile_com(2);
                sprintf(DIAG_INF,CMD_C_RETRUN3,j);
                goto bk_error;				
            }

            if (strcmp(ptr+1,"COM4")==0)
            {
                j=compile_com(3);
                sprintf(DIAG_INF,CMD_C_RETRUN4,j);
                goto bk_error;				
            }
        }
    }

error_command:		
    strcpy(DIAG_INF,error_1);
    goto bk_error;			

bk:
    strcpy(DIAG_INF,error_0);	 

bk_error:
    //发送普通命令应答,字符串
    DIAG_INT_FLAG=NORMAL_ANSWER;
    READY=1;
    READY=0;  	  


    error_flag=0;  
    WORDLINE_NEWFLAG=USED;
    memset(WORDLINE,0,128);	  

    READY_WORDLINE=1;	  	  
    READY_DIAG_INF=1;

}

short parse(char *ptr)
{
    char *px,*py;
    short i;

    px=ptr;
    for (i=0;i<10;i++)
    {
        if ((py=strchr(px,' '))==0)      //strchr()用来找出px字符串中第一个出现的参数c地址
        {
            memcpy(PARSEBUF[i],px,16);
            PARSEBUF[i][16]=0;
            i++;
            return i; 			
        }
        memcpy(PARSEBUF[i],px,py-px);
        PARSEBUF[i][py-px]=0;
        px=py+1;
    }
    return i;
}

void parse_S(char *ptr)	//ptr must string (tail=0) 设置参数
{
    int x,port_number;

    if (parse(ptr)!=8)	
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);
        strcpy(DIAG_INF,error_2);
        READY_DIAG_INF=1;

        error_flag=1;

        goto bk;
    }	

    Init_SCCs_Config();

    if (strcmp(PARSEBUF[0],"COM1")==0)
    { 
        port_number=0;
    }
    else if (strcmp(PARSEBUF[0],"COM2")==0)
    {
        port_number=1;
    }
    else if (strcmp(PARSEBUF[0],"COM3")==0)
    { 
        port_number=2;
    }
    else if (strcmp(PARSEBUF[0],"COM4")==0)
    { 
        port_number=3;
    }
    else 
    {
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);
        strcpy(DIAG_INF,error_2);
        READY_DIAG_INF=1;

        error_flag=1;

        goto bk; 
    }
    {
        if (strcmp(PARSEBUF[1],"4800")==0)
            SCC_BAUD[port_number]=BAUD_4800;
        else if (strcmp(PARSEBUF[1],"9600")==0)
            SCC_BAUD[port_number]=BAUD_9600;
        else if (strcmp(PARSEBUF[1],"19200")==0)
            SCC_BAUD[port_number]=BAUD_19200;
        else if (strcmp(PARSEBUF[1],"57600")==0)
            SCC_BAUD[port_number]=BAUD_57600;
        else if (strcmp(PARSEBUF[1],"115200")==0)
            SCC_BAUD[port_number]=BAUD_115200;	
        else SCC_BAUD[port_number]=BAUD_9600;   //default

        if (strcmp(PARSEBUF[2],"N")==0)
            SCC_PARITY[port_number]=PARITY_N;
        else if (strcmp(PARSEBUF[2],"E")==0)
            SCC_PARITY[port_number]=PARITY_E;
        else if (strcmp(PARSEBUF[2],"O")==0)
            SCC_PARITY[port_number]=PARITY_O;
        else SCC_PARITY[port_number]=PARITY_N;

        x=atoi(PARSEBUF[5]);
        SCC_STNO[port_number]=x;

        if (strcmp(PARSEBUF[6],"M")==0)
            SCC_MS[port_number]=PRO_MODBUS_M;
        else if (strcmp(PARSEBUF[6],"S")==0)
            SCC_MS[port_number]=PRO_MODBUS_S;
        else if (strcmp(PARSEBUF[6],"Z")==0)
            SCC_MS[port_number]=PRO_DC;
        else if (strcmp(PARSEBUF[6],"X")==0)
            SCC_MS[port_number]=PROT_XJ;
        else 
            //SCC_MS[port_number]=PRO_MODBUS_S;        //default:modbus slaver
        {
            READY_DIAG_INF=0;
            while(READY_DIAG_INF);
            strcpy(DIAG_INF,error_2);
            READY_DIAG_INF=1;

            error_flag=1;

            goto bk; 
        }
        x=atoi(PARSEBUF[7]);
        SCC_PAUSE_TICKS[port_number]=x;           //等待时间,待处理

        memcpy(SCC_PARAM[port_number],ptr,128);

    }	
    Init_SCC1_Config();
    Init_SCC2_Config();
    Init_SCC3_Config();
    Init_SCC4_Config();

    //-----------------------------------------------------------------------------------
    //数据区起始地址及数量的可变定义
    g_HRDATA = HRDATA_BASE;
    //-----------------------------------------------------------------------------------

    Init_CPM_Interrupt();		

bk:;
}

void parse_W(char *ptr)           //建立任务 com taskid stno saddr nregs maddr tover
{
    int taskid,stno,rw,port_number;
    int saddr,nregs,maddr,tover;

    if (parse(ptr)!=8)		 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_3);

        READY_DIAG_INF=1;

        error_flag=2;

        goto bk;
    }

    taskid=atoi(PARSEBUF[1]);            
    if (taskid>=MAXTASKS) 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_3); 	
        READY_DIAG_INF=1;

        error_flag=3;

        goto bk;
    }

    stno=atoi(PARSEBUF[2]);
    if (stno>0xFF) 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_3);

        READY_DIAG_INF=1;

        error_flag=4;

        goto bk;
    }

    rw=atoi(PARSEBUF[3]);
    saddr=atoi(PARSEBUF[4]);
    nregs=atoi(PARSEBUF[5]);
    maddr=atoi(PARSEBUF[6]);
    tover=atoi(PARSEBUF[7]);

    if (strcmp(PARSEBUF[0],"COM1")==0)
    {
        port_number=0;
    }
    else if (strcmp(PARSEBUF[0],"COM2")==0)
    {
        port_number=1;
    }
    else if (strcmp(PARSEBUF[0],"COM3")==0)
    {
        port_number=2;
    }
    else if (strcmp(PARSEBUF[0],"COM4")==0)
    {
        port_number=3;
    }
    else 
    {
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_3); 
        READY_DIAG_INF=1;

        error_flag=2;

        goto bk;
    }
    {
        SCC_TASK_VALID[port_number][taskid]=1;
        SCC_TASK_STNO[port_number][taskid]=stno;
        SCC_TASK_RW[port_number][taskid]=rw;

        SCC_TASK_SAddr[port_number][taskid]=saddr;
        SCC_TASK_NRegs[port_number][taskid]=nregs;
        SCC_TASK_MAddr[port_number][taskid]=maddr;
        SCC_TASK_TOver[port_number][taskid]=tover;
    }
bk:;
}
void parse_X(char *ptr)           //xj103 临时调试命令 com stno saddr nregs maddr tover
{
    int taskid,stno,rw,port_number;
    int saddr,nregs,maddr,tover;

    if (parse(ptr)!=8)		 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_3);
        READY_DIAG_INF=1;

        error_flag=2;

        goto bk;
    }

    taskid=atoi(PARSEBUF[1]);            
    if (taskid>=MAXTASKS) 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_3); 	
        READY_DIAG_INF=1;

        error_flag=3;

        goto bk;
    }

    stno=atoi(PARSEBUF[2]);
    if (stno>0xFF) 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_3); 
        READY_DIAG_INF=1;

        error_flag=4;

        goto bk;
    }

    rw=atoi(PARSEBUF[3]);
    saddr=atoi(PARSEBUF[4]);
    nregs=atoi(PARSEBUF[5]);
    maddr=atoi(PARSEBUF[6]);
    tover=atoi(PARSEBUF[7]);

    if (strcmp(PARSEBUF[0],"COM1")==0)
    {
        port_number=0;
    }
    else if (strcmp(PARSEBUF[0],"COM2")==0)
    {
        port_number=1;
    }
    else if (strcmp(PARSEBUF[0],"COM3")==0)
    {
        port_number=2;
    }
    else if (strcmp(PARSEBUF[0],"COM4")==0)
    {
        port_number=3;
    }
    else 
    {
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_3); 	 	 	             
        READY_DIAG_INF=1;

        error_flag=2;

        goto bk;
    }
    {
        SCC_TASK_VALID[port_number][taskid]=1;
        SCC_TASK_STNO[port_number][taskid]=stno;
        SCC_TASK_RW[port_number][taskid]=rw;

        SCC_TASK_SAddr[port_number][taskid]=saddr;
        SCC_TASK_NRegs[port_number][taskid]=nregs;
        SCC_TASK_MAddr[port_number][taskid]=maddr;
        SCC_TASK_TOver[port_number][taskid]=tover;
    }
bk:;
}
void parse_Z(char *ptr)           //直流系统特殊命令	典型 Z=com1 0(taskid)0x1f(stno) 0x39(function code) 0x10(master addr) 0(return_address) 100 para1 para2 para3
{
    int taskid,stno,rw,port_number;
    int saddr,maddr,raddr,tover,para1,para2,para3;
    if (parse(ptr)!=10)		 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_4); 	 	 	             
        READY_DIAG_INF=1;

        error_flag=2;

        goto bk;
    }
    taskid=atoi(PARSEBUF[1]);            
    if (taskid>=MAXTASKS) 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_4); 	 	 	             
        READY_DIAG_INF=1;

        error_flag=3;

        goto bk;
    }
    stno=atoi(PARSEBUF[2]);//从站编号
    if (stno>0xFF) 
    {	 
        READY_DIAG_INF=0;
        while(READY_DIAG_INF);		
        strcpy(DIAG_INF,error_4); 	 	 	             
        READY_DIAG_INF=1;

        error_flag=4;

        goto bk;
    }

    rw=atoi(PARSEBUF[3]);//function code: refers to read/write
    maddr=atoi(PARSEBUF[4]);
    raddr=atoi(PARSEBUF[5]);
    tover=atoi(PARSEBUF[6]); 
    para1=atoi(PARSEBUF[7]);
    para2=atoi(PARSEBUF[8]);
    para3=atoi(PARSEBUF[9]);
    if (strcmp(PARSEBUF[0],"COM1")==0)
    {
        port_number=0;

    }
    if (strcmp(PARSEBUF[0],"COM2")==0)
    {
        port_number=1;

    }
    if (strcmp(PARSEBUF[0],"COM3")==0)
    {	
        port_number=2;

    }
    if (strcmp(PARSEBUF[0],"COM4")==0)
    {
        port_number=3;

    }
    SCC_TASK_VALID[port_number][taskid]=1;
    SCC_TASK_STNO[port_number][taskid]=stno;
    SCC_TASK_RW[port_number][taskid]=rw;		
    SCC_TASK_MAddr[port_number][taskid]=maddr;
    SCC_TASK_RAddr[port_number][taskid]=raddr;
    SCC_TASK_TOver[port_number][taskid]=tover;
    SCC_TASK_PARA1[port_number][taskid]=para1;
    SCC_TASK_PARA2[port_number][taskid]=para2;
    SCC_TASK_PARA3[port_number][taskid]=para3;
bk:;
}

void parse_D(char *ptr)          //删除任务, old:只能删除COMx下的全部任务
{
    unsigned short stask,ntasks,j;
    short i;

    i=parse(ptr);

    if (i==1)	
    {
        if (strcmp(PARSEBUF[0],"COM1")==0)
            for (j=0;j<MAXTASKS;j++) SCC_TASK_VALID[0][j]=0;

        if (strcmp(PARSEBUF[0],"COM2")==0)
            for (j=0;j<MAXTASKS;j++) SCC_TASK_VALID[1][j]=0;

        if (strcmp(PARSEBUF[0],"COM3")==0)
            for (j=0;j<MAXTASKS;j++) SCC_TASK_VALID[2][j]=0;

        if (strcmp(PARSEBUF[0],"COM4")==0)
            for (j=0;j<MAXTASKS;j++) SCC_TASK_VALID[3][j]=0;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -