You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

13355 lines
365 KiB
C++

2 years ago
//***************************************************************
//* buban103.cpp *
//* aaawen 2004.10.19 *
//***************************************************************
//_DEBUG_MSG_,_OS_WINDOWS_DEBUG_
/*#ifdef OS_LINUX
#include "baohulib/commport.h"
#include "baohulib/serialport.h"
#else*/
#include "common.h"
2 years ago
#include "commport.h"
#include "udpcomm.h"
#include "display.h"
//#endif
#include <math.h>
#include <time.h>
#include <stdlib.h>
#ifndef _WIN32
#include <sys/types.h>
#include <unistd.h>
#endif
2 years ago
#include "buban103.h"
#include "scadaprotect.h"
//typedef int i_32;
//typedef unsigned long u_32;
extern SIO_PARAM_DEF SioParam[];
extern FUNCTION_CALL *FunCallPtr;
extern void *pvconf_handle;
extern void *pvportconf_handle;
extern void *pvdataconf_handle;
extern char pvDataFileName[256];
extern char IniFilePath[256];
/*!
\brief
2 years ago
*/
const int MAX_LINK_NUM=30;
/*!
\brief
2 years ago
*/
const int MAX_DEV_NUM_EACH_LINK=12;
/*
enum Param_Type
{
PARAM_NO=0,
PARAM_LINK,
PARAM_DEV,
PARAM_YC,
PARAM_YX,
PARAM_YM,
PARAM_YK,
PARAM_SYNCTIME,
PARAM_ASDU10
};
*/
const char *gpStrBuban103Cmd[BUBAN103_TIMER_CMD_NUM] =
{
"时间同步过程",
"总查询过程",
"电度量查询",
"通用分类数据模拟量查询",
"通用分类数据状态量查询"
2 years ago
};
/*!
:()+
2 years ago
*/
const char *gpStrBuban103ConfigInfo[] =
{
"*******部颁103规约开始*******",
2 years ago
" ",
" ; 轮询指令配置,所有命令召唤周期均以秒为单位。",
" 时间同步过程 = 0",
" 总查询过程 = 0",
" 电度量查询 = 0",
" 通用分类数据模拟量查询 = 0",
" 通用分类数据状态量查询 = 0",
2 years ago
" ",
" 链路数量=1",
" ; 缺省值=1,只支持一条链路,否则为实际的链路数量",
2 years ago
" ",
" 链路1模板文件名称 = 103template.csv",
2 years ago
" ... ...",
" 链路n模板文件名称 = 103template.csv",
" ; 其中n=配置信息中的(链路数量)对应的值",
2 years ago
" ",
" 上送遥信变位=0",
" ;仅针对于转发,缺省情况下不上送",
2 years ago
" ",
"*******部颁103规约结束*******",
"", // 结束标志(中间不能含有该空字符串)
2 years ago
};
//********************************************************************
//* 读取配置函数 *
//*参数int commid : 端口号 *
2 years ago
//********************************************************************
void Buban103ReadConfig(int commid)
{
int i, j, iDevId;
char szSection[128], entry[256], szbuf[128];
char szPortConfig[256], szDir[256], szTemplate[256];
pBUBAN103PORTPARAM pPortParam;
#ifdef OS_LINUX
strcpy(szPortConfig, "portconfig.ini");
#else
//GetCurrentDirectory(sizeof(szDir), szDir);
sprintf(szPortConfig, "%s/portconfig.ini", IniFilePath);
#endif
SioParam[commid].ExtInfo = HEAP_MALLOC(sizeof(BUBAN103PORTPARAM));
Buban103DispMalloc(commid, sizeof(BUBAN103PORTPARAM));
if(!SioParam[commid].ExtInfo)
{
#ifdef _WIN32
2 years ago
sprintf(szbuf, "WARN(%04d): commid_%02d ExtInfo=malloc(%d) failed.\n",
_getpid(), commid, sizeof(BUBAN103PORTPARAM));
#else
sprintf(szbuf, "WARN(%04d): commid_%02d ExtInfo=malloc(%d) failed.\n",
getpid(), commid, sizeof(BUBAN103PORTPARAM));
#endif
2 years ago
DebugPrint(szbuf);
return;
}
memset(SioParam[commid].ExtInfo, 0, sizeof(BUBAN103PORTPARAM));
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
// 只有在SioParam[commid].m_psBaoHu非空时才会运行到这里
2 years ago
pPortParam->m_psBaoHu = SioParam[commid].m_psBaoHu;
sprintf(szSection, "Port%d", commid+1);
if(GetPrivateProString(szSection, "上送遥信变位", "0", szbuf, 120, szPortConfig) > 0)
2 years ago
{
if(atoi(szbuf) == 0)
{
pPortParam->m_bSendChangeDi = FALSE;
}
else
{
pPortParam->m_bSendChangeDi = TRUE;
}
}
// wen 2004.07.26 增加保护装置的状态处理
if(GetPrivateProString(szSection, "链路数量", "1", szbuf, 120, szPortConfig) > 0)
2 years ago
{
pPortParam->m_iLinkNum = atoi(szbuf);
}
if(pPortParam->m_iLinkNum <= 1)
{
pPortParam->m_iLinkNum = 1;
}
if(pPortParam->m_iLinkNum > MAX_LINK_NUM)
{
pPortParam->m_iLinkNum = MAX_LINK_NUM;
}
pPortParam->m_psLink
= (BUBAN103LINKDEF *)HEAP_MALLOC(sizeof(BUBAN103LINKDEF)*pPortParam->m_iLinkNum);
Buban103DispMalloc(commid, sizeof(BUBAN103LINKDEF)*pPortParam->m_iLinkNum);
memset((void *)pPortParam->m_psLink, 0, sizeof(BUBAN103LINKDEF)*pPortParam->m_iLinkNum);
// 假定所有链路的配置相同
2 years ago
//for(i=0; i<pPortParam->m_iLinkNum; i++)
i=0;
{
// 轮询指令配置
2 years ago
for(j=0; j<BUBAN103_TIMER_CMD_NUM; j++)
{
GetPrivateProString(szSection, (char *)gpStrBuban103Cmd[j], "0", szbuf, 120, szPortConfig);
pPortParam->m_psLink[i].m_sArrayCmdTime[j].m_iCmdTimerConst
= (int)(atof(szbuf)*1000/TIMER_CNT);
if(pPortParam->m_psLink[i].m_sArrayCmdTime[j].m_iCmdTimerConst > 5)
{
pPortParam->m_psLink[i].m_sArrayCmdTime[j].m_iCmdTimerCnt
= pPortParam->m_psLink[i].m_sArrayCmdTime[j].m_iCmdTimerConst - 5;
}
}
//GetPrivateProString(szSection, "超时时间", "20", szbuf, 120, szPortConfig);
2 years ago
//pPortParam->m_psLink[i].m_u32TimeOutConst = (int)(atof(szbuf)*1000/TIMER_CNT);
pPortParam->m_psLink[i].m_u32TimeOutConst = pPortParam->m_psBaoHu->RetryTime;
}
for(i=1; i<pPortParam->m_iLinkNum; i++)
{
for(j=0; j<BUBAN103_TIMER_CMD_NUM; j++)
{
pPortParam->m_psLink[i].m_sArrayCmdTime[j].m_iCmdTimerConst
= pPortParam->m_psLink[0].m_sArrayCmdTime[j].m_iCmdTimerConst;
pPortParam->m_psLink[i].m_sArrayCmdTime[j].m_iCmdTimerCnt
= pPortParam->m_psLink[0].m_sArrayCmdTime[j].m_iCmdTimerCnt;
}
pPortParam->m_psLink[i].m_u32TimeOutConst = pPortParam->m_psLink[0].m_u32TimeOutConst;
}
for(i=0; i<pPortParam->m_iLinkNum; i++)
{
sprintf(entry, "链路%d模板文件名称", i+1);
2 years ago
GetPrivateProString(szSection, entry, "103template.csv", pPortParam->m_psLink[i].m_chArrayTempletFileName,
sizeof(pPortParam->m_psLink[i].m_chArrayTempletFileName)-1, szPortConfig);
#ifdef OS_LINUX
sprintf(szTemplate, "inf/%s", pPortParam->m_psLink[i].m_chArrayTempletFileName);
#else
sprintf(szTemplate, "%s/inf/%s", IniFilePath, pPortParam->m_psLink[i].m_chArrayTempletFileName);
#endif
// 判断是主站还是子站
2 years ago
//InitBuban103InfoFromTempletFile(commid, szTemplate, &pPortParam->m_psLink[i]);
//InitBuban103InfoFromDat(commid, &pPortParam->m_psLink[i]);
if(PROTOCOL_SLAVE == pPortParam->m_psBaoHu->PortType)
{
// wen 2005.06.22 初始化错误退出,以前配置争取的仍然可以正确运行
2 years ago
//InitBuban103InfoFromTempletFileEx(commid, szTemplate, &pPortParam->m_psLink[i], FALSE);
if(FALSE == InitBuban103InfoFromTempletFileEx(commid, szTemplate, &pPortParam->m_psLink[i], FALSE))
{
pPortParam->m_iLinkNum = i;
break;
}
}
else
{
// wen 2005.06.22 初始化错误退出,以前配置争取的仍然可以正确运行
2 years ago
//InitBuban103InfoFromTempletFileEx(commid, szTemplate, &pPortParam->m_psLink[i], TRUE);
//InitBuban103InfoFromDat(commid, &pPortParam->m_psLink[i]);
if(FALSE == InitBuban103InfoFromTempletFileEx(commid, szTemplate, &pPortParam->m_psLink[i], TRUE))
{
pPortParam->m_iLinkNum = i;
break;
}
else
{
InitBuban103InfoFromDat(commid, &pPortParam->m_psLink[i]);
}
}
}
// wen 2005.05.17 重新计算数据库点的位置
2 years ago
ReCalcDevPntStart(commid, pPortParam);
InitBuban103CmdBuf(commid, pPortParam);
// 初始化单向链表链表最大数量为10个
2 years ago
for(i=0; i<pPortParam->m_iLinkNum; i++)
{
if(pPortParam->m_psLink[i].m_psProvDev == NULL)
{
break;
}
for(j=0; j<pPortParam->m_psLink[i].m_iDevNum; j++)
{
iDevId = (commid<<16) + (i<<8) + j;
SingleListInitEx(&pPortParam->m_psLink[i].m_psProvDev[j].m_sBaoHuData, 10, iDevId);
}
}
//Buban103DispConfig(commid, pPortParam);
}
//********************************************************************
//* 读取端口数据函数 *
//*参数int commid : 端口号 *
//* u_char buf : 数据源缓冲区指针 *
//* int len : 数据源长度 *
2 years ago
//********************************************************************
void Buban103RecvData(int commid, u_char *buf, int len)// 规约读数据处理
2 years ago
{
int i;
pBUBAN103PORTPARAM pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
if(!IsExtInfoPtr(commid))
return;
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
for(i=0; i<len; i++)
{
switch(pPortParam->m_psBaoHu->m_iRevStatus)
{
case 0:// 0x10 / 0x68
pPortParam->m_iRecvLen = 0;
if(buf[i] == 0x10)
{
pPortParam->m_psBaoHu->m_iRevStatus = 4;
pPortParam->m_psBaoHu->m_iNeedRevLength = 4;
pPortParam->m_achRecvBuf[pPortParam->m_iRecvLen++] = buf[i];
}
else if(buf[i] == 0x68)
{
pPortParam->m_psBaoHu->m_iRevStatus++;
pPortParam->m_achRecvBuf[pPortParam->m_iRecvLen++] = buf[i];
}
else
{
// 错误数据增加
2 years ago
SioParam[commid].ErrMsgNum++;
}
break;
case 1:
case 2:
pPortParam->m_psBaoHu->m_iRevStatus++;
pPortParam->m_achRecvBuf[pPortParam->m_iRecvLen++] = buf[i];
break;
case 3:// 长度计算
2 years ago
if(buf[i] == 0x68)
{
if(pPortParam->m_achRecvBuf[1] != pPortParam->m_achRecvBuf[2])
{
pPortParam->m_psBaoHu->m_iRevStatus=1;
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
Buban103ProcessData(commid, pPortParam, FALSE);
pPortParam->m_iRecvLen = 0;
pPortParam->m_achRecvBuf[pPortParam->m_iRecvLen++] = buf[i];
}
else
{
pPortParam->m_psBaoHu->m_iRevStatus++;
pPortParam->m_achRecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_psBaoHu->m_iNeedRevLength = (BYTE)(pPortParam->m_achRecvBuf[1])+2;
}
}
else
{
pPortParam->m_achRecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_psBaoHu->m_iRevStatus=5;
}
break;
case 4:// 正确接收数据
2 years ago
pPortParam->m_psBaoHu->m_iNeedRevLength--;
pPortParam->m_achRecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(pPortParam->m_psBaoHu->m_iNeedRevLength > 0)
break;
if(buf[i] != 0x16)
{
pPortParam->m_psBaoHu->m_iRevStatus=5;
break;
}
if(Buban103Check(pPortParam->m_achRecvBuf, pPortParam->m_iRecvLen) == TRUE)
{
Buban103ProcessData(commid, pPortParam, TRUE);
pPortParam->m_psBaoHu->m_iRevStatus = 0;
pPortParam->m_psBaoHu->RevCmdFlag = 1;
}
else
{
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
SioParam[commid].LostSyncCnt++;
pPortParam->m_psBaoHu->m_iRevStatus = 5;
}
#ifndef OS_LINUX
if((GetCurPort() == commid) && IsRealDataDisp())
{
// WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
// (BYTE *)pPortParam->m_achRecvBuf, pPortParam->m_iRecvLen);
2 years ago
}
#endif
break;
case 5:// 错误接收数据
2 years ago
default:
pPortParam->m_achRecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(buf[i] == 0x16)
{
#ifndef OS_LINUX
// wen 2004.11.22 增加显示
2 years ago
if((GetCurPort() == commid) && IsRealDataDisp())
{
#if 0
2 years ago
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_achRecvBuf, pPortParam->m_iRecvLen);
#endif
2 years ago
}
#endif
Buban103ProcessData(commid, pPortParam, FALSE);
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
pPortParam->m_psBaoHu->m_iRevStatus = 0;
pPortParam->m_iRecvLen = 0;
}
else
{
if(pPortParam->m_iRecvLen > 200)
{
#ifndef OS_LINUX
// wen 2004.11.22 增加显示
2 years ago
if((GetCurPort() == commid) && IsRealDataDisp())
{
#if 0
2 years ago
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_achRecvBuf, pPortParam->m_iRecvLen);
#endif
2 years ago
}
#endif
Buban103ProcessData(commid, pPortParam, FALSE);
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
pPortParam->m_iRecvLen = 0;
}
}
break;
}
}
#ifdef _DEBUG_MSG_
sprintf(szbuf, "wen: commid = %d, send=%d, recv=%d, error=%d, lost=%d\n", commid,
SioParam[commid].SendCharNum, SioParam[commid].RecvCharNum,
SioParam[commid].ErrMsgNum, SioParam[commid].LostSyncCnt);
DebugPrint(szbuf);
#endif
}
//********************************************************************
//* 定时器处理函数 *
//*参数int commid : 端口号 *
2 years ago
//********************************************************************
void Buban103Timer(int commid)
{
BUBAN103PORTPARAM *pPortParam;
BUBAN103LINKDEF *pLinkParam;
if(IsExtInfoPtr(commid) == FALSE)
{
return;
}
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
// wen 2005.06.22 链路数据为0直接退出
2 years ago
if(pPortParam->m_iLinkNum <= 0)
{
return;
}
// 如果为转发端口,则不进行轮询指令的生成。
2 years ago
if(PROTOCOL_SLAVE != pPortParam->m_psBaoHu->PortType)
{
pLinkParam = &pPortParam->m_psLink[pPortParam->m_iLinkIdx];
if(IsDevLinkOk(pLinkParam, pPortParam->m_iLinkIdx) == TRUE)
{
if(pLinkParam->m_uchLinkAddr != 0xFF)
{
if(IsLinkTimeOut(pLinkParam, 0) == TRUE)
{
InitBuban103CmdBuf(commid, pPortParam);
}
}
else
{
if(IsLinkTimeOut(pLinkParam, pPortParam->m_iLinkIdx) == TRUE)
{
InitBuban103DevCmdBuf(pLinkParam, pLinkParam->m_iDevIdx);
}
}
}
//Buban103FindNextCmd(commid);
if(TRUE == Buban103FindNextCmdEx(commid))
{
Buban103CalcNextDev(commid, FALSE);
}
}
Buban103SendCmdFormPollCmdBuf(commid);
}
//********************************************************************
//* 遥控遥调数据处理函数 *
//*参数int commid : 端口号 *
//* u_char buf : 数据源缓冲区指针 *
//* int len : 数据源长度 *
2 years ago
//********************************************************************
void Buban103YkYtProcess(int commid, u_char *buf, int len) // 遥控遥调处理
2 years ago
{
int iDirect,portno, ykytpnt;
u_char asdu, dco;
CASDU20 bCAsdu20;
YKYT_PARAM YkYtParam;
DEVDEF *pDevParam;
DEVADDRPARAM sAddrParam;
BUBAN103PORTPARAM *pPortParam;
char szbuf[128];
// buf[0] --- 端口号(=commid)
2 years ago
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- 控点号
2 years ago
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- 操作类型(遥控:1=选择,2=执行,3=取消,7=直控;
// 遥调:4=选择,5=执行,6=取消,8=急停)
// buf[9] --- 控制状态(1=分到合2=合到分)
// (最高位为1时为返校命令, 1=控合, 2=控分, 3=失败)
// 在转发遥控数据点中,只保留了要转发的控点号,实际的端口号应该是该转发点的端口
// 该转发点并没有指定虚拟的转发控点,则控点和转发点的点号一致。
2 years ago
if(IsExtInfoPtr(commid) == FALSE)
{
return;
}
iDirect = buf[9] & 0x80;
portno = buf[0]+buf[1]*256+buf[2]*65536+buf[3]*16777216;
ykytpnt = buf[4]+buf[5]*256+buf[6]*65536+buf[7]*16777216;
//ykytpnt--;
// 返校信息(反馈信号)
2 years ago
if(iDirect)
{
if((buf[8] == STEP_YKYT_SELECT) || (buf[8] == STEP_YKYT_SELECT+3))
{
YkYtParam.m_iYkYtPnt = ykytpnt;
YkYtParam.m_iYkYtStep = buf[8];
YkYtParam.m_iYkYtUpDown = YKYT_SEND_UP;
YkYtParam.m_iYkYtOperate = buf[9];
SendYkYtCommand2(commid, &YkYtParam);
#ifdef _WIN32
sprintf(szbuf, "WARN(%04d): 转发遥控预令反校成功.\n", _getpid());
#else
sprintf(szbuf, "WARN(%04d): 转发遥控预令反校成功.\n", getpid());
#endif
2 years ago
DebugPrint(szbuf);
return;
}
Buban103ProvMakeYkYtCommand(commid, buf, len);
return;
}
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
// 返校失败
// 条件: 端口链路状态为假或者未找到合适的控点
2 years ago
if(FALSE == FindProtectDevFromYkYtPnt(pPortParam, &sAddrParam, ykytpnt))
{
YkYtParam.m_iYkYtPnt = ykytpnt;
YkYtParam.m_iYkYtStep = buf[8];
YkYtParam.m_iYkYtUpDown = YKYT_SEND_UP;
YkYtParam.m_iYkYtOperate = 3;
SendYkYtCommand2(commid, &YkYtParam);
return;
}
else if(FALSE == IsDevLinkOk(&pPortParam->m_psLink[sAddrParam.m_iLinkIdx], sAddrParam.m_iDevIdx))
{
YkYtParam.m_iYkYtPnt = ykytpnt;
YkYtParam.m_iYkYtStep = buf[8];
YkYtParam.m_iYkYtUpDown = YKYT_SEND_UP;
YkYtParam.m_iYkYtOperate = 3;
SendYkYtCommand2(commid, &YkYtParam);
return;
}
pDevParam = &pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_psDev[sAddrParam.m_iDevIdx];
asdu = pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Asdu;
// 操作类型
2 years ago
switch(buf[8])
{
case STEP_YKYT_SELECT:
case STEP_YKYT_SELECT+3://选择
2 years ago
if((C_DC_NA_3 != asdu) && (C_RC_NA_3 != asdu))
{// 直控方式
2 years ago
YkYtParam.m_iYkYtPnt = ykytpnt;
YkYtParam.m_iYkYtStep = buf[8];
YkYtParam.m_iYkYtUpDown = YKYT_SEND_UP;
YkYtParam.m_iYkYtOperate = buf[9];
SendYkYtCommand2(commid, &YkYtParam);
}
else
{
ykytpnt -= pDevParam->m_sDevParam.m_sYkDBOrientation.m_iStartPntNo;
bCAsdu20.nTYP = asdu; //类型标识
bCAsdu20.nVSQ = 0x01; //可变结构限定词
bCAsdu20.nCOT = 0x0c; //传送原因
bCAsdu20.nADDR = pDevParam->m_sDevParam.m_u8DevAddr; //应用服务数据单元公共地址
bCAsdu20.nFUN = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Fun;//功能类型
bCAsdu20.nINF = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Inf;//信息序号
2 years ago
if(buf[9] == 2)
{
bCAsdu20.nDCO = 0x81; //控制断路器(控分)
2 years ago
}
else
{
bCAsdu20.nDCO = 0x82; //控制断路器(控合)
2 years ago
}
bCAsdu20.nRII = (BYTE)sAddrParam.m_iLinkIdx;//返回信息标识符
2 years ago
if(pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr == 255)
{
MakeBuban103LinkCommand(commid, pDevParam->m_sDevParam.m_u8DevAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), INSERT_POLL_CMD);
}
else
{
MakeBuban103LinkCommand(commid, \
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), INSERT_POLL_CMD);
}
YkYtParam.m_iYkYtPnt = ykytpnt;
YkYtParam.m_iYkYtStep = buf[8];
YkYtParam.m_iYkYtUpDown = YKYT_SEND_UP;
YkYtParam.m_iYkYtOperate = buf[9];
SendYkYtCommand2(commid, &YkYtParam);
}
break;
case STEP_YKYT_EXEC:
case STEP_YKYT_EXEC+3://执行
2 years ago
//pDevParam = &pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_psDev[sAddrParam.m_iDevIdx];
ykytpnt -= pDevParam->m_sDevParam.m_sYkDBOrientation.m_iStartPntNo;
// 遥控遥调不仅仅只用asdu20,还有asdu64/65等 yizhonghu 20060803
//bCAsdu20.nTYP = 20; //类型标识
bCAsdu20.nTYP = asdu; //类型标识
bCAsdu20.nVSQ = 0x81; //可变结构限定词
2 years ago
if(asdu == 20)
{
bCAsdu20.nCOT = 0x14; //传送原因
bCAsdu20.nVSQ = 0x81; //可变结构限定词
2 years ago
}
else
{
bCAsdu20.nCOT = 0x0c; //传送原因
bCAsdu20.nVSQ = 0x01; //可变结构限定词
2 years ago
}
bCAsdu20.nADDR = pDevParam->m_sDevParam.m_u8DevAddr; //应用服务数据单元公共地址
bCAsdu20.nFUN = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Fun;//功能类型
bCAsdu20.nINF = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Inf;//信息序号
2 years ago
dco = 0;
if(buf[9] == 2)
{
bCAsdu20.nDCO = (1 | dco); //控制断路器(控分)
2 years ago
}
else
{
bCAsdu20.nDCO = (2 | dco); //控制断路器(控合)
2 years ago
}
bCAsdu20.nRII = (BYTE)sAddrParam.m_iLinkIdx;//返回信息标识符
2 years ago
if(pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr == 255)
{
MakeBuban103LinkCommand(commid, pDevParam->m_sDevParam.m_u8DevAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), INSERT_POLL_CMD);
}
else
{
MakeBuban103LinkCommand(commid, \
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), INSERT_POLL_CMD);
}
break;
case STEP_YKYT_CANCEL:
case STEP_YKYT_CANCEL+3://取消
2 years ago
//pDevParam = &pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_psDev[sAddrParam.m_iDevIdx];
ykytpnt -= pDevParam->m_sDevParam.m_sYkDBOrientation.m_iStartPntNo;
bCAsdu20.nTYP = asdu; //类型标识
bCAsdu20.nVSQ = 0x01; //可变结构限定词
bCAsdu20.nCOT = 0x0c; //传送原因
bCAsdu20.nADDR = pDevParam->m_sDevParam.m_u8DevAddr; //应用服务数据单元公共地址
bCAsdu20.nFUN = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Fun;//功能类型
bCAsdu20.nINF = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Inf;//信息序号
2 years ago
dco = 0xc0;
if(buf[9] == 2)
{
bCAsdu20.nDCO = (1 | dco); //控制断路器(控分)
2 years ago
}
else
{
bCAsdu20.nDCO = (2 | dco); //控制断路器(控合)
2 years ago
}
bCAsdu20.nRII = (BYTE)sAddrParam.m_iLinkIdx;//返回信息标识符
2 years ago
if(pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr == 255)
{
MakeBuban103LinkCommand(commid, pDevParam->m_sDevParam.m_u8DevAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), INSERT_POLL_CMD);
}
else
{
MakeBuban103LinkCommand(commid, \
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), INSERT_POLL_CMD);
}
break;
case STEP_YKYT_DIRECT:// 直控
2 years ago
break;
case STEP_YKYT_STOP:// 急停
2 years ago
//pDevParam = &pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_psDev[sAddrParam.m_iDevIdx];
ykytpnt -= pDevParam->m_sDevParam.m_sYkDBOrientation.m_iStartPntNo;
bCAsdu20.nTYP = asdu; //类型标识
bCAsdu20.nVSQ = 0x01; //可变结构限定词
bCAsdu20.nCOT = 0x0c; //传送原因
bCAsdu20.nADDR = pDevParam->m_sDevParam.m_u8DevAddr; //应用服务数据单元公共地址
bCAsdu20.nFUN = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Fun;//功能类型
bCAsdu20.nINF = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Inf;//信息序号
2 years ago
dco = 0x00;
bCAsdu20.nDCO = (3 | dco); //遥调急停
bCAsdu20.nRII = (BYTE)sAddrParam.m_iLinkIdx;//返回信息标识符
2 years ago
if(pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr == 255)
{
MakeBuban103LinkCommand(commid, pDevParam->m_sDevParam.m_u8DevAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), INSERT_POLL_CMD);
}
else
{
MakeBuban103LinkCommand(commid, \
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), INSERT_POLL_CMD);
}
break;
default:
break;
}
}
//********************************************************************
//* 系统下发对时函数 *
//*参数int commid : 端口号 *
2 years ago
//********************************************************************
void Buban103SendSystemTime(int commid) // 系统对时
2 years ago
{
int i, j;
CMDPARAM sCmdParam;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
char szbuf[128];
if(IsExtInfoPtr(commid) == FALSE)
{
return;
}
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
if(2 != pPortParam->m_psBaoHu->CheckTime)
{
return;
}
sprintf(szbuf, "port=%d,CheckTime=%d",commid+1, pPortParam->m_psBaoHu->CheckTime);
DebugPrint(szbuf);
// 针对所有的装置发送对时命令
2 years ago
for(i=0; i<pPortParam->m_iLinkNum; i++)
{
pLinkParam = &pPortParam->m_psLink[i];
for(j=0; j<pLinkParam->m_iDevNum; j++)
{
pDevParam = &pLinkParam->m_psDev[j];
sCmdParam.m_sDevAddr.m_uchLinkAddr = pLinkParam->m_uchLinkAddr;
sCmdParam.m_sDevAddr.m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
sCmdParam.m_uchFun = (u_char)pDevParam->m_sDevParam.m_sSyncTimeInfo.m_u8Fun;
sCmdParam.m_uchInf = (u_char)pDevParam->m_sDevParam.m_sSyncTimeInfo.m_u8Inf;
sCmdParam.m_uchRII = pDevParam->m_u8RII;
MakeTimeSyn_CAsdu6(commid, &sCmdParam);
}
}
}
//********************************************************************
//* 系统退出时规约处理函数 *
//*参数int commid : 端口号 *
2 years ago
//********************************************************************
void Buban103Exit(int commid)
{
int i, j, k;
DBORIENTATION *pDB;
GROUPDEF *pGroup;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
if(SioParam[commid].ExtInfo == NULL)
{
return;
}
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
if(pPortParam->m_psLink == NULL)
{
return;
}
for(i=0; i<pPortParam->m_iLinkNum; i++)
{
pLinkParam = (BUBAN103LINKDEF *)(&pPortParam->m_psLink[i]);
if(pLinkParam->m_psDev != NULL)
{
for(j=0; j<pLinkParam->m_iDevNum; j++)
{
// ai
for(k=0; k<DEV_AI_MAXNUM; k++)
{
pDB = &pLinkParam->m_psDev[j].m_sDevParam.m_sAiDBOrientation[k];
if(pDB->m_psDataInfo != NULL)
{
HEAP_FREE(pDB->m_psDataInfo);
pDB->m_psDataInfo = NULL;
}
}
// di
pDB = &pLinkParam->m_psDev[j].m_sDevParam.m_sDiDBOrientation;
if(pDB->m_psDataInfo != NULL)
{
HEAP_FREE(pDB->m_psDataInfo);
pDB->m_psDataInfo = NULL;
}
// pi
pDB = &pLinkParam->m_psDev[j].m_sDevParam.m_sPiDBOrientation;
if(pDB->m_psDataInfo != NULL)
{
HEAP_FREE(pDB->m_psDataInfo);
pDB->m_psDataInfo = NULL;
}
// yk
pDB = &pLinkParam->m_psDev[j].m_sDevParam.m_sYkDBOrientation;
if(pDB->m_psDataInfo != NULL)
{
HEAP_FREE(pDB->m_psDataInfo);
pDB->m_psDataInfo = NULL;
}
// group
for(k=0; k<pLinkParam->m_psDev[j].m_sDevParam.m_iCfgGroupNum; k++)
{
pGroup = &pLinkParam->m_psDev[j].m_sDevParam.m_saGroupDef[k];
if(pGroup->m_psDataInfo != NULL)
{
HEAP_FREE(pGroup->m_psDataInfo);
pGroup->m_psDataInfo = NULL;
}
if(pGroup->m_psEventInfo != NULL)
{
HEAP_FREE(pGroup->m_psEventInfo);
pGroup->m_psEventInfo = NULL;
}
if(pGroup->m_pu8DataLen != NULL)
{
HEAP_FREE(pGroup->m_pu8DataLen);
pGroup->m_pu8DataLen = NULL;
}
if(pGroup->m_pu8DataType != NULL)
{
HEAP_FREE(pGroup->m_pu8DataType);
pGroup->m_pu8DataType = NULL;
}
if(pGroup->m_pu8GIN != NULL)
{
HEAP_FREE(pGroup->m_pu8GIN);
pGroup->m_pu8GIN = NULL;
}
}
if(pLinkParam->m_psDev[j].m_sDisturbanceParam.m_pshValue != NULL)
{
HEAP_FREE(pLinkParam->m_psDev[j].m_sDisturbanceParam.m_pshValue);
pLinkParam->m_psDev[j].m_sDisturbanceParam.m_pshValue = NULL;
}
}
HEAP_FREE(pLinkParam->m_psDev);
pLinkParam->m_psDev = NULL;
}
if(pLinkParam->m_psProvDev != NULL)
{
for(j=0; j<pLinkParam->m_iDevNum; j++)
{
if(pLinkParam->m_psProvDev[j].m_sYxInfo.m_psDataInfo != NULL)
{
HEAP_FREE(pLinkParam->m_psProvDev[j].m_sYxInfo.m_psDataInfo);
pLinkParam->m_psProvDev[j].m_sYxInfo.m_psDataInfo = NULL;
}
if(pLinkParam->m_psProvDev[j].m_sYcInfo.m_psDataInfo != NULL)
{
HEAP_FREE(pLinkParam->m_psProvDev[j].m_sYcInfo.m_psDataInfo);
pLinkParam->m_psProvDev[j].m_sYcInfo.m_psDataInfo = NULL;
}
if(pLinkParam->m_psProvDev[j].m_sYmInfo.m_psDataInfo != NULL)
{
HEAP_FREE(pLinkParam->m_psProvDev[j].m_sYmInfo.m_psDataInfo);
pLinkParam->m_psProvDev[j].m_sYmInfo.m_psDataInfo = NULL;
}
SingleListDelAllData(&pLinkParam->m_psProvDev[j].m_sBaoHuData);
}
HEAP_FREE(pLinkParam->m_psProvDev);
pLinkParam->m_psProvDev = NULL;
}
HEAP_FREE(pLinkParam->m_pbLinkOk);
pLinkParam->m_pbLinkOk = NULL;
HEAP_FREE(pLinkParam->m_pu32LinkOkCnt);
pLinkParam->m_pu32LinkOkCnt = NULL;
HEAP_FREE(pLinkParam->m_pu8CtlByte);
pLinkParam->m_pu8CtlByte = NULL;
}
HEAP_FREE(pPortParam->m_psLink);
pPortParam->m_psLink = NULL;
}
// 该函数用来驱动由转发端口下发到实际装置的保护命令
2 years ago
void Buban103BaoHuCmdProcess(int commid, RTUMSG *rtumsg, BOOL bUpData)
{
int iProvAddr;
PROVDEVDEF *pProvDevParam;
DEVADDRPARAM sAddrParam;
BUBAN103PORTPARAM *pPortParam;
char szbuf[128];
if((MSGTYPE_BAOHU_SCADACMD == rtumsg->MsgType)
|| (MSGTYPE_BAOHU_SCADADATA == rtumsg->MsgType))
{
sprintf(szbuf, "commid%d 收到定值指令", commid);
2 years ago
DebugPrint(szbuf);
Buban103ScadaProtocolExchange(commid, rtumsg);
return;
}
if(FALSE == GetPortParamPtr(commid, &pPortParam))
{
return;
}
switch(rtumsg->MsgData[0])
{
case 0x68:// 长帧
2 years ago
iProvAddr = rtumsg->MsgData[9];
break;
case 0x10:// 短帧
2 years ago
default:
iProvAddr = -1;
break;
}
if(iProvAddr < 0)
{
return;
}
if(FALSE == FindProtectDevFromProvAddr(pPortParam, &sAddrParam, iProvAddr))
{
return;
}
// 上行数据
2 years ago
//if(MSGTYPE_BAOHU_103DATA == rtumsg->MsgType)
if(bUpData == TRUE)
{
// ??? 在这里存储保护数据(应该只有asdu10的数据类型)
2 years ago
pProvDevParam = &pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_psProvDev[sAddrParam.m_iDevIdx];
SingleListAddData(&pProvDevParam->m_sBaoHuData, rtumsg->MsgData, rtumsg->MsgLen);
return;
}
// 要进行转发数据的判断,需要在这里增加数据格式的存储,来确定转发数据的来源
2 years ago
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_sBaoHuCmdParam.m_iBaoHuCommid = rtumsg->PortIdx;
memcpy((void *)&pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_sBaoHuCmdParam.m_sRealAddrParam,
(void *)&sAddrParam, sizeof(DEVADDRPARAM));
GetLocalTimeEx(&pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_sBaoHuCmdParam.m_sBaoHuCmdStartTime);
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_sBaoHuCmdParam.m_iBaoHuMsgType = MSGTYPE_BAOHU_103CMD;
// 修改要下发的指令的地址
2 years ago
if(sAddrParam.m_uchLinkAddr != 0xFF)
{
rtumsg->MsgData[5] = sAddrParam.m_uchLinkAddr;
}
else
{
rtumsg->MsgData[5] = sAddrParam.m_uchCommAddr;
}
rtumsg->MsgData[9] = sAddrParam.m_uchCommAddr;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, (char *)rtumsg->MsgData, rtumsg->MsgLen);
}
int Buban103GetBaohuDataBase(int commid, int iProvAddr, GROUPDEF **ppBaoHuDB)
{
DEVDEF *pDevParam;
DEVADDRPARAM sAddrParam;
BUBAN103PORTPARAM *pPortParam;
if(FALSE == GetPortParamPtr(commid, &pPortParam))
{
return 0;
}
if(FALSE == FindProtectDevFromProvAddr(pPortParam, &sAddrParam, iProvAddr))
{
return 0;
}
pDevParam = &pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_psDev[sAddrParam.m_iDevIdx];
*ppBaoHuDB = pDevParam->m_sDevParam.m_saGroupDef;
return pDevParam->m_sDevParam.m_iCfgGroupNum;
}
/////////////////////////通用函数接口结束///////////////////////////////
2 years ago
void Buban103ProvMakeYkYtCommand(int commid, u_char *buf, int len)
{
// buf[0] --- 端口号(=commid)
2 years ago
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- 控点号
2 years ago
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- 操作类型(遥控:1=选择,2=执行,3=取消,7=直控;
// 遥调:4=选择,5=执行,6=取消,8=急停)
// buf[9] --- 控制状态(1=分到合2=合到分, 0=失败)
// (最高位为1时为返校命令)
// 在转发遥控数据点中,只保留了要转发的控点号,实际的端口号应该是该转发点的端口
// 该转发点并没有指定虚拟的转发控点,则控点和转发点的点号一致。
2 years ago
int ykytpnt;
u_char asdu;
CASDU20 bCAsdu20;
DEVDEF *pDevParam;
DEVADDRPARAM sAddrParam;
BUBAN103PORTPARAM *pPortParam;
if((buf[8] != STEP_YKYT_EXEC)\
&& (buf[8] != STEP_YKYT_EXEC+3)
&& (buf[8] != STEP_YKYT_DIRECT))
{
return;
}
if(IsExtInfoPtr(commid) == FALSE)
{
return;
}
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
ykytpnt = buf[4]+buf[5]*256+buf[6]*65536+buf[7]*16777216;
if(FALSE == FindProtectDevFromYkYtPnt(pPortParam, &sAddrParam, ykytpnt))
{
return;
}
pDevParam = &pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_psDev[sAddrParam.m_iDevIdx];
ykytpnt -= pDevParam->m_sDevParam.m_sYkDBOrientation.m_iStartPntNo;
asdu = pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Asdu;
// 遥控的类型标识不仅仅有20还有64/65 yizhonghu 20060803
//bCAsdu20.nTYP = 20; //类型标识
bCAsdu20.nTYP = asdu; //类型标识
2 years ago
if(asdu != 20)
{
bCAsdu20.nVSQ = 0x01; //可变结构限定词
bCAsdu20.nCOT = 0x0c; //传送原因
2 years ago
}
else
{
bCAsdu20.nVSQ = 0x81; //可变结构限定词
bCAsdu20.nCOT = 0x14; //传送原因
2 years ago
}
bCAsdu20.nADDR = pDevParam->m_sDevParam.m_u8DevAddr; //应用服务数据单元公共地址
bCAsdu20.nFUN = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Fun;//功能类型
bCAsdu20.nINF = (u_char)pDevParam->m_sDevParam.m_sYkDBOrientation.m_psDataInfo[ykytpnt].m_u8Inf;//信息序号
2 years ago
if(buf[9] == 2)
{
bCAsdu20.nDCO = 1; //控制断路器(控分)
2 years ago
}
else
{
bCAsdu20.nDCO = 2; //控制断路器(控合)
2 years ago
}
bCAsdu20.nRII = pDevParam->m_u8RII;//返回信息标识符
2 years ago
if(pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr == 255)
{
MakeBuban103LinkCommand(commid, pDevParam->m_sDevParam.m_u8DevAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), FAST_POLL_CMD);
}
else
{
MakeBuban103LinkCommand(commid, \
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_uchLinkAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu20, sizeof(CASDU20), FAST_POLL_CMD);
}
}
//********************************************************************
//* 初始化装置参数函数 *
//*参数DEVPARAMDEF *psDevParam : 装置参数指针 *
2 years ago
//********************************************************************
void SetProtectDevStatus(BUBAN103LINKDEF *psLinkParam, int iDevNo, BOOL bStatus)
{
DI_DEF pntmsg;
DEVDEF *psDevDef;
if(psLinkParam->m_psDev == NULL)
{
return;
}
if(bStatus == TRUE)
{
pntmsg.Status = 1;
}
else
{
pntmsg.Status = 0;
}
psDevDef = &psLinkParam->m_psDev[iDevNo];
if(psLinkParam->m_iInputStationOfDevStatus > 0)
{
SetPntMsg(psLinkParam->m_iInputStationOfDevStatus-1,
psLinkParam->m_iInputStartPntOfDevStatus+iDevNo,
(void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
}
//===========================以下为装置初始化函数=====================
2 years ago
//********************************************************************
//* 初始化装置参数函数 *
//*参数DEVPARAMDEF *psDevParam : 装置参数指针 *
2 years ago
//********************************************************************
void InitDevParam(DEVPARAMDEF *psDevParam)
{
psDevParam->m_u8SCN = 0;
psDevParam->m_sSyncTimeInfo.m_u8Fun = 255;
psDevParam->m_u8CPUNo = 1;
psDevParam->m_u8FixNo = 1;
}
//********************************************************************
//* 读取模板文件信息函数 *
//*参数int commid : 端口号 *
//* char *ptrTemplate : 模板文件名称 *
//* BUBAN103LINKDEF *psLink : 要配置端口的参数指针 *
2 years ago
//********************************************************************
BOOL InitBuban103InfoFromTempletFile(int commid,
char *ptrTemplate,
BUBAN103LINKDEF *psLink)
{
int i;
char *ptr;
char szBuf[512];
BOOL bVal;
HDSFILE hFile;
enum Param_Type ParamType;
hFile = DSOpenFileEx(ptrTemplate);
if(hFile == NULL)
{
// test
sprintf(szBuf, "open<%s> is failed.", ptrTemplate);
DebugPrint(szBuf);
return FALSE;
}
// test
sprintf(szBuf, "open<%s> is succeed.", ptrTemplate);
DebugPrint(szBuf);
ParamType = PARAM_NO;
while(TRUE)
{
ptr = DSfgets(szBuf, sizeof(szBuf), hFile);
if(!ptr)
{
break;
}
// test
//DebugPrint(szBuf);
if(strstr(ptr, "链路描述") != NULL)
2 years ago
{
//处理链路参数
2 years ago
ParamType = PARAM_LINK;
}
else if(strstr(ptr, "设备描述") != NULL)
2 years ago
{
ParamType = PARAM_DEV;
}
else if(PARAM_NO == ParamType)
{
continue;
}
switch(ParamType)
{
case PARAM_LINK:
bVal = GetLinkParamFromTemplateFile(commid, hFile, psLink);
if(TRUE == bVal)
{
if(psLink->m_iDevNum > 0)
{
psLink->m_psDev = (DEVDEF *)HEAP_MALLOC(psLink->m_iDevNum*sizeof(DEVDEF));
Buban103DispMalloc(commid, psLink->m_iDevNum*sizeof(DEVDEF));
if(psLink->m_psDev == NULL)
{
psLink->m_iDevNum = 0;
}
memset((void *)psLink->m_psDev, 0, psLink->m_iDevNum*sizeof(DEVDEF));
if(psLink->m_uchLinkAddr == 0xFF)
{
psLink->m_pbLinkOk = (BOOL *)HEAP_MALLOC(psLink->m_iDevNum*sizeof(BOOL));
memset((void *)psLink->m_pbLinkOk, 0, psLink->m_iDevNum*sizeof(BOOL));
Buban103DispMalloc(commid, psLink->m_iDevNum*sizeof(BOOL));
psLink->m_pu32LinkOkCnt = (u_32 *)HEAP_MALLOC(psLink->m_iDevNum*sizeof(u_32));
memset((void *)psLink->m_pu32LinkOkCnt, 0, psLink->m_iDevNum*sizeof(u_32));
Buban103DispMalloc(commid, psLink->m_iDevNum*sizeof(u_32));
psLink->m_pu8CtlByte = (BYTE *)HEAP_MALLOC(psLink->m_iDevNum*sizeof(u_char));
memset(psLink->m_pu8CtlByte, 0, psLink->m_iDevNum*sizeof(u_char));
Buban103DispMalloc(commid, psLink->m_iDevNum*sizeof(u_char));
}
else
{
psLink->m_pbLinkOk = (BOOL *)HEAP_MALLOC(sizeof(BOOL));
psLink->m_pbLinkOk[0] = FALSE;
Buban103DispMalloc(commid, sizeof(BOOL));
psLink->m_pu32LinkOkCnt = (u_32 *)HEAP_MALLOC(sizeof(u_32));
psLink->m_pu32LinkOkCnt[0] = 0;
Buban103DispMalloc(commid, sizeof(u_32));
psLink->m_pu8CtlByte = (BYTE *)HEAP_MALLOC(sizeof(u_char));
psLink->m_pu8CtlByte[0] = 0;
Buban103DispMalloc(commid, sizeof(u_char));
}
for(i=0; i<psLink->m_iDevNum; i++)
{
InitDevParam(&psLink->m_psDev[i].m_sDevParam);
}
}
}
break;
case PARAM_DEV:
// bVal = GetDevParamFromTemplateFile(commid, hFile, psLink);
2 years ago
break;
default:
break;
}
}
DSCloseFile(hFile);
return TRUE;
}
BOOL InitBuban103InfoFromTempletFileEx(int commid,
char *ptrTemplate,
BUBAN103LINKDEF *psLink,
BOOL bMaster)
{
char *ptr;
char szBuf[512];
BOOL bVal;
HDSFILE hFile;
enum Param_Type ParamType;
if(bMaster == TRUE)
{
return InitBuban103InfoFromTempletFile(commid, ptrTemplate, psLink);
}
hFile = DSOpenFile(ptrTemplate);
if(hFile == NULL)
{
// test
sprintf(szBuf, "open<%s> is failed.", ptrTemplate);
DebugPrint(szBuf);
return FALSE;
}
// test
sprintf(szBuf, "open<%s> is succeed.", ptrTemplate);
DebugPrint(szBuf);
ParamType = PARAM_NO;
while(TRUE)
{
ptr = DSfgets(szBuf, sizeof(szBuf), hFile);
if(!ptr)
{
break;
}
// test
//DebugPrint(szBuf);
if(strstr(ptr, "链路描述") != NULL)
2 years ago
{
//处理链路参数
2 years ago
ParamType = PARAM_LINK;
}
else if(strstr(ptr, "设备描述") != NULL)
2 years ago
{
ParamType = PARAM_DEV;
}
else if(PARAM_NO == ParamType)
{
continue;
}
switch(ParamType)
{
case PARAM_LINK:
bVal = GetLinkParamFromTemplateFile(commid, hFile, psLink);
if(TRUE == bVal)
{
if(psLink->m_iDevNum > 0)
{
psLink->m_psProvDev = (PROVDEVDEF *)HEAP_MALLOC(psLink->m_iDevNum*sizeof(PROVDEVDEF));
if(psLink->m_psProvDev == NULL)
{
psLink->m_iDevNum = 0;
}
memset((void *)psLink->m_psProvDev, 0, psLink->m_iDevNum*sizeof(PROVDEVDEF));
Buban103DispMalloc(commid, psLink->m_iDevNum*sizeof(PROVDEVDEF));
if(psLink->m_uchLinkAddr == 0xFF)
{
psLink->m_pbLinkOk = (BOOL *)HEAP_MALLOC(psLink->m_iDevNum*sizeof(BOOL));
memset((void *)psLink->m_pbLinkOk, 0, psLink->m_iDevNum*sizeof(BOOL));
Buban103DispMalloc(commid, psLink->m_iDevNum*sizeof(BOOL));
psLink->m_pu32LinkOkCnt = (u_32 *)HEAP_MALLOC(psLink->m_iDevNum*sizeof(u_32));
memset((void *)psLink->m_pu32LinkOkCnt, 0, psLink->m_iDevNum*sizeof(u_32));
Buban103DispMalloc(commid, psLink->m_iDevNum*sizeof(u_32));
psLink->m_pu8CtlByte = (BYTE *)HEAP_MALLOC(psLink->m_iDevNum*sizeof(u_char));
memset(psLink->m_pu8CtlByte, 0, psLink->m_iDevNum*sizeof(u_char));
Buban103DispMalloc(commid, psLink->m_iDevNum*sizeof(u_char));
}
else
{
psLink->m_pbLinkOk = (BOOL *)HEAP_MALLOC(sizeof(BOOL));
psLink->m_pbLinkOk[0] = FALSE;
Buban103DispMalloc(commid, sizeof(BOOL));
psLink->m_pu32LinkOkCnt = (u_32 *)HEAP_MALLOC(sizeof(u_32));
psLink->m_pu32LinkOkCnt[0] = 0;
Buban103DispMalloc(commid, sizeof(u_32));
psLink->m_pu8CtlByte = (BYTE *)HEAP_MALLOC(sizeof(u_char));
psLink->m_pu8CtlByte[0] = 0;
Buban103DispMalloc(commid, sizeof(u_char));
}
}
}
break;
case PARAM_DEV:
bVal = GetProvDevParamFromTemplateFile(commid, hFile, psLink);
break;
default:
break;
}
}
DSCloseFile(hFile);
return TRUE;
}
BOOL GetParamItem(char *pSour, char **ppDest)
{
if(pSour == NULL)
{
return FALSE;
}
*ppDest = strstr(pSour, ",");
if(*ppDest == NULL)
{
return FALSE;
}
return TRUE;
}
BOOL GetParamItemEx(char *pSour, char **ppDest, const char *pSplit)
{
if(pSour == NULL)
{
return FALSE;
}
*ppDest = strstr(pSour, pSplit);
if(*ppDest == NULL)
{
return FALSE;
}
return TRUE;
}
BOOL GetLinkParamFromTemplateFile(int commid, HDSFILE hFile,\
BUBAN103LINKDEF *psLink)
{
char *ptr, *ptrSour, *ptrDest;
char szBuf[512];
int i, ilen;
BOOL bRetVal;
ptr = DSfgets(szBuf, sizeof(szBuf), hFile);
if(ptr == NULL)
{
return FALSE;
}
ptrSour = szBuf;
if(strstr(ptrSour, "LINK") == NULL)
{
return FALSE;
}
// test
//DebugPrint(szBuf);
bRetVal = TRUE;
for(i=0; i<13; i++)
{
if(GetParamItem(ptrSour, &ptrDest) == FALSE)
{
bRetVal = FALSE;
break;
}
*ptrDest = 0;
ilen = strlen(ptrSour);
switch(i)
{
case 0:// 链路描述
2 years ago
if(ilen > 0)
{
if(ilen >= sizeof(psLink->m_szLinkName))
{
ilen = sizeof(psLink->m_szLinkName)-1;
}
memcpy(psLink->m_szLinkName, ptrSour, ilen);
psLink->m_szLinkName[ilen] = 0;
}
break;
case 1:// 链路标识
2 years ago
break;
case 2:// 链路地址
2 years ago
if(ilen > 0)
{
psLink->m_uchLinkAddr = (BYTE)atoi(ptrSour);
}
else
{
psLink->m_uchLinkAddr = 255;
}
break;
case 3:// 装置数量
2 years ago
if(ilen > 0)
{
psLink->m_iDevNum = (BYTE)atoi(ptrSour);
}
break;
case 4:// 备用
2 years ago
break;
case 5:// 备用
2 years ago
break;
case 6:// 地址偏移
2 years ago
if(ilen > 0)
{
psLink->m_iProvAddrOffset = atoi(ptrSour);
}
break;
case 7:// 数据类型
2 years ago
break;
case 8:// 写入数据库站号
2 years ago
if(ilen > 0)
{
psLink->m_iInputStationOfDevStatus = atoi(ptrSour);
}
break;
case 9:// 写入数据库起始点号
2 years ago
if(ilen > 0)
{
psLink->m_iInputStartPntOfDevStatus = atoi(ptrSour);
}
break;
case 10:// 是否判断ASDU号
2 years ago
if(ilen > 0)
{
psLink->m_iJudgeAsduNo = atoi(ptrSour);
}
break;
case 11:// 是否处理扰动数据
2 years ago
if(ilen > 0)
{
psLink->m_iDisTransDataProcess = atoi(ptrSour);
}
break;
case 12:// 是否屏蔽未配置事件
2 years ago
if(ilen > 0)
{
psLink->m_iMaskNoMatchString = atoi(ptrSour);
}
break;
case 13:// 一类数据问询次数(该项不可达,在循环外处理)
2 years ago
if(ilen > 0)
{
psLink->m_iQueryNum_CLASS1_Const = atoi(ptrSour);
}
else
{
psLink->m_iQueryNum_CLASS1_Const = 1;
}
break;
}
ptrSour = ptrDest+1;
}
// 最后一项
2 years ago
if(bRetVal == TRUE)
{
// 一类数据问询次数
2 years ago
if(strlen(ptrSour) > 0)
{
psLink->m_iQueryNum_CLASS1_Const = atoi(ptrSour);
}
else
{
psLink->m_iQueryNum_CLASS1_Const = 1;
}
}
return bRetVal;
}
BOOL GetDevParamFromTemplateFile(int commid, HDSFILE hFile,\
BUBAN103LINKDEF *psLink)
{
char *ptr, *ptrSour, *ptrDest;
char szBuf[512];
int i, j, ilen, iNum;
int iAiNum, iAiStart, iDiStart;
int iPiStart, iYkStart, iPntNo;
BOOL bRetVal;
enum Param_Type ParamType;
iAiStart = 0;
iDiStart = 0;
iPiStart = 0;
iYkStart = 0;
iAiNum = 0;
ParamType = PARAM_NO;
bRetVal = TRUE;
for(i=0; i<psLink->m_iDevNum;)
{
ptr = DSfgets(szBuf, sizeof(szBuf), hFile);
if(ptr == NULL)
{
break;
}
// test
//DebugPrint(szBuf);
if(strstr(ptr, "设备描述") != NULL)
2 years ago
{
i++;
iAiNum = 0;
ParamType = PARAM_NO;
continue;
}
if(strstr(ptr, "链路描述") != NULL)
2 years ago
{
break;
}
ptrSour = ptr;
for(j=0; j<8; j++)
{
if(GetParamItem(ptrSour, &ptrDest) == FALSE)
{
bRetVal = FALSE;
break;
}
*ptrDest = 0;
ilen = strlen(ptrSour);
switch(j)
{
case 0:// 设备描述
2 years ago
if(ParamType != PARAM_NO)
{
break;
}
if(ilen > 0)
{
if(ilen >= sizeof(psLink->m_psDev[i].m_sDevParam.m_szDevName))
{
ilen = sizeof(psLink->m_psDev[i].m_sDevParam.m_szDevName)-1;
}
memcpy(psLink->m_psDev[i].m_sDevParam.m_szDevName, ptrSour, ilen);
psLink->m_psDev[i].m_sDevParam.m_szDevName[ilen] = 0;
}
break;
case 1:// 设备型号
2 years ago
if(ParamType != PARAM_NO)
{
break;
}
if(ilen > 0)
{
if(ilen >= sizeof(psLink->m_psDev[i].m_sDevParam.m_szType))
{
ilen = sizeof(psLink->m_psDev[i].m_sDevParam.m_szType)-1;
}
memcpy(psLink->m_psDev[i].m_sDevParam.m_szType, ptrSour, ilen);
psLink->m_psDev[i].m_sDevParam.m_szType[ilen] = 0;
}
else
{
strcpy(psLink->m_psDev[i].m_sDevParam.m_szType, "dat103");
}
break;
case 2:// 设备地址
2 years ago
if(ParamType != PARAM_NO)
{
break;
}
if(ilen > 0)
{
psLink->m_psDev[i].m_sDevParam.m_u8DevAddr = (BYTE)atoi(ptrSour);
}
break;
case 3:// 转发地址
2 years ago
if(PARAM_NO != ParamType)
{
break;
}
if(ilen > 0)
{
psLink->m_psDev[i].m_sDevParam.m_iProvAddr = atoi(ptrSour);
}
break;
case 4:// 备用
2 years ago
break;
case 5:// 备用
2 years ago
break;
case 6:// 数量
2 years ago
if(ilen > 0)
{
iNum = atoi(ptrSour);
}
break;
case 7:// 数据类型
2 years ago
if(iNum <= 0)
{
break;
}
if(ilen > 0)
{
if(strcmp(ptrSour, "YC") == 0)
{
ParamType = PARAM_YC;
psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_iStnNo = commid+1;
psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_iStartPntNo = iAiStart;
psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_iPntNum = iNum;
if(NULL != psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_psDataInfo)
{
HEAP_FREE(psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_psDataInfo);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_psDataInfo
// = (DBINFO *)HEAP_MALLOC(sizeof(DBINFO)*iNum);
//memset((void *)psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_psDataInfo,
// 0, sizeof(DBINFO)*iNum);
//========================================================================================
psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_psDataInfo
= (DBINFO *)HEAP_MALLOC(sizeof(DBINFO));
memset((void *)psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum].m_psDataInfo,
0, sizeof(DBINFO));
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Buban103DispMalloc(commid, sizeof(DBINFO)*iNum);
iAiStart += iNum;
iAiNum++;
iPntNo = 0;
}
else if(strcmp(ptrSour, "YX") == 0)
{
ParamType = PARAM_YX;
psLink->m_psDev[i].m_sDevParam.m_sDiDBOrientation.m_iStnNo = commid+1;
psLink->m_psDev[i].m_sDevParam.m_sDiDBOrientation.m_iStartPntNo = iDiStart;
psLink->m_psDev[i].m_sDevParam.m_sDiDBOrientation.m_iPntNum = iNum;
if(NULL != psLink->m_psDev[i].m_sDevParam.m_sDiDBOrientation.m_psDataInfo)
{
HEAP_FREE(psLink->m_psDev[i].m_sDevParam.m_sDiDBOrientation.m_psDataInfo);
}
psLink->m_psDev[i].m_sDevParam.m_sDiDBOrientation.m_psDataInfo
= (DBINFO *)HEAP_MALLOC(sizeof(DBINFO)*iNum);
memset((void *)psLink->m_psDev[i].m_sDevParam.m_sDiDBOrientation.m_psDataInfo,
0, sizeof(DBINFO)*iNum);
Buban103DispMalloc(commid, sizeof(DBINFO)*iNum);
iDiStart += iNum;
iPntNo = 0;
}
else if(strcmp(ptrSour, "YM") == 0)
{
ParamType = PARAM_YM;
psLink->m_psDev[i].m_sDevParam.m_sPiDBOrientation.m_iStnNo = commid+1;
psLink->m_psDev[i].m_sDevParam.m_sPiDBOrientation.m_iStartPntNo = iPiStart;
psLink->m_psDev[i].m_sDevParam.m_sPiDBOrientation.m_iPntNum = iNum;
if(NULL != psLink->m_psDev[i].m_sDevParam.m_sPiDBOrientation.m_psDataInfo)
{
HEAP_FREE(psLink->m_psDev[i].m_sDevParam.m_sPiDBOrientation.m_psDataInfo);
}
psLink->m_psDev[i].m_sDevParam.m_sPiDBOrientation.m_psDataInfo
= (DBINFO *)HEAP_MALLOC(sizeof(DBINFO)*iNum);
memset((void *)psLink->m_psDev[i].m_sDevParam.m_sPiDBOrientation.m_psDataInfo,
0, sizeof(DBINFO)*iNum);
Buban103DispMalloc(commid, sizeof(DBINFO)*iNum);
iPiStart += iNum;
iPntNo = 0;
}
else if(strcmp(ptrSour, "YK") == 0)
{
ParamType = PARAM_YK;
psLink->m_psDev[i].m_sDevParam.m_sYkDBOrientation.m_iStnNo = commid+1;
psLink->m_psDev[i].m_sDevParam.m_sYkDBOrientation.m_iStartPntNo = iYkStart;
psLink->m_psDev[i].m_sDevParam.m_sYkDBOrientation.m_iPntNum = iNum;
if(NULL != psLink->m_psDev[i].m_sDevParam.m_sYkDBOrientation.m_psDataInfo)
{
HEAP_FREE(psLink->m_psDev[i].m_sDevParam.m_sYkDBOrientation.m_psDataInfo);
}
psLink->m_psDev[i].m_sDevParam.m_sYkDBOrientation.m_psDataInfo
= (DBINFO *)HEAP_MALLOC(sizeof(DBINFO)*iNum);
memset((void *)psLink->m_psDev[i].m_sDevParam.m_sYkDBOrientation.m_psDataInfo,
0, sizeof(DBINFO)*iNum);
Buban103DispMalloc(commid, sizeof(DBINFO)*iNum);
iYkStart += iNum;
iPntNo = 0;
}
else if(strcmp(ptrSour, "SYNCTIME") == 0)
{
ParamType = PARAM_SYNCTIME;
iPntNo = 0;
}
else if(strcmp(ptrSour, "ASDU10") == 0)
{
ParamType = PARAM_ASDU10;
psLink->m_psDev[i].m_sDevParam.m_iCfgGroupNum = iNum;
iPntNo = 0;
}
}
break;
default:
break;
}
ptrSour = ptrDest+1;
}
switch(ParamType)
{
case PARAM_YC:
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//if(TRUE == GetInfoData(ptrSour, iPntNo,
// (DBORIENTATION *)(&psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation)))
//{
// iPntNo++;
//}
//===============================================================================================
if(iAiNum > 0)
{
GetInfoData(ptrSour, 0, (DBORIENTATION *)(&psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[iAiNum-1]));
}
else
{
GetInfoData(ptrSour, 0, (DBORIENTATION *)(&psLink->m_psDev[i].m_sDevParam.m_sAiDBOrientation[0]));
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
break;
case PARAM_YX:
if(TRUE == GetInfoData(ptrSour, iPntNo,
&psLink->m_psDev[i].m_sDevParam.m_sDiDBOrientation))
{
iPntNo++;
}
break;
case PARAM_YM:
if(TRUE == GetInfoData(ptrSour, iPntNo,
&psLink->m_psDev[i].m_sDevParam.m_sPiDBOrientation))
{
iPntNo++;
}
break;
case PARAM_YK:
if(TRUE == GetInfoData(ptrSour, iPntNo,
&psLink->m_psDev[i].m_sDevParam.m_sYkDBOrientation))
{
iPntNo++;
}
break;
case PARAM_SYNCTIME:
GetSyncTimeInfoData(ptrSour, &psLink->m_psDev[i].m_sDevParam.m_sSyncTimeInfo);
break;
case PARAM_ASDU10:
if(TRUE == GetGroupInfoData(ptrSour, iPntNo, &psLink->m_psDev[i].m_sDevParam))
{
iPntNo++;
}
break;
default:
break;
}
}
return bRetVal;
}
BOOL GetProvDevParamFromTemplateFile(int commid,HDSFILE hFile,\
BUBAN103LINKDEF *psLink)
{
char *ptr, *ptrSour, *ptrDest;
char szBuf[512];
int i, j, ilen, iNum;
int iAiNum, iAiStart, iDiStart;
int iPiStart, iYkStart, iPntNo;
BOOL bRetVal;
enum Param_Type ParamType;
iAiStart = 0;
iDiStart = 0;
iPiStart = 0;
iYkStart = 0;
iAiNum = 0;
ParamType = PARAM_NO;
bRetVal = TRUE;
for(i=0; i<psLink->m_iDevNum;)
{
ptr = DSfgets(szBuf, sizeof(szBuf), hFile);
if(ptr == NULL)
{
break;
}
// test
//DebugPrint(szBuf);
if(strstr(ptr, "设备描述") != NULL)
2 years ago
{
i++;
iAiNum = 0;
ParamType = PARAM_NO;
continue;
}
if(strstr(ptr, "链路描述") != NULL)
2 years ago
{
break;
}
ptrSour = ptr;
for(j=0; j<8; j++)
{
if(GetParamItem(ptrSour, &ptrDest) == FALSE)
{
bRetVal = FALSE;
break;
}
*ptrDest = 0;
ilen = strlen(ptrSour);
switch(j)
{
case 0:// 设备描述
2 years ago
break;
case 1:// 设备型号
2 years ago
break;
case 2:// 设备地址
2 years ago
break;
case 3:// 转发地址
2 years ago
if(PARAM_NO != ParamType)
{
break;
}
if(ilen > 0)
{
psLink->m_psProvDev[i].m_iProvAddr = atoi(ptrSour);
}
break;
case 4:// 端口号&状态站号&状态点号
2 years ago
if(PARAM_NO != ParamType)
{
break;
}
if(ilen > 0)
{
psLink->m_psProvDev[i].m_iRealCommid = atoi(ptrSour);
if(GetParamItemEx(ptrSour, &ptrDest, "&") == FALSE)
{
psLink->m_psProvDev[i].m_iStatusStn = 0;
psLink->m_psProvDev[i].m_iStatusPnt = 0;
break;
}
ptrSour = ptrDest+1;
if(strlen(ptrSour) > 0)
{
psLink->m_psProvDev[i].m_iStatusStn = atoi(ptrSour);
if(GetParamItemEx(ptrSour, &ptrDest, "&") == FALSE)
{
psLink->m_psProvDev[i].m_iStatusStn = 0;
psLink->m_psProvDev[i].m_iStatusPnt = 0;
break;
}
ptrSour = ptrDest+1;
if(strlen(ptrSour) > 0)
{
psLink->m_psProvDev[i].m_iStatusPnt = atoi(ptrSour);
}
}
}
break;
case 5:// 备用
2 years ago
break;
case 6:// 数量
2 years ago
if(ilen > 0)
{
iNum = atoi(ptrSour);
}
break;
case 7:// 数据类型
2 years ago
if(iNum <= 0)
{
break;
}
if(ilen > 0)
{
if(strcmp(ptrSour, "YC") == 0)
{
ParamType = PARAM_YC;
psLink->m_psProvDev[i].m_sYcInfo.m_iPntNum = iNum;
psLink->m_psProvDev[i].m_sYcInfo.m_iStartPntNo = 0;
psLink->m_psProvDev[i].m_sYcInfo.m_iStnNo = 0;
psLink->m_psProvDev[i].m_sYcInfo.m_psDataInfo = NULL;
iPntNo = 0;
}
else if(strcmp(ptrSour, "YX") == 0)
{
ParamType = PARAM_YX;
psLink->m_psProvDev[i].m_sYxInfo.m_iPntNum = iNum;
psLink->m_psProvDev[i].m_sYxInfo.m_iStartPntNo = 0;
psLink->m_psProvDev[i].m_sYxInfo.m_iStnNo = 0;
if(NULL != psLink->m_psProvDev[i].m_sYxInfo.m_psDataInfo)
{
HEAP_FREE(psLink->m_psProvDev[i].m_sYxInfo.m_psDataInfo);
}
psLink->m_psProvDev[i].m_sYxInfo.m_psDataInfo
= (DBINFO *)HEAP_MALLOC(sizeof(DBINFO)*iNum);
memset((void *)psLink->m_psProvDev[i].m_sYxInfo.m_psDataInfo,
0, sizeof(DBINFO)*iNum);
Buban103DispMalloc(commid, sizeof(DBINFO)*iNum);
iPntNo = 0;
}
else if(strcmp(ptrSour, "YM") == 0)
{
ParamType = PARAM_YM;
psLink->m_psProvDev[i].m_sYmInfo.m_iPntNum = iNum;
psLink->m_psProvDev[i].m_sYmInfo.m_iStartPntNo = 0;
psLink->m_psProvDev[i].m_sYmInfo.m_iStnNo = 0;
psLink->m_psProvDev[i].m_sYmInfo.m_psDataInfo = NULL;
iPntNo = 0;
}
else if(strcmp(ptrSour, "YK") == 0)
{
ParamType = PARAM_YK;
iPntNo = 0;
}
else if(strcmp(ptrSour, "SYNCTIME") == 0)
{
ParamType = PARAM_SYNCTIME;
iPntNo = 0;
}
else if(strcmp(ptrSour, "ASDU10") == 0)
{
ParamType = PARAM_ASDU10;
psLink->m_psProvDev[i].m_iAsdu10Num = iNum;
iPntNo = 0;
}
}
break;
default:
break;
}
ptrSour = ptrDest+1;
}
switch(ParamType)
{
case PARAM_YC:
break;
case PARAM_YX:
if(TRUE == GetInfoData(ptrSour, iPntNo,
&psLink->m_psProvDev[i].m_sYxInfo))
{
iPntNo++;
}
break;
case PARAM_YM:
break;
case PARAM_YK:
break;
case PARAM_SYNCTIME:
break;
case PARAM_ASDU10:
break;
default:
break;
}
}
return bRetVal;
}
BOOL GetInfoData(char *pInfo, int iPntNo, DBORIENTATION *psDB)
{
int i;
char *ptr1, *ptr2;
BOOL bRetVal;
if(pInfo == NULL)
{
return FALSE;
}
if(iPntNo >= psDB->m_iPntNum)
{
return FALSE;
}
if(psDB->m_psDataInfo == NULL)
{
return FALSE;
}
bRetVal = TRUE;
ptr1 = pInfo;
for(i=0; i<6; i++)
{
if(GetParamItem(ptr1, &ptr2) == FALSE)
{
//bRetVal = FALSE;
break;
}
*ptr2 = 0;
switch(i)
{
case 0:// 描述
2 years ago
break;
case 1:// ASDU
if(strlen(ptr1) > 0)
{
psDB->m_psDataInfo[iPntNo].m_u8Asdu = atoi(ptr1);
}
break;
case 2:// FUN
if(strlen(ptr1) > 0)
{
psDB->m_psDataInfo[iPntNo].m_u8Fun = atoi(ptr1);
}
break;
case 3:// INF
if(strlen(ptr1) > 0)
{
psDB->m_psDataInfo[iPntNo].m_u8Inf = atoi(ptr1);
}
break;
case 4:// PROV_FUN
if(strlen(ptr1) > 0)
{
psDB->m_psDataInfo[iPntNo].m_u8ProvFun = atoi(ptr1);
}
else
{
psDB->m_psDataInfo[iPntNo].m_u8ProvFun\
= (u_char)psDB->m_psDataInfo[iPntNo].m_u8Fun;
}
break;
case 5:// PROV_INF
if(strlen(ptr1) > 0)
{
psDB->m_psDataInfo[iPntNo].m_u8ProvInf = atoi(ptr1);
}
else
{
psDB->m_psDataInfo[iPntNo].m_u8ProvInf\
= (u_char)psDB->m_psDataInfo[iPntNo].m_u8Inf;
}
break;
case 6://是否总召唤数据
2 years ago
if(strlen(ptr1) > 0)
{
psDB->m_psDataInfo[iPntNo].m_u8LoopData = atoi(ptr1);
}
else
{
psDB->m_psDataInfo[iPntNo].m_u8LoopData = 0;
}
break;
default:
bRetVal = FALSE;
break;
}
ptr1 = ptr2+1;
}
// INF
if(strlen(ptr1) > 0)
{
switch(i)
{
case 3:// INF
psDB->m_psDataInfo[iPntNo].m_u8Inf = atoi(ptr1);
psDB->m_psDataInfo[iPntNo].m_u8ProvFun\
= (u_char)psDB->m_psDataInfo[iPntNo].m_u8Fun;
psDB->m_psDataInfo[iPntNo].m_u8ProvInf\
= (u_char)psDB->m_psDataInfo[iPntNo].m_u8Inf;
psDB->m_psDataInfo[iPntNo].m_u8LoopData = 0;
break;
case 4:// PROV_FUN
psDB->m_psDataInfo[iPntNo].m_u8ProvFun = atoi(ptr1);
psDB->m_psDataInfo[iPntNo].m_u8ProvInf\
= (u_char)psDB->m_psDataInfo[iPntNo].m_u8Inf;
psDB->m_psDataInfo[iPntNo].m_u8LoopData = 0;
break;
case 5:// PROV_INF
psDB->m_psDataInfo[iPntNo].m_u8ProvInf = atoi(ptr1);
psDB->m_psDataInfo[iPntNo].m_u8LoopData = 0;
break;
case 6://是否总召唤数据
2 years ago
psDB->m_psDataInfo[iPntNo].m_u8LoopData = atoi(ptr1);
break;
default:
if(i < 6)
{
bRetVal = FALSE;
}
break;
}
}
else
{
switch(i)
{
case 4:// PROV_FUN
psDB->m_psDataInfo[iPntNo].m_u8ProvFun\
= (u_char)psDB->m_psDataInfo[iPntNo].m_u8Fun;
case 5:// PROV_INF
psDB->m_psDataInfo[iPntNo].m_u8ProvInf\
= (u_char)psDB->m_psDataInfo[iPntNo].m_u8Inf;
case 6://是否总召唤数据
2 years ago
psDB->m_psDataInfo[iPntNo].m_u8LoopData = 0;
break;
default:
if(i < 6)
{
bRetVal = FALSE;
}
break;
}
}
return bRetVal;
}
BOOL GetSyncTimeInfoData(char *pInfo, DBINFO *psSyncInfo)
{
int i;
char *ptr1, *ptr2;
BOOL bRetVal;
if(pInfo == NULL)
{
return FALSE;
}
if(psSyncInfo == NULL)
{
return FALSE;
}
bRetVal = TRUE;
ptr1 = pInfo;
for(i=0; i<3; i++)
{
if(GetParamItem(ptr1, &ptr2) == FALSE)
{
bRetVal = FALSE;
break;
}
*ptr2 = 0;
switch(i)
{
case 0:// 描述
2 years ago
break;
case 1:// ASDU
if(strlen(ptr1) > 0)
{
psSyncInfo->m_u8Asdu = atoi(ptr1);
}
break;
case 2:// FUN
if(strlen(ptr1) > 0)
{
psSyncInfo->m_u8Fun = atoi(ptr1);
}
break;
default:
bRetVal = FALSE;
break;
}
ptr1 = ptr2+1;
}
// INF
if(strlen(ptr1) > 0)
{
psSyncInfo->m_u8Inf = atoi(ptr1);
}
return bRetVal;
}
BOOL GetGroupInfoData(char *pInfo, int iPntNo, DEVPARAMDEF *psDevParam)
{
int i;
char *ptr1, *ptr2;
BOOL bRetVal;
if(pInfo == NULL)
{
return FALSE;
}
if(iPntNo >= psDevParam->m_iCfgGroupNum)
{
return FALSE;
}
bRetVal = TRUE;
ptr1 = pInfo;
for(i=0; i<3; i++)
{
if(GetParamItem(ptr1, &ptr2) == FALSE)
{
bRetVal = FALSE;
break;
}
*ptr2 = 0;
switch(i)
{
case 0:// GROUPNO
if(strlen(ptr1) > 0)
{
psDevParam->m_saGroupDef[iPntNo].m_iGroupNo = atoi(ptr1);
}
break;
case 1:// DATATYPE
if(strlen(ptr1) > 0)
{
psDevParam->m_saGroupDef[iPntNo].m_iDataType = atoi(ptr1);
}
break;
case 2:// STN
if(strlen(ptr1) > 0)
{
psDevParam->m_saGroupDef[iPntNo].m_iStationNo = atoi(ptr1);
}
break;
default:
bRetVal = FALSE;
break;
}
ptr1 = ptr2+1;
}
// START_PNT
if(strlen(ptr1) > 0)
{
psDevParam->m_saGroupDef[iPntNo].m_iStartPntNo = atoi(ptr1);
}
return bRetVal;
}
BOOL InitBuban103InfoFromDat(int commid, BUBAN103LINKDEF *psLink)
{
int i, j, iMallocSize;
char szDatFile[256], szbuf[256];
//char szDbg[256];
char szSection[128];
GROUPDEF *psGroupParam;
for(i=0; i<psLink->m_iDevNum; i++)
{
#ifdef OS_LINUX
sprintf(szDatFile, "dat/%s.dat",
psLink->m_psDev[i].m_sDevParam.m_szType);
#else
sprintf(szDatFile, "%s\\dat\\%s.dat",
IniFilePath, psLink->m_psDev[i].m_sDevParam.m_szType);
#endif
for(j=0; j<psLink->m_psDev[i].m_sDevParam.m_iCfgGroupNum; j++)
{
psGroupParam = &psLink->m_psDev[i].m_sDevParam.m_saGroupDef[j];
//psGroupParam->m_pu8DataLen = NULL;
//psGroupParam->m_pu8DataType = NULL;
//psGroupParam->m_pu8GIN = NULL;
//psGroupParam->m_iPntNum = 0;
psGroupParam->m_u32CurPntNo = 1;
psGroupParam->m_bInit = FALSE;
// (缺省为5即第一个条目大于5的数据包为中间数据包)
2 years ago
psGroupParam->m_iStartItemNo = 5;
if(PROTECT_EVENT_PNT_TYPE == psGroupParam->m_iDataType)
{
psGroupParam->m_psEventInfo = (GROUPEVENTDEF *)HEAP_MALLOC(sizeof(GROUPEVENTDEF));
memset((void *)psGroupParam->m_psEventInfo, 0, sizeof(GROUPEVENTDEF));
Buban103DispMalloc(commid, sizeof(GROUPEVENTDEF));
//psGroupParam->m_psDataInfo = NULL;
}
else
{
//psGroupParam->m_psEventInfo = NULL;
//psGroupParam->m_psDataInfo = NULL;
sprintf(szSection, "组号%d", psGroupParam->m_iGroupNo);
2 years ago
szbuf[0] = 0;
GetPrivateProString(szSection, "数量", "0", szbuf, sizeof(szbuf), szDatFile);
2 years ago
//sprintf(szDbg, "[%s]:[数量] = %s\n", szSection, szbuf);
2 years ago
//DebugPrint(szDbg);
psGroupParam->m_iPntNum = atoi(szbuf);
if(psGroupParam->m_iPntNum > 0)
{
iMallocSize = psGroupParam->m_iPntNum * sizeof(GROUPDATADEF);
psGroupParam->m_psDataInfo = (GROUPDATADEF *)HEAP_MALLOC(iMallocSize);
memset((void *)psGroupParam->m_psDataInfo, 0, iMallocSize);
Buban103DispMalloc(commid, iMallocSize);
InitGroupParam(psGroupParam, szDatFile);
iMallocSize = psGroupParam->m_iPntNum * sizeof(BYTE);
psGroupParam->m_pu8GIN = (BYTE *)HEAP_MALLOC(iMallocSize);
Buban103DispMalloc(commid, iMallocSize);
if(PROTECT_FIX_PNT_TYPE == psGroupParam->m_iDataType)
{
psGroupParam->m_pu8DataLen = (BYTE *)HEAP_MALLOC(iMallocSize);
Buban103DispMalloc(commid, iMallocSize);
psGroupParam->m_pu8DataType = (BYTE *)HEAP_MALLOC(iMallocSize);
Buban103DispMalloc(commid, iMallocSize);
}
}
GetPrivateProString(szSection, "首条目号", "-1", szbuf, sizeof(szbuf), szDatFile);
2 years ago
//sprintf(szDbg, "[%s]:[首条目号] = %s\n", szSection, szbuf);
2 years ago
//DebugPrint(szDbg);
if(atoi(szbuf) > 0)
{
psGroupParam->m_iStartItemNo = atoi(szbuf);
}
}
}
}
return TRUE;
}
void InitGroupParam(GROUPDEF *psGroupParam, char *szDatFileName)
{
i_32 i, iNameLen, iFixDataType;
char szbuf[512], szSection[128], szItem[128];
char *ptrFirst, *ptrFind;
BOOL bValue;
bValue = FALSE;
sprintf(szSection, "组号%d", psGroupParam->m_iGroupNo);
2 years ago
for(i=0; i<psGroupParam->m_iPntNum; i++)
{
ptrFirst = (char *)szbuf;
sprintf(szItem, "%d", i+1);
if(GetPrivateProString(szSection, szItem, "未知名称", szbuf, sizeof(szbuf), szDatFileName) < 0)
2 years ago
{
strcpy(szbuf, "未知名称");
2 years ago
}
// 名称
2 years ago
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
{
*ptrFind = 0;
iNameLen = strlen(ptrFirst);
}
else
{
iNameLen = strlen(ptrFirst);
if(iNameLen >= sizeof(psGroupParam->m_psDataInfo[i].m_szName))
{
iNameLen = sizeof(psGroupParam->m_psDataInfo[i].m_szName)-1;
}
memcpy(psGroupParam->m_psDataInfo[i].m_szName, ptrFirst, iNameLen);
psGroupParam->m_psDataInfo[i].m_szName[iNameLen] = 0;
continue;
}
if(iNameLen >= sizeof(psGroupParam->m_psDataInfo[i].m_szName))
{
iNameLen = sizeof(psGroupParam->m_psDataInfo[i].m_szName)-1;
}
memcpy(psGroupParam->m_psDataInfo[i].m_szName, ptrFirst, iNameLen);
psGroupParam->m_psDataInfo[i].m_szName[iNameLen] = 0;
if(PROTECT_DI_PNT_TYPE == psGroupParam->m_iDataType)
{
psGroupParam->m_psDataInfo[i].m_fValue = (float)bValue;
bValue = !bValue;
}
else
{
psGroupParam->m_psDataInfo[i].m_fValue = (float)(i+1);
}
// 其他信息
2 years ago
if(PROTECT_DI_PNT_TYPE == psGroupParam->m_iDataType)
continue;
if(PROTECT_AI_PNT_TYPE == psGroupParam->m_iDataType)
{
// 序号
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
*ptrFind = 0;
else
continue;
// 占有位
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
*ptrFind = 0;
else
continue;
// 系数
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
*ptrFind = 0;
else
continue;
// 单位
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
{
*ptrFind = 0;
iNameLen = strlen(ptrFirst);
}
else
{
iNameLen = strlen(ptrFirst);
}
if(iNameLen >= sizeof(psGroupParam->m_psDataInfo[i].m_szUnit))
{
iNameLen = sizeof(psGroupParam->m_psDataInfo[i].m_szUnit)-1;
}
memcpy(psGroupParam->m_psDataInfo[i].m_szUnit, ptrFirst, iNameLen);
psGroupParam->m_psDataInfo[i].m_szUnit[iNameLen] = 0;
continue;
}
if(PROTECT_FIX_PNT_TYPE == psGroupParam->m_iDataType)
{
// 类型(AI=1, DI=2)
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
*ptrFind = 0;
else
continue;
iFixDataType = atoi(ptrFirst);
psGroupParam->m_psDataInfo[i].iFixDataType = (u_char)iFixDataType;
// 序号
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
*ptrFind = 0;
else
continue;
// 占有位
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
*ptrFind = 0;
else
continue;
// 开关量
2 years ago
if(iFixDataType == 2)
{
// 可能存在有动作描述
2 years ago
continue;
}
// 以下为模拟量初始化
// 系数(充当步长)
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
psGroupParam->m_psDataInfo[i].m_fStepValue = (float)atof(ptrFirst);
if(ptrFind)
*ptrFind = 0;
else
continue;
// 单位
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
if(ptrFind)
{
*ptrFind = 0;
iNameLen = strlen(ptrFirst);
}
else
{
iNameLen = strlen(ptrFirst);
}
if(iNameLen >= sizeof(psGroupParam->m_psDataInfo[i].m_szUnit))
{
iNameLen = sizeof(psGroupParam->m_psDataInfo[i].m_szUnit)-1;
}
memcpy(psGroupParam->m_psDataInfo[i].m_szUnit, ptrFirst, iNameLen);
psGroupParam->m_psDataInfo[i].m_szUnit[iNameLen] = 0;
if(NULL == ptrFind)
continue;
// 最小值
2 years ago
ptrFirst = ptrFind + 1;
ptrFind = strstr(ptrFirst, ",");
psGroupParam->m_psDataInfo[i].m_fMinValue = (float)atof(ptrFirst);
if(ptrFind)
{
*ptrFind = 0;
}
else
{
continue;
}
// 最大值
2 years ago
ptrFirst = ptrFind + 1;
psGroupParam->m_psDataInfo[i].m_fMaxValue = (float)atof(ptrFirst);
}
}
}
void InitBuban103CmdBuf(int commid, BUBAN103PORTPARAM *psPortParam)
{
int i;
psPortParam->m_iLinkIdx = 0;
for(i=0; i<psPortParam->m_iLinkNum; i++)
{
InitBuban103LinkCmdBuf(&psPortParam->m_psLink[i]);
}
}
void InitBuban103LinkCmdBuf(BUBAN103LINKDEF *psLinkParam)
{
int i;
psLinkParam->m_bRstLinkOk = FALSE;
psLinkParam->m_bGotoNext = FALSE;
psLinkParam->m_iQueryNum_CLASS1_Count = 0;
psLinkParam->m_iDevIdx = 0;
psLinkParam->m_iQueryedAddr_CLASS1 = 0;
psLinkParam->m_shCurCmdIdx = 0;
if(psLinkParam->m_uchLinkAddr != 0xFF)
{
psLinkParam->m_pu8CtlByte[0] = 0x00;
psLinkParam->m_pbLinkOk[0] = FALSE;
psLinkParam->m_pu32LinkOkCnt[0] = 0;
}
else
{
for(i=0; i<psLinkParam->m_iDevNum; i++)
{
psLinkParam->m_pu8CtlByte[i] = 0x00;
psLinkParam->m_pbLinkOk[i] = FALSE;
psLinkParam->m_pu32LinkOkCnt[i] = 0;
}
}
// 初始化指令队列
2 years ago
for(i=0; i<BUBAN103_TIMER_CMD_NUM; i++)
{
if(psLinkParam->m_sArrayCmdTime[i].m_iCmdTimerConst > 20)
{
psLinkParam->m_sArrayCmdTime[i].m_iCmdTimerCnt
= psLinkParam->m_sArrayCmdTime[i].m_iCmdTimerConst-20;
}
else
{
psLinkParam->m_sArrayCmdTime[i].m_iCmdTimerCnt
= psLinkParam->m_sArrayCmdTime[i].m_iCmdTimerConst;
}
}
for(i=0; i<psLinkParam->m_iDevNum; i++)
{
InitBuban103DevCmdBuf(psLinkParam, i);
}
}
void InitBuban103DevCmdBuf(BUBAN103LINKDEF *psLinkParam, int iDevNo)
{
DEVDEF *psDevDef;
PROVDEVDEF *psProvDevParam;
SetProtectDevStatus(psLinkParam, iDevNo, FALSE);
if(psLinkParam->m_psDev != NULL)
{
psDevDef = &psLinkParam->m_psDev[iDevNo];
}
else
{
psDevDef = NULL;
}
if(psLinkParam->m_psProvDev != NULL)
{
psProvDevParam = &psLinkParam->m_psProvDev[iDevNo];
}
else
{
psProvDevParam = NULL;
}
// 链路地址为255则每个装置都是链路装置
2 years ago
if(psLinkParam->m_uchLinkAddr == 0xFF)
{
psLinkParam->m_pbLinkOk[iDevNo] = FALSE;
psLinkParam->m_pu32LinkOkCnt[iDevNo] = 0;
psLinkParam->m_pu8CtlByte[iDevNo] = 0;
}
if(psDevDef != NULL)
{
psDevDef->m_bAllQueryOk = TRUE;
psDevDef->m_bInitdata = FALSE;
if(psLinkParam->m_u32TimeOutConst > 10)
{
psDevDef->m_u32CallCnt
= psLinkParam->m_u32TimeOutConst-5;
}
else
{
psDevDef->m_u32CallCnt = 0;
}
psDevDef->m_u8RII = 0;
psDevDef->m_sDevParam.m_iFaultNo = -1;
psDevDef->m_sDevParam.m_u32FuncCode = 0;
if(psDevDef->m_sDisturbanceParam.m_pshValue != NULL)
{
HEAP_FREE(psDevDef->m_sDisturbanceParam.m_pshValue);
}
memset((void *)&psDevDef->m_sDisturbanceParam, 0, sizeof(BUBAN103DISTURBANCEDEF));
}
if(psProvDevParam != NULL)
{
memset((void *)&psProvDevParam->m_sProvGroupParam, 0, sizeof(PROV_ALLITEMOFGROUPPARAM));
psProvDevParam->m_sProvGroupParam.m_bFinished = TRUE;
psProvDevParam->m_sProvSoe.m_shFront = 0;
psProvDevParam->m_sProvSoe.m_shRear = 0;
psProvDevParam->m_sProvSoe.m_shSoeNum = 0;
// 转发
2 years ago
psProvDevParam->m_bProvQuery = FALSE;
psProvDevParam->m_iProvAsdu5Cause = 0;
psProvDevParam->m_iProvQueryStepWithASDU = 0;
// wen 2005.06.22 不可以在这里初始化链表
// 初始化单向链表链表最大数量为10个
2 years ago
//SingleListInit(&psProvDevParam->m_sBaoHuData, 10);
}
}
void ReCalcDevPntStart(int commid, BUBAN103PORTPARAM *psPortParam)
{
int i, j, k;
int iAiStart, iDiStart;
int iPiStart, iYkStart;
BOOL bSlave;
DEVDEF *pDevParam=NULL;
PROVDEVDEF *pProvDevParam=NULL;
iAiStart = 0;
iDiStart = 0;
iPiStart = 0;
iYkStart = 0;
if(psPortParam->m_psLink[0].m_psDev != NULL)
{
bSlave = FALSE;
pProvDevParam = NULL;
}
if(psPortParam->m_psLink[0].m_psProvDev != NULL)
{
bSlave = TRUE;
pDevParam = NULL;
}
for(i=0; i<psPortParam->m_iLinkNum; i++)
{
for(j=0; j<psPortParam->m_psLink[i].m_iDevNum; j++)
{
if(FALSE == bSlave)
{
pDevParam = &psPortParam->m_psLink[i].m_psDev[j];
}
else
{
pProvDevParam = &psPortParam->m_psLink[i].m_psProvDev[j];
}
if(pDevParam != NULL)
{
// ai
for(k=0; k<DEV_AI_MAXNUM; k++)
{
if(pDevParam->m_sDevParam.m_sAiDBOrientation[k].m_iPntNum <= 0)
{
break;
}
pDevParam->m_sDevParam.m_sAiDBOrientation[k].m_iStartPntNo = iAiStart;
iAiStart += pDevParam->m_sDevParam.m_sAiDBOrientation[k].m_iPntNum;
}
// di
if(pDevParam->m_sDevParam.m_sDiDBOrientation.m_iPntNum > 0)
{
pDevParam->m_sDevParam.m_sDiDBOrientation.m_iStartPntNo = iDiStart;
iDiStart += pDevParam->m_sDevParam.m_sDiDBOrientation.m_iPntNum;
}
// pi
if(pDevParam->m_sDevParam.m_sPiDBOrientation.m_iPntNum > 0)
{
pDevParam->m_sDevParam.m_sPiDBOrientation.m_iStartPntNo = iPiStart;
iPiStart += pDevParam->m_sDevParam.m_sPiDBOrientation.m_iPntNum;
}
if(pDevParam->m_sDevParam.m_sYkDBOrientation.m_iPntNum > 0)
{
pDevParam->m_sDevParam.m_sYkDBOrientation.m_iStartPntNo = iYkStart;
iYkStart += pDevParam->m_sDevParam.m_sYkDBOrientation.m_iPntNum;
}
}
if(pProvDevParam != NULL)
{
// ai
if(pProvDevParam->m_sYcInfo.m_iPntNum > 0)
{
pProvDevParam->m_sYcInfo.m_iStartPntNo = iAiStart;
iAiStart += pProvDevParam->m_sYcInfo.m_iPntNum;
}
// di
if(pProvDevParam->m_sYxInfo.m_iPntNum > 0)
{
pProvDevParam->m_sYxInfo.m_iStartPntNo = iDiStart;
iDiStart += pProvDevParam->m_sYxInfo.m_iPntNum;
}
// Pi
if(pProvDevParam->m_sYmInfo.m_iPntNum > 0)
{
pProvDevParam->m_sYmInfo.m_iStartPntNo = iPiStart;
iPiStart += pProvDevParam->m_sYmInfo.m_iPntNum;
}
}
}
}
}
//===========================装置初始化函数结束=======================
2 years ago
//===========================以下为指令生成函数=======================
2 years ago
//**************************************************************************
//* 生成 Buban103协议链路层命令 *
//*参数u_32 commid:RTU端口号 *
//* BYTE bLinkAddr:链路地址 *
//* u_char link_cmd_idx:链路层命令索引 *
//* u_char *msg:应用层命令信息,即应用服务数据单元,如果使用固定 *
//* 长度的帧格式则用NULL调用 *
//* u_32 len:应用层命令信息的长度如果使用固定长度的帧格式则用0调用*
//* u_32 cmdtype: 指令缓冲区类型 *
2 years ago
//**************************************************************************
void MakeBuban103LinkCommand(u_32 commid, BYTE bLinkAddr, u_char link_cmd_idx,
u_char* msg, u_32 len, u_32 cmdtype)
{
u_char tmp[MAX_POLL_CMD_BUF_LEN], nCs, nEnd;
CLPDU_FIX bClpdu_fix;
CLPDU_VARR bClpdu_varr;
memset(&bClpdu_fix, 0, sizeof(CLPDU_FIX));
memset(&bClpdu_varr, 0, sizeof(CLPDU_VARR));
memset(tmp, 0, sizeof(tmp));
switch(link_cmd_idx)
{
case C_RLK_NA_3: // 请求链路状态
2 years ago
bClpdu_fix.nSTART = 0x10;
bClpdu_fix.nCONTROL = C_RLK_NA_3 | 0x40;
bClpdu_fix.nADDR = bLinkAddr;
bClpdu_fix.nCS = CalBuban103Lpc(&bClpdu_fix.nCONTROL, 2);
bClpdu_fix.nEnd = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, (char*)&bClpdu_fix, 5);
break;
case C_RFB_NA_3: // 复位帧计数位
2 years ago
bClpdu_fix.nSTART = 0x10;
bClpdu_fix.nCONTROL = C_RFB_NA_3 | 0x40;
bClpdu_fix.nADDR = bLinkAddr;
bClpdu_fix.nCS = CalBuban103Lpc(&bClpdu_fix.nCONTROL, 2);
bClpdu_fix.nEnd = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, (char*)&bClpdu_fix, 5);
break;
case C_RCU_NA_3: // 复位通讯单元
2 years ago
bClpdu_fix.nSTART = 0x10;
bClpdu_fix.nCONTROL = C_RCU_NA_3 | 0x40;
bClpdu_fix.nADDR = bLinkAddr;
bClpdu_fix.nCS = CalBuban103Lpc(&bClpdu_fix.nCONTROL, 2);
bClpdu_fix.nEnd = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, (char*)&bClpdu_fix, 5);
break;
case C_PL1_NA_3: // 召唤1级用户数据
2 years ago
bClpdu_fix.nSTART = 0x10;
bClpdu_fix.nCONTROL = C_PL1_NA_3 | 0x50;
bClpdu_fix.nADDR = bLinkAddr;
bClpdu_fix.nCS = CalBuban103Lpc(&bClpdu_fix.nCONTROL, 2);
bClpdu_fix.nEnd = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, (char*)&bClpdu_fix, 5);
break;
case C_PL2_NA_3: // 召唤2级用户数据
2 years ago
bClpdu_fix.nSTART = 0x10;
bClpdu_fix.nCONTROL = C_PL2_NA_3 | 0x50;
bClpdu_fix.nADDR = bLinkAddr;
bClpdu_fix.nCS = CalBuban103Lpc(&bClpdu_fix.nCONTROL, 2);
bClpdu_fix.nEnd = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, (char*)&bClpdu_fix, 5);
break;
case C_SD1_NA_3: // 传送数据(发送/确认帧)
2 years ago
bClpdu_varr.nSTART1 = 0x68;
bClpdu_varr.nSTART2 = 0x68;
if(len != 0)
{
bClpdu_varr.nLEN1 = (BYTE)(len + 2);
bClpdu_varr.nLEN2 = bClpdu_varr.nLEN1;
}
bClpdu_varr.nCONTROL = C_SD1_NA_3 | 0x50;
bClpdu_varr.nADDR = bLinkAddr;
memcpy(tmp,(char*)&bClpdu_varr,sizeof(bClpdu_varr));
memcpy(&tmp[6],msg,len);
nCs = CalBuban103Lpc(tmp, bClpdu_varr.nLEN1);
nEnd = 0x16;
tmp[len+6] = nCs;
tmp[len+7] = nEnd;
PutPollCmdToBuf(commid, cmdtype, 0, (char*)tmp, len+8);
break;
case C_SD2_NA_3: // 传送数据(发送/无回答帧)
2 years ago
bClpdu_varr.nSTART1 = 0x68;
bClpdu_varr.nSTART2 = 0x68;
if(len != 0)
{
bClpdu_varr.nLEN1 = (BYTE)(len + 2);
bClpdu_varr.nLEN2 = bClpdu_varr.nLEN1;
}
bClpdu_varr.nCONTROL = C_SD2_NA_3 | 0x40;
bClpdu_varr.nADDR = bLinkAddr;
memcpy(tmp,(char*)&bClpdu_varr,sizeof(bClpdu_varr));
memcpy(&tmp[6],msg,len);
nCs = CalBuban103Lpc(tmp, bClpdu_varr.nLEN1);
nEnd = 0x16;
tmp[len+6] = nCs;
tmp[len+7] = nEnd;
PutPollCmdToBuf(commid, cmdtype, 0, (char*)tmp, len+8);
break;
default:
break;
}
}
//*************************************************************
//* 生成时间同步命令 *
//*参数:u_32 commid:RTU端口号 *
//* u_char addr:间隔设备地址
2 years ago
//*************************************************************
void MakeTimeSyn_CAsdu6(u_32 commid, CMDPARAM *psCmdParam)
{
CASDU6 bCAsdu6;
DAY_TIME sCurTime;
char szbuf[128];
memset(&bCAsdu6,0,sizeof(CASDU6));
bCAsdu6.nTYP = C_SYN_TA_3;
bCAsdu6.nVSQ = 0x81;
bCAsdu6.nCOT = 8;
bCAsdu6.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
bCAsdu6.nFUN = psCmdParam->m_uchFun;
bCAsdu6.nINF = psCmdParam->m_uchInf;
GetLocalTimeEx(&sCurTime);
sCurTime.mSec = sCurTime.Sec*1000 + sCurTime.mSec;
bCAsdu6.nTIME[0] = sCurTime.mSec % 256;
bCAsdu6.nTIME[1] = sCurTime.mSec / 256;
bCAsdu6.nTIME[2] = (u_char)sCurTime.Min;
bCAsdu6.nTIME[3] = (u_char)sCurTime.Hour;
//bCAsdu6.nTIME[4] = (u_char)ControlParam->CurTime.wDayOfWeek;
bCAsdu6.nTIME[4] = (u_char)(sCurTime.Day&0x1F);
bCAsdu6.nTIME[5] = (u_char)sCurTime.Month;
bCAsdu6.nTIME[6] = (u_char)(sCurTime.Year%100);
sprintf(szbuf, "对时时间为:%d年%d月%d日%d点%d分%d秒%d毫秒",sCurTime.Year,sCurTime.Month,bCAsdu6.nTIME[4],sCurTime.Hour,sCurTime.Min,sCurTime.Sec,sCurTime.mSec-sCurTime.Sec*1000);
2 years ago
DebugPrint(szbuf);
if(psCmdParam->m_sDevAddr.m_uchLinkAddr == 255)
{
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr, \
C_SD2_NA_3, (u_char*)&bCAsdu6, sizeof(CASDU6), FAST_POLL_CMD);
}
else
{
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr, \
C_SD1_NA_3, (u_char*)&bCAsdu6, sizeof(CASDU6), NORMAL_POLL_CMD);
}
}
//*************************************************************
//* 生成总查询启动命令 *
//*参数:u_32 commid:RTU端口号 *
//*参数u_char addr:间隔设备地址
2 years ago
//*************************************************************
void MakeAllQuery_CAsdu7(u_32 commid, CMDPARAM *psCmdParam)
{
BYTE u8SCN;
CASDU7 bCAsdu7;
BUBAN103PORTPARAM *pPortParam;
if(SioParam[commid].ExtInfo == NULL)
{
return;
}
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
memset(&bCAsdu7,0,sizeof(CASDU7));
bCAsdu7.nTYP = C_TGI_NA_3;
bCAsdu7.nVSQ = 0x81;
bCAsdu7.nCOT = 9;
bCAsdu7.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
bCAsdu7.nFUN = 255;
bCAsdu7.nINF = 0;
//扫描值需核实
2 years ago
u8SCN = pPortParam->m_psLink[psCmdParam->m_sDevAddr.m_iLinkIdx].m_psDev[psCmdParam->m_sDevAddr.m_iDevIdx].m_sDevParam.m_u8SCN;
bCAsdu7.nSCN = u8SCN;
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr,\
C_SD1_NA_3 , (unsigned char*)&bCAsdu7, sizeof(CASDU7), NORMAL_POLL_CMD);
pPortParam->m_psLink[psCmdParam->m_sDevAddr.m_iLinkIdx].m_psDev[psCmdParam->m_sDevAddr.m_iDevIdx].m_bAllQueryOk = FALSE;
pPortParam->m_psLink[psCmdParam->m_sDevAddr.m_iLinkIdx].m_psDev[psCmdParam->m_sDevAddr.m_iDevIdx].m_sDevParam.m_u8SCN = (u8SCN+1) % 256;
}
//*******************************************************************
//* 生成通用分类数据命令 *
//*参数:u_32 commid:RTU端口号 *
//*参数u_char addr:间隔设备地址
//* u_char inf:信息序号取值范围只能是248-251,其中: *
//* 248写条目 *
//* 249带确认的写条目 *
//* 250带执行的写条目 *
//* 251写条目终止 *
//* unsigned char* dataset:通用分类数据集信息 *
//* u_char ngd:通用分类数据集数目(数目、计数器位、后续状态位) *
2 years ago
//*******************************************************************
void MakeGenIdentData_CAsdu10(u_32 commid, CMDPARAM *psCmdParam,
u_char *dataset, u_char ngd)
{
CASDU10 bCAsdu10;
u_32 len,len1,i,start;
u_char tmp[MAX_POLL_CMD_BUF_LEN];
memset(&bCAsdu10,0,sizeof(CASDU10));
bCAsdu10.nTYP = C_GD_NA_3;
bCAsdu10.nVSQ = 0x81;
bCAsdu10.nCOT = 40;
bCAsdu10.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
bCAsdu10.nFUN = 254;
if((psCmdParam->m_uchInf >= 248)
&& (psCmdParam->m_uchInf <= 251))
{
bCAsdu10.nINF = psCmdParam->m_uchInf;
}
bCAsdu10.nRII = psCmdParam->m_uchRII;
bCAsdu10.nNGD = ngd;
//计算数据集的长度
2 years ago
start = 0;
len = 0;
for(i=0; i<ngd; i++)
{
if(dataset[start+3] == 2) //如果为成组位串类型
2 years ago
{
if((dataset[start+4] % 8) == 0)
{
len += dataset[start+4]/8;
}
else
{
len += dataset[start+4]/8+1;
}
}
else //其它类型
2 years ago
{
len += 6 + dataset[start+4]*dataset[start+5];
}
start = len;
}
len1 = sizeof(bCAsdu10)-sizeof(unsigned char*);
memcpy((void*)tmp, (void*)&bCAsdu10, len1);
if((len > 0) && (dataset != NULL))
{
memcpy((void*)&tmp[len1], dataset, len);
}
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr, \
C_SD1_NA_3 , (unsigned char*)tmp, len + len1, NORMAL_POLL_CMD);
}
//*******************************************************************
//* 生成通用分类数据命令 *
//*参数:u_32 commid:RTU端口号 *
//*参数:u_char addr:间隔设备地址 *
//* u_char inf:信息序号取值范围只能是248-251,其中: *
//* 248写条目 *
//* 249带确认的写条目 *
//* 250带执行的写条目 *
//* 251写条目终止 *
//* unsigned char* dataset:通用分类数据集信息 *
//* u_char ngd:通用分类数据集数目(数目、计数器位、后续状态位) *
//* u_32 cmdtype : 指令缓冲区类型 *
2 years ago
//*******************************************************************
void MakeGenIdentData_CAsdu10Ex(u_32 commid, CMDPARAM *psCmdParam,
u_char *dataset, u_char ngd, u_32 cmdtype)
{
CASDU10 bCAsdu10;
u_32 len,len1,i,start;
u_char tmp[MAX_POLL_CMD_BUF_LEN];
memset(&bCAsdu10,0,sizeof(CASDU10));
bCAsdu10.nTYP = C_GD_NA_3;
bCAsdu10.nVSQ = 0x81;
bCAsdu10.nCOT = 40;
bCAsdu10.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
bCAsdu10.nFUN = 254;
if((psCmdParam->m_uchInf >= 248)
&& (psCmdParam->m_uchInf <= 251))
{
bCAsdu10.nINF = psCmdParam->m_uchInf;
}
bCAsdu10.nRII = psCmdParam->m_uchRII;
bCAsdu10.nNGD = ngd;
//计算数据集的长度
2 years ago
start = 0;
len = 0;
for(i=0; i<ngd; i++)
{
if(dataset[start+3] == 2) //如果为成组位串类型
2 years ago
{
if((dataset[start+4] % 8) == 0)
{
len += dataset[start+4]/8;
}
else
{
len += dataset[start+4]/8+1;
}
}
else //其它类型
2 years ago
{
len += 6 + dataset[start+4]*dataset[start+5];
}
start = len;
}
len1 = sizeof(bCAsdu10)-sizeof(unsigned char*);
memcpy((void*)tmp, (void*)&bCAsdu10, len1);
if((len > 0) && (dataset != NULL))
{
memcpy((void*)&tmp[len1], dataset, len);
}
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr, \
C_SD1_NA_3 , (unsigned char*)tmp, len + len1, cmdtype);
}
//*************************************************************
//* 生成一般命令 *
//*参数:u_32 commid:RTU端口号 *
//*参数u_char addr:间隔设备地址
//* u_char inf:信息序号取值范围为16--26 ,包括: *
//* 16=自动重合闸投入/退出ON/OFF *
//* 17=远方保护投入/退出ON/OF *
//* 18=保护投入/退出ON/OF *
//* 19=LED复位 *
//* 23=激活特性1 *
//* 24=激活特性2 *
//* 25=激活特性3 *
//* 26=激活特性4 *
//* 其它值均为非法 *
//* bool cmd:命令状态true=合false=开) *
2 years ago
//*************************************************************
void MakeGenCommand_CAsdu20(u_32 commid, CMDPARAM *psCmdParam, bool cmd)
{
CASDU20 bCAsdu20;
memset(&bCAsdu20,0,sizeof(CASDU20));
bCAsdu20.nTYP = C_GRC_NA_3;
bCAsdu20.nVSQ = 0x81;
bCAsdu20.nCOT = 20;
bCAsdu20.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
bCAsdu20.nFUN = 128;//需要验证确认
2 years ago
bCAsdu20.nINF = psCmdParam->m_uchInf;
bCAsdu20.nRII = psCmdParam->m_uchRII;
if(cmd)
{
bCAsdu20.nDCO = 0x02;
}
else
{
bCAsdu20.nDCO = 0x01;
}
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr, \
C_SD1_NA_3 , (u_char *)&bCAsdu20, sizeof(CASDU20), NORMAL_POLL_CMD);
}
//******************************************************************
//* 生成通用分类命令 *
//*参数:u_32 commid:RTU端口号 *
//*参数u_char addr:间隔设备地址
//* u_char inf:信息序号取值范围只能是240-245,其中: *
//* 240读全部被定义的组的标题 *
//* 241读一个组的全部条目的值或属性 *
//* 242未用 *
//* 243读单个条目的目录 *
//* 244读单个条目的值或属性 *
//* 245对通用分类数据的总查询总召唤 *
//* GEN_DATAGROUP* datagroup:通用分类数据组信息 *
//* u_char nog:通用分类标示数目 *
2 years ago
//******************************************************************
void MakeGenIdentCommand_CAsdu21(u_32 commid, CMDPARAM *psCmdParam,
GEN_DATAGROUP* datagroup ,u_char nog)
{
CASDU21 bCAsdu21;
u_32 len;
u_char tmp[MAX_POLL_CMD_BUF_LEN];
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
memset(&bCAsdu21, 0, sizeof(CASDU21));
bCAsdu21.nTYP = C_GC_NA_3;
bCAsdu21.nVSQ = 0x81;
if(psCmdParam->m_uchInf == C_INF_QUERYGENERAL)
{
bCAsdu21.nCOT = C_CAUSE_QUERY;
}
else // 通用分类读命令
2 years ago
{
bCAsdu21.nCOT = C_CAUSE_READWITHVALIDDATA;
}
bCAsdu21.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
bCAsdu21.nFUN = FUNC_GENERALSORT;
if((psCmdParam->m_uchInf >= C_INF_READGROUPTITLE)
&& (psCmdParam->m_uchInf <= C_INF_QUERYGENERAL))
{
bCAsdu21.nINF = psCmdParam->m_uchInf;
}
else
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d生成通用分类命令时INF=%d不在指定的范围内!!!",
2 years ago
commid, psCmdParam->m_sDevAddr.m_uchLinkAddr, psCmdParam->m_sDevAddr.m_uchCommAddr, psCmdParam->m_uchInf);
DebugPrint(szbuf);
#endif
return;
}
bCAsdu21.nRII = psCmdParam->m_uchRII;
bCAsdu21.nNOG = nog;
len = sizeof(CASDU21)-sizeof(GEN_DATAGROUP *);
memcpy((void *)tmp, (void *)&bCAsdu21, len);
if(nog ==0)
{
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr,\
C_SD1_NA_3, tmp, len, NORMAL_POLL_CMD);
}
else
{
memcpy((void*)&tmp[len], datagroup, sizeof(GEN_DATAGROUP)*nog);
len += sizeof(GEN_DATAGROUP)*nog;
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr,\
C_SD1_NA_3 , tmp, len, NORMAL_POLL_CMD);
}
}
//*************************************************************
//* 生成扰动数据传输命令 *
//*参数:u_32 commid:RTU端口号 *
//*参数u_char addr:间隔设备地址
//* u_char too:命令类型数值范围为1--255包括
//* 1=故障的选择
//* 2=请求扰动数据
//* 3=中止扰动数据
//* 4--7 = 备用
//* 8=通道的请求
//* 9=通道的中止
//* 10--15 = 备用
//* 16=请求带标志的状态变位
//* 17=中止带标志的状态变位
//* 18--23 = 备用
//* 24=请求被记录扰动表
//* 25--31 =备用
//* 32=不带中止的扰动数据传输的结束
//* 33=由控制系统所中止的扰动数据传输的结束
//* 34=由继电保护设备(或间隔单元)所中止的扰动数据传输的结束
//* 35=不带中止的通道传输的结束
//* 36=由控制系统所中止的通道传输的结束
//* 37=由继电保护设备(或间隔单元)所中止饿通道传输的结束
//* 38=不带中止的带标志的状态变位的传输结束
//* 39=由控制系统所中止的带标志的状态变位的传输的结束
//* 40=由继电保护设备(或间隔单元)所中止的带标志的状态变位传输的结束
//* 41--63=备用
//* 64=成功地扰动数据传输(肯定)
//* 65=不成功地扰动数据传输(否定)
//* 66=成功地通道传输(肯定)
//* 67=不成功地通道传输(否定)
//* 68=成功地带标志的状态变位传输(肯定)
//* 69=不成功地带标志的状态变位传输(否定)
//* 70--255=备用
//* u_char tov:扰动值的类型
//* u_short fan:故障序号
//* u_char acc:实际通道序号
2 years ago
//*************************************************************
void MakeDisTrans_CAsdu24(u_32 commid, CMDPARAM *psCmdParam,
u_char too, u_char tov, u_short fan, u_char acc)
{
CASDU24 bCAsdu24;
memset(&bCAsdu24,0,sizeof(CASDU24));
bCAsdu24.nTYP = C_ODT_NA_3;
bCAsdu24.nVSQ = 0x81;
bCAsdu24.nCOT = 31;
bCAsdu24.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
bCAsdu24.nFUN = psCmdParam->m_uchFun;
bCAsdu24.nTOO = too;
bCAsdu24.nTOV = tov;
bCAsdu24.nFAN = fan;
bCAsdu24.nACC = acc;
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr, \
C_SD1_NA_3, (u_char *)&bCAsdu24, sizeof(CASDU24), INSERT_POLL_CMD);
}
//*************************************************************
//* 生成扰动数据传输的认可命令 *
//*参数:u_32 commid:RTU端口号 *
//*参数u_char addr:间隔设备地址
//* u_char too:命令类型数值范围为1--255包括
//* 1=故障的选择
//* 2=请求扰动数据
//* 3=中止扰动数据
//* 4--7 = 备用
//* 8=通道的请求
//* 9=通道的中止
//* 10--15 = 备用
//* 16=请求带标志的状态变位
//* 17=中止带标志的状态变位
//* 18--23 = 备用
//* 24=请求被记录扰动表
//* 25--31 =备用
//* 32=不带中止的扰动数据传输的结束
//* 33=由控制系统所中止的扰动数据传输的结束
//* 34=由继电保护设备(或间隔单元)所中止的扰动数据传输的结束
//* 35=不带中止的通道传输的结束
//* 36=由控制系统所中止的通道传输的结束
//* 37=由继电保护设备(或间隔单元)所中止饿通道传输的结束
//* 38=不带中止的带标志的状态变位的传输结束
//* 39=由控制系统所中止的带标志的状态变位的传输的结束
//* 40=由继电保护设备(或间隔单元)所中止的带标志的状态变位传输的结束
//* 41--63=备用
//* 64=成功地扰动数据传输(肯定)
//* 65=不成功地扰动数据传输(否定)
//* 66=成功地通道传输(肯定)
//* 67=不成功地通道传输(否定)
//* 68=成功地带标志的状态变位传输(肯定)
//* 69=不成功地带标志的状态变位传输(否定)
//* 70--255=备用
//* u_char tov:扰动值的类型
//* u_short fan:故障序号
//* u_char acc:实际通道序号
2 years ago
//*************************************************************
void MakeDisTrans_CAsdu25(u_32 commid, CMDPARAM *psCmdParam,
u_char too, u_char tov, u_short fan, u_char acc)
{
CASDU25 bCAsdu25;
memset(&bCAsdu25,0,sizeof(CASDU25));
bCAsdu25.nTYP = C_ADT_NA_3;
bCAsdu25.nVSQ = 0x81;
bCAsdu25.nCOT = 31;
bCAsdu25.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
bCAsdu25.nFUN = psCmdParam->m_uchFun;
bCAsdu25.nTOO = too;
bCAsdu25.nTOV = tov;
bCAsdu25.nFAN = fan;
bCAsdu25.nACC = acc;
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr,\
C_SD1_NA_3, (unsigned char*)&bCAsdu25, sizeof(CASDU25), INSERT_POLL_CMD);
}
//*************************************************************
//* 生成脉冲电度的查询命令 *
//*参数:u_32 commid:RTU端口号 *
//*参数u_char addr:间隔设备地址
2 years ago
//*************************************************************
void MakeQCC_CAsdu88(u_32 commid, CMDPARAM *psCmdParam)
{
CASDU88 bCAsdu88;
memset(&bCAsdu88,0,sizeof(CASDU88));
bCAsdu88.nTYP = C_CI_NA_3;
bCAsdu88.nVSQ = 0x81;
bCAsdu88.nCOT = C_CAUSE_CYCLE;
bCAsdu88.nADDR = psCmdParam->m_sDevAddr.m_uchCommAddr;
// ??? wen 2003.11.03 bu(1)---bu(6)
bCAsdu88.nFUN = 1;// BU(1)
bCAsdu88.nINF = 0;
// 使用冻结不复位命令yizhonghu 20060803
2 years ago
//bCAsdu88.nQCC = 5;
bCAsdu88.nQCC = 45;
bCAsdu88.nRII = psCmdParam->m_uchRII;
MakeBuban103LinkCommand(commid, psCmdParam->m_sDevAddr.m_uchLinkAddr,\
C_SD2_NA_3 , (unsigned char*)&bCAsdu88, sizeof(CASDU88), NORMAL_POLL_CMD);
}
void MakeBuban103_PL1_NA_3_Cmd(int commid, DEVADDRPARAM *psAddrParam)
{
BUBAN103PORTPARAM *pPortParam;
BUBAN103LINKDEF *pLinkParam;
if(IsExtInfoPtr(commid) == FALSE)
{
return;
}
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = (BUBAN103LINKDEF *)&pPortParam->m_psLink[psAddrParam->m_iLinkIdx];
// 多个保护设备装置
2 years ago
if(pLinkParam->m_iDevNum > 1)
{
if(pLinkParam->m_iQueryedAddr_CLASS1 != (psAddrParam->m_iDevIdx+1))
{
pLinkParam->m_iQueryedAddr_CLASS1 = psAddrParam->m_iDevIdx+1;
pLinkParam->m_iQueryNum_CLASS1_Count = 1;
MakeBuban103LinkCommand(commid, psAddrParam->m_uchLinkAddr,\
C_PL1_NA_3, NULL, 0, INSERT_POLL_CMD);
}
// 如果一条链路含有多个装置的情况
2 years ago
else if(pLinkParam->m_uchLinkAddr != 0xFF)
{
pLinkParam->m_iQueryNum_CLASS1_Count = 0;
MakeBuban103LinkCommand(commid,\
psAddrParam->m_uchLinkAddr,\
C_PL1_NA_3,NULL,0,INSERT_POLL_CMD);
}
else
{
if(pLinkParam->m_iQueryNum_CLASS1_Count < pLinkParam->m_iQueryNum_CLASS1_Const)
{
pLinkParam->m_iQueryNum_CLASS1_Count++;
MakeBuban103LinkCommand(commid, psAddrParam->m_uchLinkAddr,\
C_PL1_NA_3,NULL,0,INSERT_POLL_CMD);
}
else
{
pLinkParam->m_iQueryedAddr_CLASS1 = 0;
pLinkParam->m_iQueryNum_CLASS1_Count = 0;
}
}
}
else
{
MakeBuban103LinkCommand(commid, psAddrParam->m_uchLinkAddr,\
C_PL1_NA_3,NULL,0,INSERT_POLL_CMD);
}
}
BOOL IsDevLinkOk(BUBAN103LINKDEF *psLinkParam, int iDevNo)
{
if(psLinkParam->m_uchLinkAddr == 0xFF)
{
return psLinkParam->m_pbLinkOk[iDevNo];
}
else
{
return psLinkParam->m_pbLinkOk[0];
}
}
void SetDevLinkOk(BUBAN103LINKDEF *psLinkParam, int iDevNo, BOOL bFlagOk)
{
if(psLinkParam->m_uchLinkAddr == 0xFF)
{
psLinkParam->m_pbLinkOk[iDevNo] = bFlagOk;
psLinkParam->m_pu32LinkOkCnt[iDevNo] = 0;
}
else
{
psLinkParam->m_pbLinkOk[0] = bFlagOk;
psLinkParam->m_pu32LinkOkCnt[0] = 0;
}
}
void ClearLinkCnt(BUBAN103LINKDEF *psLinkParam, int iDevNo)
{
if(psLinkParam->m_uchLinkAddr == 0xFF)
{
psLinkParam->m_pu32LinkOkCnt[iDevNo] = 0;
}
else
{
psLinkParam->m_pu32LinkOkCnt[0] = 0;
}
}
BYTE GetLinkAddr(BUBAN103LINKDEF *psLinkParam, int iDevNo)
{
if(psLinkParam->m_uchLinkAddr == 0xFF)
{
return psLinkParam->m_psDev[iDevNo].m_sDevParam.m_u8DevAddr;
}
else
{
return psLinkParam->m_uchLinkAddr;
}
}
BYTE *GetLinkCtrl(BUBAN103LINKDEF *psLinkParam, int iDevNo)
{
if(psLinkParam->m_uchLinkAddr == 0xFF)
{
return &psLinkParam->m_pu8CtlByte[iDevNo];
}
else
{
return &psLinkParam->m_pu8CtlByte[0];
}
}
BOOL IsLinkTimeOut(BUBAN103LINKDEF *psLinkParam, int iDevNo)
{
int iNo;
iNo = iDevNo;
psLinkParam->m_pu32LinkOkCnt[iNo]++;
if(psLinkParam->m_pu32LinkOkCnt[iNo]\
>= psLinkParam->m_u32TimeOutConst)
{
return TRUE;
}
return FALSE;
}
//***************************************************************
//* 指令发送 *
//*参数:u_32 commid : RTU端口号 *
//* i_32 iBuIdx : 间隔装置索引 *
2 years ago
//***************************************************************
void Buban103SendCmdFormPollCmdBuf(int commid)
{
BYTE fcb = 0x20;
BYTE *pu8CtrlByte, buf[256];
i_32 len;
DAY_TIME sDateTime;
DEVADDRPARAM DevAddrParam;
BUBAN103PORTPARAM *pPortParam;
if((commid < 0) || (commid >= GetMaxPort()))
{
return;
}
if(!ShmGetPortFlag(commid, FLAG_OPEN))
{
return;
}
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
if(pPortParam->m_psBaoHu->ForceWaitFlag
&& pPortParam->m_psBaoHu->ForceWaitCnt)
{
pPortParam->m_psBaoHu->ForceWaitCnt--;
if(pPortParam->m_psBaoHu->ForceWaitCnt == 0)
{
// 清除当前命令
2 years ago
ClearCmdFormPollCmdBuf(commid);
//ClearCmdAllFlag(commid);
}
}
if(pPortParam->m_psBaoHu->SendCmdFlag
&& (pPortParam->m_psBaoHu->RevCmdFlag == 0))
{
pPortParam->m_psBaoHu->RetryTimeCnt++;
if(pPortParam->m_psBaoHu->RetryTimeCnt
< pPortParam->m_psBaoHu->RetryTime)
{
return;
}
pPortParam->m_psBaoHu->RetryTimeCnt = 0;
pPortParam->m_psBaoHu->RetryCnt++;
if(pPortParam->m_psBaoHu->RetryCnt
> pPortParam->m_psBaoHu->Retry)
{
len = ReGetCmdFormPollCmdBuf(commid, buf, MAX_MSG_BUF_SIZE);
if(buf[2] == 0x10)
{
DevAddrParam.m_uchLinkAddr = buf[4];
if(FindProtectDev(pPortParam, &DevAddrParam, TRUE) == TRUE)
{
if(pPortParam->m_psLink[DevAddrParam.m_iLinkIdx].m_uchLinkAddr != 0xFF)
{
InitBuban103LinkCmdBuf(&pPortParam->m_psLink[DevAddrParam.m_iLinkIdx]);
}
else
{
DevAddrParam.m_uchCommAddr = buf[4];
InitBuban103DevCmdBuf(&pPortParam->m_psLink[DevAddrParam.m_iLinkIdx], DevAddrParam.m_iDevIdx);
}
}
}
else if(buf[2] == 0x68)
{
DevAddrParam.m_uchLinkAddr = buf[7];
DevAddrParam.m_uchCommAddr = buf[11];
if(FindProtectDev(pPortParam, &DevAddrParam, FALSE) == TRUE)
{
InitBuban103DevCmdBuf(&pPortParam->m_psLink[DevAddrParam.m_iLinkIdx], DevAddrParam.m_iDevIdx);
}
}
else
{
pPortParam->m_psBaoHu->RevCmdFlag = 1;
}
// 清除当前命令
2 years ago
ClearCmdFormPollCmdBuf(commid);
//ClearCmdAllFlag(commid);
}
else
{
pPortParam->m_psBaoHu->SendCmdFlag = 0;
pPortParam->m_psBaoHu->RevCmdFlag = 0;
pPortParam->m_psBaoHu->ReSendCmdFlag = 1;
}
}
if(pPortParam->m_psBaoHu->SendCmdFlag
&& pPortParam->m_psBaoHu->RevCmdFlag)
{
// 清除当前命令
2 years ago
ClearCmdFormPollCmdBuf(commid);
//ClearCmdAllFlag(commid);
}
if(pPortParam->m_psBaoHu->WaitTime)
{
pPortParam->m_psBaoHu->WaitTimeCnt++;
if(pPortParam->m_psBaoHu->WaitTimeCnt
< pPortParam->m_psBaoHu->WaitTime)
{
return;
}
}
pPortParam->m_psBaoHu->WaitTimeCnt = 0;
if(pPortParam->m_psBaoHu->ReSendCmdFlag)
{
len = ReGetCmdFormPollCmdBuf(commid, buf, MAX_MSG_BUF_SIZE);
}
else
{
len = GetCmdFormPollCmdBuf(commid, buf, MAX_MSG_BUF_SIZE);
}
if(len < 7)
{
return;
}
#ifndef OS_LINUX
if(isUdpSocketExist() == TRUE)
#endif
{
if(buf[2] == 0x10)
{
DevAddrParam.m_uchLinkAddr = buf[4];
if(FindProtectDev(pPortParam, &DevAddrParam, TRUE) == FALSE)
{
// 清除当前命令
2 years ago
ClearCmdFormPollCmdBuf(commid);
//ClearCmdAllFlag(commid);
return;
}
if(PROTOCOL_MASTER == pPortParam->m_psBaoHu->PortType)
{
if(pPortParam->m_psBaoHu->ReSendCmdFlag)
{
pu8CtrlByte = GetLinkCtrl(&pPortParam->m_psLink[DevAddrParam.m_iLinkIdx], DevAddrParam.m_iDevIdx);
*pu8CtrlByte = ~(*pu8CtrlByte);
}
pu8CtrlByte = GetLinkCtrl(&pPortParam->m_psLink[DevAddrParam.m_iLinkIdx], DevAddrParam.m_iDevIdx);
buf[3] |= (fcb & *pu8CtrlByte);
*pu8CtrlByte = ~(*pu8CtrlByte);
}
else
{
if(ProvHaveClassOne(commid, &DevAddrParam, pPortParam->m_bSendChangeDi) == TRUE)
{
buf[3] |= 0x20;
}
}
buf[5] = CalBuban103Lpc(&buf[3], 2);
}
else if(buf[2] == 0x68)
{
DevAddrParam.m_uchLinkAddr = buf[7];
DevAddrParam.m_uchCommAddr = buf[11];
if(0xFF != DevAddrParam.m_uchLinkAddr)
{
if(FindProtectDev(pPortParam, &DevAddrParam, FALSE) == FALSE)
{
// 清除当前命令
2 years ago
ClearCmdFormPollCmdBuf(commid);
//ClearCmdAllFlag(commid);
return;
}
if(PROTOCOL_MASTER == pPortParam->m_psBaoHu->PortType)
{
if(pPortParam->m_psBaoHu->ReSendCmdFlag)
{
pu8CtrlByte = GetLinkCtrl(&pPortParam->m_psLink[DevAddrParam.m_iLinkIdx], DevAddrParam.m_iDevIdx);
*pu8CtrlByte = ~(*pu8CtrlByte);
}
pu8CtrlByte = GetLinkCtrl(&pPortParam->m_psLink[DevAddrParam.m_iLinkIdx], DevAddrParam.m_iDevIdx);
buf[6] |= (fcb & *pu8CtrlByte);
//if(buf[7] != 0xFF)
//{
// *pu8CtrlByte = ~(*pu8CtrlByte);
//}
*pu8CtrlByte = ~(*pu8CtrlByte);
}
else
{
if(ProvHaveClassOne(commid, &DevAddrParam, pPortParam->m_bSendChangeDi) == TRUE)
{
buf[6] |= 0x20;
}
}
}
if((buf[8] == C_SYN_TA_3) && (buf[3] == 15))
{
GetLocalTimeEx(&sDateTime);
sDateTime.mSec = sDateTime.Sec*1000 + sDateTime.mSec;
buf[14] = sDateTime.mSec % 256;
buf[15] = sDateTime.mSec / 256;
buf[16] = (u_char)sDateTime.Min;
buf[17] = (u_char)sDateTime.Hour;
buf[18] = (u_char)(sDateTime.Day&0x1F);
buf[19] = (u_char)sDateTime.Month;
buf[20] = (u_char)(sDateTime.Year%100);
}
buf[buf[3]+6] = CalBuban103Lpc(&buf[6], buf[3]);
}
else
{
// 清除当前命令
2 years ago
ClearCmdFormPollCmdBuf(commid);
//ClearCmdAllFlag(commid);
return;
}
SendDataToPort(commid, (char *)&buf[2], len-2);
pPortParam->m_psBaoHu->SendCmdFlag = 1;
pPortParam->m_psBaoHu->ReSendCmdFlag = 0;
pPortParam->m_psBaoHu->RevCmdFlag = 0;
}
#ifdef OS_LINUX
if(pPortParam->m_psBaoHu->LastGetCmdBuf == FAST_CMD_TYPE)
#else
if((pPortParam->m_psBaoHu->LastGetCmdBuf == FAST_CMD_TYPE)
|| !isUdpSocketExist())
#endif
{
pPortParam->m_psBaoHu->ForceWaitCnt = BYTE1(buf[0])+BYTE0(buf[1])+TIMER_CNT-1;
pPortParam->m_psBaoHu->ForceWaitCnt /= TIMER_CNT;
if(pPortParam->m_psBaoHu->ForceWaitCnt)
{
pPortParam->m_psBaoHu->ForceWaitFlag = 1;
}
else
{
ClearCmdFormPollCmdBuf(commid); // 清除当前命令
//ClearCmdAllFlag(commid); // 清除当前命令
2 years ago
}
}
}
/*!
\brief
\param u_32 portno : RTU
\param i_32 iBuIdx :
2 years ago
*/
void Buban103FindNextCmd(int commid)
{
int i, j, iCurCmdIdx;
BYTE *pu8CtrlByte;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
if((commid < 0) || (commid >= GetMaxPort()))
{
return;
}
if(!ShmGetPortFlag(commid, FLAG_OPEN))
{
return;
}
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
//所有的命令定时计数器+1
2 years ago
for(i=0; i<pPortParam->m_iLinkNum; i++)
{
pLinkParam = &pPortParam->m_psLink[i];
for(j=0; j<BUBAN103_TIMER_CMD_NUM; j++)
{
if(pLinkParam->m_sArrayCmdTime[j].m_iCmdTimerConst > 0)
{
pLinkParam->m_sArrayCmdTime[j].m_iCmdTimerCnt++;
}
}
}
//如果命令缓冲区仍有命令,则退出本函数
2 years ago
if(CheckPollCmdBufEmpty(commid) <= 0)
{
return;
}
pLinkParam = &pPortParam->m_psLink[pPortParam->m_iLinkIdx];
//每个地址下发一次命令,循环进行
2 years ago
if(pLinkParam->m_iDevIdx >= pLinkParam->m_iDevNum-1)
{
pLinkParam->m_iDevIdx = 0;
pPortParam->m_iLinkIdx = (pPortParam->m_iLinkIdx+1) % pPortParam->m_iLinkNum;
pLinkParam = &pPortParam->m_psLink[pPortParam->m_iLinkIdx];
pLinkParam->m_iDevIdx = 0;
}
else
{
pLinkParam->m_iDevIdx++;
}
//判断链路的状态,如果链路服务未工作或链路服务未实现,则发送请求链路状态命令继续查询链路状态,并退出本函数
// 如果链路工作正常,则继续本函数的后续工作
2 years ago
pDevParam = &pLinkParam->m_psDev[pLinkParam->m_iDevIdx];
if(IsDevLinkOk(pLinkParam, pLinkParam->m_iDevIdx) == FALSE)
{
// 一条链路一次循环只进行一次链路复位
2 years ago
if((pLinkParam->m_uchLinkAddr != 0xFF)
&& (pLinkParam->m_iDevIdx != 0))
{
pLinkParam->m_iDevIdx = pLinkParam->m_iDevNum - 1;
return;
}
pu8CtrlByte = GetLinkCtrl(pLinkParam, pLinkParam->m_iDevIdx);
*pu8CtrlByte = 0;
MakeBuban103LinkCommand(commid,
GetLinkAddr(pLinkParam, pLinkParam->m_iDevIdx),
C_RCU_NA_3, NULL, 0, NORMAL_POLL_CMD);
return;
}
//如果发送了保护程序传送过来的命令,且仍未收到结束帧,则继续召唤二级用户数据
2 years ago
if(pDevParam->m_bInitdata == TRUE)
{
pDevParam->m_u32CallCnt++;
if(pDevParam->m_u32CallCnt < pLinkParam->m_u32TimeOutConst)
{
if(IsDevLinkOk(pLinkParam, pLinkParam->m_iDevIdx) == TRUE)
{
MakeBuban103LinkCommand(commid,\
GetLinkAddr(pLinkParam, pLinkParam->m_iDevIdx),\
C_PL2_NA_3, NULL, 0, NORMAL_POLL_CMD);
return;
}
}
else
{
pDevParam->m_u32CallCnt = 0;
pDevParam->m_bInitdata = FALSE;
}
}
//判断有否保护程序传来的命令
2 years ago
if(IsDevLinkOk(pLinkParam, pLinkParam->m_iDevIdx) == TRUE)
{
// wen 2004.02.11 修改保护数据下发(暂时没有下发)
2 years ago
//seladdr = (u_char)(*(WORD*)&gBuban103_RtuMsg.MsgData[0]);
//if((gBuban103_RtuMsg.MsgLen > 0) && (gBuban103_RtuMsg.PortNumber == commid))
//{
// itmpBuIdx = FindMatchingBuIdx(commid, seladdr);
// if(itmpBuIdx >= 0)
// {
// MakeBuban103BaohuCommand();
// Buban103PortParam[commid][selidx][iBuIdx].CallCnt = 0;
// Buban103PortParam[commid][selidx][iBuIdx].RstLinkOk = true;
// memset((char*)&gBuban103_RtuMsg, 0, sizeof(gBuban103_RtuMsg));
// return;
// }
//}
}
iCurCmdIdx = pLinkParam->m_shCurCmdIdx;
if(pDevParam->m_bAllQueryOk == TRUE)
{
for(i=0; i<BUBAN103_TIMER_CMD_NUM; i++)
{
if(pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerConst > 0)
{
if(pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerCnt\
> pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerConst)
{
break;
}
}
iCurCmdIdx = (iCurCmdIdx+1) % BUBAN103_TIMER_CMD_NUM;
}
pLinkParam->m_shCurCmdIdx = iCurCmdIdx;
if(i >= BUBAN103_TIMER_CMD_NUM)
{
pPortParam->m_iLinkIdx = (pPortParam->m_iLinkIdx+1) % pPortParam->m_iLinkNum;
}
else
{
MakeBuban103PollingCmd(commid, pLinkParam, iCurCmdIdx);
pLinkParam->m_iDevIdx = (pLinkParam->m_iDevIdx+1) % pLinkParam->m_iDevNum;
if(pLinkParam->m_iDevIdx == 0)
{
pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerCnt = 0;
pLinkParam->m_shCurCmdIdx = (pLinkParam->m_shCurCmdIdx+1) % BUBAN103_TIMER_CMD_NUM;
pPortParam->m_iLinkIdx = (pPortParam->m_iLinkIdx+1) % pPortParam->m_iLinkNum;
}
}
}
//空闲时间不停地召唤二级数据
2 years ago
if(IsDevLinkOk(pLinkParam, pLinkParam->m_iDevIdx) == TRUE)
{
if(CheckPollCmdBufEmpty(commid) <= 0)
{
return;
}
MakeBuban103LinkCommand(commid,\
GetLinkAddr(pLinkParam, pLinkParam->m_iDevIdx),\
C_PL2_NA_3, NULL, 0, NORMAL_POLL_CMD);
}
}
BOOL Buban103FindNextCmdEx(int commid)
{
int i, j, iCurCmdIdx;
BYTE *pu8CtrlByte;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
//char szbuf[128];
if((commid < 0) || (commid >= GetMaxPort()))
{
return FALSE;
}
if(!ShmGetPortFlag(commid, FLAG_OPEN))
{
return FALSE;
}
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
/*
char szbuf[256];
FILE *fp;
DAY_TIME sTime;
fp = NULL;
if(commid == 6)
{
getcwd(szbuf, sizeof(szbuf));
sprintf(szbuf, "%s/log/cmdtime.txt", szbuf);
fp = fopen(szbuf, "a");
GetLocalTimeEx(&sTime);
sprintf(szbuf, "wen: %02d:%02d:%02d.%03d, commid=%d calc pollcmd count.\n", sTime.Hour, sTime.Min, sTime.Sec, sTime.mSec, commid);
//DebugPrint(szbuf);
if(fp)
fwrite(szbuf, 1, strlen(szbuf), fp);
}
*/
//所有的命令定时计数器+1
2 years ago
for(i=0; i<pPortParam->m_iLinkNum; i++)
{
pLinkParam = &pPortParam->m_psLink[i];
if(!IsDevLinkOk(pLinkParam, i))
{
continue;
}
for(j=0; j<BUBAN103_TIMER_CMD_NUM; j++)
{
if(pLinkParam->m_sArrayCmdTime[j].m_iCmdTimerConst > 0)
{
pLinkParam->m_sArrayCmdTime[j].m_iCmdTimerCnt++;
}
}
}
//如果命令缓冲区仍有命令,则退出本函数
2 years ago
if(CheckPollCmdBufEmpty(commid) <= 0)
{
return FALSE;
}
pLinkParam = &pPortParam->m_psLink[pPortParam->m_iLinkIdx];
pDevParam = &pLinkParam->m_psDev[pLinkParam->m_iDevIdx];
if(IsDevLinkOk(pLinkParam, pLinkParam->m_iDevIdx) == FALSE)
{
// 一条链路一次循环只进行一次链路复位
2 years ago
if((pLinkParam->m_uchLinkAddr != 0xFF)\
&& (pLinkParam->m_iDevIdx != 0))
{
pLinkParam->m_iDevIdx = pLinkParam->m_iDevNum - 1;
return TRUE;
}
pu8CtrlByte = GetLinkCtrl(pLinkParam, pLinkParam->m_iDevIdx);
*pu8CtrlByte = 0;
MakeBuban103LinkCommand(commid,
GetLinkAddr(pLinkParam, pLinkParam->m_iDevIdx),
C_RCU_NA_3, NULL, 0, NORMAL_POLL_CMD);
return TRUE;
}
//如果发送了保护程序传送过来的命令,且仍未收到结束帧,则继续召唤二级用户数据
2 years ago
if(pDevParam->m_bInitdata == TRUE)
{
pDevParam->m_u32CallCnt++;
if(pDevParam->m_u32CallCnt < pLinkParam->m_u32TimeOutConst)
{
if(IsDevLinkOk(pLinkParam, pLinkParam->m_iDevIdx) == TRUE)
{
MakeBuban103LinkCommand(commid,\
GetLinkAddr(pLinkParam, pLinkParam->m_iDevIdx),\
C_PL2_NA_3, NULL, 0, NORMAL_POLL_CMD);
return TRUE;
}
}
else
{
pDevParam->m_u32CallCnt = 0;
pDevParam->m_bInitdata = FALSE;
}
}
//判断有否保护程序传来的命令
2 years ago
if(IsDevLinkOk(pLinkParam, pLinkParam->m_iDevIdx) == TRUE)
{
// wen 2004.02.11 修改保护数据下发(暂时没有下发)
2 years ago
//seladdr = (u_char)(*(WORD*)&gBuban103_RtuMsg.MsgData[0]);
//if((gBuban103_RtuMsg.MsgLen > 0) && (gBuban103_RtuMsg.PortNumber == commid))
//{
// itmpBuIdx = FindMatchingBuIdx(commid, seladdr);
// if(itmpBuIdx >= 0)
// {
// MakeBuban103BaohuCommand();
// Buban103PortParam[commid][selidx][iBuIdx].CallCnt = 0;
// Buban103PortParam[commid][selidx][iBuIdx].RstLinkOk = true;
// memset((char*)&gBuban103_RtuMsg, 0, sizeof(gBuban103_RtuMsg));
// return;
// }
//}
}
if(pLinkParam->m_shCurCmdIdx < BUBAN103_TIMER_CMD_NUM)
{
iCurCmdIdx = pLinkParam->m_shCurCmdIdx;
}
else
{
iCurCmdIdx = 0;
}
if(pDevParam->m_bAllQueryOk == TRUE)
{
for(i=0; i<BUBAN103_TIMER_CMD_NUM; i++)
{
if(iCurCmdIdx >= BUBAN103_TIMER_CMD_NUM)
{
break;
}
if(pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerConst > 0)
{
if(pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerCnt\
> pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerConst)
{
break;
}
}
iCurCmdIdx++;
}
// 如果是一条新的轮询指令,则从第一个装置开始生成指令
2 years ago
if(pLinkParam->m_shCurCmdIdx != iCurCmdIdx)
{
pLinkParam->m_iDevIdx = 0;
pLinkParam->m_shCurCmdIdx = iCurCmdIdx;
}
if(iCurCmdIdx < BUBAN103_TIMER_CMD_NUM)
{
//if(iCurCmdIdx == 0)
//{
// sprintf(szbuf, "%d端口时间同步过程=%d,计数=%d",commid+1,pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerConst,\
2 years ago
// pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerCnt);
// DebugPrint(szbuf);
// }
MakeBuban103PollingCmd(commid, pLinkParam, iCurCmdIdx);
if(pLinkParam->m_iDevIdx >= (pLinkParam->m_iDevNum-1))
{
pLinkParam->m_sArrayCmdTime[iCurCmdIdx].m_iCmdTimerCnt = 0;
}
return TRUE;
}
}
//空闲时间不停地召唤二级数据
2 years ago
//if(IsDevLinkOk(pLinkParam, pLinkParam->m_iDevIdx) == TRUE)
//{
//if(CheckPollCmdBufEmpty(commid) <= 0)
//{
// return;
//}
// MakeBuban103LinkCommand(commid,\
// GetLinkAddr(pLinkParam, pLinkParam->m_iDevIdx),\
// C_PL2_NA_3, NULL, 0, NORMAL_POLL_CMD);
// return TRUE;
//}
MakeBuban103LinkCommand(commid,\
GetLinkAddr(pLinkParam, pLinkParam->m_iDevIdx),\
C_PL2_NA_3, NULL, 0, NORMAL_POLL_CMD);
return TRUE;
}
void Buban103CalcNextDev(int commid, BOOL bFlag)
{
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
//printf("Buban103CalcNextDev: commid_%d\n", commid);
if(FALSE == GetPortParamPtr(commid, &pPortParam))
{
return;
}
if(!ShmGetPortFlag(commid, FLAG_OPEN))
{
return;
}
//printf("Buban103CalcNextDev: LinkIdx=%d, LinkNum=%d\n", pPortParam->m_iLinkIdx, pPortParam->m_iLinkNum);
//return;
if(pPortParam->m_iLinkIdx >= pPortParam->m_iLinkNum)
{
pPortParam->m_iLinkIdx = 0;
pLinkParam = &pPortParam->m_psLink[pPortParam->m_iLinkIdx];
pLinkParam->m_iDevIdx = 0;
}
else
{
// 常规的下一个装置计算
2 years ago
pLinkParam = &pPortParam->m_psLink[pPortParam->m_iLinkIdx];
if(FALSE == bFlag)
{
if((pLinkParam->m_uchLinkAddr != 0xFF)\
&& (pLinkParam->m_iDevNum > 1))
{
pDevParam = &pLinkParam->m_psDev[pLinkParam->m_iDevIdx];
if(pDevParam->m_bAllQueryOk == FALSE)
{
pLinkParam->m_bGotoNext = TRUE;
return;
}
// else if(增加其他的多帧传输不进行装置切换的判断)
2 years ago
}
}
// 在一个装置总召唤完成以后的计算
2 years ago
else
{
pDevParam = &pLinkParam->m_psDev[pLinkParam->m_iDevIdx];
if(pLinkParam->m_bGotoNext == FALSE)
{
return;
}
if(pDevParam->m_bAllQueryOk == TRUE)
{
return;
}
// else if(增加其他的多帧传输不进行装置切换的判断)
2 years ago
}
pLinkParam->m_bGotoNext = FALSE;
pLinkParam->m_iDevIdx++;
if(pLinkParam->m_iDevIdx >= pLinkParam->m_iDevNum)
{
pLinkParam->m_iDevIdx = 0;
pPortParam->m_iLinkIdx = (pPortParam->m_iLinkIdx+1) % pPortParam->m_iLinkNum;
pLinkParam = &pPortParam->m_psLink[pPortParam->m_iLinkIdx];
pLinkParam->m_iDevIdx = 0;
}
}
}
//***************************************************************************/
//* 定时轮询标准103指令生成函数 */
//*参数:u_32 commid : 厂站端口号 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//* i_32 CmdIdx : 指令生成码索引号 */
//*返回值:BOOL retval : 指令生成成功标识 */
2 years ago
//***************************************************************************/
void MakeBuban103PollingCmd(int commid, BUBAN103LINKDEF *psLinkParam, i_32 CmdIdx)
{
i_32 i;
DEVDEF *pDevParam;
CMDPARAM CmdParam;
GEN_DATAGROUP sGenDataGroup;
//#ifdef _DEBUG_MSG_
char szbuf[256];
//#endif
pDevParam = &psLinkParam->m_psDev[psLinkParam->m_iDevIdx];
switch(CmdIdx)
{
case 0:// 时间同步
// 广播对时仅执行一次
sprintf(szbuf, "port=%d,广播对时命令下发",commid+1);
2 years ago
DebugPrint(szbuf);
psLinkParam->m_sArrayCmdTime[CmdIdx].m_iCmdTimerCnt = 0;
CmdParam.m_sDevAddr.m_uchLinkAddr = 0xFF;
CmdParam.m_sDevAddr.m_uchCommAddr = 0xFF;
CmdParam.m_uchFun = (u_char)pDevParam->m_sDevParam.m_sSyncTimeInfo.m_u8Fun;
CmdParam.m_uchInf = (u_char)pDevParam->m_sDevParam.m_sSyncTimeInfo.m_u8Inf;
CmdParam.m_uchRII = pDevParam->m_u8RII;
MakeTimeSyn_CAsdu6(commid, &CmdParam);
// 清除当前指令,指向下一个链路
2 years ago
psLinkParam->m_iDevIdx = psLinkParam->m_iDevNum - 1;
break;
case 1:// 总查询
2 years ago
CmdParam.m_sDevAddr.m_uchLinkAddr = psLinkParam->m_uchLinkAddr;
CmdParam.m_sDevAddr.m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
if(FALSE == FindProtectDev((BUBAN103PORTPARAM *)SioParam[commid].ExtInfo, &CmdParam.m_sDevAddr, FALSE))
{
break;
}
MakeAllQuery_CAsdu7(commid, &CmdParam);
break;
case 2:// 电度量查询
2 years ago
CmdParam.m_sDevAddr.m_uchLinkAddr = psLinkParam->m_uchLinkAddr;
CmdParam.m_sDevAddr.m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
if(FALSE == FindProtectDev((BUBAN103PORTPARAM *)SioParam[commid].ExtInfo, &CmdParam.m_sDevAddr, FALSE))
{
break;
}
CmdParam.m_uchRII = pDevParam->m_u8RII;
MakeQCC_CAsdu88(commid, &CmdParam);
break;
case 3:// 模拟量轮询(通用分类数据)
2 years ago
CmdParam.m_sDevAddr.m_uchLinkAddr = psLinkParam->m_uchLinkAddr;
CmdParam.m_sDevAddr.m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
if(FALSE == FindProtectDev((BUBAN103PORTPARAM *)SioParam[commid].ExtInfo, &CmdParam.m_sDevAddr, FALSE))
{
break;
}
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(AI_PNT_TYPE == pDevParam->m_sDevParam.m_saGroupDef[i].m_iDataType)
{
break;
}
}
if(i == pDevParam->m_sDevParam.m_iCfgGroupNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d 不存在通用分类数据模拟量,不能生成轮询指令!!!\n",
2 years ago
commid, CmdParam.m_sDevAddr.m_uchLinkAddr, CmdParam.m_sDevAddr.m_uchCommAddr);
//前置机站号=1
2 years ago
DebugPrint(szbuf);
#endif
break;
}
CmdParam.m_uchInf = C_INF_READGROUPALLITEMS;
sGenDataGroup.m_u8Grp = (BYTE)pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo;
sGenDataGroup.m_u8Itm = 0;
sGenDataGroup.m_u8KOD = KOD_ACTUALVALUE;
CmdParam.m_uchRII = pDevParam->m_u8RII;
MakeGenIdentCommand_CAsdu21(commid, &CmdParam, &sGenDataGroup, 1);
break;
case 4:// 状态量轮询(通用分类数据)
2 years ago
CmdParam.m_sDevAddr.m_uchLinkAddr = psLinkParam->m_uchLinkAddr;
CmdParam.m_sDevAddr.m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
if(FALSE == FindProtectDev((BUBAN103PORTPARAM *)SioParam[commid].ExtInfo, &CmdParam.m_sDevAddr, FALSE))
{
break;
}
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(DI_PNT_TYPE == pDevParam->m_sDevParam.m_saGroupDef[i].m_iDataType)
{
break;
}
}
if(i == pDevParam->m_sDevParam.m_iCfgGroupNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d 不存在通用分类数据开关量,不能生成轮询指令!!!\n",
2 years ago
commid, CmdParam.m_sDevAddr.m_uchLinkAddr, CmdParam.m_sDevAddr.m_uchCommAddr);
DebugPrint(szbuf);
#endif
break;
}
CmdParam.m_uchInf = C_INF_READGROUPALLITEMS;
sGenDataGroup.m_u8Grp = (BYTE)pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo;
sGenDataGroup.m_u8Itm = 0;
sGenDataGroup.m_u8KOD = KOD_ACTUALVALUE;
CmdParam.m_uchRII = pDevParam->m_u8RII;
MakeGenIdentCommand_CAsdu21(commid, &CmdParam, &sGenDataGroup, 1);
break;
default:
break;
}
}
//===========================指令生成函数结束=========================
2 years ago
//===========================以下为数据处理函数=======================
2 years ago
//***************************************************************
//* 计算 Buban103 累加和检验码 *
//* 参数BYTE* msg:准备计算的数据帧信息 *
//* u_32 len:准备计算的数据帧长度 *
2 years ago
//***************************************************************
BYTE CalBuban103Lpc(BYTE *msg, u_32 len)
{
u_32 i;
char retval;
retval = 0;
for(i=0; i<len; i++)
{
retval += msg[i];
}
return retval;
}
BOOL Buban103Check(char *pData, int iDataLen)
{
BOOL bRetval;
int iCheckLen;
bRetval = FALSE;
switch(pData[0])
{
case 0x10: // 短帧
2 years ago
if(pData[4] != 0x16)
{
break;
}
if(CalBuban103Lpc((BYTE *)&pData[1], 2) != (BYTE)pData[3])
{
break;
}
bRetval = TRUE;
break;
case 0x68: // 长帧
2 years ago
if(pData[0] != pData[3])
{
break;
}
if(pData[iDataLen-1] != 0x16)
{
break;
}
if(pData[1] != pData[2])
{
break;
}
iCheckLen = (BYTE)pData[1];
if(CalBuban103Lpc((BYTE *)&pData[4], iCheckLen) != (BYTE)pData[iDataLen-2])
{
break;
}
bRetval = TRUE;
break;
default:
break;
}
return bRetval;
}
void Buban103ProcessData(int commid, BUBAN103PORTPARAM *psPortParam, BOOL bProcess)
{
RTUMSG msg;
BUBAN103PORTPARAM *pPortParam;
/*
if(FALSE == GetPortParamPtr(commid, &pPortParam))
{
return;
}
*/
pPortParam = psPortParam;
if(TRUE == bProcess)
{
msg.PortIdx = commid;
//msg.MsgType = iCOMM_DATA;
msg.MsgLen = psPortParam->m_iRecvLen;
memcpy(msg.MsgData, psPortParam->m_achRecvBuf, msg.MsgLen);
msg.MsgData[msg.MsgLen] = CHECK_WHOLE;
msg.MsgData[msg.MsgLen+1] = 0;
// 子站数据处理
2 years ago
if(PROTOCOL_SLAVE == pPortParam->m_psBaoHu->PortType)
{
ProvRtuProtocolDataProcess(commid, &msg);
return;
}
// 主站数据处理
2 years ago
switch(msg.MsgData[0])
{
case 0x68:
Buban103longprocess(&msg);
break;
case 0x10:
Buban103shortprocess(&msg);
break;
default:
break;
}
}
// 总召唤完成后指向下一个地址
2 years ago
Buban103CalcNextDev(commid, TRUE);
}
BOOL FindProtectDev(BUBAN103PORTPARAM *psPortParam, \
DEVADDRPARAM *psAddrParam, \
BOOL bJudgeLinkOnly)
{
int i, j;
BYTE uchAddr;
BOOL bRetVal;
bRetVal = FALSE;
for(i=0; i<psPortParam->m_iLinkNum; i++)
{
if(psPortParam->m_psLink[i].m_uchLinkAddr != 0xFF)
{
if(psPortParam->m_psLink[i].m_uchLinkAddr != psAddrParam->m_uchLinkAddr)
{
continue;
}
uchAddr = psAddrParam->m_uchCommAddr;
if(bJudgeLinkOnly == TRUE)
{
bRetVal = TRUE;
psAddrParam->m_iLinkIdx = i;
psAddrParam->m_iDevIdx = 0;
break;
}
}
else
{
// 装置地址就是链路地址
2 years ago
uchAddr = psAddrParam->m_uchLinkAddr;
if(psAddrParam->m_uchLinkAddr == 0xFF)
{
uchAddr = psAddrParam->m_uchCommAddr;
psAddrParam->m_uchLinkAddr = uchAddr;
}
}
for(j=0; j<psPortParam->m_psLink[i].m_iDevNum; j++)
{
if(psPortParam->m_psLink[i].m_psDev != NULL)
{
if(psPortParam->m_psLink[i].m_psDev[j].m_sDevParam.m_u8DevAddr == uchAddr)
{
break;
}
}
else if(psPortParam->m_psLink[i].m_psProvDev != NULL)
{
if(psPortParam->m_psLink[i].m_psProvDev[j].m_iProvAddr == (int)uchAddr)
{
break;
}
}
}
if(j < psPortParam->m_psLink[i].m_iDevNum)
{
psAddrParam->m_iLinkIdx = i;
psAddrParam->m_iDevIdx = j;
bRetVal = TRUE;
break;
}
}
return bRetVal;
}
BOOL FindProtectDevFromProvAddr(BUBAN103PORTPARAM *psPortParam, \
DEVADDRPARAM *psAddrParam, \
int iProvAddr)
{
int i, j;
BOOL bRetVal;
DEVDEF *pDevParam;
PROVDEVDEF *pProvDevParam;
bRetVal = FALSE;
for(i=0; i<psPortParam->m_iLinkNum; i++)
{
for(j=0; j<psPortParam->m_psLink[i].m_iDevNum; j++)
{
if(psPortParam->m_psLink[i].m_psDev != NULL)
{
pDevParam = &psPortParam->m_psLink[i].m_psDev[j];
if(iProvAddr == pDevParam->m_sDevParam.m_iProvAddr)
{
psAddrParam->m_iDevIdx = j;
psAddrParam->m_iLinkIdx = i;
psAddrParam->m_uchLinkAddr = psPortParam->m_psLink[i].m_uchLinkAddr;
psAddrParam->m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
bRetVal = TRUE;
break;
}
}
else if(psPortParam->m_psLink[i].m_psProvDev != NULL)
{
pProvDevParam = &psPortParam->m_psLink[i].m_psProvDev[j];
if(iProvAddr == pProvDevParam->m_iProvAddr)
{
psAddrParam->m_iDevIdx = j;
psAddrParam->m_iLinkIdx = i;
psAddrParam->m_uchLinkAddr = 0;
psAddrParam->m_uchCommAddr = 0;
bRetVal = TRUE;
break;
}
}
else
{
return FALSE;
}
}
if(bRetVal == TRUE)
{
break;
}
}
return bRetVal;
}
BOOL FindProtectDevFromPntNo(BUBAN103PORTPARAM *psPortParam, \
DEVADDRPARAM *psAddrParam, \
DBINFO *psDBInfo,\
int iPntNo, int itype)
{
int i, j, inum, ipnt;
BOOL bRetVal, bProv;
DEVDEF *pDevParam=NULL;
PROVDEVDEF *pProvDevParam=NULL;
DBORIENTATION *pDataUnit=NULL;
bRetVal = FALSE;
if(psPortParam->m_psLink[0].m_psDev != NULL)
{
pProvDevParam = NULL;
bProv = FALSE;
}
else if(psPortParam->m_psLink[0].m_psProvDev != NULL)
{
pDevParam = NULL;
bProv = TRUE;
}
else
{
return FALSE;
}
for(i=0; i<psPortParam->m_iLinkNum; i++)
{
for(j=0; j<psPortParam->m_psLink[i].m_iDevNum; j++)
{
if(bProv == FALSE)
{
pDevParam = &psPortParam->m_psLink[i].m_psDev[j];
switch(itype)
{
case AI_PNT_TYPE:
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[0];
break;
case DI_PNT_TYPE:
pDataUnit = &pDevParam->m_sDevParam.m_sDiDBOrientation;
break;
case PI_PNT_TYPE:
pDataUnit = &pDevParam->m_sDevParam.m_sPiDBOrientation;
break;
default:
pDataUnit = NULL;
break;
}
}
else
{
pProvDevParam = &psPortParam->m_psLink[i].m_psProvDev[j];
switch(itype)
{
case DI_PNT_TYPE:
pDataUnit = &pProvDevParam->m_sYxInfo;
break;
case AI_PNT_TYPE:
case PI_PNT_TYPE:
default:
pDataUnit = NULL;
break;
}
}
if(pDataUnit == NULL)
{
continue;
}
if(AI_PNT_TYPE == itype)
{
for(inum=0; inum<DEV_AI_MAXNUM; inum++)
{
if(pDataUnit[inum].m_iPntNum <= 0)
{
break;
}
ipnt = iPntNo - pDataUnit[inum].m_iStartPntNo;
if((ipnt >= 0) && (ipnt < pDataUnit[inum].m_iPntNum))
{
pDataUnit = &pDataUnit[inum];
bRetVal = TRUE;
break;
}
}
}
else
{
if(pDataUnit->m_iPntNum <= 0)
{
break;
}
ipnt = iPntNo - pDataUnit->m_iStartPntNo;
if((ipnt >= 0) && (ipnt < pDataUnit->m_iPntNum))
{
bRetVal = TRUE;
}
}
if(TRUE == bRetVal)
{
break;
}
}
if(bRetVal == TRUE)
{
break;
}
}
if(TRUE == bRetVal)
{
psAddrParam->m_iDevIdx = j;
psAddrParam->m_iLinkIdx = i;
psAddrParam->m_uchLinkAddr = psPortParam->m_psLink[i].m_uchLinkAddr;
//if(pDevParam != NULL)
//{
// psAddrParam->m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
//}
//else if(pProvDevParam != NULL)
//{
// psAddrParam->m_uchCommAddr = (BYTE)pProvDevParam->m_iProvAddr;
//}
//else
//{
// bRetVal = FALSE;
//}
if(FALSE == bProv)
{
psAddrParam->m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
}
else
{
psAddrParam->m_uchCommAddr = (BYTE)pProvDevParam->m_iProvAddr;
}
if(psDBInfo != NULL)
{
memcpy((void *)psDBInfo, (void *)&pDataUnit->m_psDataInfo[ipnt], sizeof(DBINFO));
}
}
return bRetVal;
}
BOOL FindProtectDevFromYkYtPnt(BUBAN103PORTPARAM *psPortParam, \
DEVADDRPARAM *psAddrParam, \
int iYkYtPnt)
{
int i, j, iYkNo;
BOOL bRetVal;
DEVDEF *pDevParam;
bRetVal = FALSE;
for(i=0; i<psPortParam->m_iLinkNum; i++)
{
for(j=0; j<psPortParam->m_psLink[i].m_iDevNum; j++)
{
pDevParam = &psPortParam->m_psLink[i].m_psDev[j];
if(pDevParam->m_sDevParam.m_sYkDBOrientation.m_iPntNum <= 0)
{
continue;
}
iYkNo = iYkYtPnt - pDevParam->m_sDevParam.m_sYkDBOrientation.m_iStartPntNo;
if(iYkNo < 0)
{
continue;
}
if(iYkNo < pDevParam->m_sDevParam.m_sYkDBOrientation.m_iPntNum)
{
psAddrParam->m_iDevIdx = j;
psAddrParam->m_iLinkIdx = i;
psAddrParam->m_uchLinkAddr = psPortParam->m_psLink[i].m_uchLinkAddr;
psAddrParam->m_uchCommAddr = pDevParam->m_sDevParam.m_u8DevAddr;
bRetVal = TRUE;
break;
}
}
if(bRetVal == TRUE)
{
break;
}
}
return bRetVal;
}
int FindYkPointFromDev(DBORIENTATION *psYkYtDBUnit, BYTE u8Fun, BYTE u8Inf)
{
int i, iYkNo;
if(psYkYtDBUnit->m_iPntNum <= 0)
{
return -1;
}
for(i=0; i<psYkYtDBUnit->m_iPntNum; i++)
{
if((psYkYtDBUnit->m_psDataInfo[i].m_u8Fun == u8Fun)\
&& (psYkYtDBUnit->m_psDataInfo[i].m_u8Inf == u8Inf))
{
break;
}
}
if(i >= psYkYtDBUnit->m_iPntNum)
{
return -1;
}
iYkNo = psYkYtDBUnit->m_iStartPntNo+i;
return iYkNo;
}
BOOL GetSpecialPtr(int commid, DEVADDRPARAM *psDevAddrParam,\
BUBAN103PORTPARAM **ppsPortParam,\
BUBAN103LINKDEF **ppsLinkParam, DEVDEF **ppsDevParam)
{
if(IsExtInfoPtr(commid) == FALSE)
{
return FALSE;
}
// wen 2005.06.22 修改指针判断为直接赋值
2 years ago
/*
if((*ppsPortParam) != NULL)
{
*ppsPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
}
if((*ppsLinkParam) != NULL)
{
*ppsLinkParam = &((*ppsPortParam)->m_psLink[psDevAddrParam->m_iLinkIdx]);
}
if((*ppsDevParam) != NULL)
{
*ppsDevParam = &((*ppsLinkParam)->m_psDev[psDevAddrParam->m_iDevIdx]);
}
*/
if(ppsPortParam != NULL)
{
*ppsPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
}
if(ppsLinkParam != NULL)
{
*ppsLinkParam = &((*ppsPortParam)->m_psLink[psDevAddrParam->m_iLinkIdx]);
}
if(ppsDevParam != NULL)
{
*ppsDevParam = &((*ppsLinkParam)->m_psDev[psDevAddrParam->m_iDevIdx]);
}
return TRUE;
}
BOOL GetSpecialProvPtr(int commid, DEVADDRPARAM *psDevAddrParam,\
BUBAN103PORTPARAM **ppsPortParam,\
BUBAN103LINKDEF **ppsLinkParam, PROVDEVDEF **ppsProvDevParam)
{
if(IsExtInfoPtr(commid) == FALSE)
{
return FALSE;
}
// wen 2005.06.22 修改指针判断为直接赋值
2 years ago
/*
if((*ppsPortParam) != NULL)
{
*ppsPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
}
if((*ppsLinkParam) != NULL)
{
*ppsLinkParam = &((*ppsPortParam)->m_psLink[psDevAddrParam->m_iLinkIdx]);
}
if((*ppsProvDevParam) != NULL)
{
*ppsProvDevParam = &((*ppsLinkParam)->m_psProvDev[psDevAddrParam->m_iDevIdx]);
}
*/
if(ppsPortParam != NULL)
{
*ppsPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
}
if(ppsLinkParam != NULL)
{
*ppsLinkParam = &((*ppsPortParam)->m_psLink[psDevAddrParam->m_iLinkIdx]);
}
if(ppsProvDevParam != NULL)
{
*ppsProvDevParam = &((*ppsLinkParam)->m_psProvDev[psDevAddrParam->m_iDevIdx]);
}
return TRUE;
}
BOOL GetPortParamPtr(int commid, BUBAN103PORTPARAM **ppsPortParam)
{
if(IsExtInfoPtr(commid) == FALSE)
{
return FALSE;
}
// wen 2005.06.22 修改指针判断为直接赋值
2 years ago
/*
if((*ppsPortParam) != NULL)
{
*ppsPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
}
else
{
printf("*ppsPortParam is NULL.\n");
return FALSE;
}
*/
if(ppsPortParam != NULL)
{
*ppsPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
}
else
{
return FALSE;
}
return TRUE;
}
BOOL GetOneValueOfASDU10(BYTE *pu8SourData, VALUEDEF *psValue, BYTE u8DataType, BYTE u8DataLen)
{
BOOL bRetVal;
BYTE i, u8Len;
float fValue;
double dfValue;
psValue->m_unValue.m_dwValue = 0;
psValue->m_iDataType = DT_NO;
u8Len = u8DataLen;
bRetVal = TRUE;
switch(u8DataType)
{
case DATAID_OS8ASCII: // 8位ASCII
2 years ago
psValue->m_iDataType = DT_STRING;
if(u8Len >= MAXSTRINGLEN)
{
u8Len = MAXSTRINGLEN-1;
}
for(i=0; i<u8Len; i++)
{
psValue->m_szValue[i] = pu8SourData[i];
}
psValue->m_szValue[i] = 0;
psValue->m_iDataNum = u8Len;
break;
case DATAID_BSTRING: // 8位2进制数
2 years ago
psValue->m_iDataType = DT_CONTROL;
psValue->m_iDataNum = u8Len;
u8Len = (u8DataLen+7) / 8;
if(u8Len > sizeof(DWORD))
{
u8Len = sizeof(DWORD);
psValue->m_iDataNum = u8Len*8;
}
for(i=0; i<u8Len; i++)
{
psValue->m_unValue.m_dwValue += (pu8SourData[i] << (i*8));
}
break;
case DATAID_UI: // 无符号整数
2 years ago
psValue->m_iDataType = DT_UINT;
for(i=0; i<u8Len; i++)
{
psValue->m_unValue.m_uValue += (pu8SourData[i] << (i*8));
}
break;
case DATAID_INT: // 整数
2 years ago
case DATAID_EXDATA_0X24:
psValue->m_iDataType = DT_INT;
for(i=0; i<u8Len; i++)
{
psValue->m_unValue.m_iValue += (pu8SourData[i] << (i*8));
}
break;
case DATAID_UFLOAT: // 无符号浮点数
2 years ago
psValue->m_iDataType = DT_FLOAT;
fValue = *(float *)(pu8SourData);
SequenceRtuToHost((char *)(&fValue), sizeof(float));
psValue->m_unValue.m_fValue = fabs(fValue);
break;
case DATAID_FLOAT: // 浮点数
2 years ago
psValue->m_iDataType = DT_FLOAT;
fValue = *(float *)(pu8SourData);
SequenceRtuToHost((char *)(&fValue), sizeof(float));
psValue->m_unValue.m_fValue = fValue;
break;
case DATAID_754SHORT: // R32.23 IEEE 标准754短实数
2 years ago
psValue->m_iDataType = DT_FLOAT;
fValue = *(float *)(pu8SourData);
SequenceRtuToHost((char *)(&fValue), sizeof(float));
psValue->m_unValue.m_fValue = fValue;
break;
case DATAID_754REAL: // R64.53 IEEE 标准754实数
2 years ago
psValue->m_iDataType = DT_FLOAT;
dfValue = *(double *)(pu8SourData);
SequenceRtuToHost((char *)(&dfValue), sizeof(dfValue));
psValue->m_unValue.m_fValue = dfValue;
break;
case DATAID_DOUBLE: // 双点信息
2 years ago
psValue->m_iDataType = DT_BINARY;
psValue->m_iDataNum = 2;
psValue->m_unValue.m_dwValue = pu8SourData[0] & 0x03;
break;
case DATAID_SINGLE: // 单点信息
2 years ago
psValue->m_iDataType = DT_BINARY;
psValue->m_iDataNum = 1;
psValue->m_unValue.m_dwValue = pu8SourData[0] & 0x01;
break;
case DATAID_13BITS: // 带品质描述的被测值(13BITS)
2 years ago
psValue->m_iDataType = DT_UINT;
psValue->m_unValue.m_uValue = pu8SourData[0];
psValue->m_unValue.m_uValue = (pu8SourData[1] & 0x1f) * 256;
break;
case DATAID_WITHTIME: // 带时标的报文
case DATAID_WITHTIMESPACE:// 带相对时标的报文
case DATAID_SORTIDNO: // 通用分类标识序号
case DATAID_STRUCT: // 数据结构
2 years ago
default:
bRetVal = FALSE;
break;
}
return bRetVal;
}
int FindAiGroupIdx(DBORIENTATION *pAiDB, int iMaxNum, BYTE u8Asdu, BYTE u8Fun, BYTE u8Inf)
{
int idx;
for(idx = 0; idx < iMaxNum; idx++)
{
if(pAiDB[idx].m_psDataInfo == NULL)
{
continue;
}
if(u8Asdu == pAiDB[idx].m_psDataInfo[0].m_u8Asdu)
{
if((u8Fun == pAiDB[idx].m_psDataInfo[0].m_u8Fun)\
&& (u8Inf == pAiDB[idx].m_psDataInfo[0].m_u8Inf))
{
break;
}
}
}
return idx;
}
//***************************************************************
//* 接收的数据为固定帧长时的处理程序
//*参数 RTUMSG* rtumsg:接收到的数据信息
2 years ago
//***************************************************************
void Buban103shortprocess(RTUMSG *rtumsg)
{
BOOL bHaveClass1;
int commid;
DEVADDRPARAM sDevAddrParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
sDevAddrParam.m_uchLinkAddr = rtumsg->MsgData[2];
sDevAddrParam.m_uchCommAddr = 0;
if(FindProtectDev(pPortParam, &sDevAddrParam, TRUE) == FALSE)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d 不在端口配置保护范围内!!!",
2 years ago
commid, sDevAddrParam.m_uchLinkAddr, sDevAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
#endif
return;
}
else
{
//printf("find is right and exit.\n");
//return;
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d linkidx=%d, iDevIdx=%d.",
2 years ago
commid, sDevAddrParam.m_uchLinkAddr, sDevAddrParam.m_uchCommAddr,
sDevAddrParam.m_iLinkIdx, sDevAddrParam.m_iDevIdx);
DebugPrint(szbuf);
#endif
//Buban103DispConfig(commid, pPortParam);
//return;
pLinkParam = &pPortParam->m_psLink[sDevAddrParam.m_iLinkIdx];
SetProtectDevStatus(pLinkParam, sDevAddrParam.m_iDevIdx, TRUE);
ClearLinkCnt(pLinkParam, sDevAddrParam.m_iDevIdx);
}
bHaveClass1 = FALSE;
if(rtumsg->MsgData[1] & 0x10)
{
pLinkParam->m_iQueryedAddr_CLASS1 = 0;
pLinkParam->m_iQueryNum_CLASS1_Count = 0;
}
else
{
if(rtumsg->MsgData[1] & 0x20)
{
bHaveClass1 = TRUE;
MakeBuban103_PL1_NA_3_Cmd(commid, &sDevAddrParam);
}
else
{
pLinkParam->m_iQueryedAddr_CLASS1 = 0;
pLinkParam->m_iQueryNum_CLASS1_Count = 0;
}
}
switch(rtumsg->MsgData[1] & 0x0f)
{
case M_CON_NA_3://确认帧
2 years ago
SetDevLinkOk(pLinkParam, sDevAddrParam.m_iDevIdx, TRUE);
if(pLinkParam->m_bRstLinkOk == TRUE)
{
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bInitdata = TRUE;
}
break;
case M_BY_NA_3://忙帧(确认帧)
2 years ago
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bInitdata = TRUE;
break;
case M_NV_NA_3://无所要求的数据帧回答
2 years ago
if(FALSE == bHaveClass1)
{
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bInitdata = TRUE;
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bAllQueryOk = TRUE;
}
break;
case M_LKR_NA_3_1://链路工作正常
2 years ago
SetDevLinkOk(pLinkParam, sDevAddrParam.m_iDevIdx, TRUE);
break;
case M_LKR_NA_3_2://链路服务未工作
2 years ago
SetDevLinkOk(pLinkParam, sDevAddrParam.m_iDevIdx, FALSE);
break;
case M_LKR_NA_3_3://链路服务未实现
2 years ago
SetDevLinkOk(pLinkParam, sDevAddrParam.m_iDevIdx, FALSE);
break;
default:
#ifdef _DEBUG_MSG_
//OutputDebugString("接收到不认识的命令,请检查程序.\n");
DebugPrint("接收到不认识的命令,请检查程序.\n");
2 years ago
#endif
break;
}
}
//***************************************************************
//* 接收的数据为可变帧长时的处理程序
//*参数 RTUMSG* rtumsg:接收到的数据信息
2 years ago
//***************************************************************
void Buban103longprocess(RTUMSG *rtumsg)
{
int commid;
DEVADDRPARAM sDevAddrParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
sDevAddrParam.m_uchLinkAddr = rtumsg->MsgData[5];
sDevAddrParam.m_uchCommAddr = rtumsg->MsgData[9];
if(FindProtectDev(pPortParam, &sDevAddrParam, FALSE) == FALSE)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d 不在端口配置保护范围内!!!",
2 years ago
commid, sDevAddrParam.m_uchLinkAddr, sDevAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
#endif
return;
}
else
{
pLinkParam = &pPortParam->m_psLink[sDevAddrParam.m_iLinkIdx];
SetProtectDevStatus(pLinkParam, sDevAddrParam.m_iDevIdx, TRUE);
ClearLinkCnt(pLinkParam, sDevAddrParam.m_iDevIdx);
}
if(rtumsg->MsgData[4] & 0x10)
{
pLinkParam->m_iQueryedAddr_CLASS1 = 0;
pLinkParam->m_iQueryNum_CLASS1_Count = 0;
}
else
{
if(rtumsg->MsgData[4] & 0x20)
{
MakeBuban103_PL1_NA_3_Cmd(commid, &sDevAddrParam);
}
else
{
if(pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bAllQueryOk == FALSE)
{
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bAllQueryOk = TRUE;
}
pLinkParam->m_iQueryedAddr_CLASS1 = 0;
pLinkParam->m_iQueryNum_CLASS1_Count = 0;
}
}
switch(rtumsg->MsgData[6])//类型标识域
2 years ago
{
case M_TM_TA_3: // 1带时标的报文
2 years ago
Buban103TMprocess(rtumsg, &sDevAddrParam);
break;
case M_TMR_TA_3: // 2带相对时间的时标报文
2 years ago
Buban103TMRprocess(rtumsg, &sDevAddrParam);
break;
case M_MEI_NA_3: // 3被测值I报文
2 years ago
Buban103MEIprocess(rtumsg, &sDevAddrParam);
break;
case M_TME_TA_3: // 4带相对时间的有时标的被测值报文
2 years ago
Buban103TMEprocess(rtumsg, &sDevAddrParam);
break;
case M_IRC_NA_3: // 5标识报文
2 years ago
Buban103IRCprocess(rtumsg, &sDevAddrParam);
break;
case M_SYN_TA_3: // 6时间同步报文
2 years ago
Buban103SynTime(rtumsg, &sDevAddrParam);
break;
case M_TGI_NA_3: // 8总查询总召唤中止报文
2 years ago
pLinkParam->m_bRstLinkOk = FALSE;
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bInitdata = FALSE;
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bAllQueryOk = TRUE;
break;
case M_MEII_NA_3: // 9被测值II报文
2 years ago
Buban103MEIINAprocess(rtumsg, &sDevAddrParam);
break;
case M_GD_NTA_3: // 10通用分类数据报文
//如果NGD的COUNT位为零则表示该批通用分类数据传输结束
2 years ago
if((rtumsg->MsgData[13] & 0x80) == 0)
{
pLinkParam->m_bRstLinkOk = FALSE;
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bInitdata = FALSE;
}
Buban103GDprocess(rtumsg, &sDevAddrParam);
break;
case M_GI_NTA_3: // 11通用分类标识报文
2 years ago
Buban103GIprocess(rtumsg, &sDevAddrParam);
break;
// wen 2003.10.27 增加扰动数据的处理
case M_LRD_TA_3: // 23被记录扰动表报文
2 years ago
Buban103LRDprocess(rtumsg);
break;
case M_RTD_TA_3: // 26扰动数据传输准备就绪报文
2 years ago
Buban103RTDprocess(rtumsg);
break;
case M_RTC_NA_3: // 27被记录的通道传输准备就绪报文
2 years ago
Buban103RTCprocess(rtumsg);
break;
case M_RTT_NA_3: // 28带标志的状态变位的传输准备就绪报文
2 years ago
Buban103RTTprocess(rtumsg);
break;
case M_TOT_TA_3: // 29带标志的状态变位传输报文
2 years ago
Buban103TOTprocess(rtumsg);
break;
case M_TOV_NA_3: // 30传输扰动值报文
2 years ago
Buban103TOVprocess(rtumsg);
break;
case M_EOT_TA_3: // 31传输结束报文
2 years ago
Buban103EOTprocess(rtumsg);
pLinkParam->m_bRstLinkOk = FALSE;
pLinkParam->m_psDev[sDevAddrParam.m_iDevIdx].m_bInitdata = FALSE;
break;
case M_MEIII_TA_3: // 32带时标的被测值Ⅲ
2 years ago
Buban103MEIIITAprocess(rtumsg, &sDevAddrParam);
break;
case M_MEIV_TA_3: // 33带时标的被测值Ⅳ
2 years ago
Buban103MEIVTAprocess(rtumsg, &sDevAddrParam);
break;
case M_MEV_TA_3: // 34带时标的被测值
2 years ago
Buban103MEVTAprocess(rtumsg, &sDevAddrParam);
break;
case M_MEVI_TA_3: // 35带时标的被测值Ⅵ
2 years ago
Buban103MEVITAprocess(rtumsg, &sDevAddrParam);
break;
case M_IT_NA_3: // 36电能脉冲计数值
2 years ago
Buban103ITNAprocess(rtumsg, &sDevAddrParam);
break;
case M_IT_TA_3: // 37带时标的电能脉冲计数值
2 years ago
//Buban103MEITTAprocess(rtumsg, &sDevAddrParam);
break;
case M_ST_NA_3: // 38步位置信息
2 years ago
Buban103STNAprocess(rtumsg, &sDevAddrParam);
break;
case M_ST_TA_3: // 39带时标的步位置信息
2 years ago
//Buban103STTAprocess(rtumsg, &sDevAddrParam);
break;
case M_SP_NA_3: // 40单点状态信息
2 years ago
Buban103SPNAprocess(rtumsg, &sDevAddrParam);
break;
case M_SP_TA_3: // 41带时标的单点状态信息
2 years ago
Buban103SPTAprocess(rtumsg, &sDevAddrParam);
break;
case M_DP_NA_3: // 42双点状态信息
2 years ago
Buban103DPNAprocess(rtumsg, &sDevAddrParam);
break;
case M_DP_TA_3: // 43带时标的双点状态信息
2 years ago
Buban103DPTAprocess(rtumsg, &sDevAddrParam);
break;
case M_SS_NA_3: // 44单点状态和状态变位检出
2 years ago
Buban103SSNAprocess(rtumsg, &sDevAddrParam);
break;
case M_SS_TA_3: // 45带时标的单点状态和状态变位检出
2 years ago
Buban103SSTAprocess(rtumsg, &sDevAddrParam);
break;
case M_DS_NA_3: // 46双点状态和状态变位检出
2 years ago
Buban103DSNAprocess(rtumsg, &sDevAddrParam);
break;
case M_DS_TA_3: // 47带时标的双点状态和状态变位检出
2 years ago
Buban103DSTAprocess(rtumsg, &sDevAddrParam);
break;
case M_WL_TA_3: // 48水位
2 years ago
Buban103WLTAprocess(rtumsg, &sDevAddrParam);
break;
case M_MEVII_NA_3: // 50被测值Ⅶ
2 years ago
Buban103MEVIINAprocess(rtumsg, &sDevAddrParam);
break;
case C_DC_NA_3: // 64控制断路器命令
2 years ago
Buban103YkAck(rtumsg, &sDevAddrParam);
break;
case C_RC_NA_3: // 65升降命令
2 years ago
Buban103YtAck(rtumsg, &sDevAddrParam);
break;
case C_SE_NA_3: // 66设定命令
2 years ago
break;
case C_CC_NA_3: // 67控制命令
2 years ago
break;
case M_EX_PI_3: // 205西门子公司扩展电度数据
2 years ago
Buban103EXPIprocess(rtumsg, &sDevAddrParam);
break;
default:
#ifdef _DEBUG_MSG_
DebugPrint("接收到不认识的命令,请检查程序.\n");
2 years ago
#endif
break;
}
}
void Buban103TMprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
// 可变结构限定词(VSQ)=0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
//rtumsg->MsgData[11];
// DPI
//rtumsg->MsgData[12];
// 四个八位位组二进制时间
2 years ago
//rtumsg->MsgData[13];
// 附加信息
2 years ago
//rtumsg->MsgData[17];
Buban103TMprocessOfSoe(rtumsg, psDevAddrParam);
// wen 2004.01.12 上送给保护管理程序
2 years ago
//Buban103TMprocessOfPEvent(rtumsg, psDevAddrParam);
}
void Buban103TMprocessOfSoe(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int i, dipnt, commid, iYkNo;
BYTE buf[16], st;
// 事件发生时间毫秒数
2 years ago
time_t iTime;
WORD wMillSeconds;
struct tm *ptrtm;
DI_DEF pntmsg;
SOE_DEF sSoeData;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
//rtumsg->MsgData[11];
// DPI
//rtumsg->MsgData[12];
// 四个八位位组二进制时间
2 years ago
//rtumsg->MsgData[13];
// 附加信息
2 years ago
//rtumsg->MsgData[17];
commid = rtumsg->PortIdx;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
pDevParam = &pLinkParam->m_psDev[psDevAddrParam->m_iDevIdx];
pDataUnit = &pDevParam->m_sDevParam.m_sDiDBOrientation;
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU1信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
for(i=0; i<pDataUnit->m_iPntNum; i++)
{
// wen 2004.04.11 增加asdu类型判断
2 years ago
if(pLinkParam->m_iJudgeAsduNo != 0)
{
if(M_TM_TA_3 != pDataUnit->m_psDataInfo[i].m_u8Asdu)
{
continue;
}
}
if((pDataUnit->m_psDataInfo[i].m_u8Fun == rtumsg->MsgData[10])\
&& (pDataUnit->m_psDataInfo[i].m_u8Inf == rtumsg->MsgData[11]))
{
break;
}
}
if(i >= pDataUnit->m_iPntNum)
{
//遥控遥调返校
2 years ago
if(M_CAUSE_REMOTE != rtumsg->MsgData[8])
{
return;
}
iYkNo = FindYkPointFromDev(&pDevParam->m_sDevParam.m_sYkDBOrientation, rtumsg->MsgData[10], rtumsg->MsgData[11]);
if(iYkNo >= 0)
{
// buf[0] --- 端口号(=commid)
2 years ago
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- 控点号
2 years ago
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- 操作类型(遥控:1=选择,2=执行,3=取消,7=直控;
// 遥调:4=选择,5=执行,6=取消,8=急停)
// buf[9] --- 控制状态(1=分到合2=合到分)
// (最高位为1时为返校命令, 1=控合, 2=控分, 3=失败)
// 在转发遥控数据点中,只保留了要转发的控点号,实际的端口号应该是该转发点的端口
// 该转发点并没有指定虚拟的转发控点,则控点和转发点的点号一致。
2 years ago
buf[0] = (BYTE)(commid & 0xFF);
buf[1] = (BYTE)((commid & 0xFF00) << 8);
buf[2] = (BYTE)((commid & 0xFF0000) << 16);
buf[3] = (BYTE)((commid & 0xFF000000) << 24);
buf[4] = (BYTE)(iYkNo & 0xFF);
buf[5] = (BYTE)((iYkNo & 0xFF00) << 8);
buf[6] = (BYTE)((iYkNo & 0xFF0000) << 16);
buf[7] = (BYTE)((iYkNo & 0xFF000000) << 24);
buf[8] = STEP_YKYT_EXEC;
buf[9] = rtumsg->MsgData[12] | 0x80;
if(ShmGetDispYkYtFlag())
{
#ifdef _DEBUG_MSG_
//sprintf(szbuf, "端口%d 链路地址=%d 装置地址%d RII=0x%02x, 遥控点号=%d, op=0x%02x!!!\n",
2 years ago
// commid, rtumsg->MsgData[5], rtumsg->MsgData[9], rtumsg->MsgData[13], iYkNo, rtumsg->MsgData[12]);
//DebugPrint(szbuf);
sprintf(szbuf, "TIP_(%04d): commid=%d linkaddr=%d devaddr=%d RII=0x%02x ykytpnt=%d, op=0x%02x.\n",
_getpid(), commid, rtumsg->MsgData[5], rtumsg->MsgData[9], rtumsg->MsgData[13], iYkNo, rtumsg->MsgData[12]);
DebugPrint(szbuf);
#endif
}
Buban103YkYtProcess(commid, buf, 10);
}
return;
}
dipnt = pDataUnit->m_iStartPntNo + i;
st = rtumsg->MsgData[12] & 0x03;
if((st == 0) || (st == 3))
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d 链路地址=%d 装置地址%d RII=%d, 点号=%d, status=%d!!!\n",
2 years ago
commid, rtumsg->MsgData[5], rtumsg->MsgData[9], dipnt, rtumsg->MsgData[12]);
DebugPrint(szbuf);
#endif
return;
}
st--;
pntmsg.Status = st;
// 属于自发或者突发事件就是soe
2 years ago
//if(rtumsg->MsgData[8] == M_CAUSE_AUTOSEND)
if(rtumsg->MsgData[8] != M_CAUSE_QUERY)
{
// 事件发生时间毫秒数
2 years ago
time(&iTime);
ptrtm = localtime(&iTime);
if(ptrtm->tm_hour < (rtumsg->MsgData[16] & 0x1f))
{
iTime -= 24 * 3600;
ptrtm = localtime(&iTime);
}
ptrtm->tm_hour = rtumsg->MsgData[16] & 0x1f;
ptrtm->tm_min = rtumsg->MsgData[15] & 0x3f;
wMillSeconds = rtumsg->MsgData[13] + rtumsg->MsgData[14]*256;
ptrtm->tm_sec = wMillSeconds / 1000;
wMillSeconds %= 1000;
sSoeData.bStatus = st;
sSoeData.iPntNo = dipnt;
sSoeData.u8Type = 1;// ASDU1
sSoeData.wFaultNo = 0;
sSoeData.u8ProvFun = pDataUnit->m_psDataInfo[i].m_u8ProvFun;
sSoeData.u8ProvInf = pDataUnit->m_psDataInfo[i].m_u8ProvInf;
sSoeData.wRelativeTime = 0;
sSoeData.SoeTime.Year = ptrtm->tm_year+1900;
sSoeData.SoeTime.Month = (BYTE)(ptrtm->tm_mon+1);
sSoeData.SoeTime.Day = (BYTE)(ptrtm->tm_mday);
sSoeData.SoeTime.Hour = (BYTE)(ptrtm->tm_hour);
sSoeData.SoeTime.Min = (BYTE)(ptrtm->tm_min);
sSoeData.SoeTime.Sec = (BYTE)(ptrtm->tm_sec);
sSoeData.SoeTime.mSec = wMillSeconds;
SetPntMsg(pDataUnit->m_iStnNo-1, dipnt, (void *)&sSoeData, DI_PNT_TYPE, PNT_SOE_TIME_EX);
}
SetPntMsg(pDataUnit->m_iStnNo-1, dipnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
void Buban103TMRprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
//rtumsg->MsgData[11];
// DPI
//rtumsg->MsgData[12];
// 相对时间
2 years ago
//rtumsg->MsgData[13];
// 故障序号
2 years ago
//rtumsg->MsgData[15];
// 四个八位位组二进制时间
2 years ago
//rtumsg->MsgData[17];
// 附加信息
2 years ago
//rtumsg->MsgData[21];
Buban103TMRprocessOfSoe(rtumsg, psDevAddrParam);
// wen 2004.01.12 上送给保护管理程序
2 years ago
//Buban103TMRprocessOfPEvent(rtumsg, psDevAddrParam);
}
void Buban103TMRprocessOfSoe(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int i, dipnt, commid;
BYTE st;
// 事件发生时间毫秒数
2 years ago
time_t iTime;
WORD wMillSeconds, wTime, wFault;
struct tm *ptrtm;
DI_DEF pntmsg;
SOE_DEF sSoeData;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
//rtumsg->MsgData[11];
// DPI
//rtumsg->MsgData[12];
// 相对时间
2 years ago
//rtumsg->MsgData[13];
// 故障序号
2 years ago
//rtumsg->MsgData[15];
// 四个八位位组二进制时间
2 years ago
//rtumsg->MsgData[17];
// 附加信息
2 years ago
//rtumsg->MsgData[21];
commid = rtumsg->PortIdx;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
pDevParam = &pLinkParam->m_psDev[psDevAddrParam->m_iDevIdx];
pDataUnit = &pDevParam->m_sDevParam.m_sDiDBOrientation;
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU2信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
for(i=0; i<pDataUnit->m_iPntNum; i++)
{
// wen 2004.04.11 增加asdu类型判断
2 years ago
if(pLinkParam->m_iJudgeAsduNo != 0)
{
if(M_TMR_TA_3 != pDataUnit->m_psDataInfo[i].m_u8Asdu)
{
continue;
}
}
if((pDataUnit->m_psDataInfo[i].m_u8Fun == rtumsg->MsgData[10])\
&& (pDataUnit->m_psDataInfo[i].m_u8Inf == rtumsg->MsgData[11]))
{
break;
}
}
if(i >= pDataUnit->m_iPntNum)
{
return;
}
dipnt = pDataUnit->m_iStartPntNo + i;
if(rtumsg->MsgData[8] == M_CAUSE_QUERY)
{
// 相对时间和故障序号是无关的
2 years ago
}
else
{
// 相对时间和故障序号是相关的
2 years ago
}
st = rtumsg->MsgData[12] & 0x03;
if((st == 0) || (st == 3))
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d 链路地址=%d 装置地址%d 点号=%d, status=%d!!!\n",
2 years ago
commid, rtumsg->MsgData[5], rtumsg->MsgData[9], dipnt, rtumsg->MsgData[12]);
DebugPrint(szbuf);
#endif
return;
}
wTime = rtumsg->MsgData[13] + rtumsg->MsgData[14]*256;
wFault= rtumsg->MsgData[15] + rtumsg->MsgData[16]*256;
st--;
pntmsg.Status = st;
// 属于自发或者突发事件就是soe
2 years ago
//if(rtumsg->MsgData[8] == M_CAUSE_AUTOSEND)
if(rtumsg->MsgData[8] != M_CAUSE_QUERY)
{
// 事件发生时间毫秒数
2 years ago
time(&iTime);
ptrtm = localtime(&iTime);
if(ptrtm->tm_hour < (rtumsg->MsgData[20] & 0x1f))
{
iTime -= 24 * 3600;
ptrtm = localtime(&iTime);
}
ptrtm->tm_hour = rtumsg->MsgData[20] & 0x1f;
ptrtm->tm_min = rtumsg->MsgData[19] & 0x3f;
wMillSeconds = rtumsg->MsgData[17] + rtumsg->MsgData[18]*256;
ptrtm->tm_sec = wMillSeconds / 1000;
wMillSeconds %= 1000;
sSoeData.bStatus = st;
sSoeData.iPntNo = dipnt;
sSoeData.u8Type = 2;// ASDU2
sSoeData.wFaultNo = wFault;
sSoeData.wRelativeTime = wTime;
sSoeData.u8ProvFun = pDataUnit->m_psDataInfo[i].m_u8ProvFun;
sSoeData.u8ProvInf = pDataUnit->m_psDataInfo[i].m_u8ProvInf;
sSoeData.SoeTime.Year = ptrtm->tm_year+1900;
sSoeData.SoeTime.Month = (BYTE)(ptrtm->tm_mon+1);
sSoeData.SoeTime.Day = (BYTE)(ptrtm->tm_mday);
sSoeData.SoeTime.Hour = (BYTE)(ptrtm->tm_hour);
sSoeData.SoeTime.Min = (BYTE)(ptrtm->tm_min);
sSoeData.SoeTime.Sec = (BYTE)(ptrtm->tm_sec);
sSoeData.SoeTime.mSec = wMillSeconds;
SetPntMsg(pDataUnit->m_iStnNo-1, dipnt, (void *)&sSoeData, DI_PNT_TYPE, PNT_SOE_TIME_EX);
}
SetPntMsg(pDataUnit->m_iStnNo-1, dipnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
void Buban103MEIprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int commid;
int i, aipnt, iNum, idx;
AI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
//rtumsg->MsgData[11];
// B相电流
2 years ago
//rtumsg->MsgData[12];
// AB相线电流
2 years ago
//rtumsg->MsgData[14];
// 有功功率
2 years ago
//rtumsg->MsgData[16];
// 无功功率
2 years ago
//rtumsg->MsgData[18];
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// wen 2004.02.04 配置与测量值类型不固定关联
// 总共7组被测值
2 years ago
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*for(idx = 0; idx < DEV_AI_MAXNUM; idx++)
{
if(pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo == NULL)
{
continue;
}
if(M_MEI_NA_3 == pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo[0].m_u8Asdu)
{
break;
}
}*/
//===================================================================================================
idx = FindAiGroupIdx(pDevParam->m_sDevParam.m_sAiDBOrientation, DEV_AI_MAXNUM, M_MEI_NA_3, rtumsg->MsgData[10], rtumsg->MsgData[11]);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(idx >= DEV_AI_MAXNUM)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU3(%d,%d) 测量值Ⅰ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
else
{
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[idx];
}
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU3(%d,%d) 测量值Ⅰ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
//if((rtumsg->MsgData[10] != pDataUnit->m_psDataInfo[0].m_u8Fun)\
// || (rtumsg->MsgData[11] != pDataUnit->m_psDataInfo[0].m_u8Inf))
//{
// return;
//}
iNum = rtumsg->MsgData[7] & 0x7f;
if(iNum > pDataUnit->m_iPntNum)
{
iNum = pDataUnit->m_iPntNum;
}
aipnt = pDataUnit->m_iStartPntNo;
for(i=0; i<iNum; i++)
{
// 最低3位为品质描述
2 years ago
pntmsg.RawValue = (short)((rtumsg->MsgData[12+2*i]&0xf8) + rtumsg->MsgData[13+2*i] * 256);
pntmsg.RawValue /= 8;
SetPntMsg(pDataUnit->m_iStnNo-1, aipnt+i, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
}
}
void Buban103TMEprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int commid;
int idx;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
//rtumsg->MsgData[11];
// DPI
//rtumsg->MsgData[12];
// 相对时间
2 years ago
//rtumsg->MsgData[13];
// 故障序号
2 years ago
//rtumsg->MsgData[15];
// 四个八位位组二进制时间
2 years ago
//rtumsg->MsgData[17];
// 附加信息
2 years ago
//rtumsg->MsgData[21];
return;
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// wen 2004.02.04 配置与测量值类型不固定关联
// 总共7组被测值
2 years ago
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*for(idx = 0; idx < DEV_AI_MAXNUM; idx++)
{
if(pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo == NULL)
{
continue;
}
if(M_TME_TA_3 == pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo[0].m_u8Asdu)
{
break;
}
}*/
//===================================================================================================
idx = FindAiGroupIdx(pDevParam->m_sDevParam.m_sAiDBOrientation, DEV_AI_MAXNUM, M_TME_TA_3, rtumsg->MsgData[10], rtumsg->MsgData[11]);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(idx >= DEV_AI_MAXNUM)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU4(%d,%d) 不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
else
{
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[idx];
}
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU4(%d,%d) 不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
}
void Buban103IRCprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int commid;
CMDPARAM sCmdParam;
// 传送原因
2 years ago
if(rtumsg->MsgData[8] == M_CAUSE_POWERON)
{
commid = rtumsg->PortIdx;
memcpy((void *)&sCmdParam.m_sDevAddr, (void *)psDevAddrParam, sizeof(DEVADDRPARAM));
sCmdParam.m_uchFun = 255;
sCmdParam.m_uchInf = 0;
MakeAllQuery_CAsdu7(commid, &sCmdParam);
}
}
void Buban103MEIINAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
//rtumsg->MsgData[11];
// A相电流
2 years ago
//rtumsg->MsgData[12];
// B相电流
2 years ago
//rtumsg->MsgData[14];
// C相电流
2 years ago
//rtumsg->MsgData[16];
// A相电压
2 years ago
//rtumsg->MsgData[18];
// B相电压
2 years ago
//rtumsg->MsgData[20];
// C相电压
2 years ago
//rtumsg->MsgData[22];
// 有功功率
2 years ago
//rtumsg->MsgData[24];
// 无功功率
2 years ago
//rtumsg->MsgData[26];
// 频率
2 years ago
//rtumsg->MsgData[28];
int commid;
int i, aipnt, iNum, idx;
AI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// 总共7组被测值
2 years ago
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*for(idx = 0; idx < DEV_AI_MAXNUM; idx++)
{
if(pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo == NULL)
{
continue;
}
if(M_MEII_NA_3 == pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo[0].m_u8Asdu)
{
break;
}
}*/
//===================================================================================================
idx = FindAiGroupIdx(pDevParam->m_sDevParam.m_sAiDBOrientation, DEV_AI_MAXNUM, M_MEII_NA_3, rtumsg->MsgData[10], rtumsg->MsgData[11]);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(idx >= DEV_AI_MAXNUM)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU9(%d,%d) 测量值Ⅱ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
else
{
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[idx];
}
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU9(%d,%d) 测量值Ⅱ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
//if((rtumsg->MsgData[10] != pDataUnit->m_psDataInfo[0].m_u8Fun)\
// || (rtumsg->MsgData[11] != pDataUnit->m_psDataInfo[0].m_u8Inf))
//{
// return;
//}
iNum = rtumsg->MsgData[7] & 0x7f;
if(iNum > pDataUnit->m_iPntNum)
{
iNum = pDataUnit->m_iPntNum;
}
aipnt = pDataUnit->m_iStartPntNo;
for(i=0; i<iNum; i++)
{
// 品质描述,数据溢出
2 years ago
//if(rtumsg->MsgData[12+2*i] & 0x01);
// 品质描述,数据无效
2 years ago
//if(rtumsg->MsgData[12+2*i] & 0x02);
// 最低3位为品质描述
2 years ago
pntmsg.RawValue = (short)((rtumsg->MsgData[12+2*i]&0xf8) + rtumsg->MsgData[13+2*i] * 256);
pntmsg.RawValue /= 8;
SetPntMsg(pDataUnit->m_iStnNo-1, aipnt+i, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
}
}
void Buban103MEIIITAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
// = 144 --- 147
//rtumsg->MsgData[11];
// L2电流
2 years ago
//rtumsg->MsgData[12];
// L1-L2电流
2 years ago
//rtumsg->MsgData[14];
// 有功功率
2 years ago
//rtumsg->MsgData[16];
// 无功功率
2 years ago
//rtumsg->MsgData[18];
// 被测谐波值1(3 BYTES)
2 years ago
//rtumsg->MsgData[20];
// ... ...
// 被测谐波值N(3 BYTES)
// 四个八位位组的二进制时标
2 years ago
int commid;
int i, aipnt, iNum, idx;
AI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// 总共7组被测值
2 years ago
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*for(idx = 0; idx < DEV_AI_MAXNUM; idx++)
{
if(pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo == NULL)
{
continue;
}
if(M_MEIII_TA_3 == pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo[0].m_u8Asdu)
{
break;
}
}*/
//===================================================================================================
idx = FindAiGroupIdx(pDevParam->m_sDevParam.m_sAiDBOrientation, DEV_AI_MAXNUM, M_MEIII_TA_3, rtumsg->MsgData[10], rtumsg->MsgData[11]);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(idx >= DEV_AI_MAXNUM)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU32(%d,%d) 测量值Ⅲ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
else
{
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[idx];
}
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU32(%d,%d) 测量值Ⅲ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
//if((rtumsg->MsgData[10] != pDataUnit->m_psDataInfo[0].m_u8Fun)\
// || (rtumsg->MsgData[11] != pDataUnit->m_psDataInfo[0].m_u8Inf))
//{
// return;
//}
iNum = rtumsg->MsgData[7] & 0x7f;
if(iNum > pDataUnit->m_iPntNum)
{
iNum = pDataUnit->m_iPntNum;
}
aipnt = pDataUnit->m_iStartPntNo;
// wen 2003.11.01 大于4以后的为谐波值和二进制时标
2 years ago
iNum = 4;
for(i=0; i<iNum; i++)
{
// 最低3位为品质描述
2 years ago
pntmsg.RawValue = (short)((rtumsg->MsgData[12+2*i]&0xf8) + rtumsg->MsgData[13+2*i] * 256);
pntmsg.RawValue /= 8;
SetPntMsg(pDataUnit->m_iStnNo-1, aipnt+i, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
}
}
void Buban103MEIVTAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF) = 148
2 years ago
//rtumsg->MsgData[11];
// L1电流
2 years ago
//rtumsg->MsgData[12];
// L2电流
2 years ago
//rtumsg->MsgData[14];
// L3电流
2 years ago
//rtumsg->MsgData[16];
// Ul1电压
2 years ago
//rtumsg->MsgData[18];
// Ul2电压
2 years ago
//rtumsg->MsgData[20];
// Ul3电压
2 years ago
//rtumsg->MsgData[22];
// 有功功率
2 years ago
//rtumsg->MsgData[24];
// 无功功率
2 years ago
//rtumsg->MsgData[26];
// 频率
2 years ago
//rtumsg->MsgData[28];
// 被测谐波值1(3 BYTES)
2 years ago
//rtumsg->MsgData[30];
// ... ...
// 被测谐波值N(3 BYTES)
// 四个八位位组的二进制时标
2 years ago
int commid;
int i, aipnt, iNum, idx;
AI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// 总共7组被测值
2 years ago
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*for(idx = 0; idx < DEV_AI_MAXNUM; idx++)
{
if(pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo == NULL)
{
continue;
}
if(M_MEIV_TA_3 == pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo[0].m_u8Asdu)
{
break;
}
}*/
//===================================================================================================
idx = FindAiGroupIdx(pDevParam->m_sDevParam.m_sAiDBOrientation, DEV_AI_MAXNUM, M_MEIV_TA_3, rtumsg->MsgData[10], rtumsg->MsgData[11]);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(idx >= DEV_AI_MAXNUM)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU33(%d,%d) 测量值Ⅳ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
else
{
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[idx];
}
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU33(%d,%d) 测量值Ⅳ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
//if((rtumsg->MsgData[10] != pDataUnit->m_psDataInfo[0].m_u8Fun)\
// || (rtumsg->MsgData[11] != pDataUnit->m_psDataInfo[0].m_u8Inf))
//{
// return;
//}
iNum = rtumsg->MsgData[7] & 0x7f;
if(iNum > pDataUnit->m_iPntNum)
{
iNum = pDataUnit->m_iPntNum;
}
aipnt = pDataUnit->m_iStartPntNo;
// wen 2003.11.01 大于9以后的为谐波值和二进制时标
2 years ago
iNum = 9;
for(i=0; i<iNum; i++)
{
// 最低3位为品质描述
2 years ago
pntmsg.RawValue = (short)((rtumsg->MsgData[12+2*i]&0xf8) + rtumsg->MsgData[13+2*i] * 256);
pntmsg.RawValue /= 8;
SetPntMsg(pDataUnit->m_iStnNo-1, aipnt+i, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
}
}
// 被测值V报文
2 years ago
void Buban103MEVTAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)
2 years ago
// = 144 --- 147
//rtumsg->MsgData[11];
// 以下值为向量
// L2电流
2 years ago
//rtumsg->MsgData[12];
// L1-L2电流
2 years ago
//rtumsg->MsgData[16];
// 有功功率
2 years ago
//rtumsg->MsgData[20];
// 无功功率
2 years ago
//rtumsg->MsgData[24];
// 被测谐波值1(4 BYTES)
2 years ago
//rtumsg->MsgData[28];
// ... ...
// 被测谐波值N(4 BYTES)
// 四个八位位组的二进制时标
2 years ago
int commid;
int aipnt, iNum, idx;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// 总共7组被测值
2 years ago
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*for(idx = 0; idx < DEV_AI_MAXNUM; idx++)
{
if(pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo == NULL)
{
continue;
}
if(M_MEV_TA_3 == pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo[0].m_u8Asdu)
{
break;
}
}*/
//===================================================================================================
idx = FindAiGroupIdx(pDevParam->m_sDevParam.m_sAiDBOrientation, DEV_AI_MAXNUM, M_MEV_TA_3, rtumsg->MsgData[10], rtumsg->MsgData[11]);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(idx >= DEV_AI_MAXNUM)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU34(%d,%d) 测量值Ⅴ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
else
{
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[idx];
}
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU34(%d,%d) 测量值Ⅴ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
//if((rtumsg->MsgData[10] != pDataUnit->m_psDataInfo[0].m_u8Fun)\
// || (rtumsg->MsgData[11] != pDataUnit->m_psDataInfo[0].m_u8Inf))
//{
// return;
//}
iNum = rtumsg->MsgData[7] & 0x7f;
if(iNum > pDataUnit->m_iPntNum)
{
iNum = pDataUnit->m_iPntNum;
}
aipnt = pDataUnit->m_iStartPntNo;
}
// 被测值VI报文
2 years ago
void Buban103MEVITAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF) = 148
2 years ago
//rtumsg->MsgData[11];
// L1电流
2 years ago
//rtumsg->MsgData[12];
// L2电流
2 years ago
//rtumsg->MsgData[16];
// L3电流
2 years ago
//rtumsg->MsgData[20];
// Ul1电压
2 years ago
//rtumsg->MsgData[24];
// Ul2电压
2 years ago
//rtumsg->MsgData[28];
// Ul3电压
2 years ago
//rtumsg->MsgData[32];
// 视在功率
2 years ago
//rtumsg->MsgData[36];
// 频率
2 years ago
//rtumsg->MsgData[38];
// 频率变化率 df/dt
2 years ago
//rtumsg->MsgData[40];
// 被测谐波值向量1(3 BYTES)
2 years ago
//rtumsg->MsgData[42];
// ... ...
// 被测谐波值向量N(3 BYTES)
// 四个八位位组的二进制时标
2 years ago
int commid;
int aipnt, iNum, idx;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// 总共7组被测值
2 years ago
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*for(idx = 0; idx < DEV_AI_MAXNUM; idx++)
{
if(pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo == NULL)
{
continue;
}
if(M_MEVI_TA_3 == pDevParam->m_sDevParam.m_sAiDBOrientation[idx].m_psDataInfo[0].m_u8Asdu)
{
break;
}
}*/
//===================================================================================================
idx = FindAiGroupIdx(pDevParam->m_sDevParam.m_sAiDBOrientation, DEV_AI_MAXNUM, M_MEVI_TA_3, rtumsg->MsgData[10], rtumsg->MsgData[11]);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(idx >= DEV_AI_MAXNUM)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU35(%d,%d) 测量值Ⅵ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
else
{
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[idx];
}
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU35(%d,%d) 测量值Ⅵ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
//if((rtumsg->MsgData[10] != pDataUnit->m_psDataInfo[0].m_u8Fun)\
// || (rtumsg->MsgData[11] != pDataUnit->m_psDataInfo[0].m_u8Inf))
//{
// return;
//}
iNum = rtumsg->MsgData[7] & 0x7f;
if(iNum > pDataUnit->m_iPntNum)
{
iNum = pDataUnit->m_iPntNum;
}
aipnt = pDataUnit->m_iStartPntNo;
}
// 被测值VII报文
2 years ago
void Buban103MEVIINAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(92 --- 148)
2 years ago
//rtumsg->MsgData[11];
// 被测值1
2 years ago
//rtumsg->MsgData[12];
// 被测值2
2 years ago
//rtumsg->MsgData[14];
// ... ...
// 被测值n
2 years ago
//rtumsg->MsgData[10+2*N];
int commid;
int i, aipnt, iNum, idx;
AI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// 总共7组被测值
2 years ago
idx = FindAiGroupIdx(pDevParam->m_sDevParam.m_sAiDBOrientation, DEV_AI_MAXNUM, M_MEVII_NA_3, rtumsg->MsgData[10], rtumsg->MsgData[11]);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(idx >= DEV_AI_MAXNUM)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU50(%d,%d) 测量值Ⅶ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
else
{
pDataUnit = &pDevParam->m_sDevParam.m_sAiDBOrientation[idx];
}
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU50(%d,%d) 测量值Ⅶ不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, rtumsg->MsgData[10], rtumsg->MsgData[11]);
DebugPrint(szbuf);
#endif
return;
}
iNum = rtumsg->MsgData[7] & 0x7f;
if(iNum > pDataUnit->m_iPntNum)
{
iNum = pDataUnit->m_iPntNum;
}
aipnt = pDataUnit->m_iStartPntNo;
// wen 2003.11.01 大于9以后的为谐波值和二进制时标
// 南瑞103没有此要求 20060803 yizhonghu
2 years ago
// iNum = 9;
for(i=0; i<iNum; i++)
{
// 最低3位为品质描述
2 years ago
pntmsg.RawValue = (short)((rtumsg->MsgData[12+2*i]&0xf8) + rtumsg->MsgData[13+2*i] * 256);
pntmsg.RawValue /= 8;
SetPntMsg(pDataUnit->m_iStnNo-1, aipnt+i, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
}
}
void Buban103STNAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=1
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(76 --- 79)
2 years ago
//rtumsg->MsgData[11];
// 带瞬变状态指示的值(VTI)
2 years ago
//rtumsg->MsgData[12];
// 品质描述(QDS)
2 years ago
//rtumsg->MsgData[13];
int commid;
int aipnt;
AI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
pDataUnit = &pDevParam->m_sDevParam.m_sStepDBOrientation;
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU38 步位置信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
aipnt = pDataUnit->m_iStartPntNo + rtumsg->MsgData[11] - 76;
if(rtumsg->MsgData[12] & 0x80)
{
// 设备在瞬变状态
2 years ago
}
else
{
// 设备未在瞬变状态
2 years ago
}
pntmsg.RawValue = rtumsg->MsgData[12]&0x7F;
SetPntMsg(pDataUnit->m_iStnNo-1, aipnt, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
//品质描述(QDS) rtumsg->MsgData[13];
2 years ago
}
void Buban103SPNAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int i, dipnt, commid;
BYTE st;
DI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的单点信息1
2 years ago
//rtumsg->MsgData[12];
// 附加信息
2 years ago
//rtumsg->MsgData[13];
commid = rtumsg->PortIdx;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
pDevParam = &pLinkParam->m_psDev[psDevAddrParam->m_iDevIdx];
pDataUnit = &pDevParam->m_sDevParam.m_sDiDBOrientation;
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU1信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
for(i=0; i<pDataUnit->m_iPntNum; i++)
{
// asdu类型判断
2 years ago
if(pLinkParam->m_iJudgeAsduNo != 0)
{
if(M_SP_NA_3 != pDataUnit->m_psDataInfo[i].m_u8Asdu)
{
continue;
}
}
if((pDataUnit->m_psDataInfo[i].m_u8Fun == rtumsg->MsgData[10])\
&& (pDataUnit->m_psDataInfo[i].m_u8Inf == rtumsg->MsgData[11]))
{
break;
}
}
if(i >= pDataUnit->m_iPntNum)
{
return;
}
dipnt = pDataUnit->m_iStartPntNo + i;
st = rtumsg->MsgData[12] & 0x01;
pntmsg.Status = st;
SetPntMsg(pDataUnit->m_iStnNo-1, dipnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
void Buban103SPTAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
Buban103SPTAprocessOfSoe(rtumsg, psDevAddrParam);
}
void Buban103SPTAprocessOfSoe(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int i, dipnt, commid;
BYTE st;
// 事件发生时间毫秒数
2 years ago
time_t iTime;
WORD wMillSeconds;
struct tm *ptrtm;
DI_DEF pntmsg;
SOE_DEF sSoeData;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的单点信息1
2 years ago
//rtumsg->MsgData[12];
// 带品质描述的单点信息1变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[13];
// 带品质描述的单点信息2
2 years ago
//rtumsg->MsgData[17];
// 带品质描述的单点信息2变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[18];
// ... ...
// 带品质描述的单点信息n
2 years ago
//rtumsg->MsgData[12+5*(n-1)];
// 带品质描述的单点信息n变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[12+5*(n-1)+1];
// 附加信息
2 years ago
//rtumsg->MsgData[12+5*n];
commid = rtumsg->PortIdx;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
pDevParam = &pLinkParam->m_psDev[psDevAddrParam->m_iDevIdx];
pDataUnit = &pDevParam->m_sDevParam.m_sDiDBOrientation;
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU1信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
for(i=0; i<pDataUnit->m_iPntNum; i++)
{
// asdu类型判断
2 years ago
if(pLinkParam->m_iJudgeAsduNo != 0)
{
if(M_SP_TA_3 != pDataUnit->m_psDataInfo[i].m_u8Asdu)
{
continue;
}
}
if((pDataUnit->m_psDataInfo[i].m_u8Fun == rtumsg->MsgData[10])\
&& (pDataUnit->m_psDataInfo[i].m_u8Inf == rtumsg->MsgData[11]))
{
break;
}
}
if(i >= pDataUnit->m_iPntNum)
{
return;
}
dipnt = pDataUnit->m_iStartPntNo + i;
st = rtumsg->MsgData[12] & 0x01;
pntmsg.Status = st;
// 属于自发或者突发事件就是soe
2 years ago
if(rtumsg->MsgData[8] != M_CAUSE_QUERY)
{
// 事件发生时间毫秒数
2 years ago
time(&iTime);
ptrtm = localtime(&iTime);
if(ptrtm->tm_hour < (rtumsg->MsgData[16] & 0x1f))
{
iTime -= 24 * 3600;
ptrtm = localtime(&iTime);
}
ptrtm->tm_hour = rtumsg->MsgData[16] & 0x1f;
ptrtm->tm_min = rtumsg->MsgData[15] & 0x3f;
wMillSeconds = rtumsg->MsgData[13] + rtumsg->MsgData[14]*256;
ptrtm->tm_sec = wMillSeconds / 1000;
wMillSeconds %= 1000;
sSoeData.bStatus = st;
sSoeData.iPntNo = dipnt;
sSoeData.u8Type = 1;// ASDU1
sSoeData.wFaultNo = 0;
sSoeData.u8ProvFun = pDataUnit->m_psDataInfo[i].m_u8ProvFun;
sSoeData.u8ProvInf = pDataUnit->m_psDataInfo[i].m_u8ProvInf;
sSoeData.wRelativeTime = 0;
sSoeData.SoeTime.Year = ptrtm->tm_year+1900;
sSoeData.SoeTime.Month = (BYTE)(ptrtm->tm_mon+1);
sSoeData.SoeTime.Day = (BYTE)(ptrtm->tm_mday);
sSoeData.SoeTime.Hour = (BYTE)(ptrtm->tm_hour);
sSoeData.SoeTime.Min = (BYTE)(ptrtm->tm_min);
sSoeData.SoeTime.Sec = (BYTE)(ptrtm->tm_sec);
sSoeData.SoeTime.mSec = wMillSeconds;
SetPntMsg(pDataUnit->m_iStnNo-1, dipnt, (void *)&sSoeData, DI_PNT_TYPE, PNT_SOE_TIME_EX);
}
SetPntMsg(pDataUnit->m_iStnNo-1, dipnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
void Buban103DPNAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的双点信息1
2 years ago
//rtumsg->MsgData[12];
// 带品质描述的双点信息2
2 years ago
//rtumsg->MsgData[13];
// ... ...
// 带品质描述的双点信息n
2 years ago
//rtumsg->MsgData[12+n-1];
// 附加信息
2 years ago
//rtumsg->MsgData[12+n];
}
void Buban103DPTAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的单点信息1
2 years ago
//rtumsg->MsgData[12];
// 带品质描述的单点信息1变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[13];
// 带品质描述的单点信息2
2 years ago
//rtumsg->MsgData[17];
// 带品质描述的单点信息2变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[18];
// ... ...
// 带品质描述的单点信息n
2 years ago
//rtumsg->MsgData[12+5*(n-1)];
// 带品质描述的单点信息n变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[12+5*(n-1)+1];
// 附加信息
2 years ago
//rtumsg->MsgData[12+5*n];
Buban103DPTAprocessOfSoe(rtumsg, psDevAddrParam);
}
void Buban103DPTAprocessOfSoe(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的单点信息1
2 years ago
//rtumsg->MsgData[12];
// 带品质描述的单点信息1变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[13];
// 带品质描述的单点信息2
2 years ago
//rtumsg->MsgData[17];
// 带品质描述的单点信息2变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[18];
// ... ...
// 带品质描述的单点信息n
2 years ago
//rtumsg->MsgData[12+5*(n-1)];
// 带品质描述的单点信息n变化时间(4 bytes)
2 years ago
//rtumsg->MsgData[12+5*(n-1)+1];
// 附加信息
2 years ago
//rtumsg->MsgData[12+5*n];
}
void Buban103SSNAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int i, j, dipnt, commid;
BYTE st, len;
WORD wStatusBit;
DI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的单点信息1状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[12];
// QDS
//rtumsg->MsgData[16];
// 带品质描述的单点信息2状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[17];
// QDS
//rtumsg->MsgData[21];
// ... ...
// 带品质描述的单点信息n状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[12+5*(n-1)];
// QDS
//rtumsg->MsgData[12+5*(n-1)+4];
// 附加信息
2 years ago
//rtumsg->MsgData[12+5*n];
commid = rtumsg->PortIdx;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
pDevParam = &pLinkParam->m_psDev[psDevAddrParam->m_iDevIdx];
pDataUnit = &pDevParam->m_sDevParam.m_sDiDBOrientation;
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU1信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
for(i=0; i<pDataUnit->m_iPntNum; i++)
{
// asdu类型判断
2 years ago
if(pLinkParam->m_iJudgeAsduNo != 0)
{
if(M_SS_NA_3 != pDataUnit->m_psDataInfo[i].m_u8Asdu)
{
continue;
}
}
if((pDataUnit->m_psDataInfo[i].m_u8Fun == rtumsg->MsgData[10])\
&& (pDataUnit->m_psDataInfo[i].m_u8Inf == rtumsg->MsgData[11]))
{
break;
}
}
if(i >= pDataUnit->m_iPntNum)
{
return;
}
dipnt = pDataUnit->m_iStartPntNo + i;
len = (int)rtumsg->MsgData[1];
st = rtumsg->MsgData[12] & 0x01;
pntmsg.Status = st;
SetPntMsg(pDataUnit->m_iStnNo-1, dipnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
for ( i = 10; i < 4 + len; i += 5, dipnt += 16 )
{
wStatusBit = rtumsg->MsgData[i+3];
wStatusBit = (wStatusBit<<8) + rtumsg->MsgData[i+2];
for( j = 0; j < 16; j++ )
{
if( wStatusBit & (0x0001 << j) )
pntmsg.Status = 1;
else
pntmsg.Status = 0;
SetPntMsg(commid, dipnt+j, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
}
}
void Buban103SSTAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ) & 0x7f = 测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的单点信息1状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[12];
// QDS
//rtumsg->MsgData[16];
// 四个八位位组的二进制时标
2 years ago
//rtumsg->MsgData[17];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[21];
// 带品质描述的单点信息2状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[22];
// QDS
//rtumsg->MsgData[26];
// 四个八位位组的二进制时标
2 years ago
//rtumsg->MsgData[27];
// ... ...
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11+10*(n-1)];
// 带品质描述的单点信息n状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[11+10*(n-1)+1];
// QDS
//rtumsg->MsgData[11+10*(n-1)+5];
// 四个八位位组的二进制时标
2 years ago
//rtumsg->MsgData[11+10*(n-1)+6];
// 附加信息
2 years ago
//rtumsg->MsgData[11+10*n];
}
void Buban103DSNAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的双点信息1状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[12];
// QDS
//rtumsg->MsgData[16];
// 带品质描述的双点信息2状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[17];
// QDS
//rtumsg->MsgData[21];
// ... ...
// 带品质描述的双点信息n状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[12+5*(n-1)];
// QDS
//rtumsg->MsgData[12+5*(n-1)+4];
// 附加信息
2 years ago
//rtumsg->MsgData[12+5*n];
}
void Buban103DSTAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ) & 0x7f = 测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11];
// 带品质描述的双点信息1状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[12];
// QDS
//rtumsg->MsgData[16];
// 四个八位位组的二进制时标
2 years ago
//rtumsg->MsgData[17];
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[21];
// 带品质描述的双点信息2状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[22];
// QDS
//rtumsg->MsgData[26];
// 四个八位位组的二进制时标
2 years ago
//rtumsg->MsgData[27];
// ... ...
// 信息序号(INF)(149 --- 238)
2 years ago
//rtumsg->MsgData[11+10*(n-1)];
// 带品质描述的双点信息n状态和状态变化检出=SCD(4 BYTE)
2 years ago
//rtumsg->MsgData[11+10*(n-1)+1];
// QDS
//rtumsg->MsgData[11+10*(n-1)+5];
// 四个八位位组的二进制时标
2 years ago
//rtumsg->MsgData[11+10*(n-1)+6];
// 附加信息
2 years ago
//rtumsg->MsgData[11+10*n];
}
void Buban103WLTAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int commid;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU48 水位信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
}
void Buban103ITNAprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP)
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ)=测量量数目
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF)(6 --- 31)
2 years ago
//rtumsg->MsgData[11];
// 二进制计数器读数CR1(5 BYTES)
2 years ago
//rtumsg->MsgData[12];
// 二进制计数器读数CR2
2 years ago
//rtumsg->MsgData[17];
// ... ...
// 二进制计数器读数CRn
2 years ago
//rtumsg->MsgData[12+5*(N-1)];
// 返回信息标识符(RII)
2 years ago
//rtumsg->MsgData[12+5*N];
int commid;
int i, pipnt, iNum;
PI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
pDataUnit = &pDevParam->m_sDevParam.m_sPiDBOrientation;
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU36 电度量信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
iNum = rtumsg->MsgData[7] & 0x7f;
pipnt = pDataUnit->m_iStartPntNo + rtumsg->MsgData[11] - 6;
for(i=0; i<iNum; i++)
{
// 判断数据是否有效
2 years ago
if(rtumsg->MsgData[12+5*i+4] & 0x80)
{
continue;
}
// 最低3位为品质描述
2 years ago
pntmsg.RawValue = rtumsg->MsgData[12+5*i] + (rtumsg->MsgData[13+5*i] << 8)
+ (rtumsg->MsgData[13+5*i] << 16) + (rtumsg->MsgData[13+5*i] << 24);
SetPntMsg(pDataUnit->m_iStnNo-1, pipnt+i, (void *)&pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
}
}
// 通用分类数据报文(包括所有的定值、模拟量、开关量(压板、开入开出等))
2 years ago
void Buban103GDprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP):10
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ):0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN): 254(0xfe)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF):
// 读组标题 : 240
// 读一个组的全部条目的值或属性 : 241
// 读单个条目的目录 : 243
// 读单个条目的值或属性 : 244
// 对通用分类数据总查询中止 : 245
2 years ago
//rtumsg->MsgData[11];
// 返回信息标识符(RII)
2 years ago
//rtumsg->MsgData[12];
// 通用分类数据集数目
2 years ago
//rtumsg->MsgData[13];
// 以下为多个通用分类数据
// 通用分类标识序号(GIN):条目号和组号
2 years ago
//rtumsg->MsgData[14];
// 描述类别(KOD)
// 无所指定的描述类别 : KOD_NOSPECIFIED(0)
// 实际值 : KOD_ACTUALVALUE(1)
// 缺省值 : KOD_DEFAULTVALUE(2)
// 量程(最大值、最小值、步长) : KOD_RANGE(3)
// 备用 : KOD_BACKUP1(4)
// 精度(n,m) : KOD_PRECISION(5)
// 因子 : KOD_FACTOR(6)
// 参比 : KOD_REFERENCE(7)
// 列表 : KOD_ENUMERATION(8)
// 量纲 : KOD_DIMENSION(9)
// 描述 : KOD_DESCRIPTION(10)
// 备用 : KOD_BACKUP2(11)
// 口令条目 : KOD_PASSWORD(12)
// 只读 : KOD_READONLY(13)
// 只写 : KOD_WRITEONLY(14)
// 备用 : KOD_BACKUP3(15)
// 备用 : KOD_BACKUP4(16)
// 备用 : KOD_BACKUP5(17)
// 备用 : KOD_BACKUP6(18)
// 相应的功能类型和信息序号 : KOD_CORFUNCANDINF(19)
// 相应的事件 : KOD_COREVENT(20)
// 列表的文本阵列 : KOD_ENUMTEXTARRAY(21)
// 列表的值阵列 : KOD_ENUMVALUEARRAY(22)
// 相关联的条目 : KOD_RELATEDENTRIES(23)
2 years ago
//rtumsg->MsgData[16];
// 数据类型描述
2 years ago
//rtumsg->MsgData[17];
//DATAID_NO : 无数据
//DATAID_OS8ASCII : 8位ASCII
//DATAID_BSTRING : 8位2进制数
//DATAID_UIX : 无符号整数
//DATAID_INT : 整数
//DATAID_UFLOAT : 无符号浮点数
//DATAID_FLOAT : 浮点数
//DATAID_754SHORT : R32.23 IEEE 标准754短实数
//DATAID_754REAL : R64.53 IEEE 标准754实数
//DATAID_DOUBLE : 双点信息
//DATAID_SINGLE : 单点信息
//DATAID_13BITS : 带品质描述的被测值(13BITS)
//DATAID_SORTIDNO : 通用分类标识序号
//DATAID_WITHTIME : 带时标的报文
//DATAID_WITHTIMESPACE : 带相对时标的报文
//DATAID_STRUCT : 数据结构
// 数据尺寸
2 years ago
//rtumsg->MsgData[18]
// 数量
2 years ago
//rtumsg->MsgData[19]
// 数据值(长度根据以上描述)
2 years ago
// 2 ... n 个通用分类数据
2 years ago
int commid;
int i, iGroupNo, iCfgGroupIdx;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
// 数据转发在这里处理
2 years ago
if(rtumsg->MsgData[12] == RII_PROV_ID)
{
if(pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid >= 0)
{
if(psDevAddrParam->m_uchCommAddr ==\
pLinkParam->m_sBaoHuCmdParam.m_sRealAddrParam.m_uchCommAddr)
{
// 判断超时时间为5分钟
2 years ago
if(JudgeTimeOut(&pLinkParam->m_sBaoHuCmdParam.m_sBaoHuCmdStartTime, 5*60) == FALSE)
{
if(MSGTYPE_BAOHU_103CMD == pLinkParam->m_sBaoHuCmdParam.m_iBaoHuMsgType)
{
// 转储数据到转发端口
2 years ago
rtumsg->MsgData[9] = (BYTE)pDevParam->m_sDevParam.m_iProvAddr;
rtumsg->PortIdx = pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid;
rtumsg->MsgType = MSGTYPE_BAOHU_103DATA;
PutBaohuDataToPort(rtumsg);
}
else if(MSGTYPE_BAOHU_SCADACMD == pLinkParam->m_sBaoHuCmdParam.m_iBaoHuMsgType)
{
//rtumsg->MsgData[9] = (BYTE)pDevParam->m_sDevParam.m_iProvAddr;
//rtumsg->PortIdx = pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid;
rtumsg->MsgType = MSGTYPE_BAOHU_SCADADATA;
// 按内部保护格式转换
2 years ago
Buban103ScadaProtocolExchange(commid, rtumsg);
}
// 没有后续数据
2 years ago
if((rtumsg->MsgData[13] & 0x80) == 0)
{
pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid = -1;
pLinkParam->m_sBaoHuCmdParam.m_iBaoHuMsgType = 0;
}
return;
}
else
{
pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid = -1;
}
}
}
}
//组 号
2 years ago
iGroupNo = rtumsg->MsgData[14];
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo == iGroupNo)
{
iCfgGroupIdx = i;
break;
}
}
if(i >= pDevParam->m_sDevParam.m_iCfgGroupNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10 通用分类数据处理时Group=%d不在处理范围内!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, iGroupNo);
DebugPrint(szbuf);
#endif
return ;
}
switch(pDevParam->m_sDevParam.m_saGroupDef[iCfgGroupIdx].m_iDataType)
{
// 处理模拟量
2 years ago
case AI_PNT_TYPE:
Buban103GDprocessWithAI(rtumsg, psDevAddrParam, iCfgGroupIdx);
break;
// 处理开关量
2 years ago
case DI_PNT_TYPE:
Buban103GDprocessWithDI(rtumsg, psDevAddrParam, iCfgGroupIdx);
break;
// 处理电度量
2 years ago
case PI_PNT_TYPE:
Buban103GDprocessWithPI(rtumsg, psDevAddrParam, iCfgGroupIdx);
break;
// 处理保护模拟量
2 years ago
case PROTECT_AI_PNT_TYPE:
Buban103GDprocessWithPAI(rtumsg, psDevAddrParam, iCfgGroupIdx);
break;
// 处理保护开关量
2 years ago
case PROTECT_DI_PNT_TYPE:
Buban103GDprocessWithPDI(rtumsg, psDevAddrParam, iCfgGroupIdx);
break;
// 处理保护定值
2 years ago
case PROTECT_FIX_PNT_TYPE:
Buban103GDprocessWithPFIX(rtumsg, psDevAddrParam, iCfgGroupIdx);
break;
// 处理保护事件
2 years ago
case PROTECT_EVENT_PNT_TYPE:
Buban103GDprocessWithPEVENT(rtumsg, psDevAddrParam, iCfgGroupIdx);
break;
default:
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10处理时, Group=%d数据类型(=%d)不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr,
pDevParam->m_sDevParam.m_saGroupDef[iCfgGroupIdx].m_iGroupNo,
pDevParam->m_sDevParam.m_saGroupDef[iCfgGroupIdx].m_iDataType);
DebugPrint(szbuf);
#endif
break;
}
}
void Buban103YkAck(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP):64
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ):0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
//M_CAUSE_REMOTE : // 远方操作
2 years ago
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN): 1
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF): 48 --- 75
2 years ago
//rtumsg->MsgData[11];
// 信息序号(DCC)
2 years ago
//rtumsg->MsgData[12];
// 返回信息标识符(RII)
2 years ago
//rtumsg->MsgData[13];
int commid;
int iYkNo;
BYTE buf[16];
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
if(pDevParam->m_sDevParam.m_sYkDBOrientation.m_iPntNum <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU64 未配置遥控点!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
iYkNo = rtumsg->MsgData[11] - 48 + pDevParam->m_sDevParam.m_iYkStartPnt;
if(iYkNo >= 0)
{
// buf[0] --- 端口号(=commid)
2 years ago
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- 控点号
2 years ago
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- 操作类型(遥控:1=选择,2=执行,3=取消,7=直控;
// 遥调:4=选择,5=执行,6=取消,8=急停)
// buf[9] --- 控制状态(1=分到合2=合到分)
// (最高位为1时为返校命令, 1=控合, 2=控分, 3=失败)
// 在转发遥控数据点中,只保留了要转发的控点号,实际的端口号应该是该转发点的端口
// 该转发点并没有指定虚拟的转发控点,则控点和转发点的点号一致。
2 years ago
buf[0] = (BYTE)(commid & 0xFF);
buf[1] = (BYTE)((commid & 0xFF00) << 8);
buf[2] = (BYTE)((commid & 0xFF0000) << 16);
buf[3] = (BYTE)((commid & 0xFF000000) << 24);
buf[4] = (BYTE)(iYkNo & 0xFF);
buf[5] = (BYTE)((iYkNo & 0xFF00) << 8);
buf[6] = (BYTE)((iYkNo & 0xFF0000) << 16);
buf[7] = (BYTE)((iYkNo & 0xFF000000) << 24);
switch((rtumsg->MsgData[12] & 0xc0) >> 6)
{
case 0://
buf[8] = STEP_YKYT_EXEC;
break;
case 2:
buf[8] = STEP_YKYT_SELECT;
break;
case 3:
buf[8] = STEP_YKYT_CANCEL;
break;
default:
buf[8] = STEP_YKYT_NOEXEC;
break;
}
switch(rtumsg->MsgData[12] & 0x03)
{
case 0:
case 3:
buf[8] = STEP_YKYT_NOEXEC;
break;
default:
buf[9] = (rtumsg->MsgData[12] & 0x03) | 0x80;
break;
}
if(ShmGetDispYkYtFlag())
{
#ifdef _DEBUG_MSG_
//sprintf(szbuf, "端口%d 链路地址=%d 装置地址%d RII=0x%02x, 遥控点号=%d, op=0x%02x!!!\n",
2 years ago
// commid, rtumsg->MsgData[5], rtumsg->MsgData[9], rtumsg->MsgData[13], iYkNo, rtumsg->MsgData[12]);
//DebugPrint(szbuf);
sprintf(szbuf, "TIP_(%04d): commid=%d linkaddr=%d devaddr=%d RII=0x%02x ykpnt=%d, op=0x%02x.\n",
_getpid(), commid, rtumsg->MsgData[5], rtumsg->MsgData[9], rtumsg->MsgData[13], iYkNo, rtumsg->MsgData[12]);
DebugPrint(szbuf);
#endif
}
Buban103YkYtProcess(commid, buf, 10);
}
}
void Buban103YtAck(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP):65
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ):0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
//M_CAUSE_REMOTE : // 远方操作
2 years ago
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN): 1
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF): 48 --- 75
2 years ago
//rtumsg->MsgData[11];
// 信息序号(RCC)
2 years ago
//rtumsg->MsgData[12];
// 返回信息标识符(RII)
2 years ago
//rtumsg->MsgData[13];
int commid;
int iYtNo;
BYTE buf[16];
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
if(pDevParam->m_sDevParam.m_sYkDBOrientation.m_iPntNum <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10 未配置遥控点!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
iYtNo = rtumsg->MsgData[11] - 48 + pDevParam->m_sDevParam.m_iYtStartPnt;
if(iYtNo >= 0)
{
// buf[0] --- 端口号(=commid)
2 years ago
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- 控点号
2 years ago
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- 操作类型(遥控:1=选择,2=执行,3=取消,7=直控;
// 遥调:4=选择,5=执行,6=取消,8=急停)
// buf[9] --- 控制状态(1=分到合2=合到分)
// (最高位为1时为返校命令, 1=控合, 2=控分, 3=失败)
// 在转发遥控数据点中,只保留了要转发的控点号,实际的端口号应该是该转发点的端口
// 该转发点并没有指定虚拟的转发控点,则控点和转发点的点号一致。
2 years ago
buf[0] = (BYTE)(commid & 0xFF);
buf[1] = (BYTE)((commid & 0xFF00) << 8);
buf[2] = (BYTE)((commid & 0xFF0000) << 16);
buf[3] = (BYTE)((commid & 0xFF000000) << 24);
buf[4] = (BYTE)(iYtNo & 0xFF);
buf[5] = (BYTE)((iYtNo & 0xFF00) << 8);
buf[6] = (BYTE)((iYtNo & 0xFF0000) << 16);
buf[7] = (BYTE)((iYtNo & 0xFF000000) << 24);
switch((rtumsg->MsgData[12] & 0xc0) >> 6)
{
case 0://
buf[8] = STEP_YT_EXEC;
break;
case 2:
buf[8] = STEP_YT_SELECT;
break;
case 3:
buf[8] = STEP_YT_CANCEL;
break;
default:
buf[8] = STEP_YKYT_NOEXEC;
break;
}
switch(rtumsg->MsgData[12] & 0x03)
{
case 0:
case 3:
buf[8] = STEP_YKYT_NOEXEC;
break;
default:
buf[9] = (rtumsg->MsgData[12] & 0x03) | 0x80;
break;
}
if(ShmGetDispYkYtFlag())
{
#ifdef _DEBUG_MSG_
//sprintf(szbuf, "端口%d 链路地址=%d 装置地址%d RII=0x%02x, 遥调点号=%d, op=0x%02x!!!\n",
2 years ago
// commid, rtumsg->MsgData[5], rtumsg->MsgData[9], rtumsg->MsgData[13], iYtNo, rtumsg->MsgData[12]);
//DebugPrint(szbuf);
sprintf(szbuf, "TIP_(%04d): commid=%d linkaddr=%d devaddr=%d RII=0x%02x ytpnt=%d, op=0x%02x.\n",
_getpid(), commid, rtumsg->MsgData[5], rtumsg->MsgData[9], rtumsg->MsgData[13], iYtNo, rtumsg->MsgData[12]);
DebugPrint(szbuf);
#endif
}
Buban103YkYtProcess(commid, buf, 10);
}
}
void Buban103GDprocessWithAI(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, commid;
BYTE u8KOD, u8INF, u8NGD, u8DataType;
BYTE u8DataNum, u8DataLen;
int aipnt, aistart, stn, iOffset;
AI_DEF pntmsg;
VALUEDEF sValue;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
iOffset = 14;
if(iOffset >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(AI)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
stn = pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iStationNo;
if(stn <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(AI)_Group=%d 信息不写入数据库!!!",\
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr,\
pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iGroupNo);
DebugPrint(szbuf);
#endif
}
u8INF = rtumsg->MsgData[11];
u8NGD = rtumsg->MsgData[13] & 0x3f;
aistart = pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iStartPntNo;
for(i=0; i<u8NGD; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(AI)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(AI)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
break;
}
// 组号和条目号
2 years ago
aipnt = aistart + rtumsg->MsgData[iOffset+1];
iOffset += 2;
u8KOD = rtumsg->MsgData[iOffset++];
if(KOD_ACTUALVALUE != u8KOD)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(AI)处理时KOD=%d不在处理范围内只处理实际值数据!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 3;
continue;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<u8DataNum; j++)
{
// wen 2004.02.01 如果条目号为0则该条目为该组条目数量不上送
2 years ago
if(((aipnt-aistart) == 0) && (j == 0))
{
if(DATAID_BSTRING != u8DataType)
iOffset += u8DataLen;
else
iOffset += (u8DataLen + 7) / 8;
continue;
}
if(TRUE == GetOneValueOfASDU10(&rtumsg->MsgData[iOffset], &sValue, u8DataType, u8DataLen))
{
switch(sValue.m_iDataType)
{
case DT_UINT:// 无符号整型数
2 years ago
pntmsg.RawValue = (WORD)sValue.m_unValue.m_uValue;
SetPntMsg(stn-1, aipnt+j, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
break;
case DT_INT:
pntmsg.RawValue = (WORD)sValue.m_unValue.m_iValue;
SetPntMsg(stn-1, aipnt+j, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
break;
case DT_FLOAT:
pntmsg.RawValue = (WORD)sValue.m_unValue.m_fValue;
SetPntMsg(stn-1, aipnt+j, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
break;
case DT_CONTROL:
pntmsg.RawValue = (WORD)sValue.m_unValue.m_dwValue;
SetPntMsg(stn-1, aipnt+j, &pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
break;
case DT_NO:// 无数据
2 years ago
case DT_STRING:
case DT_BINARY:
default:
break;
}
}
iOffset += u8DataLen;
}
}
}
void Buban103GDprocessWithDI(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, commid;
BYTE u8KOD, u8INF, u8NGD, u8DataType;
BYTE u8DataNum, u8DataLen;
int dipnt, distart, stn, iOffset;
DI_DEF pntmsg;
VALUEDEF sValue;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
iOffset = 14;
if(iOffset >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(DI)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
stn = pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iStationNo;
if(stn <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(DI)_Group=%d 信息不写入数据库!!!",\
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr,\
pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iGroupNo);
DebugPrint(szbuf);
#endif
}
u8INF = rtumsg->MsgData[11];
u8NGD = rtumsg->MsgData[13] & 0x3f;
distart = pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iStartPntNo;
for(i=0; i<u8NGD; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(DI)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(DI)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
break;
}
// 组号和条目号
2 years ago
dipnt = distart + rtumsg->MsgData[iOffset+1];
iOffset += 2;
u8KOD = rtumsg->MsgData[iOffset++];
if(KOD_ACTUALVALUE != u8KOD)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(DI)处理时KOD=%d不在处理范围内只处理实际值数据!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 3;
continue;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<u8DataNum; j++)
{
// wen 2004.02.01 如果条目号为0则该条目为该组条目数量不上送
2 years ago
if(((dipnt-distart) == 0) && (j == 0))
{
if(DATAID_BSTRING != u8DataType)
iOffset += u8DataLen;
else
iOffset += (u8DataLen + 7) / 8;
continue;
}
if(TRUE == GetOneValueOfASDU10(&rtumsg->MsgData[iOffset], &sValue, u8DataType, u8DataLen))
{
switch(sValue.m_iDataType)
{
case DT_BINARY:
if(sValue.m_iDataNum > 1)
{
if((sValue.m_unValue.m_dwValue > 0)\
&& (sValue.m_unValue.m_dwValue < 3))
{
pntmsg.Status = (BYTE)(sValue.m_unValue.m_dwValue - 1);
}
else
{
pntmsg.Status = 0;
}
}
else
{
pntmsg.Status = (BYTE)(sValue.m_unValue.m_dwValue);
}
SetPntMsg(stn-1, dipnt+j, &pntmsg, DI_PNT_TYPE, PNT_STATUS);
break;
case DT_UINT:// 无符号整型数
2 years ago
if(sValue.m_unValue.m_uValue != 0)
{
pntmsg.Status = 1;
}
else
{
pntmsg.Status = 0;
}
SetPntMsg(stn-1, dipnt+j, &pntmsg, DI_PNT_TYPE, PNT_STATUS);
break;
case DT_INT:
if(sValue.m_unValue.m_iValue != 0)
{
pntmsg.Status = 1;
}
else
{
pntmsg.Status = 0;
}
SetPntMsg(stn-1, dipnt+j, &pntmsg, DI_PNT_TYPE, PNT_STATUS);
break;
case DT_FLOAT:
case DT_CONTROL:
case DT_NO:// 无数据
2 years ago
case DT_STRING:
default:
break;
}
}
iOffset += u8DataLen;
}
}
}
void Buban103GDprocessWithPI(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, commid;
BYTE u8KOD, u8INF, u8NGD, u8DataType;
BYTE u8DataNum, u8DataLen;
int pipnt, pistart, stn, iOffset;
PI_DEF pntmsg;
VALUEDEF sValue;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
iOffset = 14;
if(iOffset >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(PI)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
stn = pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iStationNo;
if(stn <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(PI)_Group=%d 信息不写入数据库!!!",\
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr,\
pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iGroupNo);
DebugPrint(szbuf);
#endif
}
u8INF = rtumsg->MsgData[11];
u8NGD = rtumsg->MsgData[13] & 0x3f;
pistart = pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx].m_iStartPntNo;
for(i=0; i<u8NGD; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(PI)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(PI)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
break;
}
// 组号和条目号
2 years ago
pipnt = pistart + rtumsg->MsgData[iOffset+1];
iOffset += 2;
u8KOD = rtumsg->MsgData[iOffset++];
if(KOD_ACTUALVALUE != u8KOD)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(PI)处理时KOD=%d不在处理范围内只处理实际值数据!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 3;
continue;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<u8DataNum; j++)
{
// wen 2004.02.01 如果条目号为0则该条目为该组条目数量不上送
2 years ago
if(((pipnt-pistart) == 0) && (j == 0))
{
if(DATAID_BSTRING != u8DataType)
iOffset += u8DataLen;
else
iOffset += (u8DataLen + 7) / 8;
continue;
}
if(TRUE == GetOneValueOfASDU10(&rtumsg->MsgData[iOffset], &sValue, u8DataType, u8DataLen))
{
switch(sValue.m_iDataType)
{
case DT_UINT:// 无符号整型数
2 years ago
pntmsg.RawValue = sValue.m_unValue.m_uValue;
SetPntMsg(stn-1, pipnt+j, &pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
break;
case DT_INT:
pntmsg.RawValue = sValue.m_unValue.m_iValue;
SetPntMsg(stn-1, pipnt+j, &pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
break;
case DT_FLOAT:
pntmsg.RawValue = (u_long)sValue.m_unValue.m_fValue;
SetPntMsg(stn-1, pipnt+j, &pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
break;
case DT_CONTROL:
case DT_NO:// 无数据
2 years ago
case DT_BINARY:
case DT_STRING:
default:
break;
}
}
iOffset += u8DataLen;
}
}
}
void Buban103GDprocessWithPAI(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, commid, iItemNum, iStrLen;
BYTE u8KOD, u8INF, u8DataType;
BYTE u8DataNum, u8DataLen, u8ItemNo;
int iOffset;
double fValue;
BOOL bFirst, bNumChanged;
VALUEDEF sValue;
GROUPDEF *pGroupParam;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
bNumChanged = FALSE;
bFirst = TRUE;
iOffset = 14;
pGroupParam = &pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx];
if((iOffset+3) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
u8INF = rtumsg->MsgData[11];
u8KOD = rtumsg->MsgData[16];
pGroupParam->m_u8NGD = rtumsg->MsgData[13];
if(pGroupParam->m_iPntNum <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据空间为零!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
// 只处理实际值
2 years ago
if(KOD_ACTUALVALUE != u8KOD)
{
return;
}
iItemNum = pGroupParam->m_u8NGD & 0x3F;
for(i=0; i<iItemNum; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 组 号
// 条目号
2 years ago
u8ItemNo = rtumsg->MsgData[iOffset+1];
iOffset += 2;
if(TRUE == bFirst)
{
if(u8ItemNo == 0)
{
pGroupParam->m_u32CurPntNo = 1;
}
else if(u8ItemNo <= pGroupParam->m_iStartItemNo)
{
pGroupParam->m_u32CurPntNo = 1;
}
if((M_INF_WRITEITEMWITHACK == u8INF)
&& (pGroupParam->m_bInit == FALSE))
{
for(j=0; j<pGroupParam->m_iPntNum; j++)
{
if(pGroupParam->m_pu8GIN[j] == u8ItemNo)
{
break;
}
}
if(j >= pGroupParam->m_iPntNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时不匹配的GIN=%d!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, u8ItemNo, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
pGroupParam->m_u32CurPntNo = j+1;
}
bFirst = FALSE;
}
if(u8KOD != rtumsg->MsgData[iOffset])
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时数据KOD=%d与要求的KOD=%d不符!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo, rtumsg->MsgData[iOffset], u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 4;
continue;
}
else
{
iOffset++;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<(int)u8DataNum; j++)
{
if((int)pGroupParam->m_u32CurPntNo > pGroupParam->m_iPntNum)
{
break;
}
if(pGroupParam->m_bInit == FALSE)
{
//pGroupParam->m_pu8DataLen[pGroupParam->m_u32CurPntNo-1] = u8DataLen;
//pGroupParam->m_pu8DataType[pGroupParam->m_u32CurPntNo-1] = u8DataType;
pGroupParam->m_pu8GIN[pGroupParam->m_u32CurPntNo-1] = u8ItemNo+j;
}
if(GetOneValueOfASDU10(&rtumsg->MsgData[iOffset], &sValue, u8DataType, u8DataLen) == FALSE)
{
iOffset += u8DataLen;
continue;
}
iOffset += u8DataLen;
switch(sValue.m_iDataType)
{
case DT_UINT:// 无符号整型数
2 years ago
fValue = sValue.m_unValue.m_uValue;
break;
case DT_INT:
fValue = sValue.m_unValue.m_iValue;
break;
case DT_FLOAT:
fValue = sValue.m_unValue.m_fValue;
break;
case DT_CONTROL:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_STRING:
fValue = -1;
break;
case DT_BINARY:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_NO:// 无数据
2 years ago
default:
fValue = -1;
break;
}
if(pGroupParam->m_bInit == FALSE)
{
if((u8ItemNo == 0) && (j == 0))
{
if((fValue > 0) && (KOD_ACTUALVALUE == u8KOD))
{
if((int)fValue > pGroupParam->m_iPntNum)
{
//pGroupParam->m_iPntNum = (int)sValue.m_unValue.m_uValue;
bNumChanged = TRUE;
}
else
{
pGroupParam->m_iPntNum = (int)fValue;
}
}
}
}
if(TRUE == bNumChanged)
{
//freeallfixmemory
}
if(DT_STRING != sValue.m_iDataType)
{
pGroupParam->m_psDataInfo[pGroupParam->m_u32CurPntNo-1].m_fValue = (float)fValue;
}
else
{
// 描述或者量纲
2 years ago
if(KOD_DESCRIPTION == u8KOD)
{
iStrLen = sizeof(pGroupParam->m_psDataInfo->m_szName)-1;
if(iStrLen > sValue.m_iDataNum)
{
iStrLen = sValue.m_iDataNum;
}
memcpy(pGroupParam->m_psDataInfo->m_szName, sValue.m_szValue, iStrLen);
pGroupParam->m_psDataInfo->m_szName[iStrLen] = 0;
}
else if(KOD_DIMENSION == u8KOD)
{
iStrLen = sizeof(pGroupParam->m_psDataInfo->m_szUnit)-1;
if(iStrLen > sValue.m_iDataNum)
{
iStrLen = sValue.m_iDataNum;
}
memcpy(pGroupParam->m_psDataInfo->m_szUnit, sValue.m_szValue, iStrLen);
pGroupParam->m_psDataInfo->m_szUnit[iStrLen] = 0;
}
}
if(pGroupParam->m_bInit == FALSE)
{
pGroupParam->m_psDataInfo[pGroupParam->m_u32CurPntNo-1].m_u32DataID = u8DataType;
}
pGroupParam->m_u32CurPntNo++;
}
}
if(pGroupParam->m_iPntNum > 0)
{
if((int)pGroupParam->m_u32CurPntNo >= pGroupParam->m_iPntNum)
{
pGroupParam->m_bInit = TRUE;
pGroupParam->m_u32CurPntNo = 1;
}
}
}
void Buban103GDprocessWithPDI(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
Buban103GDprocessWithPAI(rtumsg, psDevAddrParam, iGroupIdx);
}
void Buban103GDprocessWithPFIX(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, commid, iItemNum, iStrLen;
BYTE u8KOD, u8INF, u8DataType;
BYTE u8DataNum, u8DataLen, u8ItemNo;
int iOffset;
double fValue;
BOOL bFirst, bNumChanged;
VALUEDEF sValue;
GROUPDEF *pGroupParam;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
bNumChanged = FALSE;
bFirst = TRUE;
iOffset = 14;
pGroupParam = &pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx];
if((iOffset+3) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
u8INF = rtumsg->MsgData[11];
u8KOD = rtumsg->MsgData[16];
pGroupParam->m_u8NGD = rtumsg->MsgData[13];
if(pGroupParam->m_iPntNum > 0)
{
if(pGroupParam->m_pu8DataLen == NULL)
{
pGroupParam->m_pu8DataLen = (BYTE *)HEAP_MALLOC(pGroupParam->m_iPntNum*sizeof(BYTE));
Buban103DispMalloc(commid, pGroupParam->m_iPntNum*sizeof(BYTE));
}
if(pGroupParam->m_pu8DataType == NULL)
{
pGroupParam->m_pu8DataType = (BYTE *)HEAP_MALLOC(pGroupParam->m_iPntNum*sizeof(BYTE));
Buban103DispMalloc(commid, pGroupParam->m_iPntNum*sizeof(BYTE));
}
if(pGroupParam->m_pu8GIN == NULL)
{
pGroupParam->m_pu8GIN = (BYTE *)HEAP_MALLOC(pGroupParam->m_iPntNum*sizeof(BYTE));
Buban103DispMalloc(commid, pGroupParam->m_iPntNum*sizeof(BYTE));
}
}
else
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据空间为零!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
// 只处理实际值
2 years ago
if(KOD_ACTUALVALUE != u8KOD)
{
return;
}
iItemNum = pGroupParam->m_u8NGD & 0x3F;
for(i=0; i<iItemNum; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 组 号
// 条目号
2 years ago
u8ItemNo = rtumsg->MsgData[iOffset+1];
iOffset += 2;
if(TRUE == bFirst)
{
if(u8ItemNo == 0)
{
pGroupParam->m_u32CurPntNo = 1;
}
else if(u8ItemNo <= pGroupParam->m_iStartItemNo)
{
pGroupParam->m_u32CurPntNo = 1;
}
if((M_INF_WRITEITEMWITHACK == u8INF)
&& (pGroupParam->m_bInit == FALSE))
{
for(j=0; j<pGroupParam->m_iPntNum; j++)
{
if(pGroupParam->m_pu8GIN[j] == u8ItemNo)
{
break;
}
}
if(j >= pGroupParam->m_iPntNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时不匹配的GIN=%d!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, u8ItemNo, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
pGroupParam->m_u32CurPntNo = j+1;
}
bFirst = FALSE;
}
if(u8KOD != rtumsg->MsgData[iOffset])
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时数据KOD=%d与要求的KOD=%d不符!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo, rtumsg->MsgData[iOffset], u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 4;
continue;
}
else
{
iOffset++;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<(int)u8DataNum; j++)
{
if((int)pGroupParam->m_u32CurPntNo > pGroupParam->m_iPntNum)
{
break;
}
if(pGroupParam->m_bInit == FALSE)
{
pGroupParam->m_pu8DataLen[pGroupParam->m_u32CurPntNo-1] = u8DataLen;
pGroupParam->m_pu8DataType[pGroupParam->m_u32CurPntNo-1] = u8DataType;
pGroupParam->m_pu8GIN[pGroupParam->m_u32CurPntNo-1] = u8ItemNo+j;
}
if(GetOneValueOfASDU10(&rtumsg->MsgData[iOffset], &sValue, u8DataType, u8DataLen) == FALSE)
{
iOffset += u8DataLen;
continue;
}
iOffset += u8DataLen;
switch(sValue.m_iDataType)
{
case DT_UINT:// 无符号整型数
2 years ago
fValue = sValue.m_unValue.m_uValue;
break;
case DT_INT:
fValue = sValue.m_unValue.m_iValue;
break;
case DT_FLOAT:
fValue = sValue.m_unValue.m_fValue;
break;
case DT_CONTROL:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_STRING:
fValue = -1;
break;
case DT_BINARY:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_NO:// 无数据
2 years ago
default:
fValue = -1;
break;
}
if(pGroupParam->m_bInit == FALSE)
{
if((u8ItemNo == 0) && (j == 0))
{
if((fValue > 0) && (KOD_ACTUALVALUE == u8KOD))
{
if((int)fValue > pGroupParam->m_iPntNum)
{
//pGroupParam->m_iPntNum = (int)sValue.m_unValue.m_uValue;
bNumChanged = TRUE;
}
else
{
pGroupParam->m_iPntNum = (int)fValue;
}
}
}
}
if(TRUE == bNumChanged)
{
//freeallfixmemory
}
if(DT_STRING != sValue.m_iDataType)
{
pGroupParam->m_psDataInfo[pGroupParam->m_u32CurPntNo-1].m_fValue = (float)fValue;
}
else
{
// 描述或者量纲
2 years ago
if(KOD_DESCRIPTION == u8KOD)
{
iStrLen = sizeof(pGroupParam->m_psDataInfo->m_szName)-1;
if(iStrLen > sValue.m_iDataNum)
{
iStrLen = sValue.m_iDataNum;
}
memcpy(pGroupParam->m_psDataInfo->m_szName, sValue.m_szValue, iStrLen);
pGroupParam->m_psDataInfo->m_szName[iStrLen] = 0;
}
else if(KOD_DIMENSION == u8KOD)
{
iStrLen = sizeof(pGroupParam->m_psDataInfo->m_szUnit)-1;
if(iStrLen > sValue.m_iDataNum)
{
iStrLen = sValue.m_iDataNum;
}
memcpy(pGroupParam->m_psDataInfo->m_szUnit, sValue.m_szValue, iStrLen);
pGroupParam->m_psDataInfo->m_szUnit[iStrLen] = 0;
}
}
if(pGroupParam->m_bInit == FALSE)
{
pGroupParam->m_psDataInfo[pGroupParam->m_u32CurPntNo-1].m_u32DataID = u8DataType;
}
pGroupParam->m_u32CurPntNo++;
}
}
if(pGroupParam->m_iPntNum > 0)
{
if((int)pGroupParam->m_u32CurPntNo >= pGroupParam->m_iPntNum)
{
pGroupParam->m_bInit = TRUE;
pGroupParam->m_u32CurPntNo = 1;
}
}
// wen 2004.01.06 写定值确认
2 years ago
if((M_CAUSE_WRITEACK == rtumsg->MsgData[8])
|| (M_CAUSE_WRITECONFIRM == rtumsg->MsgData[8]))
{
//ptrProHead->uFuncCode = hWRITEFIXACK;
//RtuProtocolBaoHuCommand(&msg);
}
else if(M_CAUSE_WRITENAK == rtumsg->MsgData[8])
{
//ptrProHead->uFuncCode = hWRITEFIXNAK;
//RtuProtocolBaoHuCommand(&msg);
}
}
void Buban103GDprocessWithPEVENT(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, k, commid, iItemNum;
BYTE u8KOD, u8INF, u8DataType;
BYTE u8DataNum, u8DataLen, u8ItemNo;
int iOffset;
BOOL bFirst, bNumChanged;
time_t iTime;
WORD wMillSeconds, wTime, wFault;
struct tm *ptrtm;
SOE_DEF sSoeData;
DBORIENTATION *pDataUnit;
GROUPDEF *pGroupParam;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
bNumChanged = FALSE;
bFirst = TRUE;
iOffset = 14;
pGroupParam = &pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx];
pDataUnit = &pDevParam->m_sDevParam.m_sDiDBOrientation;
if((iOffset+3) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
u8INF = rtumsg->MsgData[11];
u8KOD = rtumsg->MsgData[16];
pGroupParam->m_u8NGD = rtumsg->MsgData[13];
// 只处理实际值
2 years ago
if(KOD_ACTUALVALUE != u8KOD)
{
return;
}
iItemNum = pGroupParam->m_u8NGD & 0x3F;
for(i=0; i<iItemNum; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 组 号
// 条目号
2 years ago
u8ItemNo = rtumsg->MsgData[iOffset+1];
iOffset += 2;
if(u8KOD != rtumsg->MsgData[iOffset])
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时数据KOD=%d与要求的KOD=%d不符!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo, rtumsg->MsgData[iOffset], u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 4;
continue;
}
else
{
iOffset++;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<(int)u8DataNum; j++)
{
if((int)pGroupParam->m_u32CurPntNo > pGroupParam->m_iPntNum)
{
break;
}
for(k=0; k<pDataUnit->m_iPntNum; k++)
{
if((pDataUnit->m_psDataInfo[k].m_u8Asdu == 10)\
&& (pDataUnit->m_psDataInfo[k].m_u8Inf == (u8ItemNo+j))\
&& (pDataUnit->m_psDataInfo[k].m_u8Fun == pGroupParam->m_iGroupNo))
{
break;
}
}
if(k >= pDataUnit->m_iPntNum)
{
iOffset += u8DataLen;
continue;
}
switch(u8DataType)
{
case DATAID_WITHTIME: // 带时标的报文
2 years ago
switch(rtumsg->MsgData[iOffset] & 0x03)
{
case 1:
sSoeData.bStatus = 0;
break;
case 2:
sSoeData.bStatus = 1;
break;
case 3:
case 0:
default:
sSoeData.bStatus = 0;
break;
}
time(&iTime);
ptrtm = localtime(&iTime);
if(ptrtm->tm_hour < (rtumsg->MsgData[iOffset+4] & 0x1f))
{
iTime -= 24 * 3600;
ptrtm = localtime(&iTime);
}
ptrtm->tm_hour = rtumsg->MsgData[iOffset+4] & 0x1f;
ptrtm->tm_min = rtumsg->MsgData[iOffset+3] & 0x3f;
wMillSeconds = rtumsg->MsgData[iOffset+1] + rtumsg->MsgData[iOffset+2]*256;
ptrtm->tm_sec = wMillSeconds / 1000;
sSoeData.iPntNo = pDataUnit->m_iStartPntNo+k;
sSoeData.u8Type = 1;// ASDU1
sSoeData.wFaultNo = 0;
sSoeData.u8ProvFun = pDataUnit->m_psDataInfo[k].m_u8ProvFun;
sSoeData.u8ProvInf = pDataUnit->m_psDataInfo[k].m_u8ProvInf;
sSoeData.wRelativeTime = 0;
sSoeData.SoeTime.Year = ptrtm->tm_year+1900;
sSoeData.SoeTime.Month = (BYTE)(ptrtm->tm_mon+1);
sSoeData.SoeTime.Day = (BYTE)(ptrtm->tm_mday);
sSoeData.SoeTime.Hour = (BYTE)(ptrtm->tm_hour);
sSoeData.SoeTime.Min = (BYTE)(ptrtm->tm_min);
sSoeData.SoeTime.Sec = (BYTE)(ptrtm->tm_sec);
sSoeData.SoeTime.mSec = wMillSeconds;
SetPntMsg(pDataUnit->m_iStnNo-1, pDataUnit->m_iStartPntNo+k, (void *)&sSoeData, DI_PNT_TYPE, PNT_SOE_TIME_EX);
break;
case DATAID_WITHTIMESPACE:// 带相对时标的报文
2 years ago
switch(rtumsg->MsgData[iOffset] & 0x03)
{
case 1:
sSoeData.bStatus = 0;
break;
case 2:
sSoeData.bStatus = 1;
break;
case 3:
case 0:
default:
sSoeData.bStatus = 0;
break;
}
wTime = rtumsg->MsgData[iOffset+1] + rtumsg->MsgData[iOffset+2]*256;
wFault= rtumsg->MsgData[iOffset+3] + rtumsg->MsgData[iOffset+4]*256;
time(&iTime);
ptrtm = localtime(&iTime);
if(ptrtm->tm_hour < (rtumsg->MsgData[iOffset+8] & 0x1f))
{
iTime -= 24 * 3600;
ptrtm = localtime(&iTime);
}
ptrtm->tm_hour = rtumsg->MsgData[iOffset+8] & 0x1f;
ptrtm->tm_min = rtumsg->MsgData[iOffset+7] & 0x3f;
wMillSeconds = rtumsg->MsgData[iOffset+5] + rtumsg->MsgData[iOffset+6]*256;
ptrtm->tm_sec = wMillSeconds / 1000;
sSoeData.iPntNo = pDataUnit->m_iStartPntNo+k;
sSoeData.u8Type = 2;// ASDU2
sSoeData.wFaultNo = wFault;
sSoeData.u8ProvFun = pDataUnit->m_psDataInfo[k].m_u8ProvFun;
sSoeData.u8ProvInf = pDataUnit->m_psDataInfo[k].m_u8ProvInf;
sSoeData.wRelativeTime = wTime;
sSoeData.SoeTime.Year = ptrtm->tm_year+1900;
sSoeData.SoeTime.Month = (BYTE)(ptrtm->tm_mon+1);
sSoeData.SoeTime.Day = (BYTE)(ptrtm->tm_mday);
sSoeData.SoeTime.Hour = (BYTE)(ptrtm->tm_hour);
sSoeData.SoeTime.Min = (BYTE)(ptrtm->tm_min);
sSoeData.SoeTime.Sec = (BYTE)(ptrtm->tm_sec);
sSoeData.SoeTime.mSec = wMillSeconds;
SetPntMsg(pDataUnit->m_iStnNo-1, pDataUnit->m_iStartPntNo+k, (void *)&sSoeData, DI_PNT_TYPE, PNT_SOE_TIME_EX);
break;
default:
break;
}
iOffset += u8DataLen;
}
}
}
void Buban103GIprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
// 类型标识(TYP):11
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ):0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
//M_CAUSE_READWITHVALIDDATA : 对通用分类读命令有效数据响应
//M_CAUSE_READWITHINVALIDDATA : 对通用分类读命令无效数据响应
2 years ago
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN): 254(0xfe)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF):
// 读单个条目的目录 : 243
2 years ago
//rtumsg->MsgData[11];
// 返回信息标识符(RII)
2 years ago
//rtumsg->MsgData[12];
// 通用分类标识序号(GIN):条目号和组号
2 years ago
//rtumsg->MsgData[13];
// 描述元素的数目(NDE)
2 years ago
//rtumsg->MsgData[15];
// 以下为多个通用分类数据
// 描述类别(KOD)
// 无所指定的描述类别 : KOD_NOSPECIFIED(0)
// 实际值 : KOD_ACTUALVALUE(1)
// 缺省值 : KOD_DEFAULTVALUE(2)
// 量程(最大值、最小值、步长) : KOD_RANGE(3)
// 备用 : KOD_BACKUP1(4)
// 精度(n,m) : KOD_PRECISION(5)
// 因子 : KOD_FACTOR(6)
// 参比 : KOD_REFERENCE(7)
// 列表 : KOD_ENUMERATION(8)
// 量纲 : KOD_DIMENSION(9)
// 描述 : KOD_DESCRIPTION(10)
// 备用 : KOD_BACKUP2(11)
// 口令条目 : KOD_PASSWORD(12)
// 只读 : KOD_READONLY(13)
// 只写 : KOD_WRITEONLY(14)
// 备用 : KOD_BACKUP3(15)
// 备用 : KOD_BACKUP4(16)
// 备用 : KOD_BACKUP5(17)
// 备用 : KOD_BACKUP6(18)
// 相应的功能类型和信息序号 : KOD_CORFUNCANDINF(19)
// 相应的事件 : KOD_COREVENT(20)
// 列表的文本阵列 : KOD_ENUMTEXTARRAY(21)
// 列表的值阵列 : KOD_ENUMVALUEARRAY(22)
// 相关联的条目 : KOD_RELATEDENTRIES(23)
2 years ago
//rtumsg->MsgData[16];
// 数据类型描述
2 years ago
//rtumsg->MsgData[17];
//DATAID_NO : 无数据
//DATAID_OS8ASCII : 8位ASCII
//DATAID_BSTRING : 字符串
//DATAID_UIX : 无符号整数
//DATAID_INT : 整数
//DATAID_UFLOAT : 无符号浮点数
//DATAID_FLOAT : 浮点数
//DATAID_754SHORT : R32.23 IEEE 标准754短实数
//DATAID_754REAL : R64.53 IEEE 标准754实数
//DATAID_DOUBLE : 双点信息
//DATAID_SINGLE : 单点信息
//DATAID_13BITS : 带品质描述的被测值(13BITS)
//DATAID_SORTIDNO : 通用分类标识序号
//DATAID_WITHTIME : 带时标的报文
//DATAID_WITHTIMESPACE : 带相对时标的报文
//DATAID_STRUCT : 数据结构
// 数据尺寸
2 years ago
//rtumsg->MsgData[18]
// 数量
2 years ago
//rtumsg->MsgData[19]
// 通用分类标识数据(GID)
// 长度根据以上描述
2 years ago
// 2 ... n 个通用分类数据
2 years ago
}
void Buban103SynTime(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
//char szDbg[128];
int commid;
DAY_TIME stime;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
//DebugPrint("sync time.");
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
//DebugPrint("sync time hello1.");
// 如果非时间同步原因,则不进行对时
2 years ago
if(M_CAUSE_CHECKTIME != rtumsg->MsgData[8])
{
return;
}
//DebugPrint("sync time hello2.");
// 上对时
2 years ago
if(1 != pPortParam->m_psBaoHu->CheckTime)
{
return;
}
stime.mSec = rtumsg->MsgData[12] + rtumsg->MsgData[13]*256;
stime.Sec = stime.mSec / 1000;
stime.mSec = stime.mSec % 1000;
stime.Min = rtumsg->MsgData[14] & 0x3F;
stime.Hour = rtumsg->MsgData[15] & 0x1F;
stime.Day = rtumsg->MsgData[16] & 0x1F;
stime.Month = rtumsg->MsgData[17] & 0x0F;
stime.Year = rtumsg->MsgData[18] & 0x7F + 2000;
//sprintf(szDbg, "time:%04d-%02d-%02d_%02d:%02d:%02d.%03d\n",
// stime.Year, stime.Month, stime.Day, stime.Hour,
// stime.Min, stime.Sec, stime.mSec);
//DebugPrint(szDbg);
SetLocalTimeEx(&stime);
}
void Buban103EXPIprocess(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int i, commid;
int pipnt;
PI_DEF pntmsg;
DBORIENTATION *pDataUnit;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
pDataUnit = &pDevParam->m_sDevParam.m_sPiDBOrientation;
if(pDataUnit->m_iStnNo < 1)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d SIEMENS扩展电度信息不写入数据库!!!",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr);
DebugPrint(szbuf);
#endif
return;
}
for(i=0; i<pDataUnit->m_iPntNum; i++)
{
if((pDataUnit->m_psDataInfo[i].m_u8Fun == rtumsg->MsgData[10])\
&& (pDataUnit->m_psDataInfo[i].m_u8Inf == rtumsg->MsgData[11]))
{
break;
}
}
if(i >= pDataUnit->m_iPntNum)
{
return;
}
pipnt = pDataUnit->m_iStartPntNo + i;
pntmsg.RawValue = rtumsg->MsgData[12] + rtumsg->MsgData[13]*256\
+rtumsg->MsgData[14]*256*256 + (rtumsg->MsgData[15]&0x0f)*256*256*256;
// 符号位
2 years ago
if(rtumsg->MsgData[15] & 0x10)
{
pntmsg.RawValue |= 0xF0000000;
}
SetPntMsg(pDataUnit->m_iStnNo-1, pipnt, (void *)&pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
}
// 扰动数据处理开始
// 扰动数据表处理
2 years ago
void Buban103LRDprocess(RTUMSG *rtumsg)
{}
// 扰动数据传输准备就绪
2 years ago
void Buban103RTDprocess(RTUMSG *rtumsg)
{}
// 带标志的状态变位传输准备就绪
2 years ago
void Buban103RTTprocess(RTUMSG *rtumsg)
{}
// 带标志的状态变位传输
2 years ago
void Buban103TOTprocess(RTUMSG *rtumsg)
{}
// 被记录的通道传输准备就绪
2 years ago
void Buban103RTCprocess(RTUMSG *rtumsg)
{}
// 传送扰动值
2 years ago
void Buban103TOVprocess(RTUMSG *rtumsg)
{}
// 带标志的状态变位、通道、扰动数据传输结束
2 years ago
void Buban103EOTprocess(RTUMSG *rtumsg)
{}
// 扰动数据处理结束
2 years ago
// 写通道扰动数据到文件中
2 years ago
BOOL Buban103WriteACCDatatoFile(RTUMSG *rtumsg)
{
return FALSE;
}
// 读录波数据文件头
2 years ago
void Buban103GetFileHead(char *ptrDataHead, size_t *piNOF, size_t *piNOC, size_t *piNOE, size_t *piINT)
{}
// 读录波数据记录时间
2 years ago
//void Buban103GetTime(char *ptrDataHead, SYSTEMTIME *ptrtm)
//{}
// 读录波数据模拟量头
2 years ago
void Buban103ProcessAiHead(char *ptrDataHead, DISTURBANCEAIDATA *pAiData)
{}
// 转换临时文件为可用文件
2 years ago
void Buban103tmpFileChangetodatFile(char *sztmpFileName)
{}
// 生成CFG文件
2 years ago
//void Buban103MakeCFGFile(int iStationNo, pDISTURBANCEDIDATA ptrDi, pDISTURBANCEAIDATA ptrAi, FILE *fp, char *szInfFile, SYSTEMTIME *tm)
//{}
// 生成DAT文件
2 years ago
void Buban103MakeDATFile(pDISTURBANCEDIDATA ptrDi, pDISTURBANCEAIDATA ptrAi, FILE *fp)
{}
//=========================以下为Buban103转发数据功能=======================//
2 years ago
//***************************************************************************/
//* 插入SOE数据函数 */
//*参数: u_32 commid : 厂站端口号 */
//* u_32 selidx : 端口索引号 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//* PROV_SOE *pSoeMsg : 转发SOE数据 */
//*返回值:BOOL retval : 插入SOE数据时是否覆盖(缓冲区是否已满) */
2 years ago
//***************************************************************************/
BOOL ProvInsertSoe(u_32 commid, DEVADDRPARAM *psDevAddrParam, SOE_DEF *pSoeMsg)
{
BOOL bReturn;
short front, rear;
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
if(FALSE == GetSpecialProvPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pProvDevParam))
{
return FALSE;
}
front = pProvDevParam->m_sProvSoe.m_shFront;
rear = pProvDevParam->m_sProvSoe.m_shRear;
if(pProvDevParam->m_sProvSoe.m_shSoeNum >= PROV_SOE_MAX)
{
// 缓冲区已满
2 years ago
memcpy((void *)&pProvDevParam->m_sProvSoe.m_sSoeData[rear],
(void *)pSoeMsg, sizeof(SOE_DEF));
pProvDevParam->m_sProvSoe.m_shFront = (front + 1) % PROV_SOE_MAX;
pProvDevParam->m_sProvSoe.m_shRear = (rear + 1) % PROV_SOE_MAX;
bReturn = FALSE;
}
else
{
memcpy((void *)&pProvDevParam->m_sProvSoe.m_sSoeData[rear],
(void *)pSoeMsg, sizeof(SOE_DEF));
pProvDevParam->m_sProvSoe.m_shRear = (rear + 1) % PROV_SOE_MAX;
pProvDevParam->m_sProvSoe.m_shSoeNum++;
bReturn = TRUE;
}
return bReturn;
}
//***************************************************************************/
//* 从缓冲区取并且删除SOE数据函数 */
//*参数: u_32 commid : 厂站端口号 */
//* u_32 selidx : 端口索引号 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//* PROV_SOE *pSoeMsg : SOE数据指针 */
//*返回值:BOOL retval : 获取SOE数据是否成功 */
2 years ago
//***************************************************************************/
BOOL ProvGetAndDelSoe(u_32 commid, DEVADDRPARAM *psDevAddrParam, SOE_DEF *pSoeMsg)
{
short front, rear;
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
if(FALSE == GetSpecialProvPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pProvDevParam))
{
return FALSE;
}
front = pProvDevParam->m_sProvSoe.m_shFront;
rear = pProvDevParam->m_sProvSoe.m_shRear;
if(pProvDevParam->m_sProvSoe.m_shSoeNum <= 0)
{
pProvDevParam->m_sProvSoe.m_shSoeNum = 0;
pProvDevParam->m_sProvSoe.m_shFront = 0;
pProvDevParam->m_sProvSoe.m_shRear = 0;
return FALSE;
}
memcpy((void *)pSoeMsg, (void *)&pProvDevParam->m_sProvSoe.m_sSoeData[front], sizeof(SOE_DEF));
pProvDevParam->m_sProvSoe.m_shFront = (front + 1) % PROV_SOE_MAX;
pProvDevParam->m_sProvSoe.m_shSoeNum--;
return TRUE;
}
BOOL ProvGetNoXSoe(u_32 commid, DEVADDRPARAM *psDevAddrParam, int iNo, SOE_DEF *pSoeMsg)
{
short rear;
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
if(FALSE == GetSpecialProvPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pProvDevParam))
{
return FALSE;
}
if(pProvDevParam->m_sProvSoe.m_shSoeNum <= 0)
{
pProvDevParam->m_sProvSoe.m_shSoeNum = 0;
pProvDevParam->m_sProvSoe.m_shFront = 0;
pProvDevParam->m_sProvSoe.m_shRear = 0;
return FALSE;
}
iNo = iNo % PROV_SOE_MAX;
rear = pProvDevParam->m_sProvSoe.m_shRear - iNo - 1;
if(rear < 0)
{
rear += PROV_SOE_MAX;
}
memcpy((void *)pSoeMsg, (void *)&pProvDevParam->m_sProvSoe.m_sSoeData[rear], sizeof(SOE_DEF));
return TRUE;
}
//***************************************************************************/
//* 转发一类数据是否存在函数 */
//*参数: u_32 commid : 厂站端口号 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
BOOL ProvHaveClassOne(u_32 commid, DEVADDRPARAM *psDevAddrParam, BOOL bCheckDiChange)
{
int i;
BOOL bACD, bQueryAllDev;
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
bACD = FALSE;
if(ProvHaveSoeData(commid) > 0)
{
bACD = TRUE;
}
else
{
if(pLinkParam->m_uchLinkAddr != 0xFF)
{
bQueryAllDev = TRUE;
}
else
{
bQueryAllDev = FALSE;
}
// 是否转发遥信变位,一般将其屏蔽
2 years ago
if(TRUE == bCheckDiChange)
{
if(pPortParam->m_psBaoHu != NULL)
{
if(pPortParam->m_psBaoHu->DiChange == TRUE)
{
bACD = TRUE;
}
}
}
if(bACD == FALSE)
{
for(i=0; i<pLinkParam->m_iDevNum; i++)
{
if(bQueryAllDev == TRUE)
{
psDevAddrParam->m_iDevIdx = i;
}
else
{
if(i >= 1)
{
break;
}
// 该项判断应该不需要存在
2 years ago
//if(psDevAddrParam->m_iDevIdx >= pLinkParam->m_iDevNum)
//{
// break;
//}
}
pProvDevParam = &pLinkParam->m_psProvDev[psDevAddrParam->m_iDevIdx];
// 如果在总查询过程中
2 years ago
//if((pProvDevParam->m_bProvQuery == TRUE) || (pProvDevParam->m_sProvGroupParam.m_bFinished == FALSE))
if(pProvDevParam->m_bProvQuery == TRUE)
{
bACD = TRUE;
break;
}
if(SingleListHaveData(&pProvDevParam->m_sBaoHuData) > 0)
{
bACD = TRUE;
break;
}
}
}
}
return bACD;
}
//***************************************************************************/
//* 转发链路指令的生成函数 */
//*参数: u_32 commid : 厂站端口号 */
//* u_char addr : 间隔设备地址 */
//* u_char cmdidx : 指令生成索引号 */
//* BOOL bACD : 一类数据存在标识 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvMakeLinkCommand(u_32 commid, u_char addr, u_char cmdidx, BOOL bACD)
{
CLPDU_FIX bClpdu_fix;
memset(&bClpdu_fix, 0, sizeof(CLPDU_FIX));
switch(cmdidx)
{
case M_CON_NA_3: // 确认帧
2 years ago
bClpdu_fix.nSTART = 0x10;
if(bACD)
bClpdu_fix.nCONTROL = cmdidx | 0x20;
else
bClpdu_fix.nCONTROL = cmdidx;
bClpdu_fix.nADDR = addr;
bClpdu_fix.nCS = CalBuban103Lpc(&bClpdu_fix.nCONTROL, 2);
bClpdu_fix.nEnd = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char*)&bClpdu_fix, 5);
break;
case M_BY_NA_3: // 忙帧(确认帧)
case M_NV_NA_3: // 无所要求的数据帧回答
case M_LKR_NA_3_1: // 链路状态响应帧--链路工作正常
case M_LKR_NA_3_2: // 链路状态响应帧--链路服务未工作
case M_LKR_NA_3_3: // 链路状态响应帧--链路服务未实现
2 years ago
bClpdu_fix.nSTART = 0x10;
if(bACD)
bClpdu_fix.nCONTROL = cmdidx | 0x20;
else
bClpdu_fix.nCONTROL = cmdidx;
bClpdu_fix.nADDR = addr;
bClpdu_fix.nCS = CalBuban103Lpc(&bClpdu_fix.nCONTROL, 2);
bClpdu_fix.nEnd = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char*)&bClpdu_fix, 5);
break;
default:
break;
}
}
//***************************************************************************/
//* 转发链路指令的生成函数 */
//*参数: u_32 commid : 厂站端口号 */
//* u_char addr : 间隔设备地址 */
//* u_char cmdidx : 指令生成索引号 */
//* BOOL bACD : 一类数据存在标识 */
//* BOOL bClearRecvBuf : 是否清除接收缓冲区 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvMakeLinkCommandEx(u_32 commid, u_char addr, u_char cmdidx, BOOL bACD, BOOL bClearRecvBuf, u_32 cmdtype)
{
CLPDU_FIX bClpdu_fix;
memset(&bClpdu_fix, 0, sizeof(CLPDU_FIX));
switch(cmdidx)
{
case M_CON_NA_3: // 确认帧
case M_BY_NA_3: // 忙帧(确认帧)
case M_NV_NA_3: // 无所要求的数据帧回答
case M_LKR_NA_3_1: // 链路状态响应帧--链路工作正常
case M_LKR_NA_3_2: // 链路状态响应帧--链路服务未工作
case M_LKR_NA_3_3: // 链路状态响应帧--链路服务未实现
2 years ago
bClpdu_fix.nSTART = 0x10;
if(bACD)
bClpdu_fix.nCONTROL = cmdidx | 0x20;
else
bClpdu_fix.nCONTROL = cmdidx;
bClpdu_fix.nADDR = addr;
bClpdu_fix.nCS = CalBuban103Lpc(&bClpdu_fix.nCONTROL, 2);
bClpdu_fix.nEnd = 0x16;
PutPollCmdToBuf(commid, cmdtype, 0, (char*)&bClpdu_fix, 5);
break;
default:
break;
}
}
//***************************************************************************/
//* 转发链路指令的生成函数 */
//*参数: u_32 commid : 厂站端口号 */
//* u_char addr : 间隔设备地址 */
//* u_char cmdidx : 指令生成索引号 */
//* BOOL bACD : 一类数据存在标识 */
//* BYTE bCause : 传送原因 */
//* u_32 cmdtype : 指令缓冲区类型 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvMakeVarCommand(u_32 commid, u_char linkaddr, u_char addr, \
u_char cmdidx, BOOL bACD, BYTE bCause, u_32 cmdtype)
{
u_char tmp[MAX_POLL_CMD_BUF_LEN];
CLPDU_VARR *ptrClpdu_varr;
i_32 len;
memset(tmp, 0, sizeof(tmp));
ptrClpdu_varr = (CLPDU_VARR *)tmp;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
ptrClpdu_varr->nADDR = linkaddr;
if(bACD)
ptrClpdu_varr->nCONTROL = 0x28;
else
ptrClpdu_varr->nCONTROL = 0x08;
len = 0;
switch(cmdidx)
{
case M_TM_TA_3://带时标的报文
2 years ago
break;
case M_TMR_TA_3://具有相对时间的带时标的报文
2 years ago
break;
case M_MEI_NA_3://被测值I
2 years ago
break;
case M_TME_TA_3://具有相对时间的带时标的被测值
2 years ago
break;
case M_IRC_NA_3://标识
2 years ago
len = sizeof(CLPDU_VARR);
tmp[len++] = cmdidx;
tmp[len++] = 0x81;
tmp[len++] = bCause;
tmp[len++] = addr;
tmp[len++] = FUNC_GLOBAL;
tmp[len++] = bCause-1;
tmp[len++] = 2;
memcpy(tmp+len, "SZ-SCADA", 8);
len += 8;
tmp[len++] = 0x01;
len += 3;
break;
case M_SYN_TA_3://时间同步
2 years ago
break;
case M_TGI_NA_3://总查询(总召唤)终止
2 years ago
len = sizeof(CLPDU_VARR);
tmp[len++] = cmdidx;
tmp[len++] = 0x81;
tmp[len++] = bCause;
tmp[len++] = addr;
tmp[len++] = FUNC_GLOBAL;
tmp[len++] = 0;
tmp[len++] = 0;
break;
case M_MEII_NA_3://被测值II
2 years ago
break;
case M_GD_NTA_3://通用分类数据
2 years ago
break;
case M_GI_NTA_3://通用分类标识
2 years ago
break;
case M_LRD_TA_3://被记录的扰动表
2 years ago
break;
case M_RTD_TA_3://扰动数据传输准备就绪
2 years ago
break;
case M_RTC_NA_3://被记录的通道传输准备就绪
2 years ago
break;
case M_RTT_NA_3://带标志的状态变位传输准备就绪
2 years ago
break;
case M_TOT_TA_3://传送带标志的状态变位
2 years ago
break;
case M_TOV_NA_3://传送扰动值
2 years ago
break;
case M_EOT_TA_3://传送结束
2 years ago
break;
case M_MEIII_TA_3://带时标的被测值Ⅲ
2 years ago
break;
case M_MEIV_TA_3://带时标的被测值Ⅳ
2 years ago
break;
case M_MEV_TA_3://带时标的被测值Ⅴ
2 years ago
break;
case M_MEVI_TA_3://带时标的被测值Ⅵ
2 years ago
break;
case M_MEVII_NA_3://被测值Ⅶ
2 years ago
break;
case M_IT_NA_3://电能脉冲计数值
2 years ago
break;
case M_IT_TA_3://带时标的电能脉冲计数值
2 years ago
break;
case M_ST_NA_3://步位置信息
2 years ago
break;
case M_ST_TA_3://带时标的步位置信息
2 years ago
break;
case M_SP_NA_3://单点状态信息
2 years ago
break;
case M_SP_TA_3://带时标的单点状态信息
2 years ago
break;
case M_DP_NA_3://双点状态信息
2 years ago
break;
case M_DP_TA_3://带时标的双点状态信息
2 years ago
break;
case M_SS_NA_3://单点状态和状态变位检出
2 years ago
break;
case M_SS_TA_3://带时标的单点状态和状态变位检出
2 years ago
break;
case M_DS_NA_3://双点状态和状态变位检出
2 years ago
break;
case M_DS_TA_3://带时标的双点状态和状态变位检出
2 years ago
break;
case M_WL_TA_3://水位
2 years ago
break;
case M_DC_NA_3://控制断路器命令
2 years ago
break;
case M_RC_NA_3://升降命令
2 years ago
break;
case M_SE_NA_3://设定命令
2 years ago
break;
case M_CC_NA_3://控制命令
2 years ago
break;
}
if(len > 0)
{
ptrClpdu_varr->nLEN1 = len - 4;
ptrClpdu_varr->nLEN2 = len - 4;
tmp[len++] = CalBuban103Lpc(tmp+4, ptrClpdu_varr->nLEN1);
tmp[len++] = 0x16;
PutPollCmdToBuf(commid, cmdtype, 0, (char*)tmp, len);
}
}
//***************************************************************************/
//* 转发命令处理 */
//*参数: u_32 portidx : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvRtuProtocolDataProcess(int commid, RTUMSG *rtumsg)
{
if(rtumsg->MsgLen == 0)
return;
// 数据校验错误(附加字节的第二个字节)
2 years ago
if(rtumsg->MsgData[rtumsg->MsgLen+1] > 0)
return;
// wen 增加限制,以使得指令缓冲区不会生成多条指令
2 years ago
//if(CheckPollCmdBuf(commid)) return;
switch(rtumsg->MsgData[0])
{
case 0x10://shortframe process
Provshortprocess(commid, rtumsg);
break;
case 0x68:
Provlongprocess(commid, rtumsg);
break;
default:
break;
}
}
//***************************************************************************/
//* 保护命令数据处理函数 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvSendCmdToPort(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
u_32 destport;
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
if(FALSE == GetSpecialProvPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pProvDevParam))
{
return;
}
if((C_GD_NA_3 != rtumsg->MsgData[6])\
&& (C_GRC_NA_3 != rtumsg->MsgData[6])\
&& (C_GC_NA_3 != rtumsg->MsgData[6]))
{
return;
}
// ??? 在这里将保护数据发送到指定的装置下发端口
2 years ago
if(pProvDevParam->m_iRealCommid > 0)
{
destport = pProvDevParam->m_iRealCommid-1;
}
else
{
return;
}
rtumsg->MsgData[12] = RII_PROV_ID;
rtumsg->MsgType = MSGTYPE_BAOHU_103CMD;
SendProtectCmdToDev(destport, rtumsg);
}
//***************************************************************************/
//* 数据转发短帧处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void Provshortprocess(u_32 commid, RTUMSG *rtumsg)
{
BOOL bFind;
DEVADDRPARAM DevAddrParam;
BUBAN103LINKDEF *pLinkParam=NULL;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
if((rtumsg->MsgData[1] & 0xc0) == 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d(CtrlByte=%02x)接收到的短帧数据不是主站命令!!!\n",
2 years ago
commid, rtumsg->MsgData[2], rtumsg->MsgData[1]);
DebugPrint(szbuf);
#endif
return;
}
if(!IsExtInfoPtr(commid))
{
return;
}
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
DevAddrParam.m_uchLinkAddr = rtumsg->MsgData[2];
if(FindProtectDev(pPortParam, &DevAddrParam, TRUE) == FALSE)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d 不匹配!!!\n",
2 years ago
commid, rtumsg->MsgData[2]);
DebugPrint(szbuf);
#endif
bFind = FALSE;
}
else
{
bFind = TRUE;
}
//printf("commid=%d, iLinkIdx=%d, iDevIdx=%d\n", commid, DevAddrParam.m_iLinkIdx, DevAddrParam.m_iDevIdx);
if(TRUE == bFind)
{
pLinkParam = &pPortParam->m_psLink[DevAddrParam.m_iLinkIdx];
}
/*
if((rtumsg->MsgData[1] & 0x0f) == C_RCU_NA_3)
{
//InitBuban103LinkCmdBuf(pLinkParam);
//SetDevLinkOk(pLinkParam, DevAddrParam.m_iDevIdx, TRUE);
ProvMakeLinkCommand(commid, rtumsg->MsgData[2], M_CON_NA_3, TRUE);
//pLinkParam->m_psProvDev[DevAddrParam.m_iDevIdx].m_iProvAsdu5Cause = M_CAUSE_RESET_CU;
}
return;
*/
switch(rtumsg->MsgData[1] & 0x0f)
{
case C_RCU_NA_3://复位通信单元
2 years ago
if(TRUE == bFind)
{
InitBuban103LinkCmdBuf(pLinkParam);
SetDevLinkOk(pLinkParam, DevAddrParam.m_iDevIdx, TRUE);
ProvMakeLinkCommand(commid, rtumsg->MsgData[2], M_CON_NA_3, TRUE);
pLinkParam->m_psProvDev[DevAddrParam.m_iDevIdx].m_iProvAsdu5Cause = M_CAUSE_RESET_CU;
}
else
{
ProvMakeLinkCommand(commid, rtumsg->MsgData[2], M_CON_NA_3, FALSE);
}
break;
case C_RFB_NA_3://复位帧计数位
2 years ago
if(TRUE == bFind)
{
pLinkParam->m_pu8CtlByte[DevAddrParam.m_iDevIdx] = 0;
pLinkParam->m_psProvDev[DevAddrParam.m_iDevIdx].m_iProvAsdu5Cause = M_CAUSE_RESET_FCB;
ProvMakeLinkCommand(commid, rtumsg->MsgData[2], M_CON_NA_3, TRUE);
}
else
{
ProvMakeLinkCommand(commid, rtumsg->MsgData[2], M_CON_NA_3, FALSE);
}
break;
case C_RLK_NA_3://链路状态请求
2 years ago
if(TRUE == bFind)
{
ProvMakeLinkCommand(commid, rtumsg->MsgData[2], M_LKR_NA_3_1, FALSE);
}
else
{
ProvMakeLinkCommand(commid, rtumsg->MsgData[2], M_LKR_NA_3_2, FALSE);
}
break;
case C_PL1_NA_3://召唤一级数据
2 years ago
if(FALSE == bFind)
{
break;
}
if(TRUE == IsDevLinkOk(pLinkParam, DevAddrParam.m_iDevIdx))
{
// 查找链路中所有的装置
2 years ago
//if(pLinkParam->m_uchLinkAddr != 0xFF)
//{
// DevAddrParam.m_iDevIdx = -1;
//}
ProvPL1process(commid, &DevAddrParam);
}
break;
case C_PL2_NA_3://召唤二级数据
2 years ago
if(FALSE == bFind)
{
break;
}
if(TRUE == IsDevLinkOk(pLinkParam, DevAddrParam.m_iDevIdx))
{
// 查找链路中所有的装置
2 years ago
//if(pLinkParam->m_uchLinkAddr != 0xFF)
//{
// DevAddrParam.m_iDevIdx = -1;
//}
ProvPL2process(commid, &DevAddrParam);
}
break;
default:
break;
}
}
//***************************************************************************/
//* 转发一类数据处理 */
//*参数: u_32 commid : 厂站端口号 */
//* u_char addr : 间隔设备地址 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvPL1process(u_32 commid, DEVADDRPARAM *psDevAddrParam)
{
BOOL bACD;
WORD wValue;
DAY_TIME sCurTime;
SOE_DEF sSoeData;
DI_DEF pntmsg;
PROV_DI_PNT *diprovptr;
DBINFO sDbInfo;
i_32 i, len;
char szDebugbuf[256];
RTUMSG rtumsg, msg;
DBORIENTATION *pDBUnit;
CLPDU_VARR *ptrClpdu_varr;
DEVADDRPARAM sDevAddrParam;
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
memset(szDebugbuf, 0, sizeof(szDebugbuf));
memset((void *)&rtumsg, 0, sizeof(rtumsg));
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
pProvDevParam = &pLinkParam->m_psProvDev[psDevAddrParam->m_iDevIdx];
if(pProvDevParam->m_iProvAsdu5Cause > 0)
{
ProvMakeVarCommand(commid, pLinkParam->m_uchLinkAddr,\
(BYTE)pProvDevParam->m_iProvAddr, M_IRC_NA_3, FALSE,\
(BYTE)pProvDevParam->m_iProvAsdu5Cause, FAST_POLL_CMD);
pProvDevParam->m_iProvAsdu5Cause = 0;
return;
}
// 首先发送突发事件(由于所有装置的信息都在一个缓冲区,所以只能有一个公共链路)
2 years ago
while(ProvHaveSoeData(commid) > 0)
{
ProvAndDelGetSoeData(commid, &sSoeData);
//if(ProvAndDelGetSoeData(commid, &sSoeData) > 0)
//{
// bACD = TRUE;
//}
//else
//{
// bACD = ProvHaveClassOne(commid, psDevAddrParam, FALSE);
//}
if(FALSE == FindProtectDevFromPntNo(pPortParam, &sDevAddrParam, &sDbInfo, sSoeData.iPntNo, DI_PNT_TYPE))
{
continue;
}
ptrClpdu_varr = (CLPDU_VARR *)rtumsg.MsgData;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
// 重新赋值链路的转发地址
2 years ago
ptrClpdu_varr->nADDR = sDevAddrParam.m_uchLinkAddr;
// 如果在总查询过程中
2 years ago
/*
if(pLinkParam->m_psProvDev[psDevAddrParam->m_iDevIdx].m_bProvQuery)
{
ptrClpdu_varr->nCONTROL |= 0x20;
}
else
{
// 是否还有一类数据
2 years ago
if(TRUE == bACD)
{
ptrClpdu_varr->nCONTROL |= 0x20;
}
else
{
ptrClpdu_varr->nCONTROL &= 0xDF;
}
}*/
// 是否还有一类数据
2 years ago
//if(TRUE == bACD)
//{
// ptrClpdu_varr->nCONTROL |= 0x20;
//}
//else
//{
// ptrClpdu_varr->nCONTROL &= 0xDF;
//}
ptrClpdu_varr->nCONTROL &= 0xDF;
wValue = sSoeData.SoeTime.mSec + sSoeData.SoeTime.Sec * 1000;
if(sSoeData.u8Type == 1)
{
rtumsg.MsgData[sizeof(CLPDU_VARR)] = 0x01;
len = 14;
// 四个八位二进制组
2 years ago
rtumsg.MsgData[sizeof(CLPDU_VARR)+7] = LOBYTE(wValue);
rtumsg.MsgData[sizeof(CLPDU_VARR)+8] = HIBYTE(wValue);
rtumsg.MsgData[sizeof(CLPDU_VARR)+9] = sSoeData.SoeTime.Min & 0x3F;
rtumsg.MsgData[sizeof(CLPDU_VARR)+10] = sSoeData.SoeTime.Hour & 0x1F;
// SIN
rtumsg.MsgData[sizeof(CLPDU_VARR)+11] = 0;
}
else
{
rtumsg.MsgData[sizeof(CLPDU_VARR)] = 0x02;
len = 18;
// 四个八位二进制组
2 years ago
rtumsg.MsgData[sizeof(CLPDU_VARR)+7] = LOBYTE(sSoeData.wRelativeTime);
rtumsg.MsgData[sizeof(CLPDU_VARR)+8] = HIBYTE(sSoeData.wRelativeTime);
rtumsg.MsgData[sizeof(CLPDU_VARR)+9] = LOBYTE(sSoeData.wFaultNo);
rtumsg.MsgData[sizeof(CLPDU_VARR)+10] = HIBYTE(sSoeData.wFaultNo);
rtumsg.MsgData[sizeof(CLPDU_VARR)+11] = LOBYTE(wValue);
rtumsg.MsgData[sizeof(CLPDU_VARR)+12] = HIBYTE(wValue);
rtumsg.MsgData[sizeof(CLPDU_VARR)+13] = sSoeData.SoeTime.Min & 0x3F;
rtumsg.MsgData[sizeof(CLPDU_VARR)+14] = sSoeData.SoeTime.Hour & 0x1F;
// SIN
rtumsg.MsgData[sizeof(CLPDU_VARR)+15] = 0;
}
ptrClpdu_varr->nLEN1 = (BYTE)len;
ptrClpdu_varr->nLEN2 = (BYTE)len;
rtumsg.MsgData[sizeof(CLPDU_VARR)+1] = 0x81;
//COT
rtumsg.MsgData[sizeof(CLPDU_VARR)+2] = M_CAUSE_AUTOSEND;
// 重新赋值 ASDU 公共地址
2 years ago
rtumsg.MsgData[sizeof(CLPDU_VARR)+3] = sDevAddrParam.m_uchCommAddr;
// FUN
//rtumsg.MsgData[sizeof(CLPDU_VARR)+4] = sSoeData.u8ProvFun;
// INF
//rtumsg.MsgData[sizeof(CLPDU_VARR)+5] = sSoeData.u8ProvInf;
// FUN
rtumsg.MsgData[sizeof(CLPDU_VARR)+4] = sDbInfo.m_u8ProvFun;
// INF
rtumsg.MsgData[sizeof(CLPDU_VARR)+5] = sDbInfo.m_u8ProvInf;
// DPI
rtumsg.MsgData[sizeof(CLPDU_VARR)+6] = sSoeData.bStatus+1;
len = ptrClpdu_varr->nLEN1 + 4;
// 发送时会重新计算
2 years ago
//rtumsg.MsgData[len++] = CalBuban103Lpc(rtumsg.MsgData+4, ptrClpdu_varr->nLEN1);
rtumsg.MsgData[len++] = 0;
rtumsg.MsgData[len++] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char*)rtumsg.MsgData, len);
return;
}
bACD = ProvHaveClassOne(commid, psDevAddrParam, pPortParam->m_bSendChangeDi);
if(bACD == TRUE)
{
// ??? 需要修改为实际信息
2 years ago
//bACD = FALSE;
pProvDevParam = &pLinkParam->m_psProvDev[psDevAddrParam->m_iDevIdx];
if(SingleListHaveData(&pProvDevParam->m_sBaoHuData) > 0)
{
msg.MsgLen = SingleListGetAndDelData(&pProvDevParam->m_sBaoHuData, msg.MsgData, sizeof(msg.MsgData));
if(pLinkParam->m_uchLinkAddr != 0xFF)
{
msg.MsgData[5] = pLinkParam->m_uchLinkAddr;
}
else
{
msg.MsgData[5] = (BYTE)pProvDevParam->m_iProvAddr;
}
msg.MsgData[9] = (BYTE)pProvDevParam->m_iProvAddr;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char*)msg.MsgData, msg.MsgLen);
return;
}
// 是否转发遥信变位,一般将其屏蔽
2 years ago
if(pPortParam->m_bSendChangeDi == TRUE)
{
if(pPortParam->m_psBaoHu->DiChange == TRUE)
{
if(TRUE == ProvSendChangedDi(commid, psDevAddrParam))
{
return;
}
}
}
// 如果在总查询过程中
2 years ago
if(pProvDevParam->m_bProvQuery == TRUE)
{
pDBUnit = &pProvDevParam->m_sYxInfo;
for(i=pProvDevParam->m_iQueryPntNo; i<pDBUnit->m_iPntNum; i++)
{
// 如果是总召唤数据
2 years ago
if(pDBUnit->m_psDataInfo[i].m_u8LoopData)
{
break;
}
}
if(i >= pDBUnit->m_iPntNum)
{
pProvDevParam->m_bProvQuery = FALSE;
pProvDevParam->m_iProvQueryStepWithASDU = 0;
ProvMakeVarCommand(commid, pLinkParam->m_uchLinkAddr,\
(BYTE)pProvDevParam->m_iProvAddr, M_TGI_NA_3, FALSE,\
(BYTE)M_CAUSE_STOPQUERY, FAST_POLL_CMD);
pProvDevParam->m_iQueryPntNo = 0;
}
else
{
pProvDevParam->m_iQueryPntNo++;
diprovptr = (PROV_DI_PNT *)pPortParam->m_psBaoHu->DiPtr;
ptrClpdu_varr = (CLPDU_VARR *)rtumsg.MsgData;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
// 重新赋值链路的转发地址
2 years ago
ptrClpdu_varr->nADDR = pLinkParam->m_uchLinkAddr;
// 如果在总查询过程中
2 years ago
ptrClpdu_varr->nCONTROL |= 0x20;
rtumsg.MsgData[sizeof(CLPDU_VARR)] = 0x01;
len = 14;
rtumsg.MsgData[sizeof(CLPDU_VARR)+1] = 0x81;
//COT
//rtumsg.MsgData[sizeof(CLPDU_VARR)+2] = M_CAUSE_AUTOSEND;
rtumsg.MsgData[sizeof(CLPDU_VARR)+2] = M_CAUSE_QUERY;
// 重新赋值 ASDU 公共地址
2 years ago
rtumsg.MsgData[sizeof(CLPDU_VARR)+3] = (BYTE)pProvDevParam->m_iProvAddr;
// FUN
rtumsg.MsgData[sizeof(CLPDU_VARR)+4] = pDBUnit->m_psDataInfo[i].m_u8ProvFun;
// INF
rtumsg.MsgData[sizeof(CLPDU_VARR)+5] = pDBUnit->m_psDataInfo[i].m_u8ProvInf;
GetPntMsg(diprovptr[pDBUnit->m_iStartPntNo+i].PortNo,\
diprovptr[pDBUnit->m_iStartPntNo+i].PntNo,\
(void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
// DPI
rtumsg.MsgData[sizeof(CLPDU_VARR)+6] = pntmsg.Status+1;
GetLocalTimeEx(&sCurTime);
wValue = sCurTime.Sec*1000+sCurTime.mSec;
// 四个八位二进制组
2 years ago
rtumsg.MsgData[sizeof(CLPDU_VARR)+7] = LOBYTE(wValue);
rtumsg.MsgData[sizeof(CLPDU_VARR)+8] = HIBYTE(wValue);
rtumsg.MsgData[sizeof(CLPDU_VARR)+9] = sCurTime.Min & 0x3F;
rtumsg.MsgData[sizeof(CLPDU_VARR)+10] = sCurTime.Hour & 0x1F;
// SIN
rtumsg.MsgData[sizeof(CLPDU_VARR)+11] = 0;
ptrClpdu_varr->nLEN1 = (BYTE)len;
ptrClpdu_varr->nLEN2 = (BYTE)len;
len = ptrClpdu_varr->nLEN1 + 4;
// 发送时会重新计算
2 years ago
//rtumsg.MsgData[len++] = CalBuban103Lpc(rtumsg.MsgData+4, ptrClpdu_varr->nLEN1);
rtumsg.MsgData[len++] = 0;
rtumsg.MsgData[len++] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char*)rtumsg.MsgData, len);
}
return;
}
}
/*
if(pLinkParam->m_uchLinkAddr != 0xFF)
{
ProvMakeLinkCommand(commid, pLinkParam->m_uchLinkAddr, M_NV_NA_3, FALSE);
}
else
{
ProvMakeLinkCommand(commid, psDevAddrParam->m_uchLinkAddr, M_NV_NA_3, FALSE);
}
*/
//ProvMakeLinkCommand(commid, psDevAddrParam->m_uchLinkAddr, M_NV_NA_3, bACD);
ProvMakeLinkCommand(commid, psDevAddrParam->m_uchLinkAddr, M_NV_NA_3, FALSE);
}
//***************************************************************************/
//* 转发二类数据处理 */
//*参数: u_32 commid : 厂站端口号 */
//* u_char addr : 间隔设备地址 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvPL2process(u_32 commid, DEVADDRPARAM *psDevAddrParam)
{
//BOOL bACD;
//PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
//pProvDevParam = &pLinkParam->m_psProvDev[pLinkParam->m_iDevIdx];
//psDevAddrParam->m_iDevIdx = pLinkParam->m_iDevIdx;
/*
// 首先发送突发事件
2 years ago
if(ProvHaveSoeData(commid) > 0)
{
bACD = TRUE;
}
else if(pProvDevParam->m_bProvQuery == TRUE)
{
bACD = TRUE;
}
else
{
bACD = FALSE;
}
*/
//bACD = ProvHaveClassOne(commid, psDevAddrParam, FALSE);
//ProvMakeLinkCommand(commid, pLinkParam->m_uchLinkAddr, M_NV_NA_3, bACD);
ProvMakeLinkCommand(commid, pLinkParam->m_uchLinkAddr, M_NV_NA_3, FALSE);
}
//***************************************************************************/
//* 数据转发长帧处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void Provlongprocess(u_32 commid, RTUMSG *rtumsg)
{
BOOL bFind;
DEVADDRPARAM DevAddrParam;
BUBAN103LINKDEF *pLinkParam=NULL;
BUBAN103PORTPARAM *pPortParam=NULL;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
if((rtumsg->MsgData[4] & 0xc0) == 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d(CtrlByte=%02x)接收到的短帧数据不是主站命令!!!\n",
2 years ago
commid, rtumsg->MsgData[5], rtumsg->MsgData[4]);
DebugPrint(szbuf);
#endif
return;
}
if(!IsExtInfoPtr(commid))
{
return;
}
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
DevAddrParam.m_uchLinkAddr = rtumsg->MsgData[5];
DevAddrParam.m_uchCommAddr = rtumsg->MsgData[9];
if(0xFF != DevAddrParam.m_uchLinkAddr)
{
if(FindProtectDev(pPortParam, &DevAddrParam, FALSE) == FALSE)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d 不匹配!!!\n",
2 years ago
commid, rtumsg->MsgData[5], rtumsg->MsgData[9]);
DebugPrint(szbuf);
#endif
bFind = FALSE;
}
else
{
bFind = TRUE;
}
if(TRUE == bFind)
{
pLinkParam = &pPortParam->m_psLink[DevAddrParam.m_iLinkIdx];
}
if(IsDevLinkOk(pLinkParam, DevAddrParam.m_iDevIdx) == FALSE)
{
return;
}
}
else
{
if(C_SYN_TA_3 != rtumsg->MsgData[6])
{
return;
}
}
// 长帧数据的功能类型
2 years ago
switch(rtumsg->MsgData[6])
{
case C_SYN_TA_3: //时间同步
2 years ago
ProvSYNprocess(commid, rtumsg);
break;
case C_TGI_NA_3: //总查询(总召唤)
2 years ago
ProvTGIprocess(commid, rtumsg, &DevAddrParam);
break;
case C_GD_NA_3: //通用分类数据
2 years ago
ProvGDprocess(commid, rtumsg, &DevAddrParam);
//ProvSendCmdToPort(commid, rtumsg, &DevAddrParam);
break;
case C_GRC_NA_3: //一般命令
2 years ago
ProvGRCprocess(commid, rtumsg, &DevAddrParam);
break;
case C_GC_NA_3: //通用分类命令
2 years ago
ProvGCprocess(commid, rtumsg, &DevAddrParam);
//ProvSendCmdToPort(commid, rtumsg, &DevAddrParam);
break;
case C_ODT_NA_3: //扰动数据传输的命令
2 years ago
ProvODTprocess(commid, rtumsg, &DevAddrParam);
break;
case C_ADT_NA_3: //扰动数据传输的认可
2 years ago
ProvADTprocess(commid, rtumsg, &DevAddrParam);
break;
case C_DC_NA_3: //控制断路器命令
2 years ago
ProvDCprocess(commid, rtumsg, &DevAddrParam);
break;
case C_RC_NA_3: //升降命令
2 years ago
ProvRCprocess(commid, rtumsg, &DevAddrParam);
break;
case C_SE_NA_3: //设定命令
2 years ago
ProvSEprocess(commid, rtumsg, &DevAddrParam);
break;
case C_CC_NA_3: //控制命令
2 years ago
ProvCCprocess(commid, rtumsg, &DevAddrParam);
break;
case C_CI_NA_3: //电能脉冲计数召唤命令
2 years ago
ProvCIprocess(commid, rtumsg, &DevAddrParam);
break;
default:
break;
}
switch(rtumsg->MsgData[4] & 0x0f)
{
case C_SD1_NA_3://传送数据(发送/确认帧)
// 非总查询命令
2 years ago
/*
if(C_TGI_NA_3 == rtumsg->MsgData[6])
{
ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_CON_NA_3, TRUE);
}
else if(C_SYN_TA_3 == rtumsg->MsgData[6])
{
if(rtumsg->MsgData[5] != 0xFF)
{
ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_CON_NA_3, TRUE);
}
}
else
{
ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_CON_NA_3, FALSE);
}
*/
//if(TRUE == ProvHaveClassOne(commid, &DevAddrParam, FALSE))
//{
// ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_CON_NA_3, TRUE);
//}
//else
//{
// ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_CON_NA_3, FALSE);
//}
ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_CON_NA_3, FALSE);
break;
case C_SD2_NA_3://传送数据(发送/无回答帧)
2 years ago
break;
}
}
//***************************************************************************/
//* 转发时间同步处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvSYNprocess(u_32 commid, RTUMSG *rtumsg)
{
i_32 len;
DAY_TIME sTime;
//char szDbg[128];
u_char tmp[MAX_POLL_CMD_BUF_LEN];
CLPDU_VARR bClpdu_varr;
BUBAN103PORTPARAM *pPortParam;
if(!IsExtInfoPtr(commid))
{
return;
}
pPortParam = (pBUBAN103PORTPARAM)SioParam[commid].ExtInfo;
sTime.mSec = rtumsg->MsgData[12] + (rtumsg->MsgData[13] << 8);
sTime.Sec = sTime.mSec / 1000;
sTime.mSec = sTime.mSec % 1000;
sTime.Min = rtumsg->MsgData[14] & 0x3F;
sTime.Hour = rtumsg->MsgData[15] & 0x1F;
sTime.Day = rtumsg->MsgData[16] & 0x1F;
sTime.Month= rtumsg->MsgData[17] & 0x0F;
sTime.Year = (rtumsg->MsgData[18] & 0x7F) + 2000;
//sprintf(szDbg, "time:%04d-%02d-%02d_%02d:%02d:%02d.%03d\n",
// sTime.Year, sTime.Month, sTime.Day, sTime.Hour,
// sTime.Min, sTime.Sec, sTime.mSec);
//DebugPrint(szDbg);
// 如果时间同步原因,则进行对时
2 years ago
if((pPortParam->m_psBaoHu->CheckTime == 1)
&& (rtumsg->MsgData[8] == M_CAUSE_CHECKTIME))
{
SetLocalTimeEx(&sTime);
}
// 广播地址
2 years ago
if(rtumsg->MsgData[5] == 0xff)
{
return;
}
memset(&bClpdu_varr, 0 , sizeof(CLPDU_VARR));
memset(tmp , 0 , sizeof(tmp));
bClpdu_varr.nSTART1 = 0x68;
bClpdu_varr.nSTART2 = 0x68;
bClpdu_varr.nLEN1 = 15;
bClpdu_varr.nLEN2 = 15;
bClpdu_varr.nCONTROL = M_DATA_NA_3;
bClpdu_varr.nADDR = rtumsg->MsgData[5];
len = sizeof(bClpdu_varr);
memcpy(tmp, (char*)&bClpdu_varr, len);
tmp[len++] = M_SYN_TA_3;
tmp[len++] = 0x81;
tmp[len++] = M_CAUSE_CHECKTIME;
tmp[len++] = rtumsg->MsgData[9];
tmp[len++] = FUNC_GLOBAL;
tmp[len++] = 0;
memcpy(tmp+len, rtumsg->MsgData+12, 7);
//if(!SetLocalTime(&t))
// tmp[len+2] |= 0x80;
len += 7;
//tmp[len++] = CalBuban103Lpc(tmp+4, bClpdu_varr.nLEN1);
tmp[len++] = 0;
tmp[len++] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char*)tmp, len);
}
//***************************************************************************/
//* 转发总查询(总召唤)处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvTGIprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
if(GetPortParamPtr(commid, &pPortParam) == FALSE)
{
return;
}
pPortParam->m_iLinkIdx = psDevAddrParam->m_iLinkIdx;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
pLinkParam->m_iDevIdx = psDevAddrParam->m_iDevIdx;
pProvDevParam = &pLinkParam->m_psProvDev[psDevAddrParam->m_iDevIdx];
// 总查询开始
2 years ago
pProvDevParam->m_bProvQuery = TRUE;
pProvDevParam->m_iProvQueryStepWithASDU = M_MEVII_NA_3;
// 存在一类数据,请查询
2 years ago
//ProvMakeLinkCommand(commid, rtumsg->MsgData[9], M_CON_NA_3, TRUE);
//ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_CON_NA_3, TRUE);
}
//***************************************************************************/
//* 转发通用分类数据处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvGDprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
//PROVDEVDEF *pProvDevParam;
//BUBAN103LINKDEF *pLinkParam;
//BUBAN103PORTPARAM *pPortParam;
if(rtumsg->MsgData[12] != RII_PROV_ID)
{
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
return;
}
//if(FALSE == GetSpecialProvPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pProvDevParam))
//{
// return;
//}
}
//***************************************************************************/
//* 转发一般命令处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvGRCprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
if(rtumsg->MsgData[12] != RII_PROV_ID)
{
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
return;
}
}
//***************************************************************************/
//* 转发通用分类命令处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvGCprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
int iGrpNum;
GROUPDEF *pBaoHuDB;
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
/*wen 2005.06.01 实际情况需要安这样来处理数据,直接转发到装置去
2 years ago
if(rtumsg->MsgData[12] != RII_PROV_ID)
{
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
return;
}
*/
if(FALSE == GetSpecialProvPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pProvDevParam))
{
return;
}
if(rtumsg->MsgData[12] != RII_PROV_ID)
{
pProvDevParam->m_sProvGroupParam.m_u8Group = rtumsg->MsgData[9];
pProvDevParam->m_sProvGroupParam.m_u8ItemAttr = rtumsg->MsgData[11];
pProvDevParam->m_sProvGroupParam.m_u8ItemNo = rtumsg->MsgData[10];
pProvDevParam->m_sProvGroupParam.m_u8RII = rtumsg->MsgData[12];
pBaoHuDB = NULL;
iGrpNum = GetBaohuDB(pProvDevParam->m_iRealCommid-1, pProvDevParam->m_iProvAddr, &pBaoHuDB);
// 传送原因(通用分类读数据)
2 years ago
if(rtumsg->MsgData[8] == C_CAUSE_READWITHVALIDDATA)
{
// INF
switch(rtumsg->MsgData[11])
{
case C_INF_READGROUPTITLE: // 读组标题
2 years ago
if((pBaoHuDB != NULL) && (iGrpNum > 0))
{
ProvMakeTitleOfGroups(commid, rtumsg, pProvDevParam, pBaoHuDB, iGrpNum);
}
else
{
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
}
break;
case C_INF_READGROUPALLITEMS: // 读一个组的全部条目的值或属性
2 years ago
if((pBaoHuDB != NULL) && (iGrpNum > 0))
{
ProvMakeAttrOfAllItemInGroup(commid, rtumsg, pProvDevParam, pBaoHuDB, iGrpNum);
}
else
{
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
}
break;
case C_INF_READDIROFSINGLEITEM: // 读单个条目的目录
2 years ago
if((pBaoHuDB != NULL) && (iGrpNum > 0))
{
ProvMakeDirOfItem(commid, rtumsg, pProvDevParam, pBaoHuDB, iGrpNum);
}
else
{
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
}
break;
case C_INF_READATTROFISNGLEITEM:// 读单个条目的值或属性
2 years ago
if((pBaoHuDB != NULL) && (iGrpNum > 0))
{
ProvMakeAttrOfItem(commid, rtumsg, pProvDevParam, pBaoHuDB, iGrpNum);
}
else
{
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
}
break;
case C_INF_QUERYGENERAL: // 对通用分类数据总查询
2 years ago
ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_NV_NA_3, FALSE);
break;
default:
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
break;
}
}
else
{
ProvSendCmdToPort(commid, rtumsg, psDevAddrParam);
}
return;
}
// wen test 可以添加保护数据返回做测试用
2 years ago
if(RII_PROV_ID == rtumsg->MsgData[12])
{
// test
RTUMSG msg;
BYTE buffix[] = {0x68, 0x46, 0x46, 0x68, 0x08, 0x01,
0x0A, 0x81, 0x2A, 0x01, 0xFE, 0xF1,
0xFF, 0x06, 0x50, 0x01, 0x01, 0x07,
0x04, 0x01, 0x00, 0x00, 0x00, 0x00,
0x50, 0x02, 0x01, 0x07, 0x04, 0x01,
0x00, 0x00, 0x00, 0x00, 0x50, 0x03,
0x01, 0x07, 0x04, 0x01, 0x22, 0xDB,
0x79, 0x3F, 0x50, 0x04, 0x01, 0x07,
0x04, 0x01, 0x3D, 0x6A, 0x53, 0x43,
0x50, 0x05, 0x01, 0x07, 0x04, 0x01,
0x00, 0x00, 0x00, 0x00, 0x50, 0x06,
0x01, 0x07, 0x04, 0x01, 0x00, 0x00,
0x00, 0x00, 0x08, 0x16 };
BYTE bufsoe[] = {0x68, 0x0E, 0x0E, 0x68, 0x28, 0x01,
0x01, 0x81, 0x01, 0x01, 0x64, 0x42,
0x01, 0x70, 0x94, 0x05, 0x0D, 0x00,
0x6A, 0x16};
msg.MsgLen = sizeof(buffix);
memcpy(msg.MsgData, buffix, msg.MsgLen);
msg.PortIdx = (BYTE)commid;
if(pLinkParam->m_uchLinkAddr != 0xFF)
{
msg.MsgData[5] = pLinkParam->m_uchLinkAddr;
}
else
{
msg.MsgData[5] = (BYTE)pProvDevParam->m_iProvAddr;
}
msg.MsgData[9] = (BYTE)pProvDevParam->m_iProvAddr;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
return;
}
}
//***************************************************************************/
//* 转发扰动数据传输的命令处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvODTprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
}
//***************************************************************************/
//* 转发扰动数据传输的认可处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvADTprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
}
//***************************************************************************/
//* 转发控制断路器命令处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvDCprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
}
//***************************************************************************/
//* 转发升降命令处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvRCprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
}
//***************************************************************************/
//* 转发设定命令处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvSEprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
}
//***************************************************************************/
//* 转发控制命令处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvCCprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
}
//***************************************************************************/
//* 转发电能脉冲计数召唤命令处理 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
void ProvCIprocess(u_32 commid, RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam)
{
i_32 iPiNum;
i_32 i;
u_char tmp[MAX_POLL_CMD_BUF_LEN];
CLPDU_VARR *ptrClpdu_varr;
i_32 len;
PI_DEF pntmsg;
PROV_PI_PNT *piprovptr;
PROVDEVDEF *pProvDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
if(GetSpecialProvPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pProvDevParam) == FALSE)
{
return;
}
memset(tmp, 0, sizeof(tmp));
ptrClpdu_varr = (CLPDU_VARR *)tmp;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
ptrClpdu_varr->nADDR = rtumsg->MsgData[5];
//if(ProvHaveClassOne(commid, psDevAddrParam, TRUE))
//{
// ptrClpdu_varr->nCONTROL = 0x28;
//}
//else
//{
// ptrClpdu_varr->nCONTROL = 0x08;
//}
ptrClpdu_varr->nCONTROL = 0x08;
len = sizeof(CLPDU_VARR);
tmp[len++] = M_IT_NA_3;
tmp[len++] = 0x00;
tmp[len++] = M_CAUSE_CYCLE;
tmp[len++] = rtumsg->MsgData[9];
tmp[len++] = 1;
iPiNum = pProvDevParam->m_sYmInfo.m_iPntNum;
if(iPiNum > INF_PI_NUM)
{
iPiNum = INF_PI_NUM;
}
piprovptr = (PROV_PI_PNT *)pPortParam->m_psBaoHu->PiPtr;
if((pProvDevParam->m_sYmInfo.m_iStartPntNo+iPiNum)\
> pPortParam->m_psBaoHu->PiNum)
{
if((pProvDevParam->m_bProvQuery == TRUE)\
|| (CheckPollCmdBufEmpty(commid) == 0))
{
//ProvMakeLinkCommand(commid, pLinkParam->m_uchLinkAddr, M_NV_NA_3, TRUE);
ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_NV_NA_3, TRUE);
}
else
{
//ProvMakeLinkCommand(commid, pLinkParam->m_uchLinkAddr, M_NV_NA_3, FALSE);
ProvMakeLinkCommand(commid, rtumsg->MsgData[5], M_NV_NA_3, FALSE);
}
return;
}
tmp[len++] = INF_PI_START;
for(i=0; i<iPiNum; i++)
{
GetPntMsg(piprovptr[pProvDevParam->m_sYmInfo.m_iStartPntNo+i].PortNo,\
piprovptr[pProvDevParam->m_sYmInfo.m_iStartPntNo+i].PntNo,\
&pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
tmp[len++] = (BYTE)(pntmsg.RawValue & 0xFF);
tmp[len++] = (BYTE)((pntmsg.RawValue & 0xFF00) >> 8);
tmp[len++] = (BYTE)((pntmsg.RawValue & 0xFF0000) >> 16);
tmp[len++] = (BYTE)((pntmsg.RawValue & 0xFF000000) >> 24);
// IV/CA/CY/顺序号
2 years ago
len++;
}
tmp[sizeof(CLPDU_VARR)+1] = (BYTE)(iPiNum);
// 返回码RII
2 years ago
tmp[len++] = rtumsg->MsgData[13];
ptrClpdu_varr->nLEN1 = len - 4;
ptrClpdu_varr->nLEN2 = len - 4;
//tmp[len++] = CalBuban103Lpc(tmp+4, ptrClpdu_varr->nLEN1);
tmp[len++] = 0;
tmp[len++] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char*)tmp, len);
}
//***************************************************************************/
//* 转发全部组标题 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
BOOL ProvMakeTitleOfGroups(u_32 commid, RTUMSG *rtumsg, PROVDEVDEF *pProvDevParam, GROUPDEF *pBaoHuDB, int iNum)
{
i_32 i, len;
RTUMSG msg;
CLPDU_VARR *ptrClpdu_varr;
memset((void *)&msg, 0, sizeof(RTUMSG));
ptrClpdu_varr = (CLPDU_VARR *)msg.MsgData;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
ptrClpdu_varr->nADDR = rtumsg->MsgData[5];
len = sizeof(CLPDU_VARR);
msg.MsgData[len++] = M_GD_NTA_3;
msg.MsgData[len++] = 0x81;
msg.MsgData[len++] = M_CAUSE_READWITHVALIDDATA;
msg.MsgData[len++] = rtumsg->MsgData[9];
msg.MsgData[len++] = FUNC_GENERALSORT;
msg.MsgData[len++] = M_INF_READGROUPTITLE;
msg.MsgData[len++] = rtumsg->MsgData[12];//RII
msg.MsgData[len++] = (BYTE)iNum;
for(i=0; i<iNum; i++)
{
//msg.MsgData[len++] = i;// 组号
msg.MsgData[len++] = (BYTE)pBaoHuDB[i].m_iGroupNo;// 组号
msg.MsgData[len++] = 0;// 条目号
msg.MsgData[len++] = KOD_DESCRIPTION;//描述
2 years ago
msg.MsgData[len++] = DATAID_OS8ASCII;//datatype
switch(pBaoHuDB[i].m_iDataType)
{
case AI_PNT_TYPE: // 模拟量
msg.MsgData[len++] = strlen("模拟量");
2 years ago
msg.MsgData[len++] = 1;
memcpy((void *)&msg.MsgData[len], (void *)"模拟量", strlen("模拟量"));
len += strlen("模拟量");
2 years ago
break;
case DI_PNT_TYPE: // 开关量
msg.MsgData[len++] = strlen("开关量");
2 years ago
msg.MsgData[len++] = 1;
memcpy((void *)&msg.MsgData[len], (void *)"开关量", strlen("开关量"));
len += strlen("开关量");
2 years ago
break;
case PI_PNT_TYPE: // 电度量
msg.MsgData[len++] = strlen("电度量");
2 years ago
msg.MsgData[len++] = 1;
memcpy((void *)&msg.MsgData[len], (void *)"电度量", strlen("电度量"));
len += strlen("电度量");
2 years ago
break;
case PROTECT_AI_PNT_TYPE: // 保护模拟量
msg.MsgData[len++] = strlen("保护模拟量");
2 years ago
msg.MsgData[len++] = 1;
memcpy((void *)&msg.MsgData[len], (void *)"保护模拟量", strlen("保护模拟量"));
len += strlen("保护模拟量");
2 years ago
break;
case PROTECT_DI_PNT_TYPE: // 保护开关量
msg.MsgData[len++] = strlen("保护开关量");
2 years ago
msg.MsgData[len++] = 1;
memcpy((void *)&msg.MsgData[len], (void *)"保护开关量", strlen("保护开关量"));
len += strlen("保护开关量");
2 years ago
break;
case PROTECT_FIX_PNT_TYPE: // 保护定值
msg.MsgData[len++] = strlen("保护定值");
2 years ago
msg.MsgData[len++] = 1;
memcpy((void *)&msg.MsgData[len], (void *)"保护定值", strlen("保护定值"));
len += strlen("保护定值");
2 years ago
break;
case PROTECT_EVENT_PNT_TYPE:// 保护事件
msg.MsgData[len++] = strlen("保护事件");
2 years ago
msg.MsgData[len++] = 1;
memcpy((void *)&msg.MsgData[len], (void *)"保护事件", strlen("保护事件"));
len += strlen("保护事件");
2 years ago
break;
default:
msg.MsgData[len++] = strlen("未知数据组");
2 years ago
msg.MsgData[len++] = 1;
memcpy((void *)&msg.MsgData[len], (void *)"未知数据组", strlen("未知数据组"));
len += strlen("未知数据组");
2 years ago
break;
}
}
ptrClpdu_varr->nLEN1 = len - 4;
ptrClpdu_varr->nLEN2 = len - 4;
//msg.MsgData[len++] = CalBuban103Lpc(msg.MsgData+4, ptrClpdu_varr->nLEN1);
msg.MsgData[len++] = 0;
msg.MsgData[len++] = 0x16;
msg.MsgLen = (WORD)len;
msg.PortIdx = (BYTE)commid;
return SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
}
//***************************************************************************/
//* 转发一个组的全部条目的值或属性 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//* BOOL bContinue : 未传送的保护数据继续 */
//*返回值:无 */
//*备 注:所有组数据只能转发一帧 */
2 years ago
//***************************************************************************/
BOOL ProvMakeAttrOfAllItemInGroup(u_32 commid, RTUMSG *rtumsg,\
PROVDEVDEF *pProvDevParam,\
GROUPDEF *pBaoHuDB, int iNum)
{
BOOL bRetVal;
i_32 i, ifixlen;
RTUMSG msg;
u_char *ptrPntNum;
CLPDU_VARR *ptrClpdu_varr;
i_32 iGroupNo, iPntNum, iNameLen;
float *pfValue, fValue;
memset((void *)&msg, 0, sizeof(RTUMSG));
ptrClpdu_varr = (CLPDU_VARR *)msg.MsgData;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
ptrClpdu_varr->nADDR = rtumsg->MsgData[5];
ifixlen = sizeof(CLPDU_VARR);
// 组号
2 years ago
for(iGroupNo=0; iGroupNo<iNum; iGroupNo++)
{
if(pBaoHuDB[iGroupNo].m_iGroupNo == (int)rtumsg->MsgData[14])
{
break;
}
}
if(iGroupNo >= iNum)
{
return FALSE;
}
msg.MsgData[ifixlen++] = M_GD_NTA_3;
msg.MsgData[ifixlen++] = 0x81;
msg.MsgData[ifixlen++] = M_CAUSE_READWITHVALIDDATA;
msg.MsgData[ifixlen++] = rtumsg->MsgData[9];
msg.MsgData[ifixlen++] = FUNC_GENERALSORT;
msg.MsgData[ifixlen++] = M_INF_READGROUPALLITEMS;
msg.MsgData[ifixlen++] = rtumsg->MsgData[12];//RII
iPntNum = pBaoHuDB[iGroupNo].m_iPntNum;
ptrPntNum = &msg.MsgData[ifixlen++];
msg.MsgLen = (WORD)ifixlen;
bRetVal = TRUE;
switch(rtumsg->MsgData[16])
{
case KOD_ACTUALVALUE: // 实际值
2 years ago
for(i=0; i<iPntNum; i++)
{
// 结构长度 = 10
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[14];// 组 号
msg.MsgData[msg.MsgLen++] = i+1; // 条目号
msg.MsgData[msg.MsgLen++] = KOD_ACTUALVALUE; // 实际值
msg.MsgData[msg.MsgLen++] = DATAID_FLOAT; // 浮点数
2 years ago
msg.MsgData[msg.MsgLen++] = sizeof(float);
msg.MsgData[msg.MsgLen++] = 1;
pfValue = (float*)(&msg.MsgData[msg.MsgLen]);
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[i].m_fValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
msg.MsgLen += sizeof(float);
*ptrPntNum++;
if(msg.MsgLen >= 240)
{
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;// lpc
msg.MsgData[msg.MsgLen++] = 0x16;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
msg.MsgLen = (WORD)ifixlen;
*ptrPntNum = 0;
}
}
if(msg.MsgLen > ifixlen)
{
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;// lpc
msg.MsgData[msg.MsgLen++] = 0x16;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
}
break;
case KOD_RANGE: // 量程(最大值、最小值、步长)
2 years ago
for(i=0; i<iPntNum; i++)
{
// 结构长度 = 17
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[14];// 组 号
msg.MsgData[msg.MsgLen++] = i+1; // 条目号
msg.MsgData[msg.MsgLen++] = KOD_RANGE; // 量程(最大值、最小值、步长)
msg.MsgData[msg.MsgLen++] = DATAID_FLOAT; // 浮点数
2 years ago
msg.MsgData[msg.MsgLen++] = sizeof(float);
msg.MsgData[msg.MsgLen++] = 3;
pfValue = (float*)(&msg.MsgData[msg.MsgLen]);
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[i].m_fMaxValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
pfValue++;
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[i].m_fMinValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
pfValue++;
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[i].m_fStepValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
msg.MsgLen += 3*sizeof(float);
*ptrPntNum++;
if(msg.MsgLen >= 240)
{
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;// lpc
msg.MsgData[msg.MsgLen++] = 0x16;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
msg.MsgLen = (WORD)ifixlen;
*ptrPntNum = 0;
}
}
if(msg.MsgLen > ifixlen)
{
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;// lpc
msg.MsgData[msg.MsgLen++] = 0x16;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
}
break;
case KOD_DIMENSION: // 量 纲
2 years ago
for(i=0; i<iPntNum; i++)
{
// 结构长度 = 6 + 量纲长度
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[14];// 组 号
msg.MsgData[msg.MsgLen++] = i+1; // 条目号
msg.MsgData[msg.MsgLen++] = KOD_DIMENSION; // 量 纲
2 years ago
msg.MsgData[msg.MsgLen++] = DATAID_OS8ASCII;
iNameLen = strlen(pBaoHuDB[iGroupNo].m_psDataInfo[i].m_szUnit);
msg.MsgData[msg.MsgLen++] = (BYTE)iNameLen;
msg.MsgData[msg.MsgLen++] = 1;
memcpy(&msg.MsgData[msg.MsgLen], pBaoHuDB[iGroupNo].m_psDataInfo[i].m_szUnit, iNameLen);
msg.MsgLen += (WORD)iNameLen;
*ptrPntNum++;
if(msg.MsgLen >= 240)
{
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;// lpc
msg.MsgData[msg.MsgLen++] = 0x16;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
msg.MsgLen = (WORD)ifixlen;
*ptrPntNum = 0;
}
}
if(msg.MsgLen > ifixlen)
{
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;// lpc
msg.MsgData[msg.MsgLen++] = 0x16;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
}
break;
case KOD_DESCRIPTION: // 描 述
2 years ago
for(i=0; i<iPntNum; i++)
{
// 结构长度 = 6 + 量纲长度
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[14];// 组 号
msg.MsgData[msg.MsgLen++] = i+1; // 条目号
msg.MsgData[msg.MsgLen++] = KOD_DIMENSION; // 量 纲
2 years ago
msg.MsgData[msg.MsgLen++] = DATAID_OS8ASCII;
iNameLen = strlen(pBaoHuDB[iGroupNo].m_psDataInfo[i].m_szName);
msg.MsgData[msg.MsgLen++] = (BYTE)iNameLen;
msg.MsgData[msg.MsgLen++] = 1;
memcpy(&msg.MsgData[msg.MsgLen], pBaoHuDB[iGroupNo].m_psDataInfo[i].m_szName, iNameLen);
msg.MsgLen += (WORD)iNameLen;
*ptrPntNum++;
if(msg.MsgLen >= 220)
{
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;// lpc
msg.MsgData[msg.MsgLen++] = 0x16;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
msg.MsgLen = (WORD)ifixlen;
*ptrPntNum = 0;
}
}
if(msg.MsgLen > ifixlen)
{
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;// lpc
msg.MsgData[msg.MsgLen++] = 0x16;
SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
}
break;
default:
bRetVal = FALSE;
break;
}
return bRetVal;
}
//***************************************************************************/
//* 转发一个条目的目录 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
BOOL ProvMakeDirOfItem(u_32 commid, RTUMSG *rtumsg, PROVDEVDEF *pProvDevParam, GROUPDEF *pBaoHuDB, int iNum)
{
RTUMSG msg;
CLPDU_VARR *ptrClpdu_varr;
i_32 iNameLen, iGroupNo, iItemNo;
float *pfValue, fValue;
// 条目号
2 years ago
iItemNo = rtumsg->MsgData[15];
for(iGroupNo=0; iGroupNo<iNum; iGroupNo++)
{
if(pBaoHuDB[iGroupNo].m_iGroupNo == (int)rtumsg->MsgData[14])
{
break;
}
}
if(iGroupNo >= iNum)
{
return FALSE;
}
if(iItemNo <= 0)
{
return FALSE;
}
if(iItemNo >= pBaoHuDB[iGroupNo].m_iPntNum)
{
return FALSE;
}
memset((void *)&msg, 0, sizeof(RTUMSG));
ptrClpdu_varr = (CLPDU_VARR *)msg.MsgData;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
ptrClpdu_varr->nADDR = rtumsg->MsgData[5];
msg.MsgLen = sizeof(CLPDU_VARR);
msg.MsgData[msg.MsgLen++] = M_GD_NTA_3;
msg.MsgData[msg.MsgLen++] = 0x81;
msg.MsgData[msg.MsgLen++] = M_CAUSE_READWITHVALIDDATA;
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[9];
msg.MsgData[msg.MsgLen++] = FUNC_GENERALSORT;
msg.MsgData[msg.MsgLen++] = M_INF_READDIROFSINGLEITEM;
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[12];//RII
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[14];
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[15];
msg.MsgData[msg.MsgLen++] = 4;
msg.MsgData[msg.MsgLen++] = KOD_ACTUALVALUE; // 实际值
msg.MsgData[msg.MsgLen++] = DATAID_FLOAT; // 浮点数
2 years ago
msg.MsgData[msg.MsgLen++] = sizeof(float);
msg.MsgData[msg.MsgLen++] = 1;
pfValue = (float*)(&msg.MsgData[msg.MsgLen]);
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo-1].m_fValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
msg.MsgLen += sizeof(float);
msg.MsgData[msg.MsgLen++] = KOD_RANGE; // 量程(最大值、最小值、步长)
msg.MsgData[msg.MsgLen++] = DATAID_FLOAT; // 浮点数
2 years ago
msg.MsgData[msg.MsgLen++] = sizeof(float);
msg.MsgData[msg.MsgLen++] = 3;
pfValue = (float*)(&msg.MsgData[msg.MsgLen]);
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo-1].m_fMaxValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
pfValue++;
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo-1].m_fMinValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
pfValue++;
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo-1].m_fStepValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
msg.MsgLen += 3*sizeof(float);
msg.MsgData[msg.MsgLen++] = KOD_DIMENSION; // 量 纲
2 years ago
msg.MsgData[msg.MsgLen++] = DATAID_OS8ASCII;
iNameLen = strlen(pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo].m_szUnit);
msg.MsgData[msg.MsgLen++] = (BYTE)iNameLen;
msg.MsgData[msg.MsgLen++] = 1;
memcpy(&msg.MsgData[msg.MsgLen], pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo].m_szUnit, iNameLen);
msg.MsgLen += (WORD)iNameLen;
msg.MsgData[msg.MsgLen++] = KOD_DESCRIPTION; // 描 述
2 years ago
msg.MsgData[msg.MsgLen++] = DATAID_OS8ASCII;
iNameLen = strlen(pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo].m_szName);
msg.MsgData[msg.MsgLen++] = (BYTE)iNameLen;
msg.MsgData[msg.MsgLen++] = 1;
memcpy(&msg.MsgData[msg.MsgLen], pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo].m_szName, iNameLen);
msg.MsgLen += (WORD)iNameLen;
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;//lpc
msg.MsgData[msg.MsgLen++] = 0x16;
return SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
}
//***************************************************************************/
//* 转发一个条目的值或属性 */
//*参数: u_32 commid : 厂站端口号 */
//* RTUMSG *rtumsg : 接收到的数据信息 */
//* i_32 iBuIdx : 保护装置(间隔)索引 */
//*返回值:无 */
2 years ago
//***************************************************************************/
BOOL ProvMakeAttrOfItem(u_32 commid, RTUMSG *rtumsg, PROVDEVDEF *pProvDevParam, GROUPDEF *pBaoHuDB, int iNum)
{
RTUMSG msg;
CLPDU_VARR *ptrClpdu_varr;
i_32 iNameLen, iGroupNo, iItemNo;
float *pfValue, fValue;
// 条目号
2 years ago
iItemNo = rtumsg->MsgData[15];
for(iGroupNo=0; iGroupNo<iNum; iGroupNo++)
{
if(pBaoHuDB[iGroupNo].m_iGroupNo == (int)rtumsg->MsgData[14])
{
break;
}
}
if(iGroupNo >= iNum)
{
return FALSE;
}
if(iItemNo <= 0)
{
return FALSE;
}
if(iItemNo >= pBaoHuDB[iGroupNo].m_iPntNum)
{
return FALSE;
}
memset((void *)&msg, 0, sizeof(RTUMSG));
ptrClpdu_varr = (CLPDU_VARR *)msg.MsgData;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
ptrClpdu_varr->nADDR = rtumsg->MsgData[5];
msg.MsgLen = sizeof(CLPDU_VARR);
msg.MsgData[msg.MsgLen++] = M_GD_NTA_3;
msg.MsgData[msg.MsgLen++] = 0x81;
msg.MsgData[msg.MsgLen++] = M_CAUSE_READWITHVALIDDATA;
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[9];
msg.MsgData[msg.MsgLen++] = FUNC_GENERALSORT;
msg.MsgData[msg.MsgLen++] = M_INF_READDIROFSINGLEITEM;
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[12];//RII
msg.MsgData[msg.MsgLen++] = 1;
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[14];
msg.MsgData[msg.MsgLen++] = rtumsg->MsgData[15];
switch(rtumsg->MsgData[16])
{
case KOD_ACTUALVALUE: // 实际值
msg.MsgData[msg.MsgLen++] = KOD_ACTUALVALUE; // 实际值
msg.MsgData[msg.MsgLen++] = DATAID_FLOAT; // 浮点数
2 years ago
msg.MsgData[msg.MsgLen++] = sizeof(float);
msg.MsgData[msg.MsgLen++] = 1;
pfValue = (float*)(&msg.MsgData[msg.MsgLen]);
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo-1].m_fValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
msg.MsgLen += sizeof(float);
break;
case KOD_RANGE: // 量程(最大值、最小值、步长)
msg.MsgData[msg.MsgLen++] = KOD_RANGE; // 量程(最大值、最小值、步长)
msg.MsgData[msg.MsgLen++] = DATAID_FLOAT; // 浮点数
2 years ago
msg.MsgData[msg.MsgLen++] = sizeof(float);
msg.MsgData[msg.MsgLen++] = 3;
pfValue = (float*)(&msg.MsgData[msg.MsgLen]);
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo-1].m_fMaxValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
pfValue++;
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo-1].m_fMinValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
pfValue++;
fValue = pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo-1].m_fStepValue;
SequenceHostToRtu((char *)&fValue, sizeof(float));
*pfValue = fValue;
msg.MsgLen += 3*sizeof(float);
break;
case KOD_DIMENSION: // 量 纲
msg.MsgData[msg.MsgLen++] = KOD_DIMENSION; // 量 纲
2 years ago
msg.MsgData[msg.MsgLen++] = DATAID_OS8ASCII;
iNameLen = strlen(pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo].m_szUnit);
msg.MsgData[msg.MsgLen++] = (BYTE)iNameLen;
msg.MsgData[msg.MsgLen++] = 1;
memcpy(&msg.MsgData[msg.MsgLen], pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo].m_szUnit, iNameLen);
msg.MsgLen += (WORD)iNameLen;
break;
case KOD_DESCRIPTION: // 描 述
msg.MsgData[msg.MsgLen++] = KOD_DIMENSION; // 量 纲
2 years ago
msg.MsgData[msg.MsgLen++] = DATAID_OS8ASCII;
iNameLen = strlen(pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo].m_szName);
msg.MsgData[msg.MsgLen++] = (BYTE)iNameLen;
msg.MsgData[msg.MsgLen++] = 1;
memcpy(&msg.MsgData[msg.MsgLen], pBaoHuDB[iGroupNo].m_psDataInfo[iItemNo].m_szName, iNameLen);
msg.MsgLen += (WORD)iNameLen;
break;
}
ptrClpdu_varr->nLEN1 = msg.MsgLen - 4;
ptrClpdu_varr->nLEN2 = msg.MsgLen - 4;
msg.MsgLen++;//lpc
msg.MsgData[msg.MsgLen++] = 0x16;
return SingleListAddData(&pProvDevParam->m_sBaoHuData, msg.MsgData, msg.MsgLen);
}
BOOL ProvSendChangedDi(u_32 commid, DEVADDRPARAM *psDevAddrParam)
{
int i, j, iStart, len;
WORD wValue;
BOOL bQueryAllDev, bFind;
DAY_TIME sCurTime;
RTUMSG rtumsg;
DI_DEF pntmsg;
PROV_DI_PNT *diprovptr = NULL;
CLPDU_VARR *ptrClpdu_varr = NULL;
PROVDEVDEF *pProvDevParam = NULL;
BUBAN103LINKDEF *pLinkParam = NULL;
BUBAN103PORTPARAM *pPortParam = NULL;
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
pLinkParam = &pPortParam->m_psLink[psDevAddrParam->m_iLinkIdx];
diprovptr = (PROV_DI_PNT*)pPortParam->m_psBaoHu->DiPtr;
bFind = FALSE;
if(pLinkParam->m_uchLinkAddr != 0xFF)
{
bQueryAllDev = TRUE;
}
else
{
bQueryAllDev = FALSE;
}
for(i=0; i<pLinkParam->m_iDevNum; i++)
{
if(bQueryAllDev == TRUE)
{
psDevAddrParam->m_iDevIdx = i;
}
else
{
if(i >= 1)
{
break;
}
}
pProvDevParam = &pLinkParam->m_psProvDev[psDevAddrParam->m_iDevIdx];
iStart = pProvDevParam->m_sYxInfo.m_iStartPntNo;
for(j=0; j<pProvDevParam->m_sYxInfo.m_iPntNum; j++)
{
if(TRUE == diprovptr[iStart+j].ChangeFlag)
{
bFind = TRUE;
diprovptr[iStart+j].ChangeFlag = FALSE;
GetPntMsg(diprovptr[iStart+j].PortNo, diprovptr[iStart+j].PntNo,
(void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
break;
}
}
if(TRUE == bFind)
{
break;
}
}
if(bFind == TRUE)
{
GetLocalTimeEx(&sCurTime);
ptrClpdu_varr = (CLPDU_VARR *)rtumsg.MsgData;
ptrClpdu_varr->nSTART1 = 0x68;
ptrClpdu_varr->nSTART2 = 0x68;
// 重新赋值链路的转发地址
2 years ago
ptrClpdu_varr->nADDR = psDevAddrParam->m_uchLinkAddr;
ptrClpdu_varr->nCONTROL &= 0xDF;
// wen 2005.06.10 遥信变位只精确到秒
2 years ago
//wValue = sCurTime.Sec*1000 + sCurTime.mSec;
wValue = sCurTime.Sec*1000;
rtumsg.MsgData[sizeof(CLPDU_VARR)] = 0x01;
// 四个八位二进制组
2 years ago
rtumsg.MsgData[sizeof(CLPDU_VARR)+7] = LOBYTE(wValue);
rtumsg.MsgData[sizeof(CLPDU_VARR)+8] = HIBYTE(wValue);
rtumsg.MsgData[sizeof(CLPDU_VARR)+9] = sCurTime.Min & 0x3F;
rtumsg.MsgData[sizeof(CLPDU_VARR)+10] = sCurTime.Hour & 0x1F;
// SIN
rtumsg.MsgData[sizeof(CLPDU_VARR)+11] = 0;
len = 14;
ptrClpdu_varr->nLEN1 = len;
ptrClpdu_varr->nLEN2 = len;
rtumsg.MsgData[sizeof(CLPDU_VARR)+1] = 0x81;
//COT
rtumsg.MsgData[sizeof(CLPDU_VARR)+2] = M_CAUSE_AUTOSEND;
// 重新赋值 ASDU 公共地址
2 years ago
rtumsg.MsgData[sizeof(CLPDU_VARR)+3] = (BYTE)pProvDevParam->m_iProvAddr;
// FUN
rtumsg.MsgData[sizeof(CLPDU_VARR)+4] = pProvDevParam->m_sYxInfo.m_psDataInfo[j].m_u8ProvFun;
// INF
rtumsg.MsgData[sizeof(CLPDU_VARR)+5] = pProvDevParam->m_sYxInfo.m_psDataInfo[j].m_u8ProvInf;
// DPI
rtumsg.MsgData[sizeof(CLPDU_VARR)+6] = pntmsg.Status+1;
len = ptrClpdu_varr->nLEN1 + 4;
// 发送时会重新计算
2 years ago
//rtumsg.MsgData[len++] = CalBuban103Lpc(rtumsg.MsgData+4, ptrClpdu_varr->nLEN1);
rtumsg.MsgData[len++] = 0;
rtumsg.MsgData[len++] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char*)rtumsg.MsgData, len);
}
else
{
pPortParam->m_psBaoHu->DiChange = FALSE;
}
return bFind;
}
i_32 PackOneValueIntoPackage(BYTE *pbDestBuf, u_32 uMaxBufLen, BYTE bDataFormat,
u_32 uDataType, u_32 uDataLen, BYTE *pbSourData)
{
i_32 iCount, k;
float *ptrfValue, fValue;
double *ptrdbValue;
short *ptri16Value;
i_32 *ptriValue;
iCount = 0;
// 数据类型
2 years ago
switch(bDataFormat)
{
case 0:// 模拟量
// pbSourData[0] // 数据源长度
2 years ago
fValue = *(float*)(pbSourData+1);
// 数据长度
2 years ago
pbDestBuf[iCount++] = (BYTE)uDataLen;
pbDestBuf[iCount++] = 1;
// 数据长度(103中无用)
2 years ago
//rtumsg->MsgData[uOffset++];
//ptrfValueSour = (float *)&rtumsg->MsgData[uOffset];
if(uDataType == DATAID_UI)// 无符号整数
2 years ago
{
if(uDataLen == 1)
{
pbDestBuf[iCount] = (BYTE)((u_32)fabs(fValue));
}
else if(uDataLen == 2)
{
ptri16Value = (short *)&pbDestBuf[iCount];
*ptri16Value = (short)fabs(fValue);
SequenceHostToRtu((char *)ptri16Value, sizeof(short));
}
else if(uDataLen == 4)
{
ptriValue = (i_32 *)&pbDestBuf[iCount];
*ptriValue = (i_32)fabs(fValue);
SequenceHostToRtu((char *)ptriValue, sizeof(i_32));
}
}
// wen 2005.04.05 北京四方扩展数据类型
2 years ago
//else if(uDataType == DATAID_INT)
else if((DATAID_INT == uDataType) || ( DATAID_EXDATA_0X24 == uDataType))
{
if(uDataLen == 1)
{
pbDestBuf[iCount] = (BYTE)((i_32)fabs(fValue));
}
else if(uDataLen == 2)
{
ptri16Value = (short *)&pbDestBuf[iCount];
*ptri16Value = (short)fabs(fValue);
SequenceHostToRtu((char *)ptri16Value, sizeof(short));
}
else if(uDataLen == 4)
{
ptriValue = (i_32 *)&pbDestBuf[iCount];
*ptriValue = (i_32)fabs(fValue);
SequenceHostToRtu((char *)ptriValue, sizeof(i_32));
}
}
else if(uDataType == DATAID_UFLOAT)// 无符号浮点数
2 years ago
{
ptrfValue = (float *)&pbDestBuf[iCount];
*ptrfValue = (float)fabs(fValue);
SequenceHostToRtu((char *)ptrfValue, sizeof(float));
}
else if(uDataType == DATAID_FLOAT)// 浮点数
2 years ago
{
ptrfValue = (float *)&pbDestBuf[iCount];
*ptrfValue = fValue;
SequenceHostToRtu((char *)ptrfValue, sizeof(float));
}
else if(uDataType == DATAID_754SHORT)// R32.23 IEEE 标准754短实数
2 years ago
{
ptrfValue = (float *)&pbDestBuf[iCount];
*ptrfValue = fValue;
SequenceHostToRtu((char *)ptrfValue, sizeof(float));
}
else if(uDataType == DATAID_754REAL)// R64.53 IEEE 标准754实数
2 years ago
{
ptrdbValue = (double *)&pbDestBuf[iCount];
*ptrdbValue = fValue;
SequenceHostToRtu((char *)ptrdbValue, sizeof(double));
}
else if(uDataType == DATAID_13BITS) // 带品质描述的被测值(13BITS)
2 years ago
{
ptri16Value = (short *)&pbDestBuf[iCount];
*ptri16Value = ((short)(fValue)) & 0x1fff;
SequenceHostToRtu((char *)ptri16Value, sizeof(short));
}
// wen 2004.07.26 修改该类型数据的处理
else if(uDataType == DATAID_BSTRING) // 8位2进制码
2 years ago
{
uDataLen = (uDataLen + 7) / 8;
for(k=0; k<(int)uDataLen; k++);
{
pbDestBuf[iCount+k] = (BYTE)(((int)(fValue)) / 256);
fValue /= 256;
}
}
iCount += uDataLen;
break;
case 1:// 开关量
// pbSourData[0] // 数据源长度
2 years ago
fValue = *(float*)(pbSourData+1);
// 数据长度
2 years ago
pbDestBuf[iCount++] = (BYTE)uDataLen;
pbDestBuf[iCount++] = 1;
if(uDataType == DATAID_UI)// 无符号整数
2 years ago
{
if(uDataLen == 1)
{
pbDestBuf[iCount] = (BYTE)((u_32)fabs(fValue));
}
else if(uDataLen == 2)
{
ptri16Value = (short *)&pbDestBuf[iCount];
*ptri16Value = (short)fabs(fValue);
SequenceHostToRtu((char *)ptri16Value, sizeof(short));
}
else if(uDataLen == 4)
{
ptriValue = (i_32 *)&pbDestBuf[iCount];
*ptriValue = (i_32)fabs(fValue);
SequenceHostToRtu((char *)ptriValue, sizeof(i_32));
}
}
else if( uDataType == DATAID_INT)
{
if(uDataLen == 1)
{
pbDestBuf[iCount] = (BYTE)((i_32)fabs(fValue));
}
else if(uDataLen == 2)
{
ptri16Value = (short *)&pbDestBuf[iCount];
*ptri16Value = (short)fabs(fValue);
SequenceHostToRtu((char *)ptri16Value, sizeof(short));
}
else if(uDataLen == 4)
{
ptriValue = (i_32 *)&pbDestBuf[iCount];
*ptriValue = (i_32)fabs(fValue);
SequenceHostToRtu((char *)ptriValue, sizeof(i_32));
}
}
else if(uDataType == DATAID_UFLOAT)// 无符号浮点数
2 years ago
{
ptrfValue = (float *)&pbDestBuf[iCount];
*ptrfValue = (float)fabs(fValue);
SequenceHostToRtu((char *)ptrfValue, sizeof(float));
}
else if(uDataType == DATAID_FLOAT)// 浮点数
2 years ago
{
ptrfValue = (float *)&pbDestBuf[iCount];
*ptrfValue = fValue;
SequenceHostToRtu((char *)ptrfValue, sizeof(float));
}
else if(uDataType == DATAID_754SHORT)// R32.23 IEEE 标准754短实数
2 years ago
{
ptrfValue = (float *)&pbDestBuf[iCount];
*ptrfValue = fValue;
SequenceHostToRtu((char *)ptrfValue, sizeof(float));
}
else if(uDataType == DATAID_754REAL)// R64.53 IEEE 标准754实数
2 years ago
{
ptrdbValue = (double *)&pbDestBuf[iCount];
*ptrdbValue = fValue;
SequenceHostToRtu((char *)ptrdbValue, sizeof(double));
}
else if(uDataType == DATAID_13BITS) // 带品质描述的被测值(13BITS)
2 years ago
{
ptri16Value = (short *)&pbDestBuf[iCount];
*ptri16Value = ((short)(fValue)) &0x1fff;
SequenceHostToRtu((char *)ptri16Value, sizeof(short));
}
// wen 2004.07.26 修改该类型数据的处理
else if(uDataType == DATAID_BSTRING) // 8位2进制码
2 years ago
{
uDataLen = (uDataLen + 7) / 8;
for(k=0; k<(int)uDataLen; k++);
{
pbDestBuf[iCount+k] = (BYTE)(((int)(fValue)) / 256);
fValue /= 256;
}
}
else if(uDataType == DATAID_DOUBLE)// 双点信息
2 years ago
{
pbDestBuf[iCount] = (BYTE)((u_32)(fabs(fValue)+1));
}
else if(uDataType == DATAID_SINGLE)// 单点信息
2 years ago
{
pbDestBuf[iCount] = (BYTE)((u_32)fabs(fValue));
}
iCount += uDataLen;
break;
case 3:// 字符串
2 years ago
pbDestBuf[iCount++] = pbSourData[0];
pbDestBuf[iCount++] = 1;
if(uDataType == DATAID_OS8ASCII)// 8位ASCII
2 years ago
{
memcpy((void *)(pbDestBuf+iCount), (void *)(pbSourData+1), pbSourData[0]);
iCount += pbSourData[0];
}
break;
}
return iCount;
}
// 部颁103和斯凯达内部规约间的格式转换
2 years ago
void Buban103ScadaCmdchange(int commid, RTUMSG *rtumsg)
{
u_32 uInterAction, uOffset, uDataLen, uDataType;
u_char bFaultNo;
i_32 i, j, k, iGroupNo, iStartNo, iCPUNo, offset;
BOOL bIsValidCmd;
GEN_DATAGROUP sGenDataGroup;
PROTECTCONTENTHEAD *ptrProHead;
BYTE bSourData[4096];
i_32 iFixDataNGD;
CMDPARAM sCmdParam;
PROTECTMSG PrtMsg;
int iProvAddr, iYkNo;
DEVDEF *pDevParam;
DEVADDRPARAM sAddrParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
char szbuf[256];
memcpy((void *)&PrtMsg, rtumsg->MsgData, rtumsg->MsgLen);
ptrProHead = (PROTECTCONTENTHEAD *)PrtMsg.MsgData;
if(FALSE == GetPortParamPtr(commid, &pPortParam))
{
return;
}
iProvAddr = ptrProHead->uAddr;
sprintf(szbuf, "地址=%d ", ptrProHead->uAddr);
2 years ago
DebugPrint(szbuf);
if(FALSE == FindProtectDevFromProvAddr(pPortParam, &sAddrParam, iProvAddr))
{
sprintf(szbuf, "地址错误 ");
2 years ago
DebugPrint(szbuf);
return;
}
// wen 2005.06.06 增加数据返回时的上下文存储
2 years ago
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_sBaoHuCmdParam.m_iBaoHuCommid = rtumsg->PortIdx;
memcpy((void *)&pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_sBaoHuCmdParam.m_sRealAddrParam,
(void *)&sAddrParam, sizeof(DEVADDRPARAM));
GetLocalTimeEx(&pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_sBaoHuCmdParam.m_sBaoHuCmdStartTime);
pPortParam->m_psLink[sAddrParam.m_iLinkIdx].m_sBaoHuCmdParam.m_iBaoHuMsgType = MSGTYPE_BAOHU_SCADACMD;
bIsValidCmd = TRUE;
uOffset = sizeof(PROTECTCONTENTHEAD);
pLinkParam = &pPortParam->m_psLink[sAddrParam.m_iLinkIdx];
pDevParam = &pLinkParam->m_psDev[sAddrParam.m_iDevIdx];
// CPU号与分组号一一对应
2 years ago
if((ptrProHead->cCPUNo != (char)0xFF) && (ptrProHead->cCPUNo != 0))
{
pDevParam->m_sDevParam.m_u8CPUNo = ptrProHead->cCPUNo;
}
if((ptrProHead->cFixNo != (char)0xFF) && (ptrProHead->cFixNo != 0))
{
pDevParam->m_sDevParam.m_u8FixNo = ptrProHead->cFixNo;
}
iCPUNo = 1;
// 保护指令记忆
2 years ago
if(ptrProHead->uAddr != 0xff)
{
pDevParam->m_sDevParam.m_u32FuncCode = ptrProHead->uFuncCode;
}
memcpy((void *)&sCmdParam.m_sDevAddr, (void *)&sAddrParam, sizeof(DEVADDRPARAM));
switch(ptrProHead->uFuncCode)
{
case hREADFIX:// 读取定值(只存在一个保护定值组的情况)
2 years ago
uInterAction = hREADINGDATA;
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(PROTECT_FIX_PNT_TYPE == pDevParam->m_sDevParam.m_saGroupDef[i].m_iDataType)
{
sprintf(szbuf, "第%d组CPU号= %d!!!\n", i+1,
2 years ago
pDevParam->m_sDevParam.m_u8CPUNo);
DebugPrint(szbuf);
if(pDevParam->m_sDevParam.m_u8CPUNo == iCPUNo)
{
break;
}
else
{
iCPUNo++;
}
}
}
if(i == pDevParam->m_sDevParam.m_iCfgGroupNum)
{
bIsValidCmd = FALSE;
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d不存在保护定值!!!\n",
2 years ago
commid, sAddrParam.m_uchLinkAddr, sAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
break;
}
pDevParam->m_sDevParam.m_saGroupDef[i].m_u32CurPntNo = 1;
sCmdParam.m_uchInf = C_INF_READGROUPALLITEMS;
sGenDataGroup.m_u8Grp = (BYTE)pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo;
sGenDataGroup.m_u8Itm = 0;
sGenDataGroup.m_u8KOD = PrtMsg.MsgData[uOffset];
sCmdParam.m_uchRII = RII_PROV_ID;
MakeGenIdentCommand_CAsdu21(commid, &sCmdParam, &sGenDataGroup, 1);
break;
case hREADFIXNO:// 读取定值区号
2 years ago
uInterAction = hREADINGDATA;
bIsValidCmd = FALSE;
break;
case hREADPAI:// 读取保护模拟量
2 years ago
uInterAction = hREADINGDATA;
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(PROTECT_AI_PNT_TYPE == pDevParam->m_sDevParam.m_saGroupDef[i].m_iDataType)
{
break;
}
}
if(i == pDevParam->m_sDevParam.m_iCfgGroupNum)
{
bIsValidCmd = FALSE;
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d不存在保护模拟量!!!\n",
2 years ago
commid, sAddrParam.m_uchLinkAddr, sAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
#endif
break;
}
pDevParam->m_sDevParam.m_saGroupDef[i].m_u32CurPntNo = 1;
sCmdParam.m_uchInf = C_INF_READGROUPALLITEMS;
sGenDataGroup.m_u8Grp = (BYTE)pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo;
sGenDataGroup.m_u8Itm = 0;
sGenDataGroup.m_u8KOD = PrtMsg.MsgData[uOffset];
sCmdParam.m_uchRII = RII_PROV_ID;
MakeGenIdentCommand_CAsdu21(commid, &sCmdParam, &sGenDataGroup, 1);
break;
case hREADPDI:// 读取保护开关量
2 years ago
uInterAction = hREADINGDATA;
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(PROTECT_DI_PNT_TYPE == pDevParam->m_sDevParam.m_saGroupDef[i].m_iDataType)
{
break;
}
}
if(i == pDevParam->m_sDevParam.m_iCfgGroupNum)
{
bIsValidCmd = FALSE;
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d不存在保护开关量!!!\n",
2 years ago
commid, sAddrParam.m_uchLinkAddr, sAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
#endif
break;
}
pDevParam->m_sDevParam.m_saGroupDef[i].m_u32CurPntNo = 1;
sCmdParam.m_uchInf = C_INF_READGROUPALLITEMS;
sGenDataGroup.m_u8Grp = (BYTE)pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo;
sGenDataGroup.m_u8Itm = 0;
sGenDataGroup.m_u8KOD = PrtMsg.MsgData[uOffset];
sCmdParam.m_uchRII = RII_PROV_ID;
MakeGenIdentCommand_CAsdu21(commid, &sCmdParam, &sGenDataGroup, 1);
break;
case hREADPWAVE:// 读取保护波形数据
case hQUERYFAULT:// 读取指定故障报告
2 years ago
bFaultNo = rtumsg->MsgData[sizeof(PROTECTCONTENTHEAD)];
uInterAction = hREADINGDATA;
bIsValidCmd = FALSE;
break;
case hQUERYSELFCHECK:// 读取指定的自检报告
2 years ago
bFaultNo = rtumsg->MsgData[sizeof(PROTECTCONTENTHEAD)];
uInterAction = hREADINGDATA;
bIsValidCmd = FALSE;
break;
case hWRITEALLFIX:// 修改保护定值
2 years ago
uInterAction = hREADINGDATA;
//uOffset += 12;
pDevParam->m_u32CallCnt = pLinkParam->m_u32TimeOutConst;
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(PROTECT_FIX_PNT_TYPE == pDevParam->m_sDevParam.m_saGroupDef[i].m_iDataType)
{
if(pDevParam->m_sDevParam.m_u8CPUNo == iCPUNo)
{
break;
}
else
{
iCPUNo++;
}
}
}
if(i == pDevParam->m_sDevParam.m_iCfgGroupNum)
{
bIsValidCmd = FALSE;
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d不存在保护定值!!!\n",
2 years ago
commid, sAddrParam.m_uchLinkAddr, sAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
#endif
break;
}
iGroupNo = pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo;
iStartNo = *((int *)&PrtMsg.MsgData[uOffset]);
sprintf(szbuf, "修改定值组帧开始 组号=%d, 起始点号=%d, uoffset=%d 接收数据:\n",iGroupNo, iStartNo, uOffset);
2 years ago
DebugPrint(szbuf);
for(k=0; k<rtumsg->MsgLen; k+=6)
{
sprintf(szbuf, "%2X %2X %2X %2X %2X %2X",rtumsg->MsgData[k],rtumsg->MsgData[k+1],rtumsg->MsgData[k+2],rtumsg->MsgData[k+3],rtumsg->MsgData[k+4],rtumsg->MsgData[k+5]);
DebugPrint(szbuf);
}
// wen 2004.02.02 当前数据处理时的起始点号
2 years ago
pDevParam->m_sDevParam.m_saGroupDef[i].m_u32CurPntNo = 1;
if(pDevParam->m_sDevParam.m_saGroupDef[i].m_bInit == FALSE)
{
bIsValidCmd = FALSE;
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d 组号%d 未先读取定值!!!\n",
2 years ago
commid, sAddrParam.m_uchLinkAddr, sAddrParam.m_uchCommAddr, iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
uOffset += 4;
offset = 0;
for(j=0, iFixDataNGD=0; (uOffset<rtumsg->MsgLen) && (j<pDevParam->m_sDevParam.m_saGroupDef[i].m_iPntNum); j++, iFixDataNGD++)
{
// wen 2004.02.02 如果一帧数据无法全部完成写定值工作,则分成多帧来完成
2 years ago
if(offset >= 200)
{
sCmdParam.m_uchInf = C_INF_WRITEITEMWITHACK;
sCmdParam.m_uchRII = RII_PROV_ID;
MakeGenIdentData_CAsdu10(commid, &sCmdParam, bSourData, (BYTE)iFixDataNGD);
offset = 0;
iFixDataNGD = 0;
}
// wen 2004.01.07 每一个数据都有索引
2 years ago
bSourData[offset++] = (BYTE)iGroupNo;
// wen 2004.02.02 用存储的条目号
2 years ago
//bSourData[offset++] = (BYTE)(iStartNo-1+j);
bSourData[offset++] = pDevParam->m_sDevParam.m_saGroupDef[i].m_pu8GIN[iStartNo-1+j];
bSourData[offset++] = 1;
uDataType = pDevParam->m_sDevParam.m_saGroupDef[i].m_pu8DataType[iStartNo-1+j];
uDataLen = pDevParam->m_sDevParam.m_saGroupDef[i].m_pu8DataLen[iStartNo-1+j];
bSourData[offset++] = (BYTE)uDataType;
// 不能处理字符串
2 years ago
offset += PackOneValueIntoPackage(bSourData+offset, sizeof(bSourData)-offset,
PrtMsg.MsgData[uOffset], uDataType, uDataLen, &PrtMsg.MsgData[uOffset+1]);
sprintf(szbuf, "第%d点定值的组号=%d,条目号=%d,数据类型=%d,数据宽度=%d,值=%d; %02X %02X %02X %02X",iStartNo-1+j,\
2 years ago
iGroupNo,pDevParam->m_sDevParam.m_saGroupDef[i].m_pu8GIN[iStartNo-1+j],\
uDataType, uDataLen, *(float*)(&PrtMsg.MsgData[uOffset+1+1]), PrtMsg.MsgData[uOffset+2], PrtMsg.MsgData[uOffset+3], PrtMsg.MsgData[uOffset+4], PrtMsg.MsgData[uOffset+5]);
DebugPrint(szbuf);
uOffset += sizeof(float)+2;
}
if(iFixDataNGD > 0)
{
sCmdParam.m_uchInf = C_INF_WRITEITEMWITHACK;
sCmdParam.m_uchRII = RII_PROV_ID;
MakeGenIdentData_CAsdu10(commid, &sCmdParam, bSourData, (BYTE)iFixDataNGD);
}
break;
case hWRITEFIXNO:// 修改保护定值区
2 years ago
uInterAction = hREADINGDATA;
pDevParam->m_u32CallCnt = pLinkParam->m_u32TimeOutConst;
bIsValidCmd = FALSE;
break;
case hRESETPROTECT:// 保护信号复归
2 years ago
//Param.bCmdIdx = APPLY_REVERT;
uInterAction = hREADDATAEND;
if(pDevParam->m_sDevParam.m_sYkDBOrientation.m_iPntNum <= 0)
{
bIsValidCmd = FALSE;
break;
}
else
{
bIsValidCmd = TRUE;
}
iYkNo = pDevParam->m_sDevParam.m_sYkDBOrientation.m_iStartPntNo;
bSourData[0] = (BYTE)(commid & 0xFF);
bSourData[1] = (BYTE)((commid & 0xFF00) << 8);
bSourData[2] = (BYTE)((commid & 0xFF0000) << 16);
bSourData[3] = (BYTE)((commid & 0xFF000000) << 24);
bSourData[4] = (BYTE)(iYkNo & 0xFF);
bSourData[5] = (BYTE)((iYkNo & 0xFF00) << 8);
bSourData[6] = (BYTE)((iYkNo & 0xFF0000) << 16);
bSourData[7] = (BYTE)((iYkNo & 0xFF000000) << 24);
bSourData[8] = STEP_YKYT_EXEC;
bSourData[9] = 1;
Buban103YkYtProcess(commid, bSourData, 10);
break;
case hCHECKTIME:// 单个装置对时
2 years ago
//Param.bCmdIdx = CHECK_TIME;
uInterAction = hREADINGDATA;
MakeTimeSyn_CAsdu6(commid, &sCmdParam);
break;
case hBROADCASTCHECKTIME:// 保护装置广播对时
2 years ago
uInterAction = hREADDATAEND;
sCmdParam.m_sDevAddr.m_uchLinkAddr = 0xFF;
MakeTimeSyn_CAsdu6(commid, &sCmdParam);
break;
case hWRITEFIXACK: // 修改保护定值确认
2 years ago
sCmdParam.m_uchInf = C_INF_WRITEITEMWITHEXEC;
sCmdParam.m_uchRII = RII_PROV_ID;
MakeGenIdentData_CAsdu10(commid, &sCmdParam, NULL, 0);
uInterAction = hREADDATAEND;
break;
case hWRITEFIXNAK: // 修改保护定值不确认
2 years ago
sCmdParam.m_uchInf = C_INF_STOPWRITEITEM;
sCmdParam.m_uchRII = RII_PROV_ID;
MakeGenIdentData_CAsdu10(commid, &sCmdParam, NULL, 0);
uInterAction = hREADDATAEND;
break;
// wen 2004.09.29
case hWRITESPECIALFIX:// 修改指定的保护定值
2 years ago
uInterAction = hREADINGDATA;
pDevParam->m_u32CallCnt = pLinkParam->m_u32TimeOutConst;
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(PROTECT_FIX_PNT_TYPE == pDevParam->m_sDevParam.m_saGroupDef[i].m_iDataType)
{
if(pDevParam->m_sDevParam.m_u8CPUNo == iCPUNo)
{
break;
}
else
{
iCPUNo++;
}
}
}
if(i == pDevParam->m_sDevParam.m_iCfgGroupNum)
{
bIsValidCmd = FALSE;
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d不存在保护定值!!!\n",
2 years ago
commid, sAddrParam.m_uchLinkAddr, sAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
#endif
break;
}
iGroupNo = pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo;
iStartNo = *((int *)&PrtMsg.MsgData[uOffset]);
pDevParam->m_sDevParam.m_saGroupDef[i].m_u32CurPntNo = iStartNo;
if(pDevParam->m_sDevParam.m_saGroupDef[i].m_bInit == FALSE)
{
bIsValidCmd = FALSE;
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d 组号%d 未先读取定值!!!\n",
2 years ago
commid, sAddrParam.m_uchLinkAddr, sAddrParam.m_uchCommAddr, iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
uOffset += 4;
offset = 0;
// wen 2004.01.07 每一个数据都有索引
2 years ago
bSourData[offset++] = (BYTE)iGroupNo;
// wen 2004.02.02 用存储的条目号
2 years ago
bSourData[offset++] = pDevParam->m_sDevParam.m_saGroupDef[i].m_pu8GIN[iStartNo-1];
bSourData[offset++] = 1;
uDataType = pDevParam->m_sDevParam.m_saGroupDef[i].m_pu8DataType[iStartNo-1];
uDataLen = pDevParam->m_sDevParam.m_saGroupDef[i].m_pu8DataLen[iStartNo-1];
bSourData[offset++] = (BYTE)uDataType;
// 不能处理字符串
2 years ago
offset += PackOneValueIntoPackage(bSourData+offset, sizeof(bSourData)-offset,
PrtMsg.MsgData[uOffset], uDataType, uDataLen, &PrtMsg.MsgData[uOffset+1]);
uOffset += sizeof(float)+2;
sCmdParam.m_uchInf = C_INF_WRITEITEMWITHACK;
sCmdParam.m_uchRII = RII_PROV_ID;
MakeGenIdentData_CAsdu10(commid, &sCmdParam, bSourData, 1);
break;
default:
bIsValidCmd = FALSE;
break;
}
// 保护地址不合法或者指令不合法时或者查询指令错误, 直接退出
2 years ago
if( !bIsValidCmd )
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d指令不可识别!!!\n",
2 years ago
commid, sAddrParam.m_uchLinkAddr, sAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
#endif
MakeInteractionCmd(pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid, commid, hREADDATAEND, ptrProHead, FALSE);
}
else
{
MakeInteractionCmd(pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid, commid, uInterAction, ptrProHead, FALSE);
}
}
void Buban103GDprocessWithPAIToScada(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, commid, iItemNum;
BYTE u8KOD, u8INF, u8DataType;
BYTE u8DataNum, u8DataLen, u8ItemNo;
u_32 *puStartNo;
int iOffset, offset;
double fValue;
float *pfValue;
BOOL bFirst, bNumChanged;
PROTECTCONTENTHEAD *ptrProHead;
RTUMSG sendmsg;
PROTECTMSG msg;
VALUEDEF sValue;
GROUPDEF *pGroupParam;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
bNumChanged = FALSE;
bFirst = TRUE;
iOffset = 14;
pGroupParam = &pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx];
if(pGroupParam->m_iPntNum <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据空间为零!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
if((iOffset+3) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
u8INF = rtumsg->MsgData[11];
u8KOD = rtumsg->MsgData[16];
pGroupParam->m_u8NGD = rtumsg->MsgData[13];
memset((void *)&msg, 0, sizeof(PROTECTMSG));
msg.MsgType = fPFV_PROTECT_BYPASS_ACK;
msg.PortNumber = commid;
// 操作用户
2 years ago
ptrProHead = (pPROTECTCONTENTHEAD)msg.MsgData;
ptrProHead->ummid = 0xFFFFFFFF;
ptrProHead->uAddr = pDevParam->m_sDevParam.m_iProvAddr;
// 定值区号(不需要时填写0xFF)
2 years ago
ptrProHead->cFixNo = (char)pDevParam->m_sDevParam.m_u8FixNo;
// C P U 号(不需要时填写0xFF)
2 years ago
ptrProHead->cCPUNo = (char)pDevParam->m_sDevParam.m_u8CPUNo;
// 操作类型
2 years ago
ptrProHead->uFuncCode = hPAIDATA;
// 扩展保留
2 years ago
offset = sizeof(PROTECTCONTENTHEAD);
// 实际条目类型
2 years ago
msg.MsgData[offset++] = u8KOD;
// 起始序号
2 years ago
puStartNo = (u_32*)&msg.MsgData[offset];
offset += sizeof(u_32);
iItemNum = pGroupParam->m_u8NGD & 0x3F;
for(i=0; i<iItemNum; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 组 号
// 条目号
2 years ago
u8ItemNo = rtumsg->MsgData[iOffset+1];
iOffset += 2;
if(TRUE == bFirst)
{
if(u8ItemNo == 0)
{
pGroupParam->m_u32CurPntNo = 1;
}
else if(u8ItemNo <= pGroupParam->m_iStartItemNo)
{
pGroupParam->m_u32CurPntNo = 1;
}
if((M_INF_WRITEITEMWITHACK == u8INF)
&& (pGroupParam->m_bInit == FALSE))
{
for(j=0; j<pGroupParam->m_iPntNum; j++)
{
if(pGroupParam->m_pu8GIN[j] == u8ItemNo)
{
break;
}
}
if(j >= pGroupParam->m_iPntNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时不匹配的GIN=%d!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, u8ItemNo, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
pGroupParam->m_u32CurPntNo = j+1;
}
*puStartNo = pGroupParam->m_u32CurPntNo;
bFirst = FALSE;
}
if(u8KOD != rtumsg->MsgData[iOffset])
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时数据KOD=%d与要求的KOD=%d不符!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo, rtumsg->MsgData[iOffset], u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 4;
continue;
}
else
{
iOffset++;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<(int)u8DataNum; j++)
{
// wen 2004.02.01 如果条目号为0则该条目为该组条目数量不上送
2 years ago
if((u8ItemNo == 0) && (j == 0))
{
iOffset += u8DataLen;
continue;
}
if((int)pGroupParam->m_u32CurPntNo > pGroupParam->m_iPntNum)
{
break;
}
if(pGroupParam->m_bInit == FALSE)
{
//pGroupParam->m_pu8DataLen[pGroupParam->m_u32CurPntNo-1] = u8DataLen;
//pGroupParam->m_pu8DataType[pGroupParam->m_u32CurPntNo-1] = u8DataType;
pGroupParam->m_pu8GIN[pGroupParam->m_u32CurPntNo-1] = u8ItemNo+j;
}
if(GetOneValueOfASDU10(&rtumsg->MsgData[iOffset], &sValue, u8DataType, u8DataLen) == FALSE)
{
iOffset += u8DataLen;
continue;
}
iOffset += u8DataLen;
switch(sValue.m_iDataType)
{
case DT_UINT:// 无符号整型数
2 years ago
fValue = sValue.m_unValue.m_uValue;
break;
case DT_INT:
fValue = sValue.m_unValue.m_iValue;
break;
case DT_FLOAT:
fValue = sValue.m_unValue.m_fValue;
break;
case DT_CONTROL:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_STRING:
fValue = -1;
break;
case DT_BINARY:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_NO:// 无数据
2 years ago
default:
fValue = -1;
break;
}
if(pGroupParam->m_bInit == FALSE)
{
if((u8ItemNo == 0) && (j == 0))
{
if((fValue > 0) && (KOD_ACTUALVALUE == u8KOD))
{
if((int)fValue > pGroupParam->m_iPntNum)
{
//pGroupParam->m_iPntNum = (int)sValue.m_unValue.m_uValue;
bNumChanged = TRUE;
}
else
{
pGroupParam->m_iPntNum = (int)fValue;
}
}
}
}
if(TRUE == bNumChanged)
{
//freeallfixmemory
}
if(DT_STRING != sValue.m_iDataType)
{
pfValue = (float *)&msg.MsgData[offset];
*pfValue = (float)fValue;
offset += sizeof(float);
}
if(pGroupParam->m_bInit == FALSE)
{
pGroupParam->m_psDataInfo[pGroupParam->m_u32CurPntNo-1].m_u32DataID = u8DataType;
}
pGroupParam->m_u32CurPntNo++;
}
}
if(pGroupParam->m_iPntNum > 0)
{
if((int)pGroupParam->m_u32CurPntNo >= pGroupParam->m_iPntNum)
{
pGroupParam->m_bInit = TRUE;
pGroupParam->m_u32CurPntNo = 1;
}
}
msg.MsgLen = offset;
sendmsg.MsgLen = (WORD)(msg.MsgLen+sizeof(PROTECTMSGHEAD));
sendmsg.MsgType = MSGTYPE_BAOHU_SCADADATA;
sendmsg.PortIdx = pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid;
memcpy(sendmsg.MsgData, (BYTE *)&msg, sendmsg.MsgLen);
PutBaohuDataToPort(&sendmsg);
if(pDevParam->m_sDevParam.m_u32FuncCode == hREADPAI)
{
if(TRUE == pGroupParam->m_bInit)
{
MakeInteractionCmd(pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid, commid, hREADDATAEND, ptrProHead, FALSE);
pDevParam->m_sDevParam.m_u32FuncCode = 0;
}
}
}
void Buban103GDprocessWithPDIToScada(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, commid, iItemNum;
BYTE u8KOD, u8INF, u8DataType;
BYTE u8DataNum, u8DataLen, u8ItemNo;
u_32 *puStartNo;
int iOffset, offset;
double fValue;
BOOL bFirst, bNumChanged;
PROTECTCONTENTHEAD *ptrProHead;
RTUMSG sendmsg;
PROTECTMSG msg;
VALUEDEF sValue;
GROUPDEF *pGroupParam;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
bNumChanged = FALSE;
bFirst = TRUE;
iOffset = 14;
pGroupParam = &pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx];
if(pGroupParam->m_iPntNum <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据空间为零!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
if((iOffset+3) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
u8INF = rtumsg->MsgData[11];
u8KOD = rtumsg->MsgData[16];
pGroupParam->m_u8NGD = rtumsg->MsgData[13];
memset((void *)&msg, 0, sizeof(PROTECTMSG));
msg.MsgType = fPFV_PROTECT_BYPASS_ACK;
msg.PortNumber = commid;
// 操作用户
2 years ago
ptrProHead = (pPROTECTCONTENTHEAD)msg.MsgData;
ptrProHead->ummid = 0xFFFFFFFF;
ptrProHead->uAddr = pDevParam->m_sDevParam.m_iProvAddr;
// 定值区号(不需要时填写0xFF)
2 years ago
ptrProHead->cFixNo = (char)pDevParam->m_sDevParam.m_u8FixNo;
// C P U 号(不需要时填写0xFF)
2 years ago
ptrProHead->cCPUNo = (char)pDevParam->m_sDevParam.m_u8CPUNo;
// 操作类型
2 years ago
ptrProHead->uFuncCode = hPDIDATA;
// 扩展保留
2 years ago
offset = sizeof(PROTECTCONTENTHEAD);
// 实际条目类型
2 years ago
msg.MsgData[offset++] = u8KOD;
// 起始序号
2 years ago
puStartNo = (u_32*)&msg.MsgData[offset];
offset += sizeof(u_32);
iItemNum = pGroupParam->m_u8NGD & 0x3F;
for(i=0; i<iItemNum; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 组 号
// 条目号
2 years ago
u8ItemNo = rtumsg->MsgData[iOffset+1];
iOffset += 2;
if(TRUE == bFirst)
{
if(u8ItemNo == 0)
{
pGroupParam->m_u32CurPntNo = 1;
}
else if(u8ItemNo <= pGroupParam->m_iStartItemNo)
{
pGroupParam->m_u32CurPntNo = 1;
}
if((M_INF_WRITEITEMWITHACK == u8INF)
&& (pGroupParam->m_bInit == FALSE))
{
for(j=0; j<pGroupParam->m_iPntNum; j++)
{
if(pGroupParam->m_pu8GIN[j] == u8ItemNo)
{
break;
}
}
if(j >= pGroupParam->m_iPntNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时不匹配的GIN=%d!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, u8ItemNo, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
pGroupParam->m_u32CurPntNo = j+1;
}
*puStartNo = pGroupParam->m_u32CurPntNo;
bFirst = FALSE;
}
if(u8KOD != rtumsg->MsgData[iOffset])
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时数据KOD=%d与要求的KOD=%d不符!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo, rtumsg->MsgData[iOffset], u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 4;
continue;
}
else
{
iOffset++;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<(int)u8DataNum; j++)
{
// wen 2004.02.01 如果条目号为0则该条目为该组条目数量不上送
2 years ago
if((u8ItemNo == 0) && (j == 0))
{
iOffset += u8DataLen;
continue;
}
if((int)pGroupParam->m_u32CurPntNo > pGroupParam->m_iPntNum)
{
break;
}
if(pGroupParam->m_bInit == FALSE)
{
//pGroupParam->m_pu8DataLen[pGroupParam->m_u32CurPntNo-1] = u8DataLen;
//pGroupParam->m_pu8DataType[pGroupParam->m_u32CurPntNo-1] = u8DataType;
pGroupParam->m_pu8GIN[pGroupParam->m_u32CurPntNo-1] = u8ItemNo+j;
}
if(GetOneValueOfASDU10(&rtumsg->MsgData[iOffset], &sValue, u8DataType, u8DataLen) == FALSE)
{
iOffset += u8DataLen;
continue;
}
iOffset += u8DataLen;
switch(sValue.m_iDataType)
{
case DT_UINT:// 无符号整型数
2 years ago
fValue = sValue.m_unValue.m_uValue;
break;
case DT_INT:
fValue = sValue.m_unValue.m_iValue;
break;
case DT_FLOAT:
fValue = sValue.m_unValue.m_fValue;
break;
case DT_CONTROL:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_STRING:
fValue = -1;
break;
case DT_BINARY:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_NO:// 无数据
2 years ago
default:
fValue = -1;
break;
}
/*
if(pGroupParam->m_bInit == FALSE)
{
if((u8ItemNo == 0) && (j == 0))
{
if((fValue > 0) && (KOD_ACTUALVALUE == u8KOD))
{
if((int)fValue > pGroupParam->m_iPntNum)
{
//pGroupParam->m_iPntNum = (int)sValue.m_unValue.m_uValue;
bNumChanged = TRUE;
}
else
{
pGroupParam->m_iPntNum = (int)fValue;
}
}
}
}
if(TRUE == bNumChanged)
{
//freeallfixmemory
}
*/
if(DT_BINARY == sValue.m_iDataType)
{
if(2 == sValue.m_iDataNum)
{
if((fValue < 1) || (fValue > 2))
{
fValue = 0;
}
else
{
fValue -= 1;
}
}
}
if(fValue > 0)
{
msg.MsgData[offset++] = TRUE;
}
else
{
msg.MsgData[offset++] = FALSE;
}
if(pGroupParam->m_bInit == FALSE)
{
pGroupParam->m_psDataInfo[pGroupParam->m_u32CurPntNo-1].m_u32DataID = u8DataType;
}
pGroupParam->m_u32CurPntNo++;
}
}
if(pGroupParam->m_iPntNum > 0)
{
if((int)pGroupParam->m_u32CurPntNo >= pGroupParam->m_iPntNum)
{
pGroupParam->m_bInit = TRUE;
pGroupParam->m_u32CurPntNo = 1;
}
}
msg.MsgLen = offset;
sendmsg.MsgLen = (WORD)(msg.MsgLen+sizeof(PROTECTMSGHEAD));
sendmsg.MsgType = MSGTYPE_BAOHU_SCADADATA;
sendmsg.PortIdx = pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid;
memcpy(sendmsg.MsgData, (BYTE *)&msg, sendmsg.MsgLen);
PutBaohuDataToPort(&sendmsg);
if(pDevParam->m_sDevParam.m_u32FuncCode == hREADPDI)
{
if(TRUE == pGroupParam->m_bInit)
{
MakeInteractionCmd(pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid, commid, hREADDATAEND, ptrProHead, FALSE);
pDevParam->m_sDevParam.m_u32FuncCode = 0;
}
}
}
void Buban103GDprocessWithPFIXToScada(RTUMSG *rtumsg, DEVADDRPARAM *psDevAddrParam, i_32 iGroupIdx)
{
int i, j, commid, iItemNum;
BYTE u8KOD, u8INF, u8DataType;
BYTE u8DataNum, u8DataLen, u8ItemNo;
u_32 *puStartNo;
int iOffset, offset;
double fValue;
float *pfValue;
BOOL bFirst, bNumChanged;
PROTECTCONTENTHEAD *ptrProHead;
RTUMSG sendmsg;
PROTECTMSG msg;
VALUEDEF sValue;
GROUPDEF *pGroupParam;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
//#ifdef _DEBUG_MSG_
char szbuf[256];
//#endif
sprintf(szbuf, "Buban103GDprocessWithPFIXToScada");
DebugPrint(szbuf);
commid = rtumsg->PortIdx;
if(FALSE == GetSpecialPtr(commid, psDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
bNumChanged = FALSE;
bFirst = TRUE;
iOffset = 14;
pGroupParam = &pDevParam->m_sDevParam.m_saGroupDef[iGroupIdx];
if(pGroupParam->m_iPntNum <= 0)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据空间为零!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
if((iOffset+3) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时, 数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
u8INF = rtumsg->MsgData[11];
u8KOD = rtumsg->MsgData[16];
pGroupParam->m_u8NGD = rtumsg->MsgData[13];
if((0xf9 == u8INF) && (rtumsg->MsgData[8] == 0x29))
{
sprintf(szbuf, "Buban103GDprocessWithPFIXToScada写定值确认失败");
2 years ago
DebugPrint(szbuf);
}
if((0xf9 == u8INF) && (rtumsg->MsgData[8] == 0x2c))
{
sprintf(szbuf, "Buban103GDprocessWithPFIXToScada写定值确认成功");
2 years ago
DebugPrint(szbuf);
}
if((0xfa == u8INF) && (rtumsg->MsgData[8] == 0x28))
{
sprintf(szbuf, "Buban103GDprocessWithPFIXToScada写定值执行成功");
2 years ago
DebugPrint(szbuf);
}
if((0xfa == u8INF) && (rtumsg->MsgData[8] == 0x29))
{
sprintf(szbuf, "Buban103GDprocessWithPFIXToScada写定值执行失败");
2 years ago
DebugPrint(szbuf);
}
if((0xfb == u8INF) && (rtumsg->MsgData[8] == 0x28))
{
sprintf(szbuf, "Buban103GDprocessWithPFIXToScada写定值终止执行成功");
2 years ago
DebugPrint(szbuf);
}
memset((void *)&msg, 0, sizeof(PROTECTMSG));
msg.MsgType = fPFV_PROTECT_BYPASS_ACK;
msg.PortNumber = commid;
// 操作用户
2 years ago
ptrProHead = (pPROTECTCONTENTHEAD)msg.MsgData;
ptrProHead->ummid = 0xFFFFFFFF;
ptrProHead->uAddr = pDevParam->m_sDevParam.m_iProvAddr;
// 定值区号(不需要时填写0xFF)
2 years ago
ptrProHead->cFixNo = (char)pDevParam->m_sDevParam.m_u8FixNo;
// C P U 号(不需要时填写0xFF)
2 years ago
ptrProHead->cCPUNo = (char)pDevParam->m_sDevParam.m_u8CPUNo;
// 操作类型
2 years ago
ptrProHead->uFuncCode = hFIXDATA;
// 扩展保留
2 years ago
offset = sizeof(PROTECTCONTENTHEAD);
// 实际条目类型
2 years ago
msg.MsgData[offset++] = u8KOD;
// 起始序号
2 years ago
puStartNo = (u_32*)&msg.MsgData[offset];
offset += sizeof(u_32);
iItemNum = pGroupParam->m_u8NGD & 0x3F;
for(i=0; i<iItemNum; i++)
{
if((iOffset+6) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 数据长度(单个数据长*数量)
2 years ago
u8DataNum = rtumsg->MsgData[iOffset+5];
u8DataLen = rtumsg->MsgData[iOffset+4];
if((iOffset+6+u8DataLen*u8DataNum) >= rtumsg->MsgLen)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)处理时,数据帧长度不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
break;
}
// 组 号
// 条目号
2 years ago
u8ItemNo = rtumsg->MsgData[iOffset+1];
iOffset += 2;
if(TRUE == bFirst)
{
if(u8ItemNo == 0)
{
pGroupParam->m_u32CurPntNo = 1;
}
else if(u8ItemNo <= pGroupParam->m_iStartItemNo)
{
pGroupParam->m_u32CurPntNo = 1;
}
if((M_INF_WRITEITEMWITHACK == u8INF)
&& (pGroupParam->m_bInit == FALSE))
{
for(j=0; j<pGroupParam->m_iPntNum; j++)
{
if(pGroupParam->m_pu8GIN[j] == u8ItemNo)
{
break;
}
}
if(j >= pGroupParam->m_iPntNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时不匹配的GIN=%d!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, u8ItemNo, pGroupParam->m_iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
pGroupParam->m_u32CurPntNo = j+1;
}
*puStartNo = pGroupParam->m_u32CurPntNo;
bFirst = FALSE;
}
if(u8KOD != rtumsg->MsgData[iOffset])
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10(Group=%d)写确认处理时数据KOD=%d与要求的KOD=%d不符!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, pGroupParam->m_iGroupNo, rtumsg->MsgData[iOffset], u8KOD);
DebugPrint(szbuf);
#endif
iOffset += u8DataLen*u8DataNum + 4;
continue;
}
else
{
iOffset++;
}
u8DataType = rtumsg->MsgData[iOffset++];
iOffset += 2;
for(j=0; j<(int)u8DataNum; j++)
{
// wen 2004.02.01 如果条目号为0则该条目为该组条目数量不上送
2 years ago
if((u8ItemNo == 0) && (j == 0))
{
iOffset += u8DataLen;
continue;
}
if((int)pGroupParam->m_u32CurPntNo > pGroupParam->m_iPntNum)
{
break;
}
if(pGroupParam->m_bInit == FALSE)
{
pGroupParam->m_pu8DataLen[pGroupParam->m_u32CurPntNo-1] = u8DataLen;
pGroupParam->m_pu8DataType[pGroupParam->m_u32CurPntNo-1] = u8DataType;
pGroupParam->m_pu8GIN[pGroupParam->m_u32CurPntNo-1] = u8ItemNo+j;
}
if(GetOneValueOfASDU10(&rtumsg->MsgData[iOffset], &sValue, u8DataType, u8DataLen) == FALSE)
{
iOffset += u8DataLen;
continue;
}
iOffset += u8DataLen;
switch(sValue.m_iDataType)
{
case DT_UINT:// 无符号整型数
2 years ago
fValue = sValue.m_unValue.m_uValue;
break;
case DT_INT:
fValue = sValue.m_unValue.m_iValue;
break;
case DT_FLOAT:
fValue = sValue.m_unValue.m_fValue;
break;
case DT_CONTROL:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_STRING:
fValue = -1;
break;
case DT_BINARY:
fValue = sValue.m_unValue.m_dwValue;
break;
case DT_NO:// 无数据
2 years ago
default:
fValue = -1;
break;
}
if(DT_STRING == sValue.m_iDataType)
{
msg.MsgData[offset++] = DATATYPE_STRING;
msg.MsgData[offset++] = (BYTE)sValue.m_iDataNum;
memcpy((void *)&msg.MsgData[offset], sValue.m_szValue, sValue.m_iDataNum);
offset += sValue.m_iDataNum;
}
else if(DT_BINARY == sValue.m_iDataType)
{
if(2 == sValue.m_iDataNum)
{
if((fValue < 1) || (fValue > 2))
{
fValue = 0;
}
else
{
fValue -= 1;
}
}
msg.MsgData[offset++] = DATATYPE_DI;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//遥信量也是以float的形式上送的
2 years ago
//if(fValue > 0)
//{
// msg.MsgData[offset++] = TRUE;
//}
//else
//{
// msg.MsgData[offset++] = FALSE;
//}
//===============================================================
if(fValue > 0)
{
fValue = TRUE;
}
else
{
fValue = FALSE;
}
pfValue = (float *)&msg.MsgData[offset];
*pfValue = (float)fValue;
offset += sizeof(float);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
else
{
// 南瑞装置的开关量以无符号整数送上来
2 years ago
//msg.MsgData[offset++] = DATATYPE_AI;
if(pGroupParam->m_psDataInfo[pGroupParam->m_u32CurPntNo-1].iFixDataType == 2)
msg.MsgData[offset++] = DATATYPE_DI;
else
msg.MsgData[offset++] = DATATYPE_AI;
pfValue = (float *)&msg.MsgData[offset];
*pfValue = (float)fValue;
offset += sizeof(float);
}
if(pGroupParam->m_bInit == FALSE)
{
pGroupParam->m_psDataInfo[pGroupParam->m_u32CurPntNo-1].m_u32DataID = u8DataType;
}
pGroupParam->m_u32CurPntNo++;
}
}
if(pGroupParam->m_iPntNum > 0)
{
if((int)pGroupParam->m_u32CurPntNo > pGroupParam->m_iPntNum)
{
sprintf(szbuf, "当前处理点号m_u32CurPntNo=%d, 定值总数m_iPntNum= %d", pGroupParam->m_u32CurPntNo, pGroupParam->m_iPntNum);
2 years ago
DebugPrint(szbuf);
pGroupParam->m_bInit = TRUE;
pGroupParam->m_u32CurPntNo = 1;
}
}
msg.MsgLen = offset;
sendmsg.MsgLen = (WORD)(msg.MsgLen+sizeof(PROTECTMSGHEAD));
sendmsg.MsgType = MSGTYPE_BAOHU_SCADADATA;
sendmsg.PortIdx = pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid;
memcpy(sendmsg.MsgData, (BYTE *)&msg, sendmsg.MsgLen);
PutBaohuDataToPort(&sendmsg);
if(pDevParam->m_sDevParam.m_u32FuncCode == hREADFIX)
{
if(TRUE == pGroupParam->m_bInit)
{
MakeInteractionCmd(pLinkParam->m_sBaoHuCmdParam.m_iBaoHuCommid, commid, hREADDATAEND, ptrProHead, FALSE);
pDevParam->m_sDevParam.m_u32FuncCode = 0;
}
}
ptrProHead = (pPROTECTCONTENTHEAD)&sendmsg.MsgData[sizeof(PROTECTMSGHEAD)];
// wen 2004.01.06 写定值确认
2 years ago
if((M_CAUSE_WRITEACK == rtumsg->MsgData[8])
|| ( M_CAUSE_WRITECONFIRM == rtumsg->MsgData[8]))
{
ptrProHead->uFuncCode = hWRITEFIXACK;
Buban103ScadaCmdchange(commid, &sendmsg);
}
else if(M_CAUSE_WRITENAK == rtumsg->MsgData[8])
{
ptrProHead->uFuncCode = hWRITEFIXNAK;
Buban103ScadaCmdchange(commid, &sendmsg);
}
}
void Buban103ScadaDatachange(int commid, RTUMSG *rtumsg)
{
// 类型标识(TYP):10
2 years ago
//rtumsg->MsgData[6];
// 可变结构限定词(VSQ):0x81
2 years ago
//rtumsg->MsgData[7];
// 传送原因(COT)
2 years ago
//rtumsg->MsgData[8];
// 应用服务数据单元公共地址
2 years ago
//rtumsg->MsgData[9];
// 功能类型(FUN): 254(0xfe)
2 years ago
//rtumsg->MsgData[10];
// 信息序号(INF):
// 读组标题 : 240
// 读一个组的全部条目的值或属性 : 241
// 读单个条目的目录 : 243
// 读单个条目的值或属性 : 244
// 对通用分类数据总查询中止 : 245
2 years ago
//rtumsg->MsgData[11];
// 返回信息标识符(RII)
2 years ago
//rtumsg->MsgData[12];
// 通用分类数据集数目
2 years ago
//rtumsg->MsgData[13];
// 以下为多个通用分类数据
// 通用分类标识序号(GIN):条目号和组号
2 years ago
//rtumsg->MsgData[14];
// 描述类别(KOD)
// 无所指定的描述类别 : KOD_NOSPECIFIED(0)
// 实际值 : KOD_ACTUALVALUE(1)
// 缺省值 : KOD_DEFAULTVALUE(2)
// 量程(最大值、最小值、步长) : KOD_RANGE(3)
// 备用 : KOD_BACKUP1(4)
// 精度(n,m) : KOD_PRECISION(5)
// 因子 : KOD_FACTOR(6)
// 参比 : KOD_REFERENCE(7)
// 列表 : KOD_ENUMERATION(8)
// 量纲 : KOD_DIMENSION(9)
// 描述 : KOD_DESCRIPTION(10)
// 备用 : KOD_BACKUP2(11)
// 口令条目 : KOD_PASSWORD(12)
// 只读 : KOD_READONLY(13)
// 只写 : KOD_WRITEONLY(14)
// 备用 : KOD_BACKUP3(15)
// 备用 : KOD_BACKUP4(16)
// 备用 : KOD_BACKUP5(17)
// 备用 : KOD_BACKUP6(18)
// 相应的功能类型和信息序号 : KOD_CORFUNCANDINF(19)
// 相应的事件 : KOD_COREVENT(20)
// 列表的文本阵列 : KOD_ENUMTEXTARRAY(21)
// 列表的值阵列 : KOD_ENUMVALUEARRAY(22)
// 相关联的条目 : KOD_RELATEDENTRIES(23)
2 years ago
//rtumsg->MsgData[16];
// 数据类型描述
2 years ago
//rtumsg->MsgData[17];
//DATAID_NO : 无数据
//DATAID_OS8ASCII : 8位ASCII
//DATAID_BSTRING : 8位2进制数
//DATAID_UIX : 无符号整数
//DATAID_INT : 整数
//DATAID_UFLOAT : 无符号浮点数
//DATAID_FLOAT : 浮点数
//DATAID_754SHORT : R32.23 IEEE 标准754短实数
//DATAID_754REAL : R64.53 IEEE 标准754实数
//DATAID_DOUBLE : 双点信息
//DATAID_SINGLE : 单点信息
//DATAID_13BITS : 带品质描述的被测值(13BITS)
//DATAID_SORTIDNO : 通用分类标识序号
//DATAID_WITHTIME : 带时标的报文
//DATAID_WITHTIMESPACE : 带相对时标的报文
//DATAID_STRUCT : 数据结构
// 数据尺寸
2 years ago
//rtumsg->MsgData[18]
// 数量
2 years ago
//rtumsg->MsgData[19]
// 数据值(长度根据以上描述)
2 years ago
// 2 ... n 个通用分类数据
2 years ago
int i, iGroupNo, iCfgGroupIdx;
DEVDEF *pDevParam;
BUBAN103LINKDEF *pLinkParam;
BUBAN103PORTPARAM *pPortParam;
DEVADDRPARAM sDevAddrParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
sDevAddrParam.m_uchLinkAddr = rtumsg->MsgData[5];
sDevAddrParam.m_uchCommAddr = rtumsg->MsgData[9];
pPortParam = (BUBAN103PORTPARAM *)SioParam[commid].ExtInfo;
if(FindProtectDev(pPortParam, &sDevAddrParam, FALSE) == FALSE)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d 不在端口配置保护范围内!!!",
2 years ago
commid, sDevAddrParam.m_uchLinkAddr, sDevAddrParam.m_uchCommAddr);
DebugPrint(szbuf);
#endif
return;
}
if(FALSE == GetSpecialPtr(commid, &sDevAddrParam, &pPortParam, &pLinkParam, &pDevParam))
{
return;
}
//组 号
2 years ago
iGroupNo = rtumsg->MsgData[14];
for(i=0; i<pDevParam->m_sDevParam.m_iCfgGroupNum; i++)
{
if(pDevParam->m_sDevParam.m_saGroupDef[i].m_iGroupNo == iGroupNo)
{
iCfgGroupIdx = i;
break;
}
}
if(i >= pDevParam->m_sDevParam.m_iCfgGroupNum)
{
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10 通用分类数据处理时Group=%d不在处理范围内!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr, iGroupNo);
DebugPrint(szbuf);
#endif
return;
}
switch(pDevParam->m_sDevParam.m_saGroupDef[iCfgGroupIdx].m_iDataType)
{
// 处理保护模拟量
2 years ago
case PROTECT_AI_PNT_TYPE:
Buban103GDprocessWithPAIToScada(rtumsg, &sDevAddrParam, iCfgGroupIdx);
break;
// 处理保护开关量
2 years ago
case PROTECT_DI_PNT_TYPE:
Buban103GDprocessWithPDIToScada(rtumsg, &sDevAddrParam, iCfgGroupIdx);
break;
// 处理保护定值
2 years ago
case PROTECT_FIX_PNT_TYPE:
Buban103GDprocessWithPFIXToScada(rtumsg, &sDevAddrParam, iCfgGroupIdx);
break;
default:
#ifdef _DEBUG_MSG_
sprintf(szbuf, "端口%d linkaddr=%d devaddr=%d ASDU10处理时, Group=%d数据类型(=%d)不匹配!!!\n",
2 years ago
commid, pLinkParam->m_uchLinkAddr, pDevParam->m_sDevParam.m_u8DevAddr,
pDevParam->m_sDevParam.m_saGroupDef[iCfgGroupIdx].m_iGroupNo,
pDevParam->m_sDevParam.m_saGroupDef[iCfgGroupIdx].m_iDataType);
DebugPrint(szbuf);
#endif
break;
}
}
void Buban103ScadaProtocolExchange(int commid, RTUMSG *rtumsg)
{
if(MSGTYPE_BAOHU_SCADACMD == rtumsg->MsgType)
{
// 下行命令
2 years ago
Buban103ScadaCmdchange(commid, rtumsg);
}
if(MSGTYPE_BAOHU_SCADADATA == rtumsg->MsgType)
{
// 上行数据
2 years ago
Buban103ScadaDatachange(commid, rtumsg);
}
}
void Buban103DispConfig(int commid, BUBAN103PORTPARAM *psPortParam)
{
int i, j;
char szDbg[256];
sprintf(szDbg, ">>>Disp Commid_%02d Config(PortType=%d):", commid, psPortParam->m_psBaoHu->PortType);
DebugPrint(szDbg);
sprintf(szDbg, ">>>LinkNum=%d", psPortParam->m_iLinkNum);
DebugPrint(szDbg);
for(i=0; i<psPortParam->m_iLinkNum; i++)
{
sprintf(szDbg, ">>>LinkIdx=%d DevNum=%d", i, psPortParam->m_psLink[i].m_iDevNum);
DebugPrint(szDbg);
if(PROTOCOL_MASTER == psPortParam->m_psBaoHu->PortType)
{
for(j=0; j<psPortParam->m_psLink[i].m_iDevNum; j++)
{
sprintf(szDbg, "###DevNo %d", j);
DebugPrint(szDbg);
sprintf(szDbg, ">>>ProvAddr=%d CfgGroupNum=%d, DevAddr=%d",
psPortParam->m_psLink[i].m_psDev[j].m_sDevParam.m_iProvAddr,
psPortParam->m_psLink[i].m_psDev[j].m_sDevParam.m_iCfgGroupNum,
psPortParam->m_psLink[i].m_psDev[j].m_sDevParam.m_u8DevAddr);
DebugPrint(szDbg);
DebugPrint((char*)"\n");
}
}
else
{
for(j=0; j<psPortParam->m_psLink[i].m_iDevNum; j++)
{
sprintf(szDbg, "###DevNo %d", j);
sprintf(szDbg, ">>>ProvAddr=%d Asdu10Num=%d, RealCommid=%d",
psPortParam->m_psLink[i].m_psProvDev[j].m_iProvAddr,
psPortParam->m_psLink[i].m_psProvDev[j].m_iAsdu10Num,
psPortParam->m_psLink[i].m_psProvDev[j].m_iRealCommid);
DebugPrint(szDbg);
DebugPrint((char*)"\n");
}
}
}
}
void Buban103DispMalloc(int commid, int iSize)
{
char szbuf[128];
return;
sprintf(szbuf, "disp: commid=%d, malloc(%d)", commid, iSize);
DebugPrint(szbuf);
}
//===========================转发数据处理结束=========================
2 years ago
//===========================数据处理函数结束=========================