📄 104sa.c
字号:
if (ComApp[i]->Tmpbuf[j] == YX_H)
yx.ST |= (0x0001<<len);
len++;
if (len >= 16)
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[no*sizeof (struct SCDYX)], (INT8U*)&yx, sizeof (struct SCDYX));
len = 0;
no++;
yx.ST = 0;
}
}
if (len != 0)
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[no*sizeof (struct SCDYX)], (INT8U*)&yx, sizeof (struct SCDYX));
no++;
}
ComApp[i]->TxMsg.Head.TypeID = M_PS_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x80 | no;
ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
#ifdef INFOADDR3BYTE
ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
#endif
ComApp[i]->TxLen = sizeof (struct PASDUHead) + no * sizeof (struct SCDYX);
ComApp[i]->GroupTrn.InfoAddr += info.Num;
}
else
{
for (j=0; j<info.Num; j++)
{
if (ComApp[i]->Tmpbuf[j] == YX_H)
ComApp[i]->TxMsg.Data[j] = 0x01;
else
ComApp[i]->TxMsg.Data[j] = 0x00;
}
ComApp[i]->TxMsg.Head.TypeID = M_SP_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x80 | info.Num;
ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
#ifdef INFOADDR3BYTE
ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
#endif
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num;
ComApp[i]->GroupTrn.InfoAddr += info.Num;
}
}
if ((!rc) || (info.Num != num))
{
if (ComApp[i]->GroupTrn.COT == REQ) //处理单组
ComApp[i]->GroupTrn.GroupNo = 17;
else
{
ComApp[i]->GroupTrn.GroupNo = 9;
ComApp[i]->GroupTrn.InfoAddr = LAI;
}
}
break;
case YCDATA:
if (info.Num)
{
ComApp[i]->AppNextFlag &= (~HaveNVA);
ycno = S104GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
memcpy ((INT8U*)&ComApp[i]->YCValue[ycno], ComApp[i]->Tmpbuf, info.Num * 2);
if ((ComApp[i]->YCTypeID == M_ME_NA) || (ComApp[i]->YCTypeID == M_ME_NB))
{
len = 3;
ComApp[i]->TxMsg.Head.TypeID = ComApp[i]->YCTypeID;
for (j=0; j<info.Num; j++)
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[3*j], &ComApp[i]->Tmpbuf[2*j], 2);
ComApp[i]->TxMsg.Data[3*j + 2] = 0x00; //QDS
}
}
else
{
len = 2;
ComApp[i]->TxMsg.Head.TypeID = M_ME_ND;
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[0], ComApp[i]->Tmpbuf, info.Num * 2);
}
ComApp[i]->TxMsg.Head.VSQ = 0x80 | info.Num;
ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
#ifdef INFOADDR3BYTE
ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
#endif
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num * len;
ComApp[i]->GroupTrn.InfoAddr += info.Num;
}
if ((!rc) || (info.Num != num))
{
if (ComApp[i]->GroupTrn.COT == REQ) //处理单组
ComApp[i]->GroupTrn.GroupNo = 17;
else
{
ComApp[i]->GroupTrn.GroupNo = 13;
ComApp[i]->GroupTrn.InfoAddr = LSPI;
}
}
break;
default:
break;
}
ComApp[i]->SData[ComApp[i]->CurSData].DevID = ComApp[i]->ActDevIndex;
ComApp[i]->SData[ComApp[i]->CurSData].Type = 0;
ComApp[i]->SData[ComApp[i]->CurSData].Num = info.Num;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeCounter() */
/*函数功能:处理电度召唤 */
/*------------------------------------------------------------------*/
void S104EnCodeCounter(INT8U Port)
{
BOOL rc = FALSE;
INT8U i, j, len1, len2, err, qcc;
INT16U ddno;
struct DBInfo info;
struct InfoAddr addr;
struct Counter counter;
i = Port - NET1;
len1 = ComApp[i]->GroupTrn.InfoAddr - LBCR;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.Type = DDDATA;
info.Num = 30;
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
len2 = ComApp[i]->GroupTrn.DevID;
if (DBCfgs[len2].DDNum > len1)
{
info.DevID = ComApp[i]->GroupTrn.DevID;
info.Start = len1;
rc = DBRead(ComApp[i]->Tmpbuf, &info); //读取数据
if (rc)
{
break;
}
}
else //指向下一台
{
len1 = 0;
if (ComApp[i]->AllDataNum == ComDb[i]->DBCfgs->Info.Logic.DevNum)
{
rc = FALSE;
break;
}
if (!S104GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX))
{
S104EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
return ;
}
else
{
ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
}
}
}
if (!rc)
{
S104EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
return ;
}
len1 = sizeof (struct InfoAddr);
len2 = sizeof (struct Counter);
qcc = ComApp[i]->GroupTrn.COT;
if (info.Num)
{
if ((qcc & 0xC0)== 0x80) //冻结复位
{
ddno = S104GetActDevNo(Port, ComApp[i]->NvaActDev, DDDATA);
for (j=0; j<info.Num; j++)
{
addr.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + j;
#ifdef INFOADDR3BYTE
addr.InfoAddrHigh = 0x00;
#endif
counter.Value = *((INT32U*)ComApp[i]->Tmpbuf + j) - ComApp[i]->DDValue[ddno + j];
counter.SQ = j;
if (j == 0)
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&addr, len1);
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[0], (INT8U*)&counter, len2);
}
else
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*(len1+len2) - len1], (INT8U*)&addr, len1);
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*(len1+len2)], (INT8U*)&counter, len2);
}
}
memcpy ((INT8U*)&ComApp[i]->DDValue[ddno], ComApp[i]->Tmpbuf, info.Num * 4);
}
else //冻结不复位
{
ddno = S104GetActDevNo(Port, ComApp[i]->NvaActDev, DDDATA);
for (j=0; j<info.Num; j++)
{
addr.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + j;
#ifdef INFOADDR3BYTE
addr.InfoAddrHigh = 0x00;
#endif
counter.Value = *((INT32U*)ComApp[i]->Tmpbuf + j);
counter.SQ = j;
if (j == 0)
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&addr, len1);
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[0], (INT8U*)&counter, len2);
}
else
{
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*(len1+len2) - len1], (INT8U*)&addr, len1);
memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*(len1+len2)], (INT8U*)&counter, len2);
}
}
}
ComApp[i]->TxMsg.Head.TypeID = M_IT_NA;
ComApp[i]->TxMsg.Head.VSQ = info.Num;
if (ComApp[i]->GroupTrn.GroupNo == 5)
ComApp[i]->TxMsg.Head.COT = REQCOGCN;
else
ComApp[i]->TxMsg.Head.COT = REQCOGCN + ComApp[i]->GroupTrn.GroupNo; //dingding
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num * (len1+len2) - len1;
ComApp[i]->GroupTrn.InfoAddr += info.Num;
}
else
{
S104EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
return ;
}
ComApp[i]->SData[ComApp[i]->CurSData].DevID = ComApp[i]->ActDevIndex;
ComApp[i]->SData[ComApp[i]->CurSData].Type = DDDATA;
ComApp[i]->SData[ComApp[i]->CurSData].Num = info.Num;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcClock() */
/*函数功能:对钟命令 */
/*------------------------------------------------------------------*/
void S104ProcClock(INT8U Port)
{
INT8U i;
i = Port - NET1;
if (ComApp[i]->BaseControl & SETSECTIME)
{
if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT104)
SetTime((void*)ComApp[i]->RxMsg->Data, IEC101TIME);
else
SetTime((void*)ComApp[i]->RxMsg->Data, IEC101EXTTIME);
}
S104EnCodeClock(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcReset() */
/*函数功能:复位进程命令 */
/*------------------------------------------------------------------*/
void S104ProcReset(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcReadData() */
/*函数功能:读数据命令 */
/*------------------------------------------------------------------*/
void S104ProcReadData(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcTest() */
/*函数功能:测试命令 */
/*------------------------------------------------------------------*/
void S104ProcTest(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcParaSet() */
/*函数功能:装载参数命令 */
/*------------------------------------------------------------------*/
void S104ProcParaSet(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcAppErr() */
/*函数功能:应用层命令错误或无法解释处理 */
/*------------------------------------------------------------------*/
void S104ProcAppErr(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeClock() */
/*函数功能:编辑时钟确认响应帧 */
/*------------------------------------------------------------------*/
void S104EnCodeClock(INT8U Port)
{
INT8U i;
i = Port - NET1;
ComApp[i]->TxMsg.Head.TypeID = C_CS_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
ComApp[i]->TxMsg.Head.COT = ACTCON;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = 0x00;
#ifdef INFOADDR3BYTE
ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
#endif
if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT104)
GetTime((void*)ComApp[i]->TxMsg.Data, IEC101TIME);
else
GetTime((void*)ComApp[i]->TxMsg.Data, IEC101EXTTIME);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + sizeof (struct IEC101Time_t);
ComApp[i]->SData[ComApp[i]->CurSData].DevID = ComApp[i]->ActDevIndex;
ComApp[i]->SData[ComApp[i]->CurSData].Type = SYSTIME;
ComApp[i]->SData[ComApp[i]->CurSData].Num = 0;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeControl() */
/*函数功能:编辑控制命令响应帧 */
/*------------------------------------------------------------------*/
void S104EnCodeControl(INT8U Port, struct DBBOOPInfo* Info)
{
INT8U i, dco;
i = Port - NET1;
ComApp[i]->TxMsg.Head.TypeID = C_DC_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
if (Info->Status & BODEL)
ComApp[i]->TxMsg.Head.COT = DEACTCON;
else
ComApp[i]->TxMsg.Head.COT = ACTCON;
if (Info->Flag & BOOPERROR)
ComApp[i]->TxMsg.Head.COT |= P101_PN;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = Info->SID + LBO - 1;
#ifdef INFOADDR3BYTE
ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
#endif
if (Info->Status & BOCLOSE)
dco = 0x02;
else
dco = 0x01;
if (Info->Flag & BOOPSELECT)
dco |= DCO_SE;
ComApp[i]->TxMsg.Data[0] = dco;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
ComApp[i]->SData[ComApp[i]->CurSData].DevID = ComApp[i]->ActDevIndex;
ComApp[i]->SData[ComApp[i]->CurSData].Type = BORESP;
ComApp[i]->SData[ComApp[i]->CurSData].Num = 0;
ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
}
/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeCOS() */
/*函数功能:编辑COS帧 */
/*------------------------------------------------------------------*/
void S104EnCodeCOS(INT8U Port)
{
BOOL rc;
INT8U i, j, len, num, val;
struct DBInfo info;
struct COS_t *cos;
struct InfoAddr addr;
i = Port - NET1;
len = sizeof (struct InfoAddr) + 1;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.DevID = S104CheckDB(Port, COSDATA);
if (info.DevID == 0xFFFF)
{
ComApp[i]->AppNextFlag &= (~HaveCOS);
return;
}
info.Type = COSDATA;
for (j=0, num=0; j<ComApp[i]->CurSData; j++)
{
if ((ComApp[i]->SData[j].DevID == info.DevID) && (ComApp[i]->SData[j].Type == COSDATA))
num += ComApp[i]->SData[j].Num;
}
info.Start = STARTTYPE | num;
info.Num = 40; //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++)
{
cos = (struct COS_t*)ComApp[i]->Tmpbuf + num;
addr.InfoAddr = LBI + cos->No;
#ifdef INFOADDR3BYTE
addr.InfoAddrHigh = 0x00;
#endif
if (cos->Status == YX_H)
val = 0x01;
else
val = 0x00;
if (num == 0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -