⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msghdler.cpp

📁 用VC编写的设备通讯程序,里面有很多规约,自己下载
💻 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 + -