📄 9311cfg.c
字号:
/*------------------------------------------------------------------*/
/*模块名称:9311cfg.c */
/*模块功能:读取参数文件并进行相关初始化 */
/*编写日期:2004年12月 */
/*编写者: dingding */
/*------------------------------------------------------------------*/
#include "includes.h"
//全局变量
struct SysConfig SysCfg;
struct MyConfig MyCfg;
struct YCPara_t YCPara;
struct PortAppInfo PortInfo[2];
struct SysPort *SysPorts;
struct DBConfig *DBCfgs;
struct DBInitInfo *DBInfos;
void *MsgQ[MAXCOMMMSG];
extern struct AbsTime_t pAbsTime;
extern BOOL TGSH;
extern INT8U PORTCFG;
extern INT16U FDNum, ResetDelay;
#ifndef BOOT_PROG
#define FAC_OVERD 0x01 //过流检测
#define FAC_SHORTD 0x02 //短路检测
#define FAC_OVER_TRIP 0x20 //过流(短路)跳闸
#define FAC_RECLOSE 0x80 //一次重合闸
#endif
/*------------------------------------------------------------------*/
/*函数名称:InitSys(void) */
/*函数功能:系统初始化,读入参数文件,初始化相关硬件 */
/*------------------------------------------------------------------*/
void InitSys(void)
{
BOOL dd, boot=FALSE;
INT16U rc, i;
INT8U *pTmpBuf;
char err[60];
struct SysTime_t SystemTime;
memset (&SysCfg, 0, sizeof (struct SysConfig));
memset (&MyCfg, 0, sizeof (struct MyConfig));
memset (&YCPara, 0, sizeof (struct YCPara_t));
memset (PortInfo, 0, 2 * sizeof (struct PortAppInfo));
memset((INT8U*)&pAbsTime, 0, (sizeof (struct AbsTime_t)));
SysSchedul();
SetCFG(FLASH_BASE);
#ifdef BOOT_PROG
boot = Test();
#endif
NVRAMInit();
//时钟初始化
GetX1226Time();
GetTime((void *)&SystemTime, SYSTIME);
sprintf(err, "%04d-%02d-%02d %02d:%02d:%02d:%03d ******系统重新启动******", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond);
ErrorInfo(ROOTID, err);
//注意添加的字符总共不要超过10个
strcpy(err, VERSIONNO);
#ifdef FUNCTION_CN
strcat(err, " CN");
#endif
ErrorInfo(ROOTID, err);
if ((pTmpBuf = (INT8U*)malloc(sizeof(INT8U)*MAXFILELEN)) == NULL)
{
ErrorInfo(ROOTID, "空间不够,无法读取文件");
return;
}
//读取ycpara.sys
SysCfg.DefPara = FALSE;
GetYcPara(YCPARAINIT);
SysSchedul();
if (!boot)
rc = ReadParaFile("devices.dat", pTmpBuf, MAXFILELEN, TRUE);
if ((rc == FOPERROR) || boot)
{
SetDefBase();
SysCfg.DefPara = TRUE;
}
else
GetDevice(pTmpBuf);
if (!SysCfg.DefPara)
{
for (i=0; i<SysCfg.DBAllNum; i++)
{
dd = GetRealBase(i, pTmpBuf);
if (!dd)
{
SetDefBase();
break;
}
}
for (i=0; i<SysCfg.DBAllNum; i++)
{
dd = GetLogicBase(i, pTmpBuf);
if (!dd)
{
SetDefBase();
break;
}
}
}
SysSchedul();
if (!boot)
rc = ReadParaFile("myconfig.dat", pTmpBuf, MAXFILELEN, TRUE);
if ((rc == FOPERROR) || boot)
{
SetDefMyConfig();
SysCfg.DefPara = TRUE;
}
else
GetMyConfig(pTmpBuf);
#ifndef BOOT_PROG
if (MyCfg.FDNum)
{
for (i=0;i<MyCfg.FDNum;i++)
if (MyCfg.Fd[i].Control & FAULTD_ENABLE)
GetDzfd(i, pTmpBuf);
}
#endif
if (!boot)
rc = ReadParaFile("ports.dat", pTmpBuf, MAXFILELEN, FALSE);
if ((rc == FOPERROR) || boot)
SetDefPort();
else
GetPorts(pTmpBuf);
DBInit();
SysSchedul();
if (SysCfg.DefPara)
ErrorInfo(ROOTID, "注意:系统使用默认参数!");
ErrorInfo(ROOTID, "系统开始运行...");
free (pTmpBuf);
}
/*------------------------------------------------------------------*/
/*函数名称:ReadParaFile() */
/*函数功能:读取参数文件(最大64K) */
/*------------------------------------------------------------------*/
INT16U ReadParaFile(char *Name, INT8U *pBuf, INT32U Len, BOOL Flag)
{
INT16U rc;
char err[60] = "";
struct FileInfo pFile;
memcpy ((INT8U*)pFile.Name, Name, MAXFILENAMELEN);
rc = FRead(pBuf, 0x8000, Len, &pFile);
if (!Flag)
return (rc);
if (rc == FOPERROR)
{
strcpy (err, Name);
strcat (err, " 文件读取失败...");
ErrorInfo(ROOTID, err);
}
return (rc);
}
/*------------------------------------------------------------------*/
/*函数名称:GetDevice() */
/*函数功能:读取设备文件,创建数据库索引 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
void GetDevice(INT8U* pTmpBuf)
{
INT8U err;
INT16U i, j, k, size, num, dd, cur;
struct FILEHEADER_t *filehead;
struct PDevConf_t *pdevice;
INT16U ports[PORTMAXNUM];
num = 0;
filehead = (struct FILEHEADER_t*)pTmpBuf;
pdevice = (struct PDevConf_t*)(filehead + 1);
i = filehead->Size - filehead->Headsize;
size = sizeof (struct PDevConf_t);
num = (INT16U)(i / size);
SysCfg.DBAllNum = num;
ports[0] = SELFPORT;
num = 1;
for (i=0; i<SysCfg.DBAllNum; i++)
{
for (j=0; j<num; j++)
if (pdevice[i].Port[0].PortID == ports[j])
break;
if (j == num)
{
ports[num] = pdevice[i].Port[0].PortID;
num++;
}
}
SysCfg.PortNum = num;
size = sizeof (struct SysPort);
SysPorts = (struct SysPort*)malloc(num * size);
size = sizeof (struct DBConfig);
DBCfgs = (struct DBConfig*)malloc(SysCfg.DBAllNum * size);
size = sizeof (struct DBInitInfo);
DBInfos = (struct DBInitInfo*)malloc(SysCfg.DBAllNum * size);
if (!(SysPorts && DBCfgs && DBInfos))
{
ErrorInfo(ROOTID, "创建数据库失败152");
return; //chongqi?
}
else
{
memset (SysPorts, 0, num * sizeof (struct SysPort));
memset (DBCfgs, 0, SysCfg.DBAllNum * sizeof (struct DBConfig));
memset (DBInfos, 0, SysCfg.DBAllNum * sizeof (struct DBInitInfo));
}
for (i=0; i<SysCfg.DBAllNum; i++)
{
DBCfgs[i].Info.Real.LogDevID[0] = DEFINDEXNO;
DBCfgs[i].Info.Real.LogDevID[1] = DEFINDEXNO;
}
SysPorts[0].PortID = SELFPORT; //固定
num = 1;
for (i=0; i<SysCfg.DBAllNum; i++)
{
for (j=0; j<num; j++)
if (pdevice[i].Port[0].PortID == SysPorts[j].PortID)
break;
if (j == num)
{
SysPorts[num].PortID = pdevice[i].Port[0].PortID;
num++;
}
}
dd = (MAXCOMMMSG) / SysCfg.DBAllNum;
if (dd < 5)
{
ErrorInfo(ROOTID, "警告:系统所带的设备太多");
}
cur = 0;
for (j=0, k=0; j<num; j++)
{
for (i=0; i<SysCfg.DBAllNum; i++)
if (pdevice[i].Port[0].PortID == SysPorts[j].PortID)
{
SysPorts[j].DevNum++;
DBCfgs[k].DevID = k;
DBInfos[k].DevID = k;
DBInfos[k].PortID = pdevice[i].Port[0].PortID;
DBInfos[k].Name = pdevice[i].Name;
strcpy (DBInfos[k].ParaName, pdevice[i].ParaName);
k++;
}
if (j == 0)
{
size = 0;
SysPorts[j].DBCfgs = &DBCfgs[0];
SysPorts[j].DevNum = SysCfg.DBAllNum;
SysPorts[j].Event = OSFlagCreate(0x00, &err);
if (err != OS_NO_ERR)
ErrorInfo(OSPrioCur, "数据库发送失败260");
SysPorts[j].CommQ = OSQCreate(&MsgQ[cur], dd);
cur = dd;
}
else
{
if (j == 1)
size = 1;
else
size += SysPorts[j-1].DevNum;
SysPorts[j].DBCfgs = &DBCfgs[size];
if (SysPorts[j].DevNum)
{
SysPorts[j].Event = OSFlagCreate(0x00, &err);
if (err != OS_NO_ERR)
ErrorInfo(OSPrioCur, "数据库发送失败260");
SysPorts[j].CommQ = OSQCreate(&MsgQ[cur], dd*SysPorts[j].DevNum);
cur += dd*SysPorts[j].DevNum;
}
}
}
}
/*------------------------------------------------------------------*/
/*函数名称:GetMyConfig() */
/*函数功能:获取参数配置文件 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
void GetMyConfig(INT8U* pTmpBuf)
{
INT16U i;
struct FILEHEADER_t *filehead;
struct pconfig_t *pconfig;
struct ppt_t *ppt;
struct pfeeder_t *pfeeder;
struct pai_t *pai;
struct pbi_t *pbi;
struct pbo_t *pbo;
struct pyc_t *pyc;
struct pyx_t *pyx;
struct pdd_t *pdd;
filehead = (struct FILEHEADER_t *)pTmpBuf;
pconfig = (struct pconfig_t *)(filehead + 1);
ppt = (struct ppt_t *)(pconfig + 1);
pfeeder = (struct pfeeder_t *)(ppt + pconfig->ptnum);
pai = (struct pai_t *)(pfeeder + pconfig->feedernum);
pbi = (struct pbi_t *)(pai + pconfig->ainum);
pbo = (struct pbo_t *)(pbi + pconfig->binum);
pyc = (struct pyc_t *)(pbo + pconfig->bonum);
pyx = (struct pyx_t *)(pyc + pconfig->ycnum);
pdd = (struct pdd_t *)(pyx + pconfig->yxnum);
if (pconfig->control & CFGTGSH)
{
if (!TGSH)
SetDefMyConfig();
}
else
{
if (TGSH)
SetDefMyConfig();
}
MyCfg.Addr = pconfig->addr;
MyCfg.Yxcyc = pconfig->yxcyc;
MyCfg.AINum = pconfig->ycnum;
MyCfg.BINum = pconfig->binum;
MyCfg.BONum = pconfig->bonum;
MyCfg.FDNum = pconfig->feedernum;
MyCfg.lan1 = pconfig->lan1;
MyCfg.lan1_ip = pconfig->lan1_ip;
MyCfg.lan1_subnet_mask = pconfig->lan1_subnet_mask;
MyCfg.lan2 = pconfig->lan2;
MyCfg.lan2_ip = pconfig->lan2_ip;
MyCfg.lan2_subnet_mask = pconfig->lan2_subnet_mask;
MyCfg.def_gtwy_ip = pconfig->def_gtwy_ip;
if (MyCfg.Yxcyc == 0)
MyCfg.Yxcyc = 2;
else if (MyCfg.Yxcyc > 10)
MyCfg.Yxcyc = 10;
MyCfg.Ai = malloc (MyCfg.AINum * sizeof(struct AICfg_t));
MyCfg.Bi = malloc (MyCfg.BINum * sizeof(struct BICfg_t));
MyCfg.Bo = malloc (MyCfg.BONum * sizeof(struct BOCfg_t));
MyCfg.Fd = malloc (MyCfg.FDNum * sizeof(struct FDCfg_t));
if (!(MyCfg.Ai && MyCfg.Bi && MyCfg.Bo && MyCfg.Fd))
{
ErrorInfo(ROOTID, "创建参数设置失败");
return;
}
else
{
memset (MyCfg.Ai, 0, MyCfg.AINum * sizeof(struct AICfg_t));
memset (MyCfg.Bi, 0, MyCfg.BINum * sizeof(struct BICfg_t));
memset (MyCfg.Bo, 0, MyCfg.BONum * sizeof(struct BOCfg_t));
memset (MyCfg.Fd, 0, MyCfg.FDNum * sizeof(struct FDCfg_t));
}
if (MyCfg.AINum)
{
for (i=0; i<MyCfg.AINum; i++)
{
MyCfg.Ai[i].Xs1 = pyc[i].xs1;
MyCfg.Ai[i].Xs2 = pyc[i].xs2;
MyCfg.Ai[i].ToZero = pyc[i].tozero;
MyCfg.Ai[i].Flag = pyc[i].yxjc;
MyCfg.Ai[i].UpperLimitYxNo = pyc[i].sxyx;
MyCfg.Ai[i].UnderLimitYxNo = pyc[i].xxyx;
MyCfg.Ai[i].UpperLimit = pyc[i].sx;
MyCfg.Ai[i].UnderLimit = pyc[i].xx;
}
}
else
MyCfg.Ai = NULL;
if (MyCfg.BINum)
{
for (i=0; i<MyCfg.BINum; i++)
{
MyCfg.Bi[i].Mode = pbi[i].mode;
MyCfg.Bi[i].DTime = pbi[i].time;
}
}
else
MyCfg.Bi = NULL;
if (MyCfg.BONum)
{
for (i=0; i<MyCfg.BONum; i++)
{
MyCfg.Bo[i].ArmTime = pbo[i].armtime;
MyCfg.Bo[i].OnTime = pbo[i].ontime;
}
}
else
MyCfg.Bo = NULL;
if (MyCfg.FDNum)
{
for (i=0; i<MyCfg.FDNum; i++)
{
strcpy ((char*)MyCfg.Fd[i].DZname, (char*)pfeeder[i].s_f_name);
MyCfg.Fd[i].Control = pfeeder[i].control;
MyCfg.Fd[i].Yxzt = pfeeder[i].kgzt1;
MyCfg.Fd[i].Yxzt2 = pfeeder[i].kgzt2;
MyCfg.Fd[i].Yxcn = pfeeder[i].kgcn;
MyCfg.Fd[i].FaultBI = pfeeder[i].faultbi;
MyCfg.Fd[i].YkH = pfeeder[i].hzjdq;
MyCfg.Fd[i].YkF = pfeeder[i].fzjdq;
MyCfg.Fd[i].FdrFlag = pfeeder[i].FdrFlag;
MyCfg.Fd[i].FdrTime = pfeeder[i].FdrTime;
}
}
else
MyCfg.Fd = NULL;
}
/*------------------------------------------------------------------*/
/*函数名称:GetPorts() */
/*函数功能:读取端口配置文件 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
void GetPorts(INT8U* pTmpBuf)
{
INT16U i, size, num;
struct FILEHEADER_t *filehead;
struct PortAttri_t *port;
filehead = (struct FILEHEADER_t*)pTmpBuf;
port = (struct PortAttri_t*)(filehead + 1);
i = filehead->Size - filehead->Headsize;
size = sizeof (struct PortAttri_t);
num = (INT16U)(i / size);
for (i=1; i<=num; i++)
{
if (port[num-i].DriverID == 0)
continue;
InitPort(&port[num-i]);
GetPad(&port[num-i], (pTmpBuf + 1024));
}
SetDefPort();
}
/*------------------------------------------------------------------*/
/*函数名称:GetPad() */
/*函数功能:读取端口相关的规约面板参数 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
void GetPad(struct PortAttri_t* Port, INT8U* pTmpBuf)
{
INT16U i, num, rc;
char file[60];
struct FILEHEADER_t *filehead;
num = Port->PortID;
if (num < 41)
i = num;
else
i = num - 40;
sprintf(file,"c%04d.dat", num);
rc = ReadParaFile(file, pTmpBuf, MAXFILELEN, FALSE);
if (rc == FOPERROR)
{
PortInfo[i-1].pPad = NULL;
return ;
}
filehead = (struct FILEHEADER_t *)pTmpBuf;
switch (PortInfo[i-1].Attr)
{
case DNPSEC:
num = sizeof (struct PSecDnpPad);
PortInfo[i-1].pPad = malloc (num);
break;
case DNPPRI:
num = sizeof (struct PPriDnpPad);
PortInfo[i-1].pPad = malloc (num);
break;
case IEC101_1997SEC:
num = sizeof (struct PSec101Pad);
PortInfo[i-1].pPad = malloc (num);
break;
case IEC101_1997PRI:
num = sizeof (struct PPri101Pad);
PortInfo[i-1].pPad = malloc (num);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -