📄 com_232.c
字号:
BYTE *pt,*cpAck;
pt =sBuf+3;
if((*pt++ != 4) || (*pt++ != 1))
{
Send15();
return;
}
wRptN =pt[0] + pt[1]*256;
pHead =FM_Search_Report(wRptN);
if((pHead == 0) || !FM_LOCK_FLASH())
{
Send19();
return;
}
cpAck =caAckBuf;
*cpAck++=SET_NUMBER*3+5+5;
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x45;
*cpAck++=SET_NUMBER*3+5;
*cpAck++=RELAY_TYPE_LO;
*cpAck++=RELAY_TYPE_HI;
*cpAck++=(BYTE)wRptN;
*cpAck++=(BYTE)(wRptN >> 8);
pt =(BYTE *)(FM_Align64k(pHead) + pHead->dSetAddr);
//including settings' zone.
for (i =0; i < (SET_NUMBER*3 + 1); i++)
{
*cpAck++ =*pt++;
}
FM_UNLOCK_FLASH();
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
//下传及固化逻辑定值命令的响应函数
#define RES_RECEIVE_READY 0x5A
#define RES_RECEIVE_OK 0xA5
#define RES_RECEIVE_COMPLETE 0xAA
//B5:准备发送逻辑定值
void ReplyCmdB5(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt, *cpAck;
pt =sBuf+3;
if(*pt++ != 68)
{
Send15();
}
else
{
//拷贝逻辑定值描述
memcpy(&m_logic_head.type[0], pt, 32);
pt +=32;
memcpy(&m_logic_head.code[0], pt, 32);
pt +=32;
m_logic_head.size =MAKEWORD(pt[0], pt[1]);
m_logic_head.crc =MAKEWORD(pt[2], pt[3]);
//保存逻辑定值长度
pTmpLogBuf=caTmpLogBuf;
*pTmpLogBuf++=*pt++;
*pTmpLogBuf++=*pt;
cpAck=caAckBuf;
*cpAck++=5;
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x50;
*cpAck++=0;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
//设置通讯命令状态
tCmd.wDelay=0;
tCmd.byCmd=0xB5;
tCmd.byStatus=RES_RECEIVE_READY;
}
return;
}
//B6:下传逻辑定值
void ReplyCmdB6(BYTE *sBuf,WORD wFrameCounter)
{
static WORD wTotalNum;
static BYTE byRI;
BYTE *pt,Rnum;
BYTE *cpAck;
WORD i;
//起始帧
if((tCmd.byCmd == 0xB5) && (tCmd.byStatus == RES_RECEIVE_READY))
{
pt=sBuf+4;
if(*pt != 1)
{
Send15();
return;
}
else
{
//接收长度计数器及接收返回码初始化
wTotalNum=0;
byRI=0;
}
}
pt =sBuf+3;
Rnum =*pt++;
if(*pt != (byRI+1))
{
Send15();
return;
}
byRI =*pt++;
Rnum-=1;
wTotalNum +=Rnum;
//接收数据
for(; Rnum > 0; Rnum--)
{
*pTmpLogBuf++ =*pt++;
}
cpAck=caAckBuf;
*cpAck++=6;
*cpAck++=byDst;
*cpAck++=byCpuN;
*cpAck++=0x51;
*cpAck++=1;
*cpAck++=byRI;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
//设置通讯命令状态
tCmd.wDelay=0;
tCmd.byCmd=0xB6;
pt=caTmpLogBuf;
i=(WORD)*pt++;
i+=((WORD)*pt)*256;
if(i == wTotalNum)
{
tCmd.byStatus=RES_RECEIVE_COMPLETE;
}
else
{
tCmd.byStatus=RES_RECEIVE_OK;
}
return;
}
//B7:固化逻辑定值
void ReplyCmdB7(BYTE *sBuf,WORD wFrameCounter)
{
BYTE *pt;
WORD wLen;
//校验命令长度
pt=sBuf+3;
if(*pt++ != 0)
{
tCmd.byCmd=0xB7;
tCmd.byStatus=RES_LOG_CODERR;
Send25(tCmd.byStatus);
return;
}
//校验命令序列
if((tCmd.byCmd != 0xB6) || (tCmd.byStatus != RES_RECEIVE_COMPLETE))
{
tCmd.byCmd=0xB7;
tCmd.byStatus=RES_LOG_CODERR;
Send25(tCmd.byStatus);
return;
}
else
{
tCmd.byCmd=0xB7;
}
//逻辑定值CRC校验
pt=caTmpLogBuf;
wLen = (WORD)*pt++;
wLen +=((WORD)*pt++)*256;
if ( !CrcOk( pt, wLen-2 ) )
{
tCmd.byStatus=RES_LOG_CHKFAIL;
Send25(tCmd.byStatus);
return;
}
//执行固化命令
if ( !FM_Write_Logic(caTmpLogBuf, &m_logic_head) )
{
tCmd.byStatus=RES_LOG_WRFAIL;
Send25(tCmd.byStatus);
return;
}
//重新读回再进行校验
if ( !FM_Read_Logic(caTmpLogBuf) )
{
tCmd.byStatus=RES_LOG_WRFAIL;
Send25(tCmd.byStatus);
return;
}
if( !GL_Convert_Logic_Set(caTmpLogBuf, pRunSet) || !GL_Toggle_Logic_Set() )
{
tCmd.byStatus=RES_LOG_CHKFAIL;
Send25(tCmd.byStatus);
return;
}
tCmd.byStatus=RES_LOG_WROK;
Send25(tCmd.byStatus);
return;
}
//测量值报文发送查询
#define T_MEASENDINTERVAL 10000
void SendMeasures()
{
static DWORD dwSendTime =0;
TMEAVAL tMeaSend;
BYTE *cpAck;
WORD nChannel;
DWORD dwValue;
long lAngle;
if((DWORD)(dTCounter-dwSendTime) < T_MEASENDINTERVAL)
{
return;
}
dwSendTime =dTCounter;
tMeaSend =*ptMea;
cpAck =caAckBuf;
*cpAck++=(BYTE)8*6+1+5;
*cpAck++=DESTADDR;
*cpAck++=byCpuN;
*cpAck++=0x32;
*cpAck++=(BYTE)8*6+1;
//属性值
*cpAck++=1;
for(nChannel =0; nChannel < AI_NUMBER; nChannel++)
{
switch(nChannel)
{
case SAM_IA://Ia
case SAM_IB://Ib
case SAM_IC://Ic
case SAM_UA://Ua
case SAM_UB://Ub
case SAM_UC://Uc
dwValue =_MulFac2(tMeaSend.lrms[nChannel],0x10000L,tMeaRelayTab[nChannel].dKBL);
lAngle =tMeaSend.lAng[nChannel]-tMeaSend.lAng[SAM_UA]; //以Ua的相位角作参考量
break;
default:
continue;
}
*cpAck++=(BYTE)dwValue;
*cpAck++=(BYTE)(dwValue >> 8);
*cpAck++=(BYTE)(dwValue >> 16);
*cpAck++=(BYTE)(dwValue >> 24);
while(lAngle < -(180*65536L))
{
lAngle +=(360*65536L);
}
while(lAngle > (180*65536L))
{
lAngle -=(360*65536L);
}
*cpAck++=(BYTE)lAngle;
*cpAck++=(BYTE)(lAngle >> 8);
*cpAck++=(BYTE)(lAngle >> 16);
*cpAck++=(BYTE)(lAngle >> 24);
}
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
//主动上送事件报告
void SendPolling()
{
static DWORD dPrevCounter=0;
if((DWORD)(dTCounter-dPrevCounter) < 400)
return;
else
dPrevCounter= dTCounter;
//发送SOE区的报文
if( INF_Search_Soe( & m_232SoePos )== true )
{
TSOERECORD* pSoe= INF_Get_Soe( m_232SoePos );
if( pSoe != 0 )
{
SendSoe( pSoe );
m_232SoePos= INF_Next_Soe_Index( m_232SoePos );
return;
}
}
//发送复制事件区的报文
if( INF_Search_Event_Copy( & m_232EventCopyPos )== true )
{
TEVENTRECORD* pEvent= INF_Get_Event_Copy( m_232EventCopyPos );
if( pEvent != 0 )
{
SendEventCopy( pEvent );
m_232EventCopyPos= INF_Next_Event_Copy_Index( m_232EventCopyPos );
return;
}
}
//发送事件区的报文
if (INF_Search_Event( & m_232EventPos ) == true)
{
TEVENTRECORD* pEvent= INF_Get_Event( m_232EventPos );
if (pEvent != 0)
{
if (pEvent->tEvent.wCode != EV_TIMEFLAG)
{
SendEvent( pEvent );
}
m_232EventPos =INF_Next_Event_Index(m_232EventPos);
return;
}
}
//发送告警区的报文
if( INF_Search_Alarm( & m_232AlarmPos )== true )
{
TEVENTRECORD* pAlarm= INF_Get_Alarm( m_232AlarmPos );
if( pAlarm != 0 )
{
SendAlarm( pAlarm );
m_232AlarmPos= INF_Next_Alarm_Index( m_232AlarmPos );
return;
}
}
//发送DI区的报文
if( INF_Search_Di( & m_232DiPos )== true )
{
TSOERECORD* pDi= INF_Get_Di( m_232DiPos );
if( pDi != 0 )
{
SendDi( pDi );
m_232DiPos= INF_Next_Di_Index( m_232DiPos );
return;
}
}
}
void SendSoe( TSOERECORD* pSoeRecord )
{
extern BYTE caAckBuf[];
BYTE *cpAck,byFtype=0;
WORD w;
byFtype=0; // SOE: 0 ; 开入量: 1
w=11;
cpAck=caAckBuf;
*cpAck++=(BYTE)(w+5);//Length
*cpAck++=DESTADDR; //Destinate
*cpAck++=byCpuN; //Source
*cpAck++=0x18; //TYPE
*cpAck++=(BYTE)w; //N
*cpAck++=pSoeRecord->byCot; //COT
*cpAck++=byFtype; //FTYPE(SOE/DI)
*cpAck++=RELAY_TYPE_LO; //CPUN
*cpAck++=RELAY_TYPE_HI;
*cpAck++=pSoeRecord->tSoe.tTime.byHour;
*cpAck++=pSoeRecord->tSoe.tTime.byMin;
*cpAck++=(BYTE)pSoeRecord->tSoe.tTime.wMs;
*cpAck++=(BYTE)(pSoeRecord->tSoe.tTime.wMs>>8);
*cpAck++=pSoeRecord->tSoe.byDiNo;
*cpAck++=pSoeRecord->tSoe.byDiq;
*cpAck=(BYTE) m_232SoePos;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
void SendEvent( TEVENTRECORD* pEvent )
{
extern BYTE caAckBuf[];
BYTE *cpAck,byFtype=0;
bool bPar;
WORD w;
byFtype=1;
//是否带参数
if(pEvent->tEvent.tParm.byParmType == EVTPARM_INVALID)
{
bPar=false;
w=14;
}
else
{
bPar=true;
w=23;
}
cpAck=caAckBuf;
*cpAck++=(BYTE)(w+5);//Length
*cpAck++=DESTADDR; //Destinate
*cpAck++=byCpuN; //Source
*cpAck++=0x17; //TYPE
*cpAck++=(BYTE)w; //N
*cpAck++=pEvent->byCot; //COT
*cpAck++=byFtype; //FTYPE(动作/告警)
*cpAck++=RELAY_TYPE_LO; //CPUN
*cpAck++=RELAY_TYPE_HI;
w=pEvent->tEvent.wRptNo; //Ntag
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
*cpAck++=pEvent->tEvent.byWavNo; //Ftag
*cpAck++=pEvent->tEvent.tEvtDate.byHour; //Hour
*cpAck++=pEvent->tEvent.tEvtDate.byMin; //Minute
w=pEvent->tEvent.tEvtDate.wMs; //Ms
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
w=pEvent->tEvent.wCode; //Event code
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
//Parameter
if(bPar)
{
int i;
BYTE *pt;
pt=(BYTE *)(&pEvent->tEvent.tParm);
for(i =0; i < sizeof(pEvent->tEvent.tParm); i++)
{
// 删除由字对齐产生的多余字节
if(i == 1)
{
pt++;
continue;
}
*cpAck++=*pt++;
}
}
*cpAck=(BYTE) m_232EventPos;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
void SendAlarm( TEVENTRECORD* pEvent )
{
extern BYTE caAckBuf[];
BYTE *cpAck,byFtype=0;
bool bPar;
WORD w;
byFtype=2; // 告警
//是否带参数
if(pEvent->tEvent.tParm.byParmType == EVTPARM_INVALID)
{
bPar=false;
w=14;
}
else
{
bPar=true;
w=23;
}
cpAck=caAckBuf;
*cpAck++=(BYTE)(w+5);//Length
*cpAck++=DESTADDR; //Destinate
*cpAck++=byCpuN; //Source
*cpAck++=0x17; //TYPE
*cpAck++=(BYTE)w; //N
*cpAck++=pEvent->byCot; //COT
*cpAck++=byFtype; //FTYPE(动作/告警)
*cpAck++=RELAY_TYPE_LO; //CPUN
*cpAck++=RELAY_TYPE_HI;
w=pEvent->tEvent.wRptNo; //Ntag
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
*cpAck++=pEvent->tEvent.byWavNo; //Ftag
*cpAck++=pEvent->tEvent.tEvtDate.byHour; //Hour
*cpAck++=pEvent->tEvent.tEvtDate.byMin; //Minute
w=pEvent->tEvent.tEvtDate.wMs; //Ms
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
w=pEvent->tEvent.wCode; //Event code
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
//Parameter
if(bPar)
{
int i;
BYTE *pt;
pt=(BYTE *)(&pEvent->tEvent.tParm);
for(i =0; i < sizeof(pEvent->tEvent.tParm); i++)
{
// 删除由字对齐产生的多余字节
if(i == 1)
{
pt++;
continue;
}
*cpAck++=*pt++;
}
}
*cpAck=((BYTE) m_232AlarmPos)+EVTRECORD_NUMBER;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
void SendDi( TSOERECORD* pDiRecord )
{
extern BYTE caAckBuf[];
BYTE *cpAck,byFtype=0;
WORD w;
byFtype=1; // SOE: 0 ; 开入量: 1
w=11;
cpAck=caAckBuf;
*cpAck++=(BYTE)(w+5);//Length
*cpAck++=DESTADDR; //Destinate
*cpAck++=byCpuN; //Source
*cpAck++=0x18; //TYPE
*cpAck++=(BYTE)w; //N
*cpAck++=pDiRecord->byCot; //COT
*cpAck++=byFtype; //FTYPE(SOE/DI)
*cpAck++=RELAY_TYPE_LO; //CPUN
*cpAck++=RELAY_TYPE_HI;
*cpAck++=pDiRecord->tSoe.tTime.byHour;
*cpAck++=pDiRecord->tSoe.tTime.byMin;
*cpAck++=(BYTE)pDiRecord->tSoe.tTime.wMs;
*cpAck++=(BYTE)(pDiRecord->tSoe.tTime.wMs>>8);
*cpAck++=pDiRecord->tSoe.byDiNo;
*cpAck++=pDiRecord->tSoe.byDiq;
*cpAck=(BYTE) m_232DiPos;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
void SendEventCopy( TEVENTRECORD* pEvent )
{
extern BYTE caAckBuf[];
BYTE *cpAck,byFtype=0;
bool bPar;
WORD w;
byFtype=2; // 告警
//是否带参数
if(pEvent->tEvent.tParm.byParmType == EVTPARM_INVALID)
{
bPar=false;
w=14;
}
else
{
bPar=true;
w=23;
}
cpAck=caAckBuf;
*cpAck++=(BYTE)(w+5);//Length
*cpAck++=DESTADDR; //Destinate
*cpAck++=byCpuN; //Source
*cpAck++=0x17; //TYPE
*cpAck++=(BYTE)w; //N
*cpAck++=pEvent->byCot; //COT
*cpAck++=byFtype; //FTYPE(动作/告警)
*cpAck++=RELAY_TYPE_LO; //CPUN
*cpAck++=RELAY_TYPE_HI;
w=pEvent->tEvent.wRptNo; //Ntag
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
*cpAck++=pEvent->tEvent.byWavNo; //Ftag
*cpAck++=pEvent->tEvent.tEvtDate.byHour; //Hour
*cpAck++=pEvent->tEvent.tEvtDate.byMin; //Minute
w=pEvent->tEvent.tEvtDate.wMs; //Ms
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
w=pEvent->tEvent.wCode; //Event code
*cpAck++=(BYTE)w;
*cpAck++=(BYTE)(w>>8);
//Parameter
if(bPar)
{
int i;
BYTE *pt;
pt=(BYTE *)(&pEvent->tEvent.tParm);
for(i =0; i < sizeof(pEvent->tEvent.tParm); i++)
{
// 删除由字对齐产生的多余字节
if(i == 1)
{
pt++;
continue;
}
*cpAck++=*pt++;
}
}
*cpAck=((BYTE) m_232EventCopyPos)+EVTRECORD_NUMBER+ALMRECORD_NUMBER;
MakeCs(caAckBuf);
SciPutn(caAckBuf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -