📄 104sa.c
字号:
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&addr, len-1);
}
else
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[1 + (num-1)*len], (INT8U*)&addr, len-1);
}
ComApp[i]->TxMsg.Data[num*len] = val;
}
ComApp[i]->TxMsg.Head.TypeID = M_SP_NA;
ComApp[i]->TxMsg.Head.VSQ = info.Num;
ComApp[i]->TxMsg.Head.COT = SPONT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, info.DevID);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num*len - sizeof (struct InfoAddr);
ComApp[i]->SData[ComApp[i]->CurSData].DevID = info.DevID;
ComApp[i]->SData[ComApp[i]->CurSData].Type = COSDATA;
ComApp[i]->SData[ComApp[i]->CurSData].Num = info.Num;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
ComApp[i]->AppNextFlag &= (~HaveCOS);
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeReadData() */
/*函数功能:编辑读命令 */
/*------------------------------------------------------------------*/
void S104EnCodeReadData(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeSOE() */
/*函数功能:编辑SOE帧 */
/*------------------------------------------------------------------*/
void S104EnCodeSOE(INT8U Port)
{
BOOL rc;
INT8U i, j, len1, len2, num, val;
struct DBInfo info;
struct SOE_t *soe;
struct InfoAddr addr;
struct IEC101Time_t time;
i = Port - NET1;
len1 = sizeof (struct InfoAddr);
len2 = sizeof (struct IEC101Time_t);
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = S104CheckDB(Port, SOEDATA);
if (info.DevID == 0xFFFF)
{
ComApp[i]->AppNextFlag &= (~HaveSOE);
return;
}
info.Type = SOEDATA;
for (j=0, num=0; j<ComApp[i]->CurSData; j++)
{
if ((ComApp[i]->SData[j].DevID == info.DevID) && (ComApp[i]->SData[j].Type == SOEDATA))
num += ComApp[i]->SData[j].Num;
}
info.Start = STARTTYPE | num;
info.Num = 20; //dingding?
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if ((!rc) || (info.Num == 0))
{
info.Num = 0;
DBClear(&info);
return;
}
for (num=0; num<info.Num; num++)
{
soe = (struct SOE_t*)ComApp[i]->Tmpbuf + num;
addr.InfoAddr = LBI + soe->No;
#ifdef INFOADDR3BYTE
addr.InfoAddrHigh = 0x00;
#endif
if (soe->Status == YX_H)
val = 0x01;
else
val = 0x00;
if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT104)
TimeChange((void*)&time, IEC101TIME, (void*)&soe->Time, ABSTIME);
else
TimeChange((void*)&time, IEC101EXTTIME, (void*)&soe->Time, ABSTIME);
if (num == 0)
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&addr, len1);
}
else
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[num*(len1+len2+1) - len1], (INT8U*)&addr, len1);
}
ComApp[i]->TxMsg.Data[num*(len1+len2+1)] = val;
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[num*(len1+len2+1) + 1], (INT8U*)&time, len2);
}
ComApp[i]->TxMsg.Head.TypeID = M_SP_TB;
ComApp[i]->TxMsg.Head.VSQ = info.Num;
ComApp[i]->TxMsg.Head.COT = SPONT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, info.DevID);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num*(len1+len2+1) - len1;
ComApp[i]->SData[ComApp[i]->CurSData].DevID = info.DevID;
ComApp[i]->SData[ComApp[i]->CurSData].Type = SOEDATA;
ComApp[i]->SData[ComApp[i]->CurSData].Num = info.Num;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
ComApp[i]->AppNextFlag &= (~HaveSOE);
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeFA() */
/*函数功能:编辑故障检测数据帧 */
/*------------------------------------------------------------------*/
void S104EnCodeFA(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeNVA() */
/*函数功能:编辑变化遥测帧 */
/*------------------------------------------------------------------*/
void S104EnCodeNVA(INT8U Port)
{
BOOL rc;
INT8U i, j, k, len, ll;
INT16U tmp, no, num, curdev;
struct DBInfo info;
struct InfoAddr *addr;
struct NVAF *yc;
i = Port - NET1;
num = 0;
len = sizeof (struct InfoAddr);
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.Type = YCDATA;
info.Num = 40; //dingding?
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
info.DevID = ComApp[i]->NvaActDev;
info.Start = ComApp[i]->NvaActDevCur;
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if ((!rc) || (info.Num == 0))
{
rc = S104GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
if (!rc)
{
return ;
}
}
else
{
no = S104GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
no += ComApp[i]->NvaActDevCur;
ComApp[i]->TxMsg.Head.InfoAddr = LAI + k;
#ifdef INFOADDR3BYTE
ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
#endif
for (k=0; k<info.Num; k++)
{
tmp = *((INT16U*)ComApp[i]->Tmpbuf + k);
if ((tmp > ComApp[i]->YCValue[no+k] + ComApp[i]->YCDVal[no+k]) ||
(tmp < ComApp[i]->YCValue[no+k] - ComApp[i]->YCDVal[no+k]))
{
ComApp[i]->YCValue[no+k] = tmp;
if ((ComApp[i]->YCTypeID == M_ME_NA) || (ComApp[i]->YCTypeID == M_ME_NB))
{
ll = 3;
addr = (struct InfoAddr*)((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr + num*(len+ll));
addr->InfoAddr = LAI + k;
#ifdef INFOADDR3BYTE
addr->InfoAddrHigh = 0x00;
#endif
yc = (struct NVAF*)&ComApp[i]->TxMsg.Data[num*(len+ll)];
yc->Value = tmp;
yc->QDS = 0x00;
}
else
{
ll = 2;
addr = (struct InfoAddr*)((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr + num*(len+ll));
addr->InfoAddr = LAI + k;
#ifdef INFOADDR3BYTE
addr->InfoAddrHigh = 0x00;
#endif
yc = (struct NVAF*)&ComApp[i]->TxMsg.Data[num*(len+ll)];
yc->Value = tmp;
yc->QDS = 0x00;
}
num++;
}
if (num >= 40) //一帧发送的最多遥测个数
{
ComApp[i]->NvaActDevCur = k;
break;
}
}
if (num)
curdev = ComApp[i]->NvaActDev;
if (info.Num == 0x80) //当前设备一次没有发完
{
ComApp[i]->NvaActDevCur = k;
}
else //下一台设备
{
ComApp[i]->NvaActDevCur = 0;
rc = S104GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
if (!rc)
{
ComApp[i]->AppNextFlag &= (~HaveNVA);
return ;
}
if (num)
break;
}
}
} //for
if (num)
{
ComApp[i]->TxMsg.Head.TypeID = ComApp[i]->YCTypeID;
ComApp[i]->TxMsg.Head.VSQ = num;
ComApp[i]->TxMsg.Head.COT = SPONT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, curdev);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + num*(len+ll) - len;
ComApp[i]->SData[ComApp[i]->CurSData].DevID = curdev;
ComApp[i]->SData[ComApp[i]->CurSData].Type = YCDOTDATA;
ComApp[i]->SData[ComApp[i]->CurSData].Num = num;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
}
else
ComApp[i]->AppNextFlag &= (~HaveNVA);
}
/*------------------------------------------------------------------*/
/*函数名称:S104CheckNVA() */
/*函数功能:检测变化遥测数据,成功返回TRUE */
/*------------------------------------------------------------------*/
BOOL S104CheckNVA(INT8U Port)
{
BOOL rc;
INT8U i, j, k;
INT16U tmp, no, num;
struct DBInfo info;
i = Port - NET1;
num = 0;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.Type = YCDATA;
info.Num = 0x80;
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
info.DevID = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
info.Start = num;
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if (rc)
{
no = S104GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
no += num;
for (k=0; k<info.Num; k++)
{
tmp = *((INT16U*)ComApp[i]->Tmpbuf + k);
if ((tmp > ComApp[i]->YCValue[no+k] + ComApp[i]->YCDVal[no+k]) ||
(tmp < ComApp[i]->YCValue[no+k] - ComApp[i]->YCDVal[no+k]))
{
return (TRUE);
}
}
if (info.Num == 0x80) //当前设备一次没有发完
{
num += 0x80;
}
else //下一台设备
{
num = 0;
}
}
} //for
return (FALSE);
}
/*------------------------------------------------------------------*/
/*函数名称:S104GetYcDeadValue() */
/*函数功能:获得遥测死区值 */
/*输入说明: */
/*------------------------------------------------------------------*/
void S104GetYcDeadValue(INT8U Port, INT16U Num, INT32U DValue)
{
INT8U i, id;
INT16U num, j;
struct DBInfo info;
i = Port - NET1;
num = 0;
for (id=0; id<ComDb[i]->DBCfgs->Info.Logic.DevNum; id++)
{
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = ComDb[i]->DBCfgs->Info.Logic.pOld[id].DevID;
info.Type = YCFULLVAULE;
info.Num = DBCfgs[info.DevID].YCNum;
info.Start = 0;
DBRead(&ComApp[i]->Tmpbuf[0], &info);
for (j=0; j<info.Num; j++)
{
ComApp[i]->YCDVal[num+j] = DValue * (*((INT16U*)ComApp[i]->Tmpbuf + j)) / 1000; //可能为零
}
num += info.Num;
}
}
/*------------------------------------------------------------------*/
/*函数名称:S104GetActDevIndexByAddr() */
/*函数功能:通过地址查询设备的是否存在 */
/*输出说明:成功返回TRUE */
/*------------------------------------------------------------------*/
BOOL S104GetActDevIndexByAddr(INT8U Port, INT16U Addr)
{
INT8U i, j;
INT16U dev;
i = Port - NET1;
if (Addr == BROADCASTADDR)
{
ComApp[i]->ActDevIndex = ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;
return (TRUE);
}
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
dev = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
if (Addr == DBCfgs[dev].Address)
{
ComApp[i]->ActDevIndex = dev;
return (TRUE);
}
}
return (FALSE);
}
/*------------------------------------------------------------------*/
/*函数名称:S104GetAddrByDevIndex() */
/*函数功能:通过设备查询地址的是否存在(针对公共地址) */
/*输出说明:成功返回地址 */
/*------------------------------------------------------------------*/
INT16U S104GetAddrByDevIndex(INT8U Port, INT16U DevID)
{
INT8U i, j;
i = Port - NET1;
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
if (DevID == ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID)
{
return (DBCfgs[DevID].Address);
}
}
return (0);
}
/*------------------------------------------------------------------*/
/*函数名称:S104GetNextActDevIndex() */
/*函数功能:激活下一个设备 */
/*输出说明:成功返回TRUE,只有一个设备时返回FALSE */
/*------------------------------------------------------------------*/
BOOL S104GetNextActDevIndex(INT8U Port, INT16U ActDev, INT8U Flag)
{
INT8U i, j;
INT16U devid;
i = Port - NET1;
devid = ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;
for (j=0; j<(ComDb[i]->DBCfgs->Info.Logic.DevNum - 1); j++)
{
if (ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID == ActDev)
{
devid = ComDb[i]->DBCfgs->Info.Logic.pOld[j+1].DevID;
break;
}
}
if (Flag == ACTDEVINDEX)
{
ComApp[i]->ActDevIndex = devid;
}
else if (Flag == NVAACTDEV)
{
ComApp[i]->NvaActDev = devid;
}
else
return (FALSE);
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:S104GetActDevNo() */
/*函数功能:获得当前设备的遥测起始号 */
/*输出说明:返回起始号 */
/*------------------------------------------------------------------*/
INT16U S104GetActDevNo(INT8U Port, INT16U DevID, INT16U Flag)
{
INT8U i, j;
INT16U num, dev;
i = Port - NET1;
num = 0;
if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
return (num);
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
if (DevID == ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID)
return (num);
else
{
dev = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
if (Flag == YCDATA)
num += DBCfgs[dev].YCNum;
else if (Flag == DDDATA)
num += DBCfgs[dev].DDNum;
}
}
return (0); //dingding?
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -