📄 9311db.c
字号:
return;
}
len2 = (pInfo->Num & 0xFF) * ADBIT + (pInfo->Num >>8);
if (info.Length*2 >= LBBLOCK)
{
len1 = 0;
}
else if ((info.Length + len2)*2 > LBBLOCK)
{
len1 = LBBLOCK/2 - info.Length;
len2 -= len1;
}
else
{
len1 = len2;
len2 = 0;
}
if ((limit == 0) || (info.Length + len2) >= LB2LIMIT) //使用区限制
{
len2 = 0;
}
if (len1)
{
for (i=0; i<ADNUM; i++)
{
wp = LBADDR + LBFDBLOCK*((pInfo->SuperID*limit) + cur) + LBBLOCK*i + info.Length*2;
for (j=0; j<len1*2; j++)
{
*(wp + j) = *(pData + i*(len1+len2)*2 + j);
}
}
}
if (len2)
{
for (i=0; i<ADNUM; i++)
{
wp = LBADDR2 + LB2LIMIT*i + (info.Length+len1)*2 - LBBLOCK;
for (j=0; j<len2*2; j++)
{
*(wp + j) = *(pData + i*(len1+len2)*2 + len1*2 + j);
}
}
}
info.Length += len1 + len2;
*wtmp = cur;
*(wtmp + cur + 1) = 0x3F;
if ((info.Length*2 > LBBLOCK) || (limit == 0))
{
wtmp = LBMANAG2ADDR;
*wtmp = cur + (INT8U)(info.FDIndex<<4);
}
wp = LBINFOADDR + ((pInfo->SuperID*limit) + cur) * LBINFOSIZE;
for (i=0; i<size; i++)
{
*(wp + i) = *((INT8U*)&info + i);
}
}
/*------------------------------------------------------------------*/
/*函数名称:DBRead() */
/*函数功能:数据库读操作 */
/*输入说明:pData:数据指针 */
/* pInfo:数据信息 */
/*------------------------------------------------------------------*/
BOOL DBRead(INT8U *pData, struct DBInfo *pInfo)
{
BOOL rc;
volatile INT8U *rp;
INT16U *pb;
INT16U i, j, size, num, tmp, oldID;
oldID = OSPrioCur;
OSTaskChangePrio(OSPrioCur, HID);
switch (pInfo->Type)
{
case YCDOTDATA:
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
break;
case YCDATA:
if (pInfo->Start >= DBCfgs[pInfo->DevID].YCNum)
{
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
}
pb = (INT16U*)GetDBAddr(pInfo->DevID, YCDATA, FALSE);
tmp = pInfo->Num;
if (pInfo->Start + tmp > DBCfgs[pInfo->DevID].YCNum)
tmp = DBCfgs[pInfo->DevID].YCNum - pInfo->Start;
pInfo->Num = tmp; //realnum
if (DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2) //log2
{
if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC) //log1
{
tmp = tmp * sizeof(INT16S);
memcpy (pData, &pb[pInfo->Start], tmp);
}
else
{
j = 0;
for (i=0; i<DBCfgs[pInfo->DevID].YCNum; i++)
{
if (j == pInfo->Num)
break;
if (DBCfgs[pInfo->DevID].Info.Real.pAI[i].Control & FCFGYCSEND)
{
memcpy (&pData[2*j], &pb[i], sizeof(INT16S));
j++;
}
}
if (j == 0)
{
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
}
pInfo->Num = j;
}
}
else
{
tmp = tmp * sizeof(INT16S);
memcpy (pData, &pb[pInfo->Start], tmp);
}
break;
case YXDOTDATA:
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
break;
case YXDATA:
if (pInfo->Start >= DBCfgs[pInfo->DevID].YXNum)
{
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
}
rp = (volatile INT8U*)GetDBAddr(pInfo->DevID, YXDATA, TRUE);
num = pInfo->Start + pInfo->Num;
if (num > DBCfgs[pInfo->DevID].YXNum)
num = DBCfgs[pInfo->DevID].YXNum;
pInfo->Num = num; //realnum
if (DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2) //log2
{
if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC) //log1
{
for (i=pInfo->Start; i<num; i++)
pData[i - pInfo->Start] = *(rp + i);
}
else
{
j = 0;
for (i=0; i<DBCfgs[pInfo->DevID].YXNum; i++)
{
if (j == pInfo->Num)
break;
if (DBCfgs[pInfo->DevID].Info.Real.pBI[i].Control & FCFGBISEND)
{
pData[j] = *(rp + i);
j++;
}
}
if (j == 0)
{
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
}
pInfo->Num = j;
}
}
else
{
for (i=pInfo->Start; i<num; i++)
pData[i - pInfo->Start] = *(rp + i);
}
break;
case SOEDATA:
rc = DBReadSOE(pData, pInfo);
OSTaskChangePrio(OSPrioCur, oldID);
return (rc);
break;
case COSDATA:
rc = DBReadCOS(pData, pInfo);
OSTaskChangePrio(OSPrioCur, oldID);
return (rc);
break;
case DDDATA:
rp = (volatile INT8U*)GetDBAddr(pInfo->DevID, DDDATA, TRUE);
tmp = pInfo->Num;
if (pInfo->Start + tmp > DBCfgs[pInfo->DevID].DDNum)
tmp = DBCfgs[pInfo->DevID].DDNum - pInfo->Start;
pInfo->Num = tmp; //realnum
if (DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2) //log2
{
if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC) //log1
{
tmp = tmp * sizeof(INT32U);
for(i=0; i<tmp; i++)
pData[i] = *(rp + pInfo->Start*4 + i);
}
else
{
j = 0;
for (i=0; i<DBCfgs[pInfo->DevID].DDNum; i++)
{
if (j == pInfo->Num)
break;
if (DBCfgs[pInfo->DevID].Info.Real.pDD[i].Control & FCFGDDSEND)
{
for (size=0; size<4; size++)
pData[4*j + size] = *(rp + 4*i + size);
j++;
}
}
if (j == 0)
{
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
}
pInfo->Num = j;
}
}
else
{
tmp = tmp * sizeof(INT32U);
for(i=0; i<tmp; i++)
pData[i] = *(rp + pInfo->Start*4 + i);
}
break;
case FRESET:
rp = FRESETADDR;
*pData = *rp;
break;
case FENTERBOOT:
rp = FENTERBOOTADDR;
*pData = *rp;
break;
case ABSTIME:
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
break;
case BIDATA:
rp = BIVALADDR;
size = (pInfo->Num - 1) / 8 + 1;
for (i=0; i<size; i++)
*(pData + i) = *(rp + i);
break;
case FDRLOC:
if (pInfo->Num >= 15)
pInfo->Num = 0;
rp = FDRLOCADDR;
*pData = *(rp + pInfo->Num);
break;
case INFODATA:
rp = SYSINFOADDR;
*pData = *rp;
size = sizeof (struct SysInfo_t);
tmp = pInfo->Start;
for (i=0; i<pInfo->Num; i++)
{
rp += tmp * size + 1;
for (j=0; j<size; j++)
*(pData + i*size + j + 1) = *(rp + j);
tmp = (tmp + 1) % SYSINFOLIMIT;
}
break;
case LBDATAUA:
case LBDATAUC:
case LBDATAIA:
case LBDATAIB:
case LBDATAIC:
case LBDATAIO:
case LBINFO:
DBReadLB(pData, pInfo);
break;
case YCFULLVAULE:
if (pInfo->Start >= DBCfgs[pInfo->DevID].YCNum)
{
OSTaskChangePrio(OSPrioCur, oldID);
return (FALSE);
}
tmp = pInfo->Num;
if (pInfo->Start + tmp > DBCfgs[pInfo->DevID].YCNum)
tmp = DBCfgs[pInfo->DevID].YCNum - pInfo->Start;
pInfo->Num = tmp;
for (i=pInfo->Start; i<tmp; i++)
{
for (j=0; j<SysCfg.DBAllNum; j++)
{
if (DBCfgs[j].Flag & (FDBLOGIC | FDBLOGIC2))
continue;
if ((DBCfgs[j].Flag & FDBLOGUSE) && (DBCfgs[j].Info.Real.LogDevID[0] == pInfo->DevID))
{
for (tmp=0; tmp<DBCfgs[j].YCNum; tmp++)
{
if (DBCfgs[j].Info.Real.pAI[tmp].Index[0] == i)
*((INT16U*)pData + i) = DBCfgs[j].Info.Real.pAI[tmp].b;
}
}
if ((DBCfgs[j].Flag & FDBLOG2USE) && (DBCfgs[j].Info.Real.LogDevID[1] == pInfo->DevID))
{
for (tmp=0; tmp<DBCfgs[j].YCNum; tmp++)
{
if (DBCfgs[j].Info.Real.pAI[tmp].Index[1] == i)
*((INT16U*)pData + i) = DBCfgs[j].Info.Real.pAI[tmp].b;
}
}
}
}
break;
default:
break;
}
OSTaskChangePrio(OSPrioCur, oldID);
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:DBReadCOS() */
/*函数功能:数据库读COS操作 */
/*输入说明:pData:数据指针 */
/* pInfo:数据信息 */
/*------------------------------------------------------------------*/
BOOL DBReadCOS(INT8U *pData, struct DBInfo *pInfo)
{
BOOL next = FALSE;
INT8U err;
volatile INT8U *rp, *rtmp;
INT16U i, j, size, num, tmp, rc, id, start, cur;
struct COS_t cos;
size = sizeof (struct COS_t);
if (pInfo->Start >= COSLIMIT)
{
if ((pInfo->Start & STARTTYPE) && (DBCfgs[pInfo->SuperID].Flag & (FDBLOGIC | FDBLOGIC2))) //变化遥信
{
num = 0;
rc = DEFINDEXNO;
for (i=0; i<DBCfgs[pInfo->SuperID].Info.Logic.DevNum; i++)
{
tmp = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].DevID;
if (tmp != pInfo->DevID)
continue;
start = pInfo->Start & 0xFFF;
rp = (volatile INT8U*)GetDBAddr(tmp, COSDATA, TRUE);
cur = *rp;
num = 0;
if ((DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2) && (!(DBCfgs[pInfo->DevID].Flag & FDBLOGIC))) //log2
{
tmp = 0;
rc = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].COSOld;
for (i=0; i<COSLIMIT; i++)
{
if (rc == cur)
break;
rtmp = rp + rc * size + 1;
for (j=0; j<size; j++)
*((INT8U*)&cos + j) = *(rtmp + j);
rc = (rc + 1) % COSLIMIT;
id = cos.No;
if (DBCfgs[pInfo->DevID].Info.Real.pBI[id].Control & FCFGBISEND)
{
tmp++;
if (tmp > start)
{
for (j=0; j<id; j++)
if(!(DBCfgs[pInfo->DevID].Info.Real.pBI[j].Control & FCFGBISEND))
cos.No--;
memcpy (&pData[size*num], (INT8U*)&cos, size);
num++;
}
}
if (num >= pInfo->Num)
{
next = TRUE;
break;
}
}
}
else
{
rc = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].COSOld;
rc = (rc + start) % COSLIMIT;
for (i=0; i<COSLIMIT; i++)
{
if (rc == cur)
break;
rtmp = rp + rc * size + 1;
for (j=0; j<size; j++)
*(pData + i*size + j) = *(rtmp + j);
rc = (rc + 1) % COSLIMIT;
num++;
if (num >= pInfo->Num)
{
next = TRUE;
break;
}
}
}
break;
}
pInfo->Num = num; //realnum
if (next)
{
rc = GetPortofDB(pInfo->DevID);
if (rc != 0xFFFF)
{
OSFlagPost (SysPorts[rc].Event, FCOS, OS_FLAG_SET, &err);
if (err != OS_NO_ERR)
{
ErrorInfo(OSPrioCur, "数据库发送失败1497");
return (FALSE);
}
}
}
return (TRUE);
}
else
return (FALSE);
}
rp = (volatile INT8U*)GetDBAddr(pInfo->DevID, COSDATA, TRUE);
*pData = *rp;
tmp = pInfo->Start;
for (i=0; i<pInfo->Num; i++)
{
rtmp = rp + tmp * size + 1;
for (j=0; j<size; j++)
*(pData + i*size + j + 1) = *(rtmp + j);
tmp = (tmp + 1) % COSLIMIT;
}
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:DBReadSOE() */
/*函数功能:数据库读SOE操作 */
/*输入说明:pData:数据指针 */
/* pInfo:数据信息 */
/*------------------------------------------------------------------*/
BOOL DBReadSOE(INT8U *pData, struct DBInfo *pInfo)
{
BOOL next = FALSE;
INT8U err;
volatile INT8U *rp, *rtmp;
INT16U i, j, size, num, tmp, rc, id, start, cur;
struct SOE_t soe;
size = sizeof (struct SOE_t);
if (pInfo->Start >= SOELIMIT)
{
if ((pInfo->Start & STARTTYPE) && (DBCfgs[pInfo->SuperID].Flag & (FDBLOGIC | FDBLOGIC2))) //变化遥信
{
num = 0;
rc = DEFINDEXNO;
for (i=0; i<DBCfgs[pInfo->SuperID].Info.Logic.DevNum; i++)
{
tmp = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].DevID;
if (tmp != pInfo->DevID)
continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -