📄 msghdler.cpp
字号:
//**************************************************************************
//
// Filename : Msghdler.cpp
//
// Subsystem :
//
// Description: Protocol message handlers.
//
//**************************************************************************
/*
* NT Definitions
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "gencom.h"
#include "comiosrv.h"
#include "locmsgdef.h"
#define byte_swap(value) (((value)>>8 & 0x00ff) | ((value)<<8 & 0xff00))
VOID PollMarshall(REQUEST_MSGS* pReqMsg, CPio* pPio)
{
int msg_size = 0;
BYTE *p_buf;
/*
* If we are starting a poll, the command setup device in polled mode.
*/
p_buf = GetPioWrtBuf(pPio);
switch ( pReqMsg->FuncCode ) {
case INIT_POLL:
case INFO_POLL: // normal polling
SetRtuCmdStep(pReqMsg->pRtu, 0);
// issue: ^P0003ST1
memcpy(p_buf, POLLST1CMD, POLLREQLEN);
SetPioReadHeadCnt(pPio, POLLST1LEN);
SetPioReadCnt(pPio, POLLST1LEN);
SetPioUnPackFunc(pPio, PollUnmarshall);
break;
case RFLH_POLL: // send additional polling
if (GetRtuCmdStep(pReqMsg->pRtu) == 1) {
// issue: ^P0003ST2
memcpy(p_buf, POLLST2CMD, POLLREQLEN);
SetPioReadHeadCnt(pPio, POLLST2LEN);
SetPioReadCnt(pPio, POLLST2LEN);
SetPioUnPackFunc(pPio, PollUnmarshall);
}
else if (GetRtuCmdStep(pReqMsg->pRtu) == 2) {
// issue: ^P0003ST3
memcpy(p_buf, POLLST3CMD, POLLREQLEN);
SetPioReadHeadCnt(pPio, POLLST3LEN);
SetPioReadCnt(pPio, POLLST3LEN);
SetPioUnPackFunc(pPio, PollUnmarshall);
}
break;
default:
printf( "PollMarshall(), Unexpected Cmd: %d\n", pReqMsg->FuncCode);
break;
}
memcpy(GetPioUserDefMsg(pPio), pReqMsg, sizeof(REQUEST_MSGS) );
SetPioWriteCnt(pPio, POLLREQLEN);
SetPioWriteOffset(pPio, 0);
//
// STS commands are acknowledged
// Set this stuff for a reply!
//
// One pass read, Simple two pass, purge
SetPioComState(pPio, FALSE, FALSE, TRUE);
// write data to debug buffer if rtu in debug mode
SetPioRtuDbgOutMsg(pPio, pReqMsg->pRtu);
SetPioReadOffset(pPio, 0);
SetPioReadFixupCnt(pPio, 0);
memset((char *)GetPioReadBuf(pPio), 0, 1);
}
VOID PollUnmarshall(CPio *pPio, int ioStream)
{
BYTE *p_buf;
char *pStr, recbuf[128];
int nStep, value;
int procdi = 0, procdi1 = 0, procdi2 = 0, procdi3 = 0;
REQUEST_MSGS *sendInfo = (REQUEST_MSGS*)GetPioUserDefMsg(pPio);
p_buf = GetPioReadBuf(pPio);
if ( GetPioRecvStatus(pPio) == PIO__SUCCESS ) {
// write data to debug buffer if rtu in debug mode
SetPioRtuDbgInMsg(pPio, sendInfo->pRtu);
nStep = GetRtuCmdStep(sendInfo->pRtu);
switch (nStep) {
case 0: // battery output
SetRtuCmdStep(sendInfo->pRtu, 1);
// get data from buffer
// i.e. ^D0180,0,0,00000,,,2120
memcpy(recbuf, p_buf, POLLST1LEN);
recbuf[POLLST1LEN] = '\0';
pStr = strtok(&recbuf[7], ",");
if (pStr) {
// set battery status
// group 0, point 0, 1 for battery status
switch (atoi(pStr)) {
case 0:
procdi = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTSTSPNT, 0);
procdi1 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTSTSPNT+1, 0);
break;
case 1:
procdi = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTSTSPNT, 1);
procdi1 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTSTSPNT+1, 0);
break;
case 2:
procdi = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTSTSPNT, 0);
procdi1 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTSTSPNT+1, 1);
break;
}
pStr = strtok(&recbuf[9], ",");
if (pStr) {
// set battery charge
// group 0, point 5, 6 for battery charge
switch (atoi(pStr)) {
case 0:
procdi2 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTCHGPNT, 0);
procdi3 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTCHGPNT+1, 0);
break;
case 1:
procdi2 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTCHGPNT, 1);
procdi3 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTCHGPNT+1, 0);
break;
case 2:
procdi2 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTCHGPNT, 0);
procdi3 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTCHGPNT+1, 1);
break;
case 3:
procdi2 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTCHGPNT, 1);
procdi3 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, BATTCHGPNT+1, 1);
break;
}
}
UpdRtuPntSts(sendInfo->pRtu, procdi | procdi1 | procdi2 | procdi3);
// set battery output voltage
value = atoi(&recbuf[POLLST1LEN - 4]);
// for directly set PI value, let last param (offset) = 1
UpdRtuIntData(sendInfo->pRtu, PANORMSLOT, BATTOUTPNT, value, 1);
sendInfo->FuncCode = RFLH_POLL;
// add a high priority refresh poll
AddMorePollCmd(sendInfo, TRUE);
}
else {
SetPioRecvStatus(pPio, PIO__BAD_CHECKSUM);
}
break;
case 1: // input line
SetRtuCmdStep(sendInfo->pRtu, 2);
// get data from buffer
// i.e. ^D0090,1,,2150
memcpy(recbuf, p_buf, POLLST2LEN);
recbuf[POLLST2LEN] = '\0';
pStr = strtok(&recbuf[5], ",");
if (pStr) {
// set line input voltage
value = atoi(&recbuf[POLLST2LEN - 4]);
// for directly set PI value, let last param (offset) = 1
UpdRtuIntData(sendInfo->pRtu, PANORMSLOT, INPVOLTPNT, value, 1);
sendInfo->FuncCode = RFLH_POLL;
// add a high priority refresh poll
AddMorePollCmd(sendInfo, TRUE);
}
else {
SetPioRecvStatus(pPio, PIO__BAD_CHECKSUM);
}
break;
case 2: // output line
SetRtuCmdStep(sendInfo->pRtu, 3);
// get data from buffer
// i.e. ^D0220,500,1,2240,0020,,005
memcpy(recbuf, p_buf, POLLST3LEN);
recbuf[POLLST3LEN] = '\0';
pStr = strtok(&recbuf[5], ",");
if (pStr) {
// set battery condition
// group 0, point 2, 3, 4 for battery condition
switch (atoi(pStr)) {
case 0:
procdi = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, POWESTSPNT, 0);
procdi1 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, POWESTSPNT+1, 0);
break;
case 1:
procdi = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, POWESTSPNT, 1);
procdi1 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, POWESTSPNT+1, 0);
break;
case 2:
procdi = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, POWESTSPNT, 0);
procdi1 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, POWESTSPNT+1, 1);
break;
case 3:
procdi = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, POWESTSPNT, 1);
procdi1 = UpdRtuRawData(sendInfo->pRtu, DINORMSLOT, POWESTSPNT+1, 1);
break;
}
UpdRtuPntSts(sendInfo->pRtu, procdi | procdi1);
pStr = strtok(NULL, ",");
if (pStr) {
// set line output frequency
value = atoi(pStr);
// for directly set PI value, let last param (offset) = 1
UpdRtuIntData(sendInfo->pRtu, PANORMSLOT, OUTFREQPNT, value, 1);
}
pStr = strtok(NULL, ","); // skip line number
pStr = strtok(NULL, ",");
if (pStr) {
// set line output voltage
value = atoi(pStr);
// for directly set PI value, let last param (offset) = 1
UpdRtuIntData(sendInfo->pRtu, PANORMSLOT, OUTVOLTPNT, value, 1);
}
pStr = strtok(NULL, ",");
if (pStr) {
// set line output current
value = atoi(pStr);
// for directly set PI value, let last param (offset) = 1
UpdRtuIntData(sendInfo->pRtu, PANORMSLOT, OUTCURRPNT, value, 1);
}
// set line output load %
value = atoi(&recbuf[POLLST3LEN - 3]);
// for directly set PI value, let last param (offset) = 1
UpdRtuIntData(sendInfo->pRtu, PANORMSLOT, OUTLOADPNT, value, 1);
}
else {
SetPioRecvStatus(pPio, PIO__BAD_CHECKSUM);
}
break;
default:
printf("Unknow communication step: %d\n", nStep);
break;
}
}
// clear polling flag for next polling
ClrRtuPollSts(sendInfo->pRtu);
ClrPioRtuStream(ioStream);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -