?? iec104.cpp
字號:
/******************************************************************
* Copyright (c) 2004-2005, 許繼日立公司
* All rights reserved.
*
* 文件名稱:iec104.cpp
* 文件標識:
* 摘 要:104規約類。 主要處理104應用層信息。
*
* 當前版本:1.0
* 作 者:李龍偉 <lilongwei1@hotmail.com>
* 完成日期:2004年12月28日
*
* 取代版本:1.0
* 原作者 :李龍偉
* 完成日期:2004年12月28日
******************************************************************/
#include "iec104.h"
#include "ntdef.h"
#include "ext.h"
/*====================================================================================
*
* Subroutine : CIEC104()
*
* Parameters :
*
*
* Called from :
*
* Description : CIEC104類構造函數
*
* Return :
*
* Modification:
* 2004-11-24:
*
*====================================================================================*/
CIEC104::CIEC104(BYTE no, short rlen, short slen) : BaseRule(no,rlen,slen)
{
m_wSendCount = 0;
m_wRevCount = 0;
m_bDataSend = false; //是否連接標志
m_bFrameLen = 0;
memset(&m_bFrameBuf, 0x00, sizeof(unsigned char)*0x100);
memset(&m_bYXInfBuf, 0x00, sizeof(BYTE)*512);
memset(&m_bSector, 0x00, sizeof(BYTE)*512);
ReadYXInf104();
}
/*====================================================================================
*
* Subroutine : ~CIEC104()
*
* Parameters :
*
*
* Called from :
*
* Description : CIEC104類析構函數
*
* Return :
*
* Modification:
* 2004-11-24:
*
*====================================================================================*/
CIEC104::~CIEC104()
{
}
/*====================================================================================
*
* Subroutine : RuleLoop()
*
* Parameters :
*
*
* Called from : Rule_Data()
*
* Description : tcp103數據大循環函數
*
* Return :
*
* Modification:
* 2004-11-24:
*
*====================================================================================*/
void CIEC104::RuleLoop()
{
int nResult = 0; //返回值
int nResult1 = 0; //返回值
bool bConnect = false; //連接成功
unsigned long i_start; //收到報文判斷開始
unsigned long i_end; //結束時間
int tstop = 30;//??????
i_start = GetTickCount(); //初始化
i_end = GetTickCount(); //初始化
//延時5秒鐘,等待CDT規約連接正常
Sleep(5000);
while (1)
{
if (g_bSysStop)
{
break;
}
if (BaseConnect(CHANNEL_SOCK) == 0)
{
Sleep(10);
continue;
}
while (1)
{
Sleep(10);
nResult = BaseRead(1, 0, CHANNEL_SOCK);
if ( nResult > 0 )
{
do
{
nResult = CheckRevData();
if (nResult != 0)
{
nResult1 = TcpHeart();
if ((nResult1 == 0) && (m_bDataSend))
{
UnpackData();
}
SetNetState(GATE_CLOSE);
i_start = GetTickCount();
bConnect = true;
PackData();
}
else
{
i_end = GetTickCount();
if (((i_end-i_start) / 1000) > tstop)
{
SetNetState(GATE_UNCLOSE);
m_bDataSend = false; //連接失敗
bConnect = false;
break;
}
}
}while(m_wRevLen != 0);
if (!bConnect)
{
break;
}
}
else
{
i_end = GetTickCount();
if ((i_end-i_start) / 1000 > tstop)
{
m_bDataSend = false; //連接失敗
bConnect = false;
SetNetState(GATE_UNCLOSE);
break;
}
}
// PackData();
}
}
}
/*====================================================================================
*
* Subroutine : CheckRevData()
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 校驗收到的數據是否正確
*
* Return : 0 不正確
* !=0 正確
* Modification:
* 2004-12-03:
*
*====================================================================================*/
int CIEC104::CheckRevData(void)
{
unsigned int nLength = 0; //長度
unsigned char nResult = 0; //起始符
nLength = m_bRevBuf[1];
if ((m_bRevBuf[0] == 0x68)
|| (m_wRevLen >= (nLength+2)))
{
m_bFrameLen = nLength + 2;
memcpy(&m_bFrameBuf[0], &m_bRevBuf[0], m_bFrameLen);
memcpy(&m_bRevBuf[0], &m_bRevBuf[m_bFrameLen], m_wRevLen-m_bFrameLen);
m_wRevLen -= m_bFrameLen;
nResult = 1;
}
else
{
m_wRevLen = 0;
}
return nResult;
}
/*====================================================================================
*
* Subroutine : TcpHeart()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 控制域數據處理
*
* Return : 0 數據沒有處理完,需要應用層數據
* !0 數據已經處理完并打包
* Modification:
* 2004-12-13:
*
*====================================================================================*/
int CIEC104::TcpHeart(void)
{
int nResult = 0; //返回值
int iLength = 0; //數據長度
unsigned char bType1 = 0;//報文類型
unsigned char bType2 = 0;//報文類型
bool bStart = false; //開始標志
bool bStop = false; //結束標志
bool bTest = false; //測試標志
DATA_STR DataInfo; //數據信息格式
memset(&DataInfo, 0x00, sizeof(DATA_STR));
iLength = m_bFrameBuf[1];
bType1 = m_bFrameBuf[2] & 0x01;
m_wRevCount+=2; //最低位未使用
// m_wSendCount+=2; //最低位未使用
//固定長的報文格式
if (bType1 != 0)
{
nResult = 1;
if (m_bFrameBuf[2] && 0x04)
{
bStart = true;
}
if (m_bFrameBuf[2] && 0x10)
{
bStop = true;
}
if (m_bFrameBuf[2] && 0x40)
{
bTest = true;
}
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x04;
DataInfo.ApduHead.bControlCode2 = 0;
DataInfo.ApduHead.bControlCode3 = 0;
DataInfo.ApduHead.bControlCode4 = 0;
bType2 = m_bFrameBuf[2] & 0x02;
if ( (iLength == 4)
&& (bType2!=0x00)
&& (bStart))
{
m_bDataSend = true;
DataInfo.ApduHead.bControlCode1 = 0x0b;
m_SendList.push_back(DataInfo);
ID_State(m_iAddress, 0);////////////////??
}
else if ((iLength == 4)
&& (bType2 != 0x00)
&& (bStop))
{
m_bDataSend = false;
DataInfo.ApduHead.bControlCode1 = 0x23;
m_SendList.push_back(DataInfo);
}
else if ( (iLength == 4)
&& (bType2 != 0x00)
&& (bTest))
{
DataInfo.ApduHead.bControlCode1 = 0x83;
m_SendList.push_back(DataInfo);
}
else
{
DataInfo.ApduHead.bControlCode1 = 1;
DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;
m_SendList.push_back(DataInfo);
}
m_wSendCount+=2; //最低位未使用
}
return nResult;
}
/*====================================================================================
*
* Subroutine : UnpackData()
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 對103數據進行解包處理
*
* Return :
*
* Modification:
* 2004-12-03:
*
*====================================================================================*/
void CIEC104::UnpackData(void)
{
unsigned char bFrameType = 0; //幀類型
unsigned char bInf = 0; //信息序號
bInf = m_bFrameBuf[13];
bFrameType = m_bFrameBuf[6];
switch (bFrameType)
{
case CMDCODE_GI_104: //總召喚
GeneralInquire();
m_wSendCount += 2; //最低位未使用
break;
case CMDCODE_TIME_104: //時間同步
CalibrateTime();
m_wSendCount += 2; //最低位未使用
break;
case CMDCODE_BREAK_104: //斷路器控制
case CMDCODE_SWITCH_104: //調壓開關升降
RtuControl();
m_wSendCount += 2; //最低位未使用
break;
case CMDCODE_FREEZE_104: //電度凍結
break;
default:
GetYC();
break;
}
return;
}
/*====================================================================================
*
* Subroutine : PackData()
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 對103數據進行打包處理
*
* Return :
*
* Modification:
* 2004-12-03:
*
*====================================================================================*/
void CIEC104::PackData(void)
{
int i = 0; //一般變量
int bLength = 0;//存儲的值長度
int ret = 0; //返回值變量
unsigned char index = 0; //序號
DATA_STR DataInfo; //數據信息格式
memset(&DataInfo, 0x00, sizeof(DATA_STR));
ret = PutSendList();
if (!m_SendList.empty())
{
DataInfo = m_SendList.front();
m_SendList.pop_front();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -