📄 console.c.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 + -