📄 101priapp.c
字号:
void P101ProcSetNVA(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcYX() */
/*函数功能:处理遥信数据并写入数据库 */
/*输入说明:Flag:YX类型 */
/*------------------------------------------------------------------*/
void P101ProcYX(INT8U Port, INT8U Flag)
{
INT8U i, j, k, num;
INT16U tmp, all;
struct DBInfo info;
i = Port - 1;
memset (ComApp[i]->Tmpbuf, 0, 512);
info.SuperID = ComApp[i]->ActDevIndex;
info.DevID = ComApp[i]->ActDevIndex;
info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LBI;
all = ComApp[i]->RxMsg->Head.VSQ & P101_VSQ;
if (all >= ComDb[i]->DBCfgs[ComApp[i]->ActIndex].YXNum - 1)
all = ComDb[i]->DBCfgs[ComApp[i]->ActIndex].YXNum - 1;
info.Num = all;
if (Flag == M_SP_NA)
{
if (ComApp[i]->RxMsg->Head.VSQ & P101_SQ)
{
info.Type = YXDATA;
for (j=0; j<info.Num; j++)
{
if (ComApp[i]->RxMsg->Data[j])
ComApp[i]->Tmpbuf[j] = YX_H;
else
ComApp[i]->Tmpbuf[j] = YX_F;
}
}
else
{
info.Type = YXDOTDATA;
ComApp[i]->Tmpbuf[0] = ComApp[i]->RxMsg->Head.InfoAddr - LBI;
if (ComApp[i]->RxMsg->Data[0])
ComApp[i]->Tmpbuf[2] = YX_H;
else
ComApp[i]->Tmpbuf[2] = YX_F;
for (j=1; j<info.Num; j++)
{
tmp = *((INT16U*)(ComApp[i]->RxMsg->Data + j*3 - 2)) - LBI;
ComApp[i]->Tmpbuf[3*j + 0] = tmp & 0xFF;
ComApp[i]->Tmpbuf[3*j + 1] = (tmp>>8) & 0xFF;
if (ComApp[i]->RxMsg->Data[3*j])
ComApp[i]->Tmpbuf[3*j + 2] = YX_H;
else
ComApp[i]->Tmpbuf[3*j + 2] = YX_F;
}
}
DBWrite(ComApp[i]->Tmpbuf, &info);
}
if (Flag == M_PS_NA)
{
info.Type = YXDATA;
num = all / 16;
info.Num = 16;
for (j=0; j<num; j++)
{
if (j == 0)
info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LBI;
else
{
tmp = *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) - 1);
tmp = tmp * 0x100;
tmp += *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) - 2);
info.Start = tmp - LBI;
}
tmp = *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) + 1);
tmp = tmp * 0x100;
tmp += *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX));
for (k=0; k<16; k++)
{
if (tmp & (0x0001<<k))
ComApp[i]->Tmpbuf[k] = YX_H;
else
ComApp[i]->Tmpbuf[k] = YX_F;
}
DBWrite(ComApp[i]->Tmpbuf, &info);
}
info.Num = all % 16;
tmp = *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) - 1);
tmp = tmp * 0x100;
tmp += *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) - 2);
info.Start = tmp - LBI;
tmp = *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) + 1);
tmp = tmp * 0x100;
tmp += *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX));
for (k=0; k<info.Num; k++)
{
if (tmp & (0x0001<<k))
ComApp[i]->Tmpbuf[k] = YX_H;
else
ComApp[i]->Tmpbuf[k] = YX_F;
}
DBWrite(ComApp[i]->Tmpbuf, &info);
}
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcYC() */
/*函数功能:处理遥测数据并写入数据库 */
/*输入说明:Flag:YC类型 */
/*------------------------------------------------------------------*/
void P101ProcYC(INT8U Port, INT8U Flag)
{
INT8U i, j;
INT16U tmp;
struct DBInfo info;
i = Port - 1;
memset (ComApp[i]->Tmpbuf, 0, 512);
info.SuperID = ComApp[i]->ActDevIndex;
info.DevID = ComApp[i]->ActDevIndex;
info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LAI;
info.Num = ComApp[i]->RxMsg->Head.VSQ & P101_VSQ;
if (Flag == M_ME_ND)
{
if (ComApp[i]->RxMsg->Head.VSQ & P101_SQ)
{
info.Type = YCDATA;
memcpy (ComApp[i]->Tmpbuf, (INT8U*)&ComApp[i]->RxMsg->Data, info.Num * 2);
}
else
{
info.Type = YCDOTDATA;
ComApp[i]->Tmpbuf[0] = ComApp[i]->RxMsg->Head.InfoAddr - LAI;
ComApp[i]->Tmpbuf[2] = *(ComApp[i]->RxMsg->Data);
ComApp[i]->Tmpbuf[3] = *(ComApp[i]->RxMsg->Data + 1);
for (j=1; j<info.Num; j++)
{
tmp = *(ComApp[i]->RxMsg->Data + j*4 - 1);
tmp = tmp * 0x100;
tmp += *(ComApp[i]->RxMsg->Data + j*4 - 2);
ComApp[i]->Tmpbuf[j*4] = tmp - LAI;
ComApp[i]->Tmpbuf[j*4 + 2] = *(ComApp[i]->RxMsg->Data + j*4);
ComApp[i]->Tmpbuf[j*4 + 3] = *(ComApp[i]->RxMsg->Data + j*4 + 1);
}
}
}
if (Flag == M_ME_NA)
{
if (ComApp[i]->RxMsg->Head.VSQ & P101_SQ)
{
info.Type = YCDATA;
for (j=0; j<info.Num; j++)
{
ComApp[i]->Tmpbuf[j*2 + 0] = *(ComApp[i]->RxMsg->Data + j*3);
ComApp[i]->Tmpbuf[j*2 + 1] = *(ComApp[i]->RxMsg->Data + j*3 + 1);
}
}
else
{
info.Type = YCDOTDATA;
ComApp[i]->Tmpbuf[0] = ComApp[i]->RxMsg->Head.InfoAddr - LAI;
ComApp[i]->Tmpbuf[2] = *(ComApp[i]->RxMsg->Data);
ComApp[i]->Tmpbuf[3] = *(ComApp[i]->RxMsg->Data + 1);
for (j=1; j<info.Num; j++)
{
tmp = *(ComApp[i]->RxMsg->Data + j*5 - 1);
tmp = tmp * 0x100;
tmp += *(ComApp[i]->RxMsg->Data + j*5 - 2);
ComApp[i]->Tmpbuf[j*4] = tmp - LAI;
ComApp[i]->Tmpbuf[j*4 + 2] = *(ComApp[i]->RxMsg->Data + j*5);
ComApp[i]->Tmpbuf[j*4 + 3] = *(ComApp[i]->RxMsg->Data + j*5 + 1);
}
}
}
DBWrite(ComApp[i]->Tmpbuf, &info);
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcSOE() */
/*函数功能:处理遥信数据并写入数据库 */
/*------------------------------------------------------------------*/
void P101ProcSOE(INT8U Port)
{
INT8U i, j, min;
struct DBInfo info;
struct AbsTime_t time;
struct SOECP24Time *tmp;
struct SOE_t *soe;
i = Port - 1;
memset (ComApp[i]->Tmpbuf, 0, 512);
info.SuperID = ComApp[i]->ActDevIndex;
info.DevID = ComApp[i]->ActDevIndex;
info.Type = SOEDATA;
info.Num = ComApp[i]->RxMsg->Head.VSQ & P101_VSQ;
GetTime((INT8U*)&time, ABSTIME);
min = time.Minute % 60;
time.Minute = (time.Minute / 60) * 60;
for (j=0; j<info.Num; j++)
{
soe = (struct SOE_t*)&ComApp[i]->Tmpbuf[j * sizeof (struct SOE_t)];
if (j == 0)
tmp = (struct SOECP24Time*)&ComApp[i]->RxMsg->Head.InfoAddr;
else
tmp = (struct SOECP24Time*)&ComApp[i]->RxMsg->Data[j * sizeof (struct SOECP24Time) - 2];
soe->No = tmp->No - LBI;
if (soe->No >= ComDb[i]->DBCfgs[ComApp[i]->ActIndex].YXNum - 1)
continue;
if (tmp->Status)
soe->Status = YX_H;
else
soe->Status = YX_F;
if (min >= tmp->Minute)
soe->Time.Minute = time.Minute + tmp->Minute;
else
soe->Time.Minute = time.Minute + tmp->Minute - 60;
soe->Time.Msecond = tmp->Msecond;
}
DBWrite(ComApp[i]->Tmpbuf, &info);
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcDD() */
/*函数功能:处理电度数据并写入数据库 */
/*------------------------------------------------------------------*/
void P101ProcDD(INT8U Port)
{
INT8U i, j, k;
struct DBInfo info;
i = Port - 1;
memset (ComApp[i]->Tmpbuf, 0, 512);
info.SuperID = ComApp[i]->ActDevIndex;
info.DevID = ComApp[i]->ActDevIndex;
info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LBCD;
info.Num = ComApp[i]->RxMsg->Head.VSQ & P101_VSQ;
for (j=0, k=0; k<info.Num * 7; j++, k++)
{
ComApp[i]->Tmpbuf[j] = ComApp[i]->RxMsg->Data[k];
k += 3;
}
DBWrite(ComApp[i]->Tmpbuf, &info);
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcTimeDelay() */
/*函数功能:延时获得命令 */
/*------------------------------------------------------------------*/
void P101ProcTimeDelay(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcClock() */
/*函数功能:对钟命令确认命令 */
/*输入说明: */
/*------------------------------------------------------------------*/
void P101ProcClock(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcReset() */
/*函数功能:复位进程命令 */
/*------------------------------------------------------------------*/
void P101ProcReset(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcReadData() */
/*函数功能:读数据命令 */
/*------------------------------------------------------------------*/
void P101ProcReadData(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcTest() */
/*函数功能:测试命令 */
/*------------------------------------------------------------------*/
void P101ProcTest(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcParaSet() */
/*函数功能:装载参数命令 */
/*------------------------------------------------------------------*/
void P101ProcParaSet(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:P101ProcAppErr() */
/*函数功能:应用层命令错误或无法解释处理 */
/*------------------------------------------------------------------*/
void P101ProcAppErr(INT8U Port)
{
/*
ComApp[i]->TxLen = 0;
ComApp[i]->AppCommand = APP_APPCON;
if (ComApp[i]->Data1Flag)
ComApp[i]->AppCommand |= APP_HAVEDATA1;
*/
}
/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeControl() */
/*函数功能:编辑控制命令帧 */
/*------------------------------------------------------------------*/
void P101EnCodeControl(INT8U Port, struct DBBOOPInfo* Info)
{
INT8U i, dco;
i = Port - 1;
dco = 0;
ComApp[i]->YKDevID = Info->SuperID;
ComApp[i]->TxMsg.Head.TypeID = C_DC_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
if (Info->Status & BODEL)
ComApp[i]->TxMsg.Head.COT = DEACT;
else
ComApp[i]->TxMsg.Head.COT = ACT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)P101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = Info->ID + LBO - 1;
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]->AppCommand = APP_SENDCON;
}
/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeClock() */
/*函数功能:编辑对钟命令帧 */
/*------------------------------------------------------------------*/
void P101EnCodeClock(INT8U Port)
{
INT8U i;
i = Port - 1;
ComApp[i]->TxMsg.Head.TypeID = C_CS_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
ComApp[i]->TxMsg.Head.COT = ACT;
ComApp[i]->TxMsg.Head.PubAddr = 0xFF;
ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT)
GetTime((void*)ComApp[i]->TxMsg.Data, IEC101TIME);
else
GetTime((void*)ComApp[i]->TxMsg.Data, IEC101EXTTIME);
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 7;
ComApp[i]->AppCommand = APP_SENDNOCON;
ComApp[i]->AppDevs[ComApp[i]->ActIndex].Status = INUSE;
}
/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeAllData() */
/*函数功能:编辑总召唤帧 */
/*输入说明: */
/*------------------------------------------------------------------*/
void P101EnCodeAllData(INT8U Port)
{
INT8U i;
i = Port - 1;
ComApp[i]->TxMsg.Head.TypeID = C_IC_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
ComApp[i]->TxMsg.Head.COT = ACT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)P101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
ComApp[i]->TxMsg.Data[0] = 0x14;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
ComApp[i]->AppCommand = APP_SENDCON;
ComApp[i]->AppDevs[ComApp[i]->ActIndex].Status = USING;
}
/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeCounter() */
/*函数功能:编辑总召唤帧 */
/*输入说明: */
/*------------------------------------------------------------------*/
void P101EnCodeCounter(INT8U Port)
{
INT8U i;
i = Port - 1;
ComApp[i]->TxMsg.Head.TypeID = C_CI_NA;
ComApp[i]->TxMsg.Head.VSQ = 0x01;
ComApp[i]->TxMsg.Head.COT = ACT;
ComApp[i]->TxMsg.Head.PubAddr = (INT8U)P101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
ComApp[i]->TxMsg.Data[0] = 0x14;
ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
ComApp[i]->AppCommand = APP_SENDCON;
ComApp[i]->AppDevs[ComApp[i]->ActIndex].Status = USING;
}
/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeCommStatus() */
/*函数功能:编辑通讯状态帧 */
/*输入说明:Flag为TRUE,通讯正常; */
/*------------------------------------------------------------------*/
void P101EnCodeCommStatus(INT8U Port, BOOL Flag)
{
INT8U i;
struct SOE_t soe;
struct DBInfo info;
i = Port - 1;
soe.No = ComDb[i]->DBCfgs[ComApp[i]->ActIndex].YXNum - 1;
if (Flag)
soe.Status = YX_H;
else
soe.Status = YX_F;
GetTime((void*)&soe.Time, ABSTIME);
info.SuperID = ComApp[i]->ActDevIndex;
info.DevID = ComApp[i]->ActDevIndex;
info.Num = 1;
info.Type = SOEDATA;
DBWrite((INT8U*)&soe, &info);
info.Type = YXDOTDATA;
DBWrite((INT8U*)&soe, &info);
}
/*------------------------------------------------------------------*/
/*函数名称:P101GetAddrByDevIndex() */
/*函数功能:通过设备查询地址的是否存在(针对公共地址) */
/*输入说明:DevID为0xFFFF,将对应广播地址 */
/*输出说明:成功返回地址 */
/*------------------------------------------------------------------*/
INT16U P101GetAddrByDevIndex(INT8U Port, INT16U DevID)
{
INT8U i, j;
i = Port - 1;
if (DevID == 0xFFFF)
return (0xFFFF);
for (j=0; j<ComDb[i]->DevNum; j++)
{
if (DevID == ComDb[i]->DBCfgs[j].DevID)
{
return (ComDb[i]->DBCfgs[j].Address);
}
}
return (0);
}
/*------------------------------------------------------------------*/
/*函数名称:P101GetDevIndexByAddr() */
/*函数功能:通过设备查询地址的是否存在(针对公共地址) */
/*输入说明:DevID为0xFFFF,将对应广播地址 */
/*输出说明:成功返回地址 */
/*------------------------------------------------------------------*/
INT16U P101GetDevIndexByAddr(INT8U Port, INT16U Addr)
{
INT8U i, j;
i = Port - 1;
for (j=0; j<ComDb[i]->DevNum; j++)
{
if (Addr == ComDb[i]->DBCfgs[j].Address)
{
return (ComDb[i]->DBCfgs[j].DevID);
}
}
return (0);
}
/*------------------------------------------------------------------*/
/*函数名称:P101GetIndexByAddr() */
/*函数功能:通过设备查询地址的是否存在(针对公共地址) */
/*输入说明:DevID为0xFFFF,将对应广播地址 */
/*输出说明:成功返回地址 */
/*------------------------------------------------------------------*/
INT16U P101GetIndexByAddr(INT8U Port, INT16U DevID)
{
INT8U i, j;
i = Port - 1;
for (j=0; j<ComDb[i]->DevNum; j++)
{
if (DevID == ComDb[i]->DBCfgs[j].DevID)
{
return (j);
}
}
return (0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -