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

📄 rtuconf.cpp

📁 一个完整的RTU程序源码,用DOS平台,支持16串口,在天津港用的很多,8个规约103,modbus,cdt,1801,u4f
💻 CPP
字号:
#include "sc_cfg.h"
#include "common.h"
#include "extern.h"

#define TYPE         "TYPE"
#define AD_BASE      "AD_BASE"
#define DIO1_BASE    "DIO1_BASE"
#define DIO2_BASE    "DIO2_BASE"
#define SIO1_BASE    "SIO1_BASE"
#define SIO2_BASE    "SIO2_BASE"
#define SIO1_TOTAL   "SIO1_TOTAL"
#define SIO2_TOTAL   "SIO2_TOTAL"
#define SIO1_INT     "SIO1_INT"
#define SIO2_INT     "SIO2_INT"
#define SETCOM       "SET_COM"
#define PROTOCOM     "PROTOCOL_COM"
#define CHK_TM_PORT  "CHECK_TIME_PORT"
#define DO_YK_PORT   "DO_YK_PORT"
#define YK_ESC_TM    "YK_ESCAPE_TIME"
#define BD_YX        "BOARD_YX"
#define BD_YC        "BOARD_YC"
#define BD_YM        "BOARD_YM"
#define BD_YK        "BOARD_YK"
#define SUM_YX       "TOTAL_YX"
#define SUM_YC			 "TOTAL_YC"
#define SUM_YM			 "TOTAL_YM"
#define SUM_YK			 "TOTAL_YK"

#define is_it(x) if (!strcmp(name,x))
#define is_it_n(x,y) if (!strncmp(name,x,y))

PortSet_t  PortSet[MAX_PORT];
INT8U ProtocolSet[MAX_PORT][PROTOCOL_SET_SIZE];

YxDefine_t far YxDefine[MAX_YX_LIMIT];
YcDefine_t far YcDefine[MAX_YC_LIMIT];
YmDefine_t far YmDefine[MAX_YM_LIMIT];
YkDefine_t far YkDefine[MAX_YK_LIMIT];

INT8U plattype;
INT16U _adbase;
INT16U _dio1base;
INT16U _dio2base;
INT16U _sio1base;
INT16U _sio2base;
INT8U _sio1total;
INT8U _sio2total;
INT8U _sio1int;
INT8U _sio2int;
INT8U _CheckTimePort;
INT8U _DoYkPort;
INT8U _YkEscapeTime;

INT16U _TotalBDYx;
INT16U _TotalBDYc;
INT16U _TotalBDYm;
INT16U _TotalBDYk;

INT16U _TotalYx;
INT16U _TotalYc;
INT16U _TotalYm;
INT16U _TotalYk;

void LoadConfig(void);

static void LoadYxConfig(void);
static void LoadYcConfig(void);
static void LoadYmConfig(void);
static void LoadYkConfig(void);
static void LoadRTUConfig(void);

static void TranslateSingle(FILE *fp);
static void TranslateYx(FILE *fp, YxDefine_t *matrix);
static void TranslateYc(FILE *fp, YcDefine_t *matrix);
static void TranslateYm(FILE *fp, YmDefine_t *matrix);
static void TranslateYk(FILE *fp, YkDefine_t *matrix);
static void set_values(char *name, char *value, int ncount);

PortSet_t *GetPortSet(INT8U portno)
{
	if (portno >= MAX_PORT) ErrorExit("get portno exceed limit");
	return (&PortSet[portno]);
}

INT16U GetTotalYxNum()
{
	return _TotalYx;
}

INT16U GetTotalYcNum()
{
	return _TotalYc;
}

INT16U GetTotalYmNum()
{
	return _TotalYm;
}

INT16U GetTotalYkNum()
{
	return _TotalYk;
}

YxDefine_t *GetYxDefine(int index)
{
	if (index >= MAX_YX_LIMIT) ErrorExit("get yx define exceed limit");
	return &(YxDefine[index]);
}

YcDefine_t *GetYcDefine(int index)
{
  if (index >= MAX_YC_LIMIT) ErrorExit("get yc define exceed limit");
	return &(YcDefine[index]);
}

YmDefine_t *GetYmDefine(int index)
{
	if (index >= MAX_YM_LIMIT) ErrorExit("get ym define exceed limit");
	return &(YmDefine[index]);
}

YkDefine_t *GetYkDefine(int index)
{
	if (index >= MAX_YK_LIMIT) ErrorExit("get yk define exceed limit");
	return &(YkDefine[index]);
}

INT8U GetProtocolSet(INT8U portno, int index)
{
	if (portno >= MAX_PORT || index >= PROTOCOL_SET_SIZE)
		ErrorExit("get protocol set exceed limit");
	return ProtocolSet[portno][index];
}

static void set_values(char *name, char *value, int ncount)
{
	int portno;

	strupr(name);
	is_it(TYPE) plattype = atoi(value);
	else is_it(AD_BASE) sscanf(value, "%x", &_adbase);
	else is_it(DIO1_BASE) sscanf(value, "%x", &_dio1base);
	else is_it(DIO2_BASE) sscanf(value, "%x", &_dio2base);
	else is_it(SIO1_BASE) sscanf(value, "%x", &_sio1base);
	else is_it(SIO2_BASE) sscanf(value, "%x", &_sio2base);
	else is_it(SIO1_TOTAL) _sio1total = atoi(value);
	else is_it(SIO2_TOTAL) _sio2total = atoi(value);
	else is_it(SIO1_INT)
		_sio1int = atoi(value);
	else is_it(SIO2_INT)
		_sio2int = atoi(value);
	else is_it(CHK_TM_PORT) _CheckTimePort = atoi(value);
	else is_it(DO_YK_PORT) _DoYkPort = atoi(value);
	else is_it(YK_ESC_TM) _YkEscapeTime = atoi(value);
	else is_it(BD_YX) _TotalBDYx = atoi(value);
	else is_it(BD_YC) _TotalBDYc = atoi(value);
	else is_it(BD_YM) _TotalBDYm = atoi(value);
	else is_it(BD_YK) _TotalBDYk = atoi(value);
	else is_it(SUM_YX) _TotalYx = atoi(value);
	else is_it(SUM_YC) _TotalYc = atoi(value);
	else is_it(SUM_YM) _TotalYm = atoi(value);
	else is_it(SUM_YK) _TotalYk = atoi(value);
	else is_it_n(SETCOM, 7) {
		portno = atoi(&name[7]) - 1;
		if (portno < 0 || portno >= MAX_PORT) {
			ErrorExit("port is unknown");
		}
		switch (ncount) {
			case 0:
				PortSet[portno].Baud = atoi(value); break;
			case 1:
				PortSet[portno].DataBit = atoi(value); break;
			case 2:
				PortSet[portno].StopBit = atoi(value); break;
			case 3:
				PortSet[portno].Parity = atoi(value); break;
			case 4:
				PortSet[portno].isWork = atoi(value); break;
			case 5:
				PortSet[portno].Protocol = atoi(value); break;
			case 6:
				PortSet[portno].DevStartAddr = atoi(value); break;
			case 7:
				PortSet[portno].DevEndAddr = atoi(value); break;
		}
	}
	else is_it_n(PROTOCOM, 12) {
		portno = atoi(&name[12]) - 1;
		if (portno < 0 || portno >= MAX_PORT) {
			ErrorExit("port is unknown");
		}
		if (ncount >= PROTOCOL_SET_SIZE) {
			ErrorExit("protocol set too much item");
		}
		ProtocolSet[portno][ncount] = atoi(value);
	}
}

static void TranslateSingle(FILE *fp)
{
	char name[40];
	char value[80], ch[2];
	int mode, ncount;

	*name = *value = mode = ch[1] = ncount = 0;

	while (fread(ch, 1, 1, fp) == 1) {
		switch (*ch) {
			case ' ':
			case '\t':
				break;
			case '=':
				if (!mode) mode = 1;
				break;
			case '\"':
			case '#':
			case ';':
				mode = 2;
				break;
			case ',':
				if (*name && *value)
					set_values(name, value, ncount);
				*value = 0;
				ncount++;
				break;
			case '\n':
			case '\r':
				if (*name && *value)
					set_values(name, value, ncount);
				*name = *value = mode = ncount = 0;
				break;
			default:
				switch (mode) {
					case 0 :
						strcat(name, ch);
						break;
					case 1 :
						strcat(value, ch);
						break;
				}
				break;
		}
	}
}

static void TranslateYx(FILE *fp, YxDefine_t *matrix)
{
	char value[80], ch[2];
	int mode, sequence;

	*value = mode = ch[1] = 0;

	while (fread(ch, 1, 1, fp) == 1) {
		switch (*ch) {
			case ' ':
			case '\t':
				break;
			case '\"':
			case '#':
			case ';':
				mode = 2; /* commerce */
				break;
			case '\n':
			case '\r':
				if (mode == 0) {
					sequence = atoi(value);
					if (sequence < MAX_YX_LIMIT) {
						sscanf(value, "%*u,%u,%u,%u,%u,%u,%u", &matrix[sequence].portno,	&matrix[sequence].devno,
							&matrix[sequence].type, &matrix[sequence].info, &matrix[sequence].reset,&matrix[sequence].channel);
						if (matrix[sequence].reset) matrix[sequence].reset = TRUE;
						else matrix[sequence].reset = FALSE;
					}
				}
				*value = mode = 0;
				break;
			default:
				if (mode == 0) strcat(value, ch);
				break;
		}
	}
}

static void TranslateYc(FILE *fp, YcDefine_t *matrix)
{
	char value[80], ch[2];
	int mode, sequence;

	*value = mode = ch[1] = 0;

	while (fread(ch, 1, 1, fp) == 1) {
		switch (*ch) {
			case ' ':
			case '\t':
				break;
			case '\"':
			case '#':
			case ';':
				mode = 2; /* commerce */
				break;
			case '\n':
			case '\r':
				if (mode == 0) {
					sequence = atoi(value);
					if (sequence < MAX_YC_LIMIT) {
						sscanf(value, "%*u,%u,%u,%u,%u,%u", &matrix[sequence].portno,	&matrix[sequence].devno,
							&matrix[sequence].type, &matrix[sequence].info, &matrix[sequence].order);
					}
				}
				*value = mode = 0;
				break;
			default:
				if (mode == 0) strcat(value, ch);
				break;
		}
	}
}

static void TranslateYm(FILE *fp, YmDefine_t *matrix)
{
	char value[80], ch[2];
	int mode, sequence;

	*value = mode = ch[1] = 0;

	while (fread(ch, 1, 1, fp) == 1) {
		switch (*ch) {
			case ' ':
			case '\t':
				break;
			case '\"':
			case '#':
			case ';':
				mode = 2; /* commerce */
				break;
			case '\n':
			case '\r':
				if (mode == 0) {
					sequence = atoi(value);
					if (sequence < MAX_YM_LIMIT) {
						sscanf(value, "%*u,%u,%u,%u,%u,%u", &matrix[sequence].portno,	&matrix[sequence].devno,
							&matrix[sequence].type, &matrix[sequence].info, &matrix[sequence].datalen);
					}
				}
				*value = mode = 0;
				break;
			default:
				if (mode == 0) strcat(value, ch);
				break;
		}
	}
}

static void TranslateYk(FILE *fp, YkDefine_t *matrix)
{
	char value[80], ch[2];
	int mode, sequence;

	*value = mode = ch[1] = 0;

	while (fread(ch, 1, 1, fp) == 1) {
		switch (*ch) {
			case ' ':
			case '\t':
				break;
			case '\"':
			case '#':
			case ';':
				mode = 2; /* commerce */
				break;
			case '\n':
			case '\r':
				if (mode == 0) {
					sequence = atoi(value);
					if (sequence < MAX_YK_LIMIT) {
						sscanf(value, "%*u,%u,%u,%u,%u", &matrix[sequence].portno,
							&matrix[sequence].devno, &matrix[sequence].type, &matrix[sequence].info);
					}
				}
				*value = mode = 0;
				break;
			default:
				if (mode == 0) strcat(value, ch);
				break;
		}
	}
}

void LoadConfig(void)
{
	LoadRTUConfig();
	LoadYxConfig();
	LoadYcConfig();
	LoadYmConfig();
	LoadYkConfig();
}

static void LoadRTUConfig(void)
{
	FILE *fp;

	if ((fp = fopen("rtuset.cfg", "rt")) == NULL) {
		ErrorExit("can't open rtuset.cfg");
	}
	TranslateSingle(fp);
	fclose(fp);
}


static void LoadYxConfig(void)
{
	FILE *fp;

	if ((fp = fopen("yxtable.cfg", "rt")) == NULL) {
		ErrorExit("can't open yxtable.cfg");
	}
	TranslateYx(fp, YxDefine);
	fclose(fp);
}

static void LoadYcConfig(void)
{
	FILE *fp;

	if ((fp = fopen("yctable.cfg", "rt")) == NULL) {
		ErrorExit("can't open yctable.cfg");
	}
	TranslateYc(fp, YcDefine);
	fclose(fp);
}

static void LoadYmConfig(void)
{
	FILE *fp;

	if ((fp = fopen("ymtable.cfg", "rt")) == NULL) {
		ErrorExit("can't open ymtable.cfg");
	}
	TranslateYm(fp, YmDefine);
	fclose(fp);
}

static void LoadYkConfig(void)
{
	FILE *fp;

	if ((fp = fopen("yktable.cfg", "rt")) == NULL) {
		ErrorExit("can't open yktable.cfg");
	}
	TranslateYk(fp, YkDefine);
	fclose(fp);
}

⌨️ 快捷键说明

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