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.

3696 lines
88 KiB
C++

2 years ago
//***************************************************************
//* buban101.cpp *
//* aaawen 2005.09.08 *
//***************************************************************
//_DEBUG_MSG_,_OS_WINDOWS_DEBUG_
#ifdef OS_LINUX
#include "baohulib/commport.h"
#include "baohulib/serialport.h"
#else
#include "commport.h"
#include "udpcomm.h"
#include "display.h"
#endif
#include <math.h>
#include <time.h>
#include "buban101.h"
#include "scadaprotect.h"
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];
const char *gpStrBuban101Cmd[BUBAN101_TIMER_CMD_NUM] =
{
"<EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"<EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
};
/*!
<EFBFBD><EFBFBD>֯<EFBFBD>:<EFBFBD><EFBFBD>·(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)+װ<EFBFBD><EFBFBD>
*/
char *gpStrBuban101ConfigInfo[] =
{
" ; ***** <20><><EFBFBD><EFBFBD>101<30><31>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *****",
" ",
" ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB>",
" վ<><D5BE>ַ = 1 ; ȱʡ= 0 <20><>",
" ƽ<><C6BD>ʽͨѶ = 0 ; ȱʡ= 0 <20><>",
" <20><><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 120",
" <20>ٻ<EFBFBD><D9BB><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 300",
" <20><>ʱʱ<CAB1><CAB1> = 20.0",
" ң<>ط<EFBFBD>ʽ=0",
" ; =0<><30>˫<EFBFBD><CBAB>ң<EFBFBD><D2A3>(ȱʡ)<29><>=1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ء<EFBFBD>",
" ",
"ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ=0x701",
"ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ=0x001",
"ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ=0xC01",
"ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ=0xB01",
" ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ȱʡֵΪ97<39>沿<EFBFBD><E6B2BF>101<30><31><EFBFBD>涨ֵ",
" ",
" <20><EFBFBD><E6B1BE> = 1",
" ;=0 <20><>buban101(ȱʡֵ); =1 <20><>IEC_870_5_101<30><31>Լ",
"<><D7A2><><D7AA><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>Buban101<30><31>Լ",
" ",
"*******<2A><><EFBFBD><EFBFBD>101<30><31>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>*******",
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־(<28>м䲻<D0BC>ܺ<EFBFBD><DCBA>иÿ<D0B8><C3BF>ַ<EFBFBD><D6B7><EFBFBD>)
};
//********************************************************************
//* <20><>ȡ<EFBFBD><C8A1><EFBFBD>ú<EFBFBD><C3BA><EFBFBD> *
//*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int commid : <20>˿ں<CBBF> *
//********************************************************************
void Buban101ReadConfig(int commid)
{
int i;
char szSection[128], szbuf[128];
char szPortConfig[256];
pBUBAN101PORTPARAM 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(BUBAN101PORTPARAM));
if(!SioParam[commid].ExtInfo)
{
sprintf(szbuf, "WARN(%04d): commid_%02d ExtInfo=malloc(%d) failed.\n",
getpid(), commid, sizeof(BUBAN101PORTPARAM));
DebugPrint(szbuf);
return;
}
memset(SioParam[commid].ExtInfo, 0, sizeof(BUBAN101PORTPARAM));
pPortParam = (pBUBAN101PORTPARAM)SioParam[commid].ExtInfo;
/* ֻ<><D6BB><EFBFBD><EFBFBD>SioParam[commid].m_psBaoHu<48>ǿ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD> */
pPortParam->m_psBaoHu = SioParam[commid].m_psBaoHu;
sprintf(szSection, "Port%d", commid+1);
if(GetPrivateProString(szSection, "վ<EFBFBD><EFBFBD>ַ", "0", szbuf, 120, szPortConfig) > 0)
{
pPortParam->LinkAddr = atoi(szbuf);
}
if(GetPrivateProString(szSection, "ƽ<EFBFBD><EFBFBD>ʽͨѶ", "0", szbuf, 120, szPortConfig) > 0)
{
pPortParam->BalanceOrNot = atoi(szbuf);
}
if(GetPrivateProString(szSection, "ң<EFBFBD>ط<EFBFBD>ʽ", "0", szbuf, 120, szPortConfig) > 0)
{
pPortParam->YkMode = atoi(szbuf);
}
if(GetPrivateProString(szSection, "<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>", "20.0", szbuf, 120, szPortConfig) > 0)
{
pPortParam->lTimeOutConst = (long)(atof(szbuf)*1000/TIMER_CNT);
}
pPortParam->RtuVersion = GetPrivateProInt(szSection, "<EFBFBD><EFBFBD><EFBFBD>", 0, szPortConfig);
pPortParam->iAiBaseAddr = GetPrivateProInt(szSection, "ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ", INFO_AI_BASEADDR, szPortConfig);
pPortParam->iDiBaseAddr = GetPrivateProInt(szSection, "ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ", INFO_DI_BASEADDR, szPortConfig);
pPortParam->iPiBaseAddr = GetPrivateProInt(szSection, "ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ", INFO_PI_BASEADDR, szPortConfig);
pPortParam->iYkBaseAddr = GetPrivateProInt(szSection, "ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ", INFO_YKYT_BASEADDR, szPortConfig);
// <20><>ѯָ<D1AF><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0; i<BUBAN101_TIMER_CMD_NUM; i++)
{
GetPrivateProString(szSection, (char *)gpStrBuban101Cmd[i], "0", szbuf, 120, szPortConfig);
pPortParam->CmdTime[i].CmdTimerConst = (long)(atof(szbuf)*1000/TIMER_CNT);
if(pPortParam->CmdTime[i].CmdTimerConst > 5)
{
pPortParam->CmdTime[i].CmdTimerCnt = pPortParam->CmdTime[i].CmdTimerConst - 5;
}
}
InitBuban101CommandBuffer(commid);
}
//********************************************************************
//* <20><>ȡ<EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD> *
//*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int commid : <20>˿ں<CBBF> *
//* u_char buf : <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> *
//* int len : <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD> *
//********************************************************************
void Buban101RecvData(int commid, u_char *buf, int len)// <20><>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
{
int i;
pBUBAN101PORTPARAM pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
if(!IsExtInfoPtr(commid))
return;
pPortParam = (pBUBAN101PORTPARAM)SioParam[commid].ExtInfo;
// wen 2005.09.12 <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
if(len > 0)
{
pPortParam->LinkOkCnt = 0;
}
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_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
}
else if(buf[i] == 0x68)
{
pPortParam->m_psBaoHu->m_iRevStatus++;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
}
else if(buf[i] == 0xE5)
{
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
Buban101ProcessData(commid, pPortParam, TRUE);
//pPortParam->LinkOkCnt = 0;
pPortParam->m_psBaoHu->RevCmdFlag = 1;
#ifndef OS_LINUX
if((GetCurPort() == commid) && IsRealDataDisp())
{
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen);
}
#endif
break;
}
else
{
pPortParam->m_psBaoHu->m_iRevStatus = 5;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
}
break;
case 1:
case 2:
pPortParam->m_psBaoHu->m_iRevStatus++;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
break;
case 3:// <20><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>
if(buf[i] == 0x68)
{
if(pPortParam->m_au8RecvBuf[1] != pPortParam->m_au8RecvBuf[2])
{
pPortParam->m_psBaoHu->m_iRevStatus=1;
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
Buban101ProcessData(commid, pPortParam, FALSE);
pPortParam->m_iRecvLen = 0;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
}
else
{
pPortParam->m_psBaoHu->m_iRevStatus++;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_psBaoHu->m_iNeedRevLength = (BYTE)(pPortParam->m_au8RecvBuf[1])+2;
}
}
else
{
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_psBaoHu->m_iRevStatus=5;
}
break;
case 4:// <20><>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pPortParam->m_psBaoHu->m_iNeedRevLength--;
pPortParam->m_au8RecvBuf[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(Buban101Check(pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen) == TRUE)
{
Buban101ProcessData(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_au8RecvBuf, pPortParam->m_iRecvLen);
}
#endif
//pPortParam->LinkOkCnt = 0;
break;
case 5:// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
default:
//if(buf[i] == 0x16)
if(buf[i] == 0x10)
{
#ifndef OS_LINUX
// wen 2004.11.22 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
if((GetCurPort() == commid) && IsRealDataDisp())
{
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen);
}
#endif
Buban101ProcessData(commid, pPortParam, FALSE);
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
pPortParam->m_psBaoHu->m_iRevStatus = 4;
pPortParam->m_psBaoHu->m_iNeedRevLength = 4;
pPortParam->m_iRecvLen = 1;
pPortParam->m_au8RecvBuf[0] = buf[i];
}
else if(buf[i] == 0x68)
{
#ifndef OS_LINUX
// wen 2004.11.22 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
if((GetCurPort() == commid) && IsRealDataDisp())
{
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen);
}
#endif
Buban101ProcessData(commid, pPortParam, FALSE);
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
pPortParam->m_psBaoHu->m_iRevStatus = 1;
pPortParam->m_iRecvLen = 1;
pPortParam->m_au8RecvBuf[0] = buf[i];
}
else if((buf[i] == 0x16) || (buf[i] == 0xE5))
{
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
#ifndef OS_LINUX
// wen 2004.11.22 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
if((GetCurPort() == commid) && IsRealDataDisp())
{
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen);
}
#endif
Buban101ProcessData(commid, pPortParam, FALSE);
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
pPortParam->m_psBaoHu->m_iRevStatus = 0;
pPortParam->m_iRecvLen = 0;
}
else
{
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(pPortParam->m_iRecvLen > 200)
{
#ifndef OS_LINUX
// wen 2004.11.22 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
if((GetCurPort() == commid) && IsRealDataDisp())
{
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen);
}
#endif
Buban101ProcessData(commid, pPortParam, FALSE);
SioParam[commid].ErrMsgNum += pPortParam->m_iRecvLen;
pPortParam->m_iRecvLen = 0;
}
}
//pPortParam->LinkOkCnt = 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
}
//********************************************************************
//* <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *
//*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int commid : <20>˿ں<CBBF> *
//********************************************************************
void Buban101Timer(int commid)
{
BUBAN101PORTPARAM *pPortParam;
if(IsExtInfoPtr(commid) == FALSE)
{
return;
}
pPortParam = (pBUBAN101PORTPARAM)SioParam[commid].ExtInfo;
// <20><><EFBFBD><EFBFBD>Ϊת<CEAA><D7AA><EFBFBD>˿ڣ<CBBF><DAA3>򲻽<EFBFBD><F2B2BBBD><EFBFBD><EFBFBD><EFBFBD>ѯָ<D1AF><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD>
if(PROTOCOL_SLAVE != pPortParam->m_psBaoHu->PortType)
{
if(pPortParam->LinkOk)
{
pPortParam->LinkOkCnt++;
if(pPortParam->LinkOkCnt >= pPortParam->lTimeOutConst)
{
InitBuban101CommandBuffer(commid);
return;
}
}
Buban101FindNextCmd(commid);
}
Buban101SendCmdFormPollCmdBuf(commid);
}
//********************************************************************
//* ң<><D2A3>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *
//*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int commid : <20>˿ں<CBBF> *
//* u_char buf : <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> *
//* int len : <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD> *
//********************************************************************
void Buban101YkYtProcess(int commid, u_char *buf, int len) // ң<><D2A3>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
int portno, ykytpnt;
int iDirect;
// buf[0] --- <20>˿ں<CBBF>(=commid)
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- <20>ص<EFBFBD><D8B5><EFBFBD>
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D2A3>:1=ѡ<><D1A1>,2=ִ<><D6B4>,3=ȡ<><C8A1>,7=ֱ<><D6B1>;
// ң<><D2A3>:4=ѡ<><D1A1>,5=ִ<><D6B4>,6=ȡ<><C8A1>,8=<3D><>ͣ)
// buf[9] --- <20><><EFBFBD><EFBFBD>״̬(1=<3D>ֵ<EFBFBD><D6B5>ϣ<EFBFBD>2=<3D>ϵ<EFBFBD><CFB5><EFBFBD>)
// (<28><><EFBFBD><EFBFBD>λΪ1ʱ<31><CAB1>Ϊ<EFBFBD><CEAA>У<EFBFBD><D0A3><EFBFBD><EFBFBD>, 1=<3D>غ<EFBFBD>, 2=<3D>ط<EFBFBD>, 3=ʧ<><CAA7>)
// <20><>ת<EFBFBD><D7AA>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>У<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫת<D2AA><D7AA><EFBFBD>Ŀص<C4BF><D8B5>ţ<EFBFBD>ʵ<EFBFBD>ʵĶ˿ں<CBBF>Ӧ<EFBFBD><D3A6><EFBFBD>Ǹ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>Ķ˿<C4B6>
// <20><>ת<EFBFBD><D7AA><EFBFBD>㲢û<E3B2A2><C3BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ص㣬<D8B5><E3A3AC><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>һ<EFBFBD>¡<EFBFBD>
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;
// <20><>У<EFBFBD><D0A3>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>)
if(iDirect)
{
Buban101ProvMakeYkYtCommand(commid, buf, len);
}
else
{
MakeBuBan101YkYtCommand(commid, buf, len);
}
}
//********************************************************************
//* ϵͳ<CFB5>·<EFBFBD><C2B7><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> *
//*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int commid : <20>˿ں<CBBF> *
//********************************************************************
void Buban101SendSystemTime(int commid) // ϵͳ<CFB5><CDB3>ʱ
{
BUBAN101PORTPARAM *pPortParam;
if(IsExtInfoPtr(commid) == FALSE)
{
return;
}
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(2 != pPortParam->m_psBaoHu->CheckTime)
{
return;
}
if(pPortParam->Initdata)
{
if(PROTOCOL_SLAVE != pPortParam->m_psBaoHu->PortType)
{
MakeBuban101Command(commid, RTU_TIME);
}
}
}
//********************************************************************
//* ϵͳ<CFB5>˳<EFBFBD>ʱ<EFBFBD><CAB1>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *
//*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int commid : <20>˿ں<CBBF> *
//********************************************************************
void Buban101Exit(int commid)
{
// <20>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
}
// <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>˿<EFBFBD><CBBF>·<EFBFBD><C2B7><EFBFBD>ʵ<EFBFBD><CAB5>װ<EFBFBD>õı<C3B5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Buban101BaoHuCmdProcess(int commid, RTUMSG *rtumsg, BOOL bUpData)
{
}
int Buban101GetBaohuDataBase(int commid, int iProvAddr, GROUPDEF **ppBaoHuDB)
{
return 0;
}
/////////////////////////ͨ<>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>ӿڽ<D3BF><DABD><EFBFBD>///////////////////////////////
/////////////////////////buban101<30><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>///////////////////////////
// У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
BOOL Buban101Check(u_char* msg, int len)
{
BOOL bRetval = FALSE;
int iCheckLen;
if( len == 1 )
{
if( msg[0] == 0xE5 )
bRetval = TRUE;
}
else
{
switch( msg[0] )
{
case 0x10: // <20><>֡
if ( msg[4] != 0x16 )
break;
if ( CalBuban101Lpc( &msg[1], 2 ) != msg[3] )
break;
bRetval = TRUE;
break;
case 0x68: // <20><>֡
if ( msg[0] != msg[3] )
break;
if ( msg[len-1] != 0x16 )
break;
if ( msg[1] != msg[2] )
break;
iCheckLen = msg[1];
if ( CalBuban101Lpc( &msg[4], iCheckLen ) != msg[len-2] )
break;
bRetval = TRUE;
break;
default:
break;
}
}
return bRetval;
}
//<2F><><EFBFBD><EFBFBD> Buban101 <20>ۼӺͼ<D3BA><CDBC><EFBFBD><EFBFBD><EFBFBD>
u_char CalBuban101Lpc(u_char* msg, int len)
{
int i;
u_char retval = 0;
for (i = 0 ; i < len; i++)
retval += msg[i];
return retval;
}
//ָ<><EFBFBD><EEBBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
void InitBuban101CommandBuffer(int commid)
{
pBUBAN101PORTPARAM pPortParam;
pPortParam = (pBUBAN101PORTPARAM)SioParam[commid].ExtInfo;
pPortParam->LinkOk = false;
pPortParam->RstLinkOk = false;
pPortParam->Initdata = false;
pPortParam->CtlByte = 0;
pPortParam->CurCmdIdx = 0;
pPortParam->LinkOkCnt = 0;
ClearAllCmdFromPollCmdBuf(commid);
}
/////////////////////////buban101<30><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڽ<D3BF><DABD><EFBFBD>///////////////////////
void Buban101ProvMakeYkYtCommand(int commid, u_char *buf, int len)
{
// buf[0] --- <20>˿ں<CBBF>(=commid)
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- <20>ص<EFBFBD><D8B5><EFBFBD>
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D2A3>:1=ѡ<><D1A1>,2=ִ<><D6B4>,3=ȡ<><C8A1>,7=ֱ<><D6B1>;
// ң<><D2A3>:4=ѡ<><D1A1>,5=ִ<><D6B4>,6=ȡ<><C8A1>,8=<3D><>ͣ)
// buf[9] --- <20><><EFBFBD><EFBFBD>״̬(1=<3D>ֵ<EFBFBD><D6B5>ϣ<EFBFBD>2=<3D>ϵ<EFBFBD><CFB5><EFBFBD>)
// (<28><><EFBFBD><EFBFBD>λΪ1ʱ<31><CAB1>Ϊ<EFBFBD><CEAA>У<EFBFBD><D0A3><EFBFBD><EFBFBD>, 1=<3D>غ<EFBFBD>, 2=<3D>ط<EFBFBD>, 3=ʧ<><CAA7>)
// <20><>ת<EFBFBD><D7AA>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>У<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫת<D2AA><D7AA><EFBFBD>Ŀص<C4BF><D8B5>ţ<EFBFBD>ʵ<EFBFBD>ʵĶ˿ں<CBBF>Ӧ<EFBFBD><D3A6><EFBFBD>Ǹ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>Ķ˿<C4B6>
// <20><>ת<EFBFBD><D7AA><EFBFBD>㲢û<E3B2A2><C3BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ص㣬<D8B5><E3A3AC><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>һ<EFBFBD>¡<EFBFBD>
int ykpoint;
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
static int iYkStatus = 0;
BUBAN101PORTPARAM *pPortParam;
if(IsExtInfoPtr(commid) == FALSE)
{
return;
}
if((buf[9] & 0x80) == 0)
{
return;
}
pPortParam = (pBUBAN101PORTPARAM)SioParam[commid].ExtInfo;
memset( (char*)commandbuf, 0x00, MAX_POLLCMD_BUF_LEN );
ykpoint = buf[4]+buf[5]*256+buf[6]*65536+buf[7]*16777216;
ykpoint += pPortParam->iYkBaseAddr - 1;
switch(buf[8])
{
case 1:
case 4: // ѡ<><D1A1>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
switch(pPortParam->YkMode)
{
case CONTROL_SINGAL: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(VER_IEC870_5_101 != pPortParam->RtuVersion)
commandbuf[6] = 46;
else
commandbuf[6] = 45;
break;
case CONTROL_DOUBLE: // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case CONTROL_DIRECT: // ֱ<>ӿ<EFBFBD><D3BF><EFBFBD>
commandbuf[6] = 46;//(rtumsg->MsgData[3] == 1) ? 46 : 47;
break;
}
commandbuf[7] = 1;
if((buf[9] & 0x03) == 0x03)
{
commandbuf[8] = 0x47;
}
else
{
commandbuf[8] = 7;
}
commandbuf[9] = pPortParam->LinkAddr;
// wen 2002.11.18 <20>ֽ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>޸<EFBFBD>
commandbuf[10] = (char)(ykpoint & 0x00ff);
commandbuf[11] = (char)((ykpoint & 0xff00)>>8);
if(commandbuf[8] == 0x07)
{
if((buf[9] & 0x01) == 1)
{
if( commandbuf[6] != 45)
{
commandbuf[12] = 0xfc + 2;
iYkStatus = 2;
}
else
{
commandbuf[12] = 0xfc + 1;
iYkStatus = 1;
}
}
else
{
if( commandbuf[6] != 45 )
{
commandbuf[12] = 0xfc + 1;
iYkStatus = 1;
}
else
{
commandbuf[12] = 0xfc;
iYkStatus = 0;
}
}
}
commandbuf[13] = CalBuban101Lpc(&commandbuf[4], 9);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, (char *)commandbuf, 15);
break;
case 2:
case 5: // ִ<><D6B4>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
switch(pPortParam->YkMode )
{
case CONTROL_SINGAL: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(VER_IEC870_5_101 != pPortParam->RtuVersion)
commandbuf[6] = 46;
else
commandbuf[6] = 45;
break;
case CONTROL_DOUBLE: // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case CONTROL_DIRECT: // ֱ<>ӿ<EFBFBD><D3BF><EFBFBD>
commandbuf[6] = 46;//(rtumsg->MsgData[3] == 1) ? 46 : 47;
break;
}
commandbuf[7] = 1;
if(buf[9] & 0x01)
{
commandbuf[8] = 7;
}
else
{
commandbuf[8] = 0x47;
}
commandbuf[9] = pPortParam->LinkAddr;
// wen 2002.11.18 <20>ֽ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>޸<EFBFBD>
//*(WORD*)&commandbuf[10] = ykpoint;
commandbuf[10] = (char)(ykpoint & 0x00ff);
commandbuf[11] = (char)((ykpoint & 0xff00)>>8);
commandbuf[12] = (char)(0x7c + iYkStatus);
commandbuf[13] = CalBuban101Lpc(&commandbuf[4], 9);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, (char *)commandbuf, 15);
break;
case 3:
case 6:
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
switch(pPortParam->YkMode)
{
case CONTROL_SINGAL: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(VER_IEC870_5_101 != pPortParam->RtuVersion)
commandbuf[6] = 46;
else
commandbuf[6] = 45;
break;
case CONTROL_DOUBLE: // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case CONTROL_DIRECT: // ֱ<>ӿ<EFBFBD><D3BF><EFBFBD>
commandbuf[6] = 46;//(rtumsg->MsgData[3] == 1) ? 46 : 47;
break;
}
commandbuf[7] = 1;
if(buf[9] & 0x01)
{
commandbuf[8] = 9;
}
else
{
commandbuf[8] = 0x49;
}
commandbuf[9] = pPortParam->LinkAddr;
// wen 2002.11.18 <20>ֽ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>޸<EFBFBD>
//*(WORD*)&commandbuf[10] = ykpoint;
commandbuf[10] = (char)(ykpoint & 0x00ff);
commandbuf[11] = (char)((ykpoint & 0xff00)>>8);
commandbuf[12] = (char)(0xfc + iYkStatus);
commandbuf[13] = CalBuban101Lpc(&commandbuf[4], 9);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, (char *)commandbuf, 15);
break;
}
if(ShmGetDispYkYtFlag())
{
printf("TIP_(%04d): commid =%d ykytpnt=%d, op=%d checked.\n",
getpid(), commid, ykpoint, (buf[9] & 0x7F));
}
}
//===========================<3D><><EFBFBD><EFBFBD>Ϊָ<CEAA><D6B8><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>=======================
/*!
\brief Ѱ<EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
\param u_32 portno : RTU<EFBFBD>˿ں<EFBFBD>
\param i_32 iBuIdx : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void MakeBuban101Command(u_32 commid, u_char cmdidx)
{
int i;
DAY_TIME sCurTime;
char commandbuf[MAX_POLLCMD_BUF_LEN];
BUBAN101PORTPARAM *pPortParam;
memset( commandbuf, 0, sizeof( commandbuf ) );
pPortParam = (pBUBAN101PORTPARAM)SioParam[commid].ExtInfo;
switch ( cmdidx )
{
case ASK_LINK: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·
commandbuf[0] = 0x10;
commandbuf[1] = 0x49;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, commandbuf, 5);
break;
case RST_LINK: // <20><>λ<EFBFBD><CEBB>·
commandbuf[0] = 0x10;
commandbuf[1] = 0x40;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, commandbuf, 5);
break;
case RTU_TIME: // ʱ<><CAB1>ͬ<EFBFBD><CDAC>
GetLocalTimeEx(&sCurTime);
commandbuf[0] = 0x68;
commandbuf[1] = 15;
commandbuf[2] = 15;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 103;
commandbuf[7] = 1;
commandbuf[8] = 6;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
sCurTime.mSec = sCurTime.Sec * 1000 + sCurTime.mSec;
commandbuf[12] = sCurTime.mSec % 256;
commandbuf[13] = sCurTime.mSec / 256;
commandbuf[14] = (u_char)sCurTime.Min;
commandbuf[15] = (u_char)sCurTime.Hour;
commandbuf[16] = (u_char)sCurTime.Day;
commandbuf[17] = (u_char)sCurTime.Month;
commandbuf[18] = (u_char)(sCurTime.Year%100);
commandbuf[20] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, commandbuf, 21);
break;
case ASK_DI_DATA: // <20>ٻ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>YX
for ( i = 0; i < (pPortParam->m_psBaoHu->DiNum+MAX_GROUP_DINUM-1)/MAX_GROUP_DINUM; i++)
{
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x5b;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 100;
commandbuf[7] = 0;
commandbuf[8] = 5;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
commandbuf[12] = 21 + i;
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, commandbuf, 15);
}
break;
case ASK_AI_DATA: // <20>ٻ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>YC
for ( i = 0; i < (pPortParam->m_psBaoHu->AiNum+MAX_GROUP_AINUM-1)/MAX_GROUP_AINUM; i++)
{
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x5b;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 100;
commandbuf[7] = 0;
commandbuf[8] = 5;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
commandbuf[12] = 29 + i;
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, commandbuf, 15);
}
break;
case ASK_PI_DATA: // <20>ٻ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>YM
for ( i = 0; i < (pPortParam->m_psBaoHu->PiNum+MAX_GROUP_PINUM-1)/MAX_GROUP_PINUM; i++)
{
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x5b;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 101;
commandbuf[7] = 0;
commandbuf[8] = 6;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
if(VER_IEC870_5_101 == pPortParam->RtuVersion)
commandbuf[12] = 1 + i;
else
commandbuf[12] = 2 + i;
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, commandbuf, 15);
}
break;
case ASK_PI: //<2F>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 101;
commandbuf[7] = 1;
commandbuf[8] = 6;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
if(VER_IEC870_5_101 == pPortParam->RtuVersion)
commandbuf[12] = 0x45;
else
commandbuf[12] = 0x41;
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, commandbuf, 15);
pPortParam->Initdata = FALSE;
break;
case ASK_ALL_DATA:// <20>ٻ<EFBFBD><D9BB><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 100;
commandbuf[7] = 1;
commandbuf[8] = 6;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
commandbuf[12] = 20;
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, commandbuf, 15);
pPortParam->Initdata = FALSE;
break;
case ASK_SECOND_DATA:// <20>ٻ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
commandbuf[0] = 0x10;
commandbuf[1] = 0x5b;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, NORMAL_POLL_CMD, 0, commandbuf, 5);
break;
case ASK_FIRST_DATA: // <20>ٻ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
commandbuf[0] = 0x10;
commandbuf[1] = 0x5a;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, commandbuf, 5);
break;
case ACK: //ȷ<>ϻش<CFBB>
commandbuf[0] = 0x10;
commandbuf[1] = 0x00;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, commandbuf, 5);
break;
case ANS_LINK:
commandbuf[0] = 0x10;
commandbuf[1] = 0x0b;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, commandbuf, 5);
break;
}
}
//<2F><><EFBFBD><EFBFBD>ң<EFBFBD><D2A3>ң<EFBFBD><D2A3>ָ<EFBFBD><D6B8>
void MakeBuBan101YkYtCommand( u_32 commid, u_char *buf, int len )
{
// buf[0] --- <20>˿ں<CBBF>(=commid)
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- <20>ص<EFBFBD><D8B5><EFBFBD>
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D2A3>:1=ѡ<><D1A1>,2=ִ<><D6B4>,3=ȡ<><C8A1>,7=ֱ<><D6B1>;
// ң<><D2A3>:4=ѡ<><D1A1>,5=ִ<><D6B4>,6=ȡ<><C8A1>,8=<3D><>ͣ)
// buf[9] --- <20><><EFBFBD><EFBFBD>״̬(1=<3D>ֵ<EFBFBD><D6B5>ϣ<EFBFBD>2=<3D>ϵ<EFBFBD><CFB5><EFBFBD>)
// (<28><><EFBFBD><EFBFBD>λΪ1ʱ<31><CAB1>Ϊ<EFBFBD><CEAA>У<EFBFBD><D0A3><EFBFBD><EFBFBD>, 1=<3D>ɹ<EFBFBD>, 0=ʧ<><CAA7>)
// <20><>ת<EFBFBD><D7AA>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>У<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫת<D2AA><D7AA><EFBFBD>Ŀص<C4BF><D8B5>ţ<EFBFBD>ʵ<EFBFBD>ʵĶ˿ں<CBBF>Ӧ<EFBFBD><D3A6><EFBFBD>Ǹ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>Ķ˿<C4B6>
// <20><>ת<EFBFBD><D7AA><EFBFBD>㲢û<E3B2A2><C3BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ص㣬<D8B5><E3A3AC><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>һ<EFBFBD>¡<EFBFBD>
int ykpoint;
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
static int iYkStatus = 0;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (pBUBAN101PORTPARAM)SioParam[commid].ExtInfo;
memset( (char*)commandbuf, 0x00, MAX_POLLCMD_BUF_LEN );
ykpoint = buf[4]+buf[5]*256+buf[6]*65536+buf[7]*16777216;
ykpoint += pPortParam->iYkBaseAddr - 1;
switch(buf[8])
{
case 1:
case 4: // ѡ<><D1A1>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
switch(pPortParam->YkMode)
{
case CONTROL_SINGAL: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(VER_IEC870_5_101 != pPortParam->RtuVersion)
commandbuf[6] = 46;
else
commandbuf[6] = 45;
break;
case CONTROL_DOUBLE: // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case CONTROL_DIRECT: // ֱ<>ӿ<EFBFBD><D3BF><EFBFBD>
commandbuf[6] = 46;//(rtumsg->MsgData[3] == 1) ? 46 : 47;
break;
}
commandbuf[7] = 1;
commandbuf[8] = 6;
commandbuf[9] = pPortParam->LinkAddr;
// wen 2002.11.18 <20>ֽ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>޸<EFBFBD>
commandbuf[10] = (char)(ykpoint & 0x00ff);
commandbuf[11] = (char)((ykpoint & 0xff00)>>8);
if(buf[9] == 1)
{
if( commandbuf[6] != 45 )
{
commandbuf[12] = 0xfc + 2;
iYkStatus = 2;
}
else
{
commandbuf[12] = 0xfc + 1;
iYkStatus = 1;
}
}
else
{
if( commandbuf[6] != 45 )
{
commandbuf[12] = 0xfc + 1;
iYkStatus = 1;
}
else
{
commandbuf[12] = 0xfc;
iYkStatus = 0;
}
}
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, (char *)commandbuf, 15);
break;
case 2:
case 5: // ִ<><D6B4>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
switch(pPortParam->YkMode )
{
case CONTROL_SINGAL: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(VER_IEC870_5_101 != pPortParam->RtuVersion)
commandbuf[6] = 46;
else
commandbuf[6] = 45;
break;
case CONTROL_DOUBLE: // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case CONTROL_DIRECT: // ֱ<>ӿ<EFBFBD><D3BF><EFBFBD>
commandbuf[6] = 46;//(rtumsg->MsgData[3] == 1) ? 46 : 47;
break;
}
commandbuf[7] = 1;
commandbuf[8] = 6;
commandbuf[9] = pPortParam->LinkAddr;
// wen 2002.11.18 <20>ֽ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>޸<EFBFBD>
//*(WORD*)&commandbuf[10] = ykpoint;
commandbuf[10] = (char)(ykpoint & 0x00ff);
commandbuf[11] = (char)((ykpoint & 0xff00)>>8);
commandbuf[12] = (char)(0x7c + iYkStatus);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, (char *)commandbuf, 15);
break;
case 3:
case 6:
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
switch(pPortParam->YkMode)
{
case CONTROL_SINGAL: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(VER_IEC870_5_101 != pPortParam->RtuVersion)
commandbuf[6] = 46;
else
commandbuf[6] = 45;
break;
case CONTROL_DOUBLE: // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case CONTROL_DIRECT: // ֱ<>ӿ<EFBFBD><D3BF><EFBFBD>
commandbuf[6] = 46;//(rtumsg->MsgData[3] == 1) ? 46 : 47;
break;
}
commandbuf[7] = 1;
commandbuf[8] = 8;
commandbuf[9] = pPortParam->LinkAddr;
// wen 2002.11.18 <20>ֽ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>޸<EFBFBD>
//*(WORD*)&commandbuf[10] = ykpoint;
commandbuf[10] = (char)(ykpoint & 0x00ff);
commandbuf[11] = (char)((ykpoint & 0xff00)>>8);
commandbuf[12] = (char)(0xfc + iYkStatus);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, INSERT_POLL_CMD, 0, (char *)commandbuf, 15);
break;
}
if(ShmGetDispYkYtFlag())
{
printf("TIP_(%04d): commid =%d ykytpnt=%d, op=%d checked.\n",
getpid(), commid, ykpoint, (buf[9] & 0x7F));
}
}
//===================<3D><><EFBFBD><EFBFBD>ΪPOLLING<4E><47>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><E6BAAF><EFBFBD>ӿ<EFBFBD>======================
/*!
\brief Ѱ<EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
\param u_32 portno : RTU<EFBFBD>˿ں<EFBFBD>
\param i_32 iBuIdx : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Buban101FindNextCmd(int commid)
{
int i, iCurCmdIdx;
BUBAN101PORTPARAM *pPortParam;
int framename[BUBAN101_TIMER_CMD_NUM] =
{
// ASK_DI_DATA,
// ASK_AI_DATA,
// ASK_PI_DATA,
ASK_PI,
ASK_ALL_DATA
};
if((commid < 0) || (commid >= GetMaxPort()))
{
return;
}
if(!ShmGetPortFlag(commid, FLAG_OPEN))
{
return;
}
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(!pPortParam->LinkOk)
{
if(CheckPollCmdBufEmpty(commid) <= 0)
{
return;
}
if(!pPortParam->RstLinkOk)
{
InitBuban101CommandBuffer(commid);
MakeBuban101Command(commid, ASK_LINK);
}
else
{
pPortParam->LinkOkCnt++;
if(pPortParam->LinkOkCnt >= pPortParam->lTimeOutConst)
{
pPortParam->LinkOkCnt = 0;
pPortParam->RstLinkOk = false;
}
}
return;
}
for(i = 0; i < BUBAN101_TIMER_CMD_NUM; i++)
{
if(pPortParam->CmdTime[i].CmdTimerConst )
pPortParam->CmdTime[i].CmdTimerCnt++;
}
if(CheckPollCmdBufEmpty(commid) <= 0)
{
return;
}
if (!pPortParam->Initdata )
{
// IEC-870-5-101<30>ж<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ
//<2F><>Ҵ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IEC101Ҫ<31><D2AA><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><D9BB>ڼ䲻<DABC><E4B2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//if(VER_IEC870_5_101 == pPortParam->RtuVersion)
// MakeBuban101Command( port, ASK_SECOND_DATA );
return;
}
iCurCmdIdx = pPortParam->CurCmdIdx;
for ( i = 0; i < BUBAN101_TIMER_CMD_NUM; i++ )
{
iCurCmdIdx = (iCurCmdIdx+1) % BUBAN101_TIMER_CMD_NUM;
if ( (pPortParam->CmdTime[iCurCmdIdx].CmdTimerCnt
>= pPortParam->CmdTime[iCurCmdIdx].CmdTimerConst)
&& ( pPortParam->CmdTime[iCurCmdIdx].CmdTimerConst > 0 ))
{
pPortParam->CurCmdIdx = iCurCmdIdx;
MakeBuban101Command(commid, framename[iCurCmdIdx]);
pPortParam->CmdTime[iCurCmdIdx].CmdTimerCnt = 0;
return;
}
}
MakeBuban101Command(commid, ASK_SECOND_DATA);
}
BOOL Buban101FindNextCmdEx(int commid)
{
BOOL bRetVal;
int i, iCurCmdIdx;
BUBAN101PORTPARAM *pPortParam;
int framename[BUBAN101_TIMER_CMD_NUM] =
{
// ASK_DI_DATA,
// ASK_AI_DATA,
// ASK_PI_DATA,
ASK_PI,
ASK_ALL_DATA
};
bRetVal = FALSE;
if((commid < 0) || (commid >= GetMaxPort()))
{
return bRetVal;
}
if(!ShmGetPortFlag(commid, FLAG_OPEN))
{
return bRetVal;
}
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(!pPortParam->LinkOk)
{
if(CheckPollCmdBufEmpty(commid) <= 0)
{
return bRetVal;
}
if(!pPortParam->RstLinkOk)
{
InitBuban101CommandBuffer(commid);
MakeBuban101Command(commid, ASK_LINK);
bRetVal = TRUE;
}
else
{
pPortParam->LinkOkCnt++;
if(pPortParam->LinkOkCnt >= pPortParam->lTimeOutConst)
{
pPortParam->LinkOkCnt = 0;
pPortParam->RstLinkOk = false;
}
}
return bRetVal;
}
for(i = 0; i < BUBAN101_TIMER_CMD_NUM; i++)
{
if(pPortParam->CmdTime[i].CmdTimerConst )
pPortParam->CmdTime[i].CmdTimerCnt++;
}
if(CheckPollCmdBufEmpty(commid) <= 0)
{
return bRetVal;
}
if (!pPortParam->Initdata )
{
// IEC-870-5-101<30>ж<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ
//<2F><>Ҵ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IEC101Ҫ<31><D2AA><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><D9BB>ڼ䲻<DABC><E4B2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//if(VER_IEC870_5_101 == pPortParam->RtuVersion)
// MakeBuban101Command( port, ASK_SECOND_DATA );
return bRetVal;
}
iCurCmdIdx = pPortParam->CurCmdIdx;
for ( i = 0; i < BUBAN101_TIMER_CMD_NUM; i++ )
{
iCurCmdIdx = (iCurCmdIdx+1) % BUBAN101_TIMER_CMD_NUM;
if ( (pPortParam->CmdTime[iCurCmdIdx].CmdTimerCnt
>= pPortParam->CmdTime[iCurCmdIdx].CmdTimerConst)
&& ( pPortParam->CmdTime[iCurCmdIdx].CmdTimerConst > 0 ))
{
pPortParam->CurCmdIdx = iCurCmdIdx;
MakeBuban101Command(commid, framename[iCurCmdIdx]);
pPortParam->CmdTime[iCurCmdIdx].CmdTimerCnt = 0;
bRetVal = TRUE;
}
}
if(FALSE == bRetVal)
{
MakeBuban101Command(commid, ASK_SECOND_DATA);
bRetVal = TRUE;
}
return bRetVal;
}
void Buban101SendCmdFormPollCmdBuf(int commid)
{
BYTE fcb = 0x20;
BYTE buf[MAX_MSG_BUF_SIZE];
i_32 len;
BUBAN101PORTPARAM *pPortParam;
if((commid < 0) || (commid >= GetMaxPort()))
{
return;
}
if(!ShmGetPortFlag(commid, FLAG_OPEN))
{
return;
}
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(pPortParam->m_psBaoHu->ForceWaitFlag
&& pPortParam->m_psBaoHu->ForceWaitCnt)
{
pPortParam->m_psBaoHu->ForceWaitCnt--;
if(pPortParam->m_psBaoHu->ForceWaitCnt == 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
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)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
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)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
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, sizeof(buf));
}
else
{
len = GetCmdFormPollCmdBuf(commid, buf, sizeof(buf));
}
if(len < 3)
{
return;
}
#ifndef OS_LINUX
if(isUdpSocketExist() == TRUE)
#endif
{
switch(buf[2])
{
case 0x10:
if(PROTOCOL_SLAVE == pPortParam->m_psBaoHu->PortType)
break;
if((buf[3] & 0x40) == 0)
{
buf[5] = CalBuban101Lpc(&buf[3], 2);
break;
}
if(pPortParam->m_psBaoHu->ReSendCmdFlag)
{
pPortParam->CtlByte = ~pPortParam->CtlByte;
}
buf[3] |= ( fcb & pPortParam->CtlByte );
pPortParam->CtlByte = ~pPortParam->CtlByte;
buf[5] = CalBuban101Lpc(&buf[3], 2);
break;
case 0x68:
if(PROTOCOL_SLAVE == pPortParam->m_psBaoHu->PortType)
break;
if(pPortParam->m_psBaoHu->ReSendCmdFlag)
{
pPortParam->CtlByte = ~pPortParam->CtlByte;
}
buf[6] |= ( fcb & pPortParam->CtlByte );
pPortParam->CtlByte = ~pPortParam->CtlByte;
buf[buf[3]+6] = CalBuban101Lpc(&buf[6], buf[3]);
break;
default:
break;
}
SendDataToPort(commid, (char *)&buf[2], len-2);
pPortParam->m_psBaoHu->SendCmdFlag = 1;
pPortParam->m_psBaoHu->ReSendCmdFlag = 0;
pPortParam->m_psBaoHu->RevCmdFlag = 0;
pPortParam->m_psBaoHu->RetryTimeCnt = 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); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
//ClearCmdAllFlag(commid); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
}
}
}
//===========================ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=========================
//===========================<3D><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=======================
void Buban101ProcessData(u_32 commid, BUBAN101PORTPARAM *psPortParam, BOOL bProcess)
{
RTUMSG msg;
BUBAN101PORTPARAM *pPortParam;
pPortParam = psPortParam;
if(TRUE == bProcess)
{
msg.PortIdx = (BYTE)commid;
msg.MsgLen = psPortParam->m_iRecvLen;
memcpy(msg.MsgData, psPortParam->m_au8RecvBuf, msg.MsgLen);
msg.MsgData[msg.MsgLen] = CHECK_WHOLE;
msg.MsgData[msg.MsgLen+1] = 0;
// <20><>վ<EFBFBD><D5BE><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
if(PROTOCOL_SLAVE == pPortParam->m_psBaoHu->PortType)
{
ProvBuban101dataProcess(commid, &msg);
return;
}
// <20><>վ<EFBFBD><D5BE><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
switch(msg.MsgData[0])
{
case 0x68:
Buban101longprocess(&msg);
break;
case 0x10:
Buban101shortprocess(&msg);
break;
case 0xE5:
Buban101NoChanged(&msg);
break;
default:
break;
}
}
}
void Buban101NoChanged(RTUMSG * rtumsg)
{
}
//***************************************************************
//* <09><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>̶<EFBFBD>֡<EFBFBD><D6A1>ʱ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//*<2A><><EFBFBD><EFBFBD> RTUMSG* rtumsg:<3A><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//***************************************************************
void Buban101shortprocess(RTUMSG *rtumsg)
{
int framecnt = 0;
int commid;
BOOL bMakeAllDataFlag;
BUBAN101PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
// wen 2003.08.11 <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD>ո<EFBFBD><D5B8><EFBFBD><EFBFBD><EFBFBD>ʱ
bMakeAllDataFlag = pPortParam->LinkOk & pPortParam->RstLinkOk;
if((rtumsg->MsgData[1] & 0xc0) == 0xc0)
{
switch(rtumsg->MsgData[1] & 0x0f)
{
case 0x0: //<2F><>λ<EFBFBD><CEBB>·ȷ<C2B7><C8B7>0000
if(!pPortParam->RstLinkOk)
{
MakeBuban101Command(commid, ASK_LINK);
break;
}
else
{
pPortParam->LinkOk = TRUE;
}
if(pPortParam->LinkOk && pPortParam->RstLinkOk)
{
if(!bMakeAllDataFlag)
{
MakeBuban101Command(commid, ASK_ALL_DATA);
}
}
pPortParam->CtlByte = 0xff;
MakeBuban101Command(commid, ACK);
pPortParam->RstLinkOk = TRUE;
break;
case 0x09: //<2F><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>վ
if(bMakeAllDataFlag)
{
InitBuban101CommandBuffer(commid);
}
MakeBuban101Command(commid, ANS_LINK);
break;
default:
break;
}
return;
}
//<2F><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>
if(rtumsg->MsgData[1] & 0x10)
{
;
}
else
{
// wen 2004.03.16 <20>޸<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻҪ<D6BB><D2AA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD>ѯ
//if( bMakeAllDataFlag )
//{
// //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// if ( (rtumsg->MsgData[1] & 0x20) && pPortParam->Initdata )
// MakeBuban101Command ( port, ASK_FIRST_DATA);
//}
if(rtumsg->MsgData[1] & 0x20)
{
MakeBuban101Command(commid, ASK_FIRST_DATA);
}
}
switch(rtumsg->MsgData[1] & 0x0f)
{
case 0x0: //<2F><>λ<EFBFBD><CEBB>·ȷ<C2B7><C8B7>0000
if(pPortParam->RstLinkOk)
{
pPortParam->LinkOk = TRUE;
}
else
{
if(pPortParam->BalanceOrNot == 0)
{
pPortParam->LinkOk = TRUE;
pPortParam->RstLinkOk = TRUE;
}
}
if(pPortParam->LinkOk && pPortParam->RstLinkOk)
{
if(!bMakeAllDataFlag)
{
MakeBuban101Command(commid, ASK_ALL_DATA);
}
}
pPortParam->RstLinkOk = TRUE;
pPortParam->CtlByte = 0xff;
break;
case 0xb: //<2F><>·<EFBFBD><C2B7><EFBFBD><EFBFBD>1011
MakeBuban101Command(commid, RST_LINK);
break;
case 0x09:
pPortParam->Initdata = TRUE;
break;
default:
break;
}
}
//***************************************************************
//* <09><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ɱ<EFBFBD>֡<EFBFBD><D6A1>ʱ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//*<2A><><EFBFBD><EFBFBD> RTUMSG* rtumsg:<3A><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//***************************************************************
void Buban101longprocess(RTUMSG *rtumsg)
{
int commid;
BUBAN101PORTPARAM *pPortParam;
#ifdef _DEBUG_MSG_
char szbuf[256];
#endif
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if ((rtumsg->MsgData[4] & 0xc0) != 0xc0)
{
//<2F><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>
if( rtumsg->MsgData[4] & 0x10)
{
;
}
else
{
// wen 2004.03.16 <20>޸<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻҪ<D6BB><D2AA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD>ѯ
////<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//if( rtumsg->MsgData[4] & 0x20 && pPortParam->Initdata)
// MakeBuban101Command (rtumsg->PortNumber, ASK_FIRST_DATA);
if(rtumsg->MsgData[4] & 0x20)
{
MakeBuban101Command(commid, ASK_FIRST_DATA);
}
}
}
switch (rtumsg->MsgData[6])
{
case 1: // <20><><EFBFBD><EFBFBD>ң<EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>
Buban101DiDataProcess( rtumsg, 0 );
break;
case 2: // <20><><EFBFBD><EFBFBD>ң<EFBFBD><D2A3>SOE<4F><45><EFBFBD><EFBFBD>
Buban101SoeDataProcess( rtumsg, 0 );
break;
case 3: // ˫<><CBAB>ң<EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>
Buban101DiDataProcess( rtumsg, 1 );
break;
case 4: // ˫<><CBAB>ң<EFBFBD><D2A3>SOE<4F><45><EFBFBD><EFBFBD>
Buban101SoeDataProcess( rtumsg, 1 );
break;
case 5: // <20><>ѹ<EFBFBD><D1B9><EFBFBD>ֽ<EFBFBD>ͷλ<CDB7><CEBB>
break;
case 6: // <20><>ѹ<EFBFBD><D1B9><EFBFBD>ֽ<EFBFBD>ͷλ<CDB7>ô<EFBFBD>ʱ<EFBFBD><CAB1>
break;
case 7: // <20><>վԶ<D5BE><D4B6><EFBFBD>ն<EFBFBD>״̬
break;
case 9: // <20><>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ң<EFBFBD><D2A3>
Buban101AiWithPzDataProcess( rtumsg, 0 );
break;
case 10: // <20><>Ʒ<EFBFBD>ʴ<EFBFBD>ʱ<EFBFBD><CAB1>ң<EFBFBD><D2A3>
Buban101AiWithPzDataProcess( rtumsg, 1 );
break;
case 20: // <20><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>ң<EFBFBD>ű<EFBFBD>λ֡
Buban101AutoSendDiProcess( rtumsg );
break;
case 21: // ȫң<C8AB><D2A3><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD> <20><><EFBFBD><EFBFBD><E4BBAF><EFBFBD><EFBFBD>
Buban101AllAiDataProcess( rtumsg );
break;
case 15: // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Buban101PiDataProcess( rtumsg );
break;
case 16: // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Buban101PiWithTimeDataProcess( rtumsg );
break;
case 17: // <20>̵籣<CCB5><E7B1A3>װ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>¼<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>¼֡
case 18: // <20>̵籣<CCB5><E7B1A3>װ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>˳<EFBFBD><CBB3>
case 19: // <20>̵籣<CCB5><E7B1A3>װ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>¼<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>¼
Buban101BaoHuDataProcess( rtumsg );
break;
// wen 2004.05.27 <20><><EFBFBD><EFBFBD>101<30><31>Լ<EFBFBD>޸ĵ<DEB8>(???)
case 30: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>Ϣ M_SP_TB_1
Buban101SoeDataProcessWithCP56Time2a( rtumsg, 0 );
break;
case 31: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD>Ϣ M_DP_TB_1
Buban101SoeDataProcessWithCP56Time2a( rtumsg, 1 );
break;
case 32: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD>IJ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ M_ST_TB_1
break;
case 33: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD><EFBFBD>32<33><32><EFBFBD>ش<EFBFBD> M_BO_TB_1
break;
case 34: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ֵ, <20><>һ<EFBFBD><D2BB>ֵ M_ME_TD_1
Buban101AiWithDataProcessWithM_ME_TD_1( rtumsg );
break;
case 35: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ֵ, <20><><EFBFBD>Ȼ<EFBFBD>ֵ M_ME_TE_1
Buban101AiWithDataProcessWithM_ME_TE_1( rtumsg );
break;
case 36: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ֵ, <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> M_ME_TF_1
Buban101AiWithDataProcessWithM_ME_TF_1( rtumsg );
break;
case 37: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD><DBBC><EFBFBD> M_IT_TB_1
Buban101PiWithTimeDataProcessWithM_IT_TB_1( rtumsg );
break;
case 38: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD>ļ̵籣<CCB5><E7B1A3>װ<EFBFBD><D7B0><EFBFBD>¼<EFBFBD> M_EP_TD_1
break;
case 39: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD>ļ̵籣<CCB5><E7B1A3>װ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD> M_EP_TE_1
break;
case 40: // <20><>CP56Time2aʱ<61><CAB1><EFBFBD>ļ̵籣<CCB5><E7B1A3>װ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>ϢM_EP_TF_1
break;
case 45:
case 46: // ң<>ط<EFBFBD>У
case 47: // ң<><D2A3><EFBFBD><EFBFBD>У
Buban101YkYtAck( rtumsg );
break;
case 48: // <20>趨ȷ<E8B6A8><C8B7>
Buban101SetAck( rtumsg );
break;
case 100: // <20><><EFBFBD>ٻ<EFBFBD>ȷ<EFBFBD><C8B7>
Buban101InitdataProecss( rtumsg );
break;
case 101: // <20><><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD>֡
Buban101PidataEnd( rtumsg );
break;
case 103: // ʱ<><CAB1>ͬ<EFBFBD><CDAC>ȷ<EFBFBD><C8B7>֡
Buban101SynTime( rtumsg );
break;
default:
#ifdef _DEBUG_MSG_
DebugPrint("<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n");
#endif
break;
}
}
/* Buban101 <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD> */
void Buban101InitdataProecss(RTUMSG * rtumsg)
{
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
switch(rtumsg->MsgData[8])
{
case 7:
case 9://<2F><><EFBFBD>ٻ<EFBFBD>ȷ<EFBFBD><C8B7>
break;
case 10://<2F><><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>
pPortParam->Initdata = TRUE;
break;
}
}
/* <20><><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD>֡ */
void Buban101PidataEnd(RTUMSG * rtumsg)
{
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(rtumsg->MsgData[8] & 0x40)
{
pPortParam->Initdata = TRUE;
return;
}
switch(rtumsg->MsgData[8])
{
case 7://<2F><><EFBFBD>ٻ<EFBFBD>ȷ<EFBFBD><C8B7>
break;
case 10://<2F><><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>
pPortParam->Initdata = TRUE;
break;
}
}
//<2F>趨ȷ<E8B6A8><C8B7>
void Buban101SetAck( RTUMSG *rtumsg)
{
}
//Buban101 ң<><D2A3>ң<EFBFBD><D2A3><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
void Buban101YkYtAck(RTUMSG * rtumsg)
{
int commid;
YKYT_PARAM YkYtParam;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
YkYtParam.m_iYkYtPnt = (rtumsg->MsgData[11]<<8) + rtumsg->MsgData[10];
YkYtParam.m_iYkYtPnt -= pPortParam->iYkBaseAddr;
YkYtParam.m_iYkYtPnt %= 256;
if(rtumsg->MsgData[12] & 0x80) //ѡ<><D1A1><EFBFBD><EFBFBD>У
{
YkYtParam.m_iYkYtStep = STEP_YKYT_SELECT;
//<2F><>λΪ<CEBB>϶<EFBFBD><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>λ
if(rtumsg->MsgData[8] & 0x40)
{
YkYtParam.m_iYkYtOperate = 3;
}
else if(rtumsg->MsgData[8] == 0x07)
{
if(rtumsg->MsgData[6] != 45)
{
switch(rtumsg->MsgData[12] & 0x03)
{
case 1://<2F>ط<EFBFBD>
if(pPortParam->m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate == 2)
{
YkYtParam.m_iYkYtOperate = pPortParam->m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate;
}
else
{
YkYtParam.m_iYkYtOperate = 3;
}
break;
case 2://<2F>غ<EFBFBD>
if(pPortParam->m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate == 1)
{
YkYtParam.m_iYkYtOperate = pPortParam->m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate;
}
else
{
YkYtParam.m_iYkYtOperate = 3;
}
break;
default:
YkYtParam.m_iYkYtOperate = 3;
break;
}
}
else
{
// <20>غ<EFBFBD>
if( rtumsg->MsgData[12] & 0x01 )
{
if(pPortParam->m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate == 1)
{
YkYtParam.m_iYkYtOperate = pPortParam->m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate;
}
else
{
YkYtParam.m_iYkYtOperate = 3;
}
}
// <20>ط<EFBFBD>
else
{
if(pPortParam->m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate == 2)
{
YkYtParam.m_iYkYtOperate = pPortParam->m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate;
}
else
{
YkYtParam.m_iYkYtOperate = 3;
}
}
}
}
YkYtParam.m_iYkYtUpDown = YKYT_SEND_UP;
SendYkYtCommand2(commid, &YkYtParam);
}
else //ִ<>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><>λΪ<CEBB>϶<EFBFBD><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>λ
if( ( rtumsg->MsgData[8] & 0x40 ) == 0 )
{
switch( rtumsg->MsgData[8] )
{
case 0x07://ִ<><D6B4>ȷ<EFBFBD><C8B7>
break;
case 0x0a://ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
default:
break;
}
}
}
}
/* Buban101 <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> */
void Buban101SynTime(RTUMSG * rtumsg)
{
int commid;
DAY_TIME stime;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(1 != pPortParam->m_psBaoHu->CheckTime)
{
return;
}
if(rtumsg->MsgData[8] != 0x07)
return;
stime.mSec = (rtumsg->MsgData[13]<<8) + rtumsg->MsgData[12];
stime.Sec = stime.mSec / 1000;
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;
SetLocalTimeEx(&stime);
}
/* <20><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ű<EFBFBD>λ֡ */
void Buban101AutoSendDiProcess(RTUMSG *rtumsg)
{
int i, j, dipnt, len;
DI_DEF pntmsg;
WORD wStatus, wStatusBit;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
//<2F><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20>仯ң<E4BBAF><D2A3>
//if( ( rtumsg->MsgData[8] & 0x0f ) == 0x03 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ̱<D3BC><CCB1><EFBFBD>ʹ<EFBFBD>øñ<C3B8><C3B1><EFBFBD>(<28><>ʾ<EFBFBD><CABE>20<32><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>20)Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˽<EFBFBD><CBBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1>jessie in 2003.04.15
//{
// wen 2002.09.06 ң<><D2A3>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//len -= 6;
//for ( i = 10; i < 10 + len; i += 7 )
for ( i = 10; i < 4 + len; i += 7 )
{
dipnt = rtumsg->MsgData[i+1];
dipnt = rtumsg->MsgData[i] + (dipnt<<8) - pPortParam->iDiBaseAddr;
wStatus = rtumsg->MsgData[i+3];
wStatus = (wStatus<<8) + rtumsg->MsgData[i+2];
wStatusBit = rtumsg->MsgData[i+5];
wStatusBit = (wStatusBit<<8) + rtumsg->MsgData[i+4];
for( j = 0; j < 16; j++ )
{
//<2F><>Ҵ<EFBFBD>ı<C4B1><E4BBAF><EFBFBD><EFBFBD>״̬Ϊ0<CEAA><30><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> jessie in 2004.19
//if( wStatusBit & (0x0001 << j) )
//{
if( wStatus & (0x0001 << j) )
pntmsg.Status = 1;
else
pntmsg.Status = 0;
SetPntMsg(commid, dipnt+j, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
//}
}
}
// wen 2005.09.28 <20>޸Ķ<DEB8><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ȷ<EFBFBD><C8B7>Ӧ<EFBFBD><D3A6>
// MakeBuban101Command(commid, ACK);
if(pPortParam->BalanceOrNot)
{
if((rtumsg->MsgData[4] & 0xc0) == 0xc0)
{
MakeBuban101Command(commid, ACK);
}
}
//}
}
// Buban101 <20><>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
void Buban101AiWithPzDataProcess(RTUMSG * rtumsg, int flag)
{
int i, aipnt, len;
AI_DEF pntmsg;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
//<2F><><EFBFBD><EFBFBD><EFBFBD>仯ң<E4BBAF><D2A3>
if((rtumsg->MsgData[7] & 0x80)==0)
{
for ( i = 10; i < 4 + len; i += 5 )
{
aipnt = rtumsg->MsgData[i+1];
aipnt = (aipnt<<8) + rtumsg->MsgData[i] - pPortParam->iAiBaseAddr;
pntmsg.RawValue = rtumsg->MsgData[i+3];
pntmsg.RawValue = (pntmsg.RawValue<<8) + rtumsg->MsgData[i+2];
// Ʒ<><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// rtumsg->MsgData[i+4];
SetPntMsg(commid, aipnt, (void *)&pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
// ʱ<><CAB1>
if(flag)
{
i += 3;
}
}
}
else// <20><><EFBFBD><EFBFBD>ң<EFBFBD><D2A3>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
{
aipnt = rtumsg->MsgData[11];
aipnt = (aipnt<<8) + rtumsg->MsgData[10] - pPortParam->iAiBaseAddr;
if( len < 0 )
return;
for ( i = 12; i < len + 4; i+= 3 )
{
pntmsg.RawValue = rtumsg->MsgData[i+1];
pntmsg.RawValue = (pntmsg.RawValue<<8) + rtumsg->MsgData[i];
SetPntMsg(commid, aipnt, (void *)&pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
aipnt++;
// Ʒ<><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// rtumsg->MsgData[i+2];
// ʱ<><CAB1>
if ( flag )
i += 3;
}
}
}
void Buban101AllAiDataProcess(RTUMSG *rtumsg)
{
int i, aipnt, len;
AI_DEF pntmsg;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
aipnt = 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD>仯ң<E4BBAF><D2A3>
if((rtumsg->MsgData[7] & 0x80)==0)
{
for ( i = 10; i < len + 4; i+= 4 )
{
aipnt = rtumsg->MsgData[i+1];
aipnt = (aipnt<<8) + rtumsg->MsgData[i] - pPortParam->iAiBaseAddr;
pntmsg.RawValue = rtumsg->MsgData[i+3];
pntmsg.RawValue = (pntmsg.RawValue<<8) + rtumsg->MsgData[i+2];
SetPntMsg(commid, aipnt, (void *)&pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
}
return;
}
//<2F><><EFBFBD><EFBFBD>ȫң<C8AB><D2A3>
aipnt = rtumsg->MsgData[11];
aipnt = (aipnt<<8) + rtumsg->MsgData[10] - pPortParam->iAiBaseAddr;
if(len < 0)
{
return;
}
for ( i = 12; i < len + 4; i+= 2 )
{
pntmsg.RawValue = rtumsg->MsgData[i+1];
pntmsg.RawValue = (pntmsg.RawValue<<8) + rtumsg->MsgData[i];
SetPntMsg(commid, aipnt, (void *)&pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
aipnt++;
}
}
void Buban101DiDataProcess(RTUMSG *rtumsg, int flag)
{
int i, dipnt, len;
DI_DEF pntmsg;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
//<2F><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20>仯ң<E4BBAF><D2A3>
if( ( rtumsg->MsgData[8] & 0x0f ) == 0x03 )
{
for ( i = 10; i < 4 + len; i += 3 )
{
dipnt = rtumsg->MsgData[i+1];
dipnt = (dipnt<<8) + rtumsg->MsgData[i] - pPortParam->iDiBaseAddr;
if ( flag == 0 )
pntmsg.Status = rtumsg->MsgData[i+2] & 0x1;
else
{
switch ( rtumsg->MsgData[i+2] & 0x3 )
{
case 1:
pntmsg.Status = 1;
break;
case 2:
pntmsg.Status = 0;
break;
default:
pntmsg.Status = 0xff;
break;
}
}
if ( pntmsg.Status != 0xff )
{
SetPntMsg(commid, dipnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
}
// wen 2005.09.28 <20>޸Ķ<DEB8><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ȷ<EFBFBD><C8B7>Ӧ<EFBFBD><D3A6>
if(pPortParam->BalanceOrNot)
{
if((rtumsg->MsgData[4] & 0xc0) == 0xc0)
{
MakeBuban101Command(commid, ACK);
}
}
return;
}
if(rtumsg->MsgData[7] & 0x80)
{
dipnt = rtumsg->MsgData[11];
dipnt = (dipnt<<8) + rtumsg->MsgData[10] - pPortParam->iDiBaseAddr;
for ( i = 12; i < 4 + len; i++,dipnt++ )
{
if ( flag == 0 )
pntmsg.Status = rtumsg->MsgData[i] & 0x1;
else
{
switch ( rtumsg->MsgData[i] & 0x3 )
{
case 1:
pntmsg.Status = 1;
break;
case 2:
pntmsg.Status = 0;
break;
default:
pntmsg.Status = 0xff;
break;
}
}
if(pntmsg.Status != 0xff)
{
SetPntMsg(commid, dipnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
}
}
else
{
for ( i = 10; i < 4 + len; i += 3 )
{
dipnt = rtumsg->MsgData[i+1];
dipnt = (dipnt<<8) + rtumsg->MsgData[i] - pPortParam->iDiBaseAddr;
if ( flag == 0 )
pntmsg.Status = rtumsg->MsgData[i+2] & 0x1;
else
{
switch ( rtumsg->MsgData[i+2] & 0x3 )
{
case 1:
pntmsg.Status = 1;
break;
case 2:
pntmsg.Status = 0;
break;
default:
pntmsg.Status = 0xff;
break;
}
}
if(pntmsg.Status != 0xff)
{
SetPntMsg(commid, dipnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_STATUS);
}
}
}
}
void Buban101SoeDataProcess(RTUMSG *rtumsg, int flag)
{
_int64 i64Millseconds;
time_t iTime;
int i, pnt, len;
char st;
int sec;
DI_DEF pntmsg;
DAY_TIME sm;
struct tm *testtm;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
for ( i = 10; i < len + 4; i += 6 )
{
pnt = rtumsg->MsgData[i+1];
pnt = (pnt<<8) + rtumsg->MsgData[i] - pPortParam->iDiBaseAddr;
if ( flag == 0 )
st = rtumsg->MsgData[i+2] & 0x01;
else
{
switch ( rtumsg->MsgData[i+2] & 0x3 )
{
case 1:
st = 1;
break;
case 2:
st = 0;
break;
default:
st = 0x0f;
break;
}
}
if ( st == 0x0f )
continue;
sec = rtumsg->MsgData[i+3] + ( rtumsg->MsgData[i+4] << 8 );
pntmsg.SoeTime.mSec = sec % 1000;
pntmsg.SoeTime.Sec = sec / 1000;
pntmsg.SoeTime.Min = (rtumsg->MsgData[i+5] & 0x3f); // <20><>
GetLocalTimeEx(&sm);
if(abs(pntmsg.SoeTime.Min-sm.Min) > 50)
{
i64Millseconds = SystemTimeToMillseconds(&sm, 0);
if(i64Millseconds > 0)
{
// <20><>ȥһСʱ
iTime = (long)(i64Millseconds/1000) - 3600;
testtm = localtime(&iTime);
sm.Year = testtm->tm_year + 1900;
sm.Month = testtm->tm_mon + 1;
sm.Day = testtm->tm_mday;
sm.Hour = testtm->tm_hour;
sm.Min = testtm->tm_min;
sm.Sec = testtm->tm_sec;
}
}
pntmsg.SoeTime.Hour = sm.Hour;
pntmsg.SoeTime.Day = sm.Day;
pntmsg.SoeTime.Month = sm.Month;
pntmsg.SoeTime.Year = sm.Year;
pntmsg.Status = st;
SetPntMsg(commid, pnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_SOE_TIME);
}
}
void Buban101PiDataProcess( RTUMSG * rtumsg )
{
int i, point, len;
PI_DEF pntmsg;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
for(i = 10; i < 4 + len; i += 7)
{
point = rtumsg->MsgData[i+1];
point = (point<<8) + rtumsg->MsgData[i] - pPortParam->iPiBaseAddr;
pntmsg.RawValue = (rtumsg->MsgData[i+5]<<24) + (rtumsg->MsgData[i+4]<<16)
+ (rtumsg->MsgData[i+3]<<8) + rtumsg->MsgData[i+2];
SetPntMsg(commid, point, (void *)&pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
}
}
void Buban101PiWithTimeDataProcess( RTUMSG *rtumsg )
{
int i, point, len;
PI_DEF pntmsg;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
for ( i = 10; i < 4 + len; i += 10 )
{
point = rtumsg->MsgData[i+1];
point = (point<<8) + rtumsg->MsgData[i] - pPortParam->iPiBaseAddr;
pntmsg.RawValue = (rtumsg->MsgData[i+5]<<24) + (rtumsg->MsgData[i+4]<<16)
+ (rtumsg->MsgData[i+3]<<8) + rtumsg->MsgData[i+2];
SetPntMsg(commid, point, (void *)&pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
}
}
void Buban101BaoHuDataProcess( RTUMSG *rtumsg )
{
// <20>ù<EFBFBD><C3B9>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void Buban101DefaultBaoHuDataProcess( RTUMSG *rtumsg )
{
// <20>ù<EFBFBD><C3B9>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 7 BYTE <20><>ʱ<EFBFBD><CAB1>
//***************************************************************
//* Buban101 SOE <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>(7 bytes ʱ<><CAB1>) *
//***************************************************************
void Buban101SoeDataProcessWithCP56Time2a( RTUMSG *rtumsg, int flag )
{
_int64 i64Millseconds;
time_t iTime;
int i, pnt, len;
char st;
int sec;
DI_DEF pntmsg;
DAY_TIME sm;
struct tm *testtm;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
for ( i = 10; i < len + 4; i += 9 )
{
pnt = rtumsg->MsgData[i+1];
pnt = (pnt<<8) + rtumsg->MsgData[i] - pPortParam->iDiBaseAddr;
if(flag == 0)
{
st = rtumsg->MsgData[i+2] & 0x01;
}
else
{
switch ( rtumsg->MsgData[i+2] & 0x3 )
{
case 1:
st = 1;
break;
case 2:
st = 0;
break;
default:
st = 0x0f;
break;
}
}
if(st == 0x0f)
{
continue;
}
sec = rtumsg->MsgData[i+3] + (rtumsg->MsgData[i+4] << 8);
pntmsg.SoeTime.mSec = sec % 1000;
pntmsg.SoeTime.Sec = sec / 1000;
pntmsg.SoeTime.Min = (char)(rtumsg->MsgData[i+5] & 0x3f);
pntmsg.SoeTime.Hour = (char)(rtumsg->MsgData[i+6] & 0x1f);
pntmsg.SoeTime.Day = (char)(rtumsg->MsgData[i+7] & 0x1f);
GetLocalTimeEx(&sm);
if((pntmsg.SoeTime.Day-sm.Day) < 0)
{
i64Millseconds = SystemTimeToMillseconds(&sm, 0);
if(i64Millseconds > 0)
{
// <20><>ȥһСʱ
iTime = (long)(i64Millseconds/1000) - 3600;
testtm = localtime(&iTime);
sm.Year = testtm->tm_year + 1900;
sm.Month = testtm->tm_mon + 1;
sm.Day = testtm->tm_mday;
sm.Hour = testtm->tm_hour;
sm.Min = testtm->tm_min;
sm.Sec = testtm->tm_sec;
}
}
pntmsg.SoeTime.Month = sm.Month;
pntmsg.SoeTime.Year = sm.Year;
pntmsg.Status = st;
SetPntMsg(commid, pnt, (void *)&pntmsg, DI_PNT_TYPE, PNT_SOE_TIME);
}
}
void Buban101AiWithDataProcessWithM_ME_TD_1(RTUMSG * rtumsg)
{
int i, aipnt, len;
AI_DEF pntmsg;
char szbuf[256];
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
//<2F><><EFBFBD><EFBFBD><EFBFBD>仯ң<E4BBAF><D2A3>
for(i = 10; i < 4 + len; i += 12)
{
if( ( i + 12 ) > (4 + len))
{
sprintf(szbuf, ">>>>>WARN(%04d): Commid_%02d (iLen=%d) is not enough in Buban101AiWithDataProcessWithM_ME_TD_1",
getpid(), commid, len);
DebugPrint(szbuf);
break;
}
aipnt = rtumsg->MsgData[i+1];
aipnt = (aipnt<<8) + rtumsg->MsgData[i] - pPortParam->iAiBaseAddr;
pntmsg.RawValue = rtumsg->MsgData[i+3];
pntmsg.RawValue = (pntmsg.RawValue<<8) + rtumsg->MsgData[i+2];
SetPntMsg(commid, aipnt, (void *)&pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
// 7<>ֽ<EFBFBD>ʱ<EFBFBD><CAB1>
}
}
void Buban101AiWithDataProcessWithM_ME_TE_1(RTUMSG * rtumsg)
{
Buban101AiWithDataProcessWithM_ME_TD_1(rtumsg);
}
void Buban101AiWithDataProcessWithM_ME_TF_1(RTUMSG * rtumsg)
{
int i, aipnt, len;
AI_DEF pntmsg;
char szbuf[256];
float fValue;
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
//<2F><><EFBFBD><EFBFBD><EFBFBD>仯ң<E4BBAF><D2A3>
for ( i = 10; i < 4 + len; i += 14 )
{
if( ( i + 14 ) > (4 + len))
{
sprintf(szbuf, ">>>>>WARN(%04d): Commid_%02d (iLen=%d) is not enough in Buban101AiWithDataProcessWithM_ME_TF_1",
getpid(), commid, len);
DebugPrint(szbuf);
break;
}
aipnt = rtumsg->MsgData[i+1];
aipnt = (aipnt<<8) + rtumsg->MsgData[i] - pPortParam->iAiBaseAddr;
fValue = *((float *)&rtumsg->MsgData[i+2]);
SequenceRtuToHost((char *)&fValue, sizeof(float));
// Ʒ<><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// rtumsg->MsgData[i+6];
// <20><><EFBFBD><EFBFBD>С<CEBB><D0A1>
pntmsg.RawValue = (int)(fValue * 100);
SetPntMsg(commid, aipnt, (void *)&pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
// 7<>ֽ<EFBFBD>ʱ<EFBFBD><CAB1>
}
}
//Buban101 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>with time
void Buban101PiWithTimeDataProcessWithM_IT_TB_1(RTUMSG *rtumsg)
{
int i, point, len;
AI_DEF pntmsg;
char szbuf[256];
int commid;
BUBAN101PORTPARAM *pPortParam;
commid = rtumsg->PortIdx;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
len = (int)rtumsg->MsgData[1];
for(i = 10; i < 4 + len; i += 14)
{
if( ( i + 14 ) > (4 + len))
{
sprintf(szbuf, ">>>>>WARN(%04d): Commid_%02d (iLen=%d) is not enough in Buban101PiWithTimeDataProcessWithM_IT_TB_1",
getpid(), commid, len);
DebugPrint(szbuf);
break;
}
point = rtumsg->MsgData[i+1];
point = (point<<8) + rtumsg->MsgData[i] - pPortParam->iPiBaseAddr;
pntmsg.RawValue = (rtumsg->MsgData[i+5]<<24) + (rtumsg->MsgData[i+4]<<16)
+ (rtumsg->MsgData[i+3]<<8) + rtumsg->MsgData[i+2];
SetPntMsg(commid, point, (void *)&pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
// 1 BYTE (IV CA CY ˳<><CBB3><EFBFBD><EFBFBD>)
// 7 BYTE ʱ<><CAB1>
}
}
//=========================<3D><><EFBFBD><EFBFBD>ΪBuban101ת<31><D7AA><EFBFBD><EFBFBD><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD>=======================//
void ProvBuban101dataProcess(int commid, RTUMSG *rtumsg)
{
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>( <20><><EFBFBD><EFBFBD><EFBFBD>ֽڵĵڶ<C4B5><DAB6><EFBFBD><EFBFBD>ֽ<EFBFBD>)
if(rtumsg->MsgData[rtumsg->MsgLen+1] > 0)
{
return;
}
switch(rtumsg->MsgData[0])
{
case 0x68:
ProvBuban101longprocess(commid, rtumsg);
break;
case 0x10://shortframe process
ProvBuban101shortprocess(commid, rtumsg);
break;
default:
break;
}
}
void ProvBuban101shortprocess(int commid, RTUMSG * rtumsg)
{
int framecnt = 0;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
//<2F><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((rtumsg->MsgData[1] & 0xc0) == 0x00)
{
switch(rtumsg->MsgData[1] & 0x0f)
{
case 0x0b://<2F>ش<EFBFBD><D8B4><EFBFBD>·״̬(<28><>·<EFBFBD><C2B7><EFBFBD><EFBFBD>)
ProvMakeBuban101Command(commid, RST_LINK);
break;
case 0x00://<2F><>·ȷ<C2B7><C8B7>
if(pPortParam->RstLinkOk)
{
pPortParam->LinkOk = TRUE;
}
// wen 2005.09.13 <20><>·<EFBFBD><C2B7>ȷ<EFBFBD><C8B7>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Ӧ<EFBFBD><D3A6>
//ProvMakeBuban101Command(commid, ACK);
break;
default:
break;
}
return;
}
switch(rtumsg->MsgData[1] & 0x0f)
{
case 0x09://<2F><>·״̬<D7B4><CCAC><EFBFBD><EFBFBD>
ProvMakeBuban101Command(commid, ANS_LINK);
break;
case 0x00://<2F><>λ<EFBFBD><CEBB>·
if(pPortParam->BalanceOrNot==0)
{
pPortParam->LinkOk = TRUE;
pPortParam->RstLinkOk = TRUE;
ProvMakeBuban101Command(commid, ACK);
}
else
{
pPortParam->LinkOk = FALSE;
pPortParam->RstLinkOk = TRUE;
ProvMakeBuban101Command(commid, ACK);
//ProvMakeBuban101Command(commid, RST_LINK);
ProvMakeBuban101Command(commid, ASK_LINK);
}
break;
case 0x0a://<2F>ٻ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pPortParam->LinkOk)
{
ProvMakeBuban101Command(commid, ASK_FIRST_DATA);
}
break;
case 0x0b://<2F>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pPortParam->LinkOk)
{
ProvMakeBuban101Command(commid, ASK_SECOND_DATA);
}
break;
default:
break;
}
}
void ProvBuban101longprocess(int commid, RTUMSG * rtumsg)
{
if((rtumsg->MsgData[4] & 0xc0) != 0x40)
{
ProvMakeBuban101Command(commid, ASK_DATA_NO);
}
switch(rtumsg->MsgData[6])
{
case 1: // <20><><EFBFBD><EFBFBD>ң<EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>
break;
case 2: // <20><><EFBFBD><EFBFBD>ң<EFBFBD><D2A3>SOE<4F><45><EFBFBD><EFBFBD>
break;
case 3: // ˫<><CBAB>ң<EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>
break;
case 4: // <20><><EFBFBD><EFBFBD>ң<EFBFBD><D2A3>SOE<4F><45><EFBFBD><EFBFBD>
break;
case 5: // <20><>ѹ<EFBFBD><D1B9><EFBFBD>ֽ<EFBFBD>ͷλ<CDB7><CEBB>
break;
case 6: // <20><>ѹ<EFBFBD><D1B9><EFBFBD>ֽ<EFBFBD>ͷλ<CDB7>ô<EFBFBD>ʱ<EFBFBD><CAB1>
break;
case 7: // <20><>վԶ<D5BE><D4B6><EFBFBD>ն<EFBFBD>״̬
break;
case 9: // <20><>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ң<EFBFBD><D2A3>
break;
case 10: // <20><>Ʒ<EFBFBD>ʴ<EFBFBD>ʱ<EFBFBD><CAB1>ң<EFBFBD><D2A3>
break;
case 21: // ȫң<C8AB><D2A3><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD> <20><><EFBFBD><EFBFBD><E4BBAF><EFBFBD><EFBFBD>
break;
case 15: // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 16: // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 17:
case 18:
case 19: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 46: // ң<>ط<EFBFBD>У
case 47: // ң<><D2A3><EFBFBD><EFBFBD>У
ProvBuban101YkYtData(commid, rtumsg);
break;
case 100: // <20>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>
ProvBuban101SendAllData(commid, rtumsg);
break;
case 101: // <20>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>
ProvBuban101SendPIData(commid, rtumsg);
break;
case 103: // ʱ<><CAB1>ͬ<EFBFBD><CDAC>ȷ<EFBFBD><C8B7>֡
ProvBuban101ProcessTime(commid, rtumsg);
break;
}
}
//<2F><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD>
//<2F><><EFBFBD>ٻ<EFBFBD>ȷ<EFBFBD><C8B7>(<28><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>[8]=0x07,0x09ȷ<39><C8B7>; =0x0a <20><><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>)
void ProvBuban101SendAllData(int commid, RTUMSG * rtumsg)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
int iGroup;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD>
if(rtumsg->MsgData[12] != 20)
{
iGroup = rtumsg->MsgData[12] - 20;
//<2F><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
if( ( iGroup <= 0 ) || ( iGroup > 12 ) )
{
ProvMakeBuban101Command(commid, ASK_DATA_NO);
return;
}
if(iGroup > 8)
{
iGroup -= 8;
ProvBuban101SendAI(commid, rtumsg, iGroup);
}
else
ProvBuban101SendDI(commid, rtumsg, iGroup);
return;
}
//<2F><><EFBFBD>ٻ<EFBFBD>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x00;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 100;
commandbuf[7] = 0;
switch(rtumsg->MsgData[8])
{
case 0x06://<2F><><EFBFBD><EFBFBD>
commandbuf[8] = 7;
break;
case 0x08://ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
default:
commandbuf[8] = 9;
break;
}
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
commandbuf[12] = 0x14;
commandbuf[13] = CalBuban101Lpc(&commandbuf[4], 9);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 15);
if(rtumsg->MsgData[8] != 0x06)
return;
ProvBuban101SendAI(commid, rtumsg, 0);
ProvBuban101SendDI(commid, rtumsg, 0);
//<2F><><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>
ProvMakeBuban101Command(commid, ASK_ALLDATA_END);
pPortParam->m_psBaoHu->DiChange = FALSE;
}
void ProvBuban101SendPIData(int commid, RTUMSG * rtumsg)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
int iGroup = rtumsg->MsgData[12] & 0x3F;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
/*switch((rtumsg->MsgData[12]&0xc0)>>6)
{
case 0x00://<2F><>Чָ<D0A7><D6B8><EFBFBD><EFBFBD>ʽ
break;
case 0x01://<2F><><EFBFBD><EFBFBD><E1B2BB>λ
break;
case 0x02://<2F><><EFBFBD>Ḵλ
break;
case 0x03://<2F><><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
break;
}*/
//<2F><><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD>
if( iGroup != 1 )
{
//<2F><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>
if(( iGroup <= 0 ) || ( iGroup > 5 ))
{
ProvMakeBuban101Command(commid, ASK_DATA_NO);
return;
}
ProvBuban101SendPI(commid, rtumsg, iGroup-1);
return;
}
//<2F><><EFBFBD>ٻ<EFBFBD>ȷ<EFBFBD><C8B7>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x00;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 101;
commandbuf[7] = 0;
commandbuf[8] = 7;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
commandbuf[12] = rtumsg->MsgData[12];
commandbuf[13] = CalBuban101Lpc(&commandbuf[4], 9);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 15);
ProvBuban101SendPI(commid, rtumsg, 0);
//<2F><><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x80;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 101;
commandbuf[7] = 0;
commandbuf[8] = 10;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
commandbuf[12] = rtumsg->MsgData[12];
commandbuf[13] = CalBuban101Lpc(&commandbuf[4], 9);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 15);
}
void ProvBuban101ProcessTime(int commid, RTUMSG *rtumsg)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
BUBAN101PORTPARAM *pPortParam;
DAY_TIME sCurTime;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>
switch(rtumsg->MsgData[8])
{
case 0x06://<2F><><EFBFBD><EFBFBD>(<28><>ʱ)
commandbuf[0] = 0x68;
commandbuf[1] = 15;
commandbuf[2] = 15;
commandbuf[3] = 0x68;
commandbuf[4] = 0x53;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 103;
commandbuf[7] = 1;
commandbuf[8] = 7;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
memcpy(commandbuf+12, rtumsg->MsgData+12, 7);
commandbuf[19] = CalBuban101Lpc(&commandbuf[4], commandbuf[1]);
commandbuf[20] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 21);
// wen 2006.03.29 <20><><EFBFBD>Ӷ<EFBFBD>ʱ
if(1 == pPortParam->m_psBaoHu->CheckTime)
{
sCurTime.mSec = rtumsg->MsgData[12] + (rtumsg->MsgData[13] << 8);
sCurTime.Sec = sCurTime.mSec/1000;
sCurTime.mSec = sCurTime.mSec % 1000;
sCurTime.Min = rtumsg->MsgData[14] & 0x3F;
sCurTime.Hour = rtumsg->MsgData[15] & 0x1F;
sCurTime.Day = rtumsg->MsgData[16] & 0x1F;
sCurTime.Month= rtumsg->MsgData[17] & 0x0F;
sCurTime.Year = (rtumsg->MsgData[18] & 0x7F)+2000;
SetLocalTimeEx(&sCurTime);
}
break;
case 0x07://<2F><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
break;
}
}
void ProvBuban101SendPI(int commid, RTUMSG *rtumsg, int iGroupNo)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
WORD wStartAddr;
int iLenth, iSendCount=1;
int i, j, iAllDataCount, iSendNum;
int iNo;
PI_DEF pntmsg;
PROV_PI_PNT *piprovptr;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(iGroupNo == 0)//<2F><><EFBFBD>ٻ<EFBFBD>
{
wStartAddr = MAX_GROUP_PINUM*iGroupNo + pPortParam->iPiBaseAddr;
iAllDataCount = pPortParam->m_psBaoHu->PiNum;
iSendCount = (iAllDataCount+MAX_PINUM-1)/MAX_PINUM;
}
else//<2F><><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD>
{
wStartAddr = MAX_GROUP_PINUM*(iGroupNo-1);
iAllDataCount = pPortParam->m_psBaoHu->PiNum - wStartAddr;
wStartAddr += pPortParam->iPiBaseAddr;
if( iAllDataCount > MAX_GROUP_PINUM)
{
iSendCount = 2;
if((iAllDataCount - MAX_GROUP_PINUM)>0)
iAllDataCount = MAX_GROUP_PINUM;
}
}
piprovptr = (PROV_PI_PNT *)pPortParam->m_psBaoHu->PiPtr;
for(i = 0; i < iSendCount; i++)
{
commandbuf[0] = 0x68;
commandbuf[3] = 0x68;
commandbuf[4] = 0x08;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 15;
commandbuf[8] = 37+iGroupNo;
commandbuf[9] = pPortParam->LinkAddr;
//ң<><D2A3>ֵ
if(iAllDataCount>MAX_PINUM)
{
iAllDataCount -= MAX_PINUM;
iSendNum = MAX_PINUM;
}
else
{
iSendNum = iAllDataCount;
}
for(j = 0, iLenth = 10; j < iSendNum; j++, wStartAddr++)
{
commandbuf[iLenth++] = (char)(wStartAddr &0x00ff);
commandbuf[iLenth++] = (char)((wStartAddr &0xff00)>>8);
iNo = wStartAddr - pPortParam->iPiBaseAddr;
pntmsg.RawValue = 0;
GetPntMsg(piprovptr[iNo].PortNo, piprovptr[iNo].PntNo,
(void *)&pntmsg, PI_PNT_TYPE, PNT_RAWVALUE);
piprovptr[iNo].ChangeFlag = FALSE;
commandbuf[iLenth++] = (char)(pntmsg.RawValue & 0x000000ff);
commandbuf[iLenth++] = (char)((pntmsg.RawValue & 0x0000ff00)>>8);
commandbuf[iLenth++] = (char)((pntmsg.RawValue & 0x00ff0000)>>16);
commandbuf[iLenth++] = (char)((pntmsg.RawValue & 0xff000000)>>24);
commandbuf[iLenth++] = (char)(j+1);
}
commandbuf[7] = (BYTE)j;
commandbuf[1] = (char)(iLenth-4);
commandbuf[2] = commandbuf[1];
commandbuf[iLenth++] = CalBuban101Lpc(&commandbuf[4], commandbuf[1]);
commandbuf[iLenth++] = 0x16;
if(iGroupNo != 0)
{
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, iLenth);
}
else
{
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, iLenth);
}
}
}
void ProvBuban101SendAI(int commid, RTUMSG *rtumsg, int iGroupNo)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
WORD wStartAddr;
int iLenth, iSendCount=1;
int i, j, iAllDataCount, iSendNum;
int iNo;
AI_DEF pntmsg;
PROV_AI_PNT *aiprovptr;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if( iGroupNo == 0 )//<2F><><EFBFBD>ٻ<EFBFBD>
{
wStartAddr = MAX_GROUP_AINUM*iGroupNo + pPortParam->iAiBaseAddr;
iAllDataCount = pPortParam->m_psBaoHu->AiNum;
iSendCount = (iAllDataCount+MAX_AINUM-1)/MAX_AINUM;
}
else//<2F><><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD>
{
wStartAddr = MAX_GROUP_AINUM*(iGroupNo-1);
iAllDataCount = pPortParam->m_psBaoHu->AiNum - wStartAddr;
wStartAddr += pPortParam->iAiBaseAddr;
if(iAllDataCount > MAX_AINUM)
{
iSendCount = 2;
if((iAllDataCount - MAX_GROUP_AINUM) > 0)
{
iAllDataCount = MAX_GROUP_AINUM;
}
}
}
aiprovptr = (PROV_AI_PNT *)pPortParam->m_psBaoHu->AiPtr;
for( i = 0; i < iSendCount; i++ )
{
commandbuf[0] = 0x68;
commandbuf[3] = 0x68;
commandbuf[4] = 0x08;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 21;
commandbuf[8] = rtumsg->MsgData[12];
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = (char)(wStartAddr);
commandbuf[11] = (char)((wStartAddr&0xff00)>>8);
//ң<><D2A3>ֵ
if(iAllDataCount > MAX_AINUM)
{
iAllDataCount -= MAX_AINUM;
iSendNum = MAX_AINUM;
}
else
{
iSendNum = iAllDataCount;
}
iNo = wStartAddr - pPortParam->iAiBaseAddr;
for(j = 0, iLenth = 12; j < iSendNum; j++)
{
GetPntMsg(aiprovptr[iNo+j].PortNo, aiprovptr[iNo+j].PntNo,
&pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
aiprovptr[iNo+j].ChangeFlag = FALSE;
commandbuf[iLenth++] = (char)(pntmsg.RawValue);
commandbuf[iLenth++] = (char)((pntmsg.RawValue&0xff00)>>8);
}
commandbuf[7] = (BYTE)j;
commandbuf[7] |= 0x80;
commandbuf[1] = commandbuf[2] = (char)(iLenth-4);
commandbuf[iLenth++] = CalBuban101Lpc( &commandbuf[4], commandbuf[1]);
commandbuf[iLenth++] = 0x16;
if(iGroupNo != 0)
{
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, iLenth);
}
else
{
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, iLenth);
}
wStartAddr += MAX_AINUM;
}
}
void ProvBuban101SendDI(int commid, RTUMSG *rtumsg, int iGroupNo)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
WORD wStartAddr;
int iLenth, iSendCount=1;
int i, j, iAllDataCount, iSendNum;
int iNo;
DI_DEF pntmsg;
PROV_DI_PNT *diprovptr;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(iGroupNo == 0)//<2F><><EFBFBD>ٻ<EFBFBD>
{
wStartAddr = MAX_GROUP_DINUM*iGroupNo + pPortParam->iDiBaseAddr;
iAllDataCount = pPortParam->m_psBaoHu->DiNum;
iSendCount = (iAllDataCount+MAX_DINUM-1)/MAX_DINUM;
}
else//<2F><><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD>
{
wStartAddr = MAX_GROUP_DINUM*(iGroupNo-1);
iAllDataCount = pPortParam->m_psBaoHu->DiNum - wStartAddr;
wStartAddr += pPortParam->iDiBaseAddr;
if( iAllDataCount > MAX_GROUP_DINUM)
{
iAllDataCount = MAX_GROUP_DINUM;
}
}
diprovptr = (PROV_DI_PNT *)pPortParam->m_psBaoHu->DiPtr;
for(i=0; i<iSendCount; i++)
{
commandbuf[0] = 0x68;
commandbuf[3] = 0x68;
commandbuf[4] = 0x08;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 1;//=3,Ϊ˫<CEAA><CBAB>
commandbuf[8] = rtumsg->MsgData[12];
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = (char)(wStartAddr);
commandbuf[11] = (char)((wStartAddr&0xff00)>>8);
if(iAllDataCount > MAX_DINUM)
{
iAllDataCount -= MAX_DINUM;
iSendNum = MAX_DINUM;
}
else
{
iSendNum = iAllDataCount;
}
iNo = wStartAddr - pPortParam->iDiBaseAddr;
for( j = 0, iLenth = 12; j < iSendNum; j++ )
{
GetPntMsg(diprovptr[iNo+j].PortNo, diprovptr[iNo+j].PntNo,
&pntmsg, DI_PNT_TYPE, PNT_STATUS);
diprovptr[iNo+j].ChangeFlag = FALSE;
commandbuf[iLenth++] = pntmsg.Status;
}
commandbuf[7] = (char)j;
commandbuf[7] |= 0x80;
commandbuf[1] = (char)(iLenth-4);
commandbuf[2] = commandbuf[1];
commandbuf[iLenth++] = CalBuban101Lpc( &commandbuf[4], commandbuf[1]);
commandbuf[iLenth++] = 0x16;
if(iGroupNo != 0)
{
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, iLenth);
}
else
{
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, iLenth);
}
wStartAddr += MAX_DINUM;
}
}
void ProvBuban101YkYtData(int commid, RTUMSG *rtumsg)
{
PROV_DI_PNT *diprovptr;
DI_DEF *diptr;
int ykytcommid, provpnt;
int ykytpnt, ykytop, step;
YKYT_PARAM YkYtParam;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
if(rtumsg->MsgData[8] == 8)
{
step = STEP_YKYT_CANCEL;
}
else
{
if(rtumsg->MsgData[12] & 0x80) //ѡ<><D1A1><EFBFBD><EFBFBD>У
{
step = STEP_YKYT_SELECT;
}
else
{
step = STEP_YKYT_EXEC;
}
}
ykytpnt = 0;
ykytop = 3;
if(ShmGetDispYkYtFlag())
{
printf("TIP_(%04d): commid =%d recv ykyt select.\n", getpid(), commid);
}
ykytpnt = (rtumsg->MsgData[11]<<8) + rtumsg->MsgData[10];
ykytpnt -= pPortParam->iYkBaseAddr;
ykytpnt += 1;
//ykytop = ((rtumsg->MsgData[12] & 0x03) == 1) ? 2 : 1;
if(rtumsg->MsgData[6] == 45)
{
// ykytop == 1 <20>غ<EFBFBD>, == 2 <20>ط<EFBFBD>
ykytop = ((rtumsg->MsgData[12] & 0x03) == 1) ? 1 : 2;
}
else if(rtumsg->MsgData[6] == 46)
{
ykytop = ((rtumsg->MsgData[12] & 0x03) == 2) ? 1 : 2;
}
else // == 47
{
//step = STEP_YKYT_CANCEL;
MakeProvBuban101YkYtAckMsg(commid, ykytpnt, 3, step);
return;
}
provpnt = FindProvPntFromYkYtPnt(commid, ykytpnt, pPortParam->m_psBaoHu);
if(provpnt < 0) // <20>ص<EFBFBD><D8B5>Ŵ<EFBFBD>
{
MakeProvBuban101YkYtAckMsg(commid, ykytpnt, 3, step);
}
else
{
diprovptr = (PROV_DI_PNT *)pPortParam->m_psBaoHu->DiPtr;
ykytcommid = diprovptr[provpnt].PortNo;
if(!SioParam[ykytcommid].m_psBaoHu)
{
MakeProvBuban101YkYtAckMsg(commid, ykytpnt, 3, step);
return;
}
if(!SioParam[ykytcommid].m_psBaoHu->DiPtr)
{
MakeProvBuban101YkYtAckMsg(commid, ykytpnt, 3, step);
return;
}
diptr = (DI_DEF *)SioParam[ykytcommid].m_psBaoHu->DiPtr;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>û<EFBFBD>пص<D0BF><D8B5><EFBFBD><EFBFBD>߿ص㲻<D8B5><E3B2BB><EFBFBD><EFBFBD>
if(!diptr[diprovptr[provpnt].PntNo].CtrlEnable)
{
MakeProvBuban101YkYtAckMsg(commid, ykytpnt, 3, step);
return;
}
if(STEP_YKYT_SELECT == step)
{
if(STEP_YKYT_SELECT == SioParam[ykytcommid].m_psBaoHu->ProvYkYtMsg.m_iYkYtStep)
{
if(!ProvPortYkYtIsTimeOut(ykytcommid, &SioParam[ykytcommid].m_psBaoHu->ProvYkYtMsg))
{
MakeProvBuban101YkYtAckMsg(commid, ykytpnt, 3, step);
return;
}
}
}
SioParam[ykytcommid].m_psBaoHu->ProvYkYtMsg.m_iProvPntIdx = provpnt;
SioParam[ykytcommid].m_psBaoHu->ProvYkYtMsg.m_iProvPortIdx = commid;
SioParam[ykytcommid].m_psBaoHu->ProvYkYtMsg.m_iProvYkYtPointIdx = ykytpnt;
SioParam[ykytcommid].m_psBaoHu->ProvYkYtMsg.m_iYkYtPointIdx = diptr[diprovptr[provpnt].PntNo].ControlNo;
SioParam[ykytcommid].m_psBaoHu->ProvYkYtMsg.m_iYkYtOperate = ykytop;
// buf[0] --- <20>˿ں<CBBF>(=commid)
// buf[1]
// buf[2]
// buf[3]
// buf[4] --- <20>ص<EFBFBD><D8B5><EFBFBD>
// buf[5]
// buf[6]
// buf[7]
// buf[8] --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D2A3>:1=ѡ<><D1A1>,2=ִ<><D6B4>,3=ȡ<><C8A1>,7=ֱ<><D6B1>;
// ң<><D2A3>:4=ѡ<><D1A1>,5=ִ<><D6B4>,6=ȡ<><C8A1>,8=<3D><>ͣ)
// buf[9] --- <20><><EFBFBD><EFBFBD>״̬(1=<3D>ֵ<EFBFBD><D6B5>ϣ<EFBFBD>2=<3D>ϵ<EFBFBD><CFB5><EFBFBD>)
// (<28><><EFBFBD><EFBFBD>λΪ1ʱ<31><CAB1>Ϊ<EFBFBD><CEAA>У<EFBFBD><D0A3><EFBFBD><EFBFBD>, 1=<3D>ɹ<EFBFBD>, 0=ʧ<><CAA7>)
//buf[0] = ykytcommid & 0xFF;
//buf[1] = (ykytcommid & 0xFF00) >> 8;
//buf[2] = (ykytcommid & 0xFF0000) >> 16;
//buf[3] = (ykytcommid & 0xFF000000) >> 24;
//buf[4] = diptr[diprovptr[provpnt].PntNo].ControlNo & 0xFF;
//buf[5] = (diptr[diprovptr[provpnt].PntNo].ControlNo & 0xFF00) >> 8;
//buf[6] = (diptr[diprovptr[provpnt].PntNo].ControlNo & 0xFF0000) >> 16;
//buf[7] = (diptr[diprovptr[provpnt].PntNo].ControlNo & 0xFF000000) >> 24;
//buf[8] = STEP_YKYT_SELECT;
//buf[9] = ykytop;
//SendYkYtCommand(ykytcommid, (char *)buf, 10); // <20><><EFBFBD><EFBFBD>ң<EFBFBD><D2A3>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
YkYtParam.m_iYkYtOperate = ykytop;
YkYtParam.m_iYkYtPnt = diptr[diprovptr[provpnt].PntNo].ControlNo;
YkYtParam.m_iYkYtStep = step;
YkYtParam.m_iYkYtUpDown = YKYT_SEND_DOWN;
SendYkYtCommand2(ykytcommid, &YkYtParam);
if(STEP_YKYT_EXEC == step)
{
MakeProvBuban101YkYtAckMsg(commid, ykytpnt, ykytop, step);
MakeProvBuban101YkYtAckMsg(commid, ykytpnt, ykytop, STEP_YKYT_NOEXEC);
}
}
}
void MakeProvBuban101YkYtAckMsg(int commid, int pnt, int op, int step)
{
int iCount;
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
memset(commandbuf, 0, sizeof(commandbuf));
iCount = 4;
commandbuf[0] = 0x68;
commandbuf[1] = 0x09;
commandbuf[2] = 0x09;
commandbuf[3] = 0x68;
commandbuf[4] = 0x80;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 46;/*47*/
commandbuf[7] = 1;
// DCS/RCS
switch(op)
{
case 1: // ѡ<><D1A1><EFBFBD><EFBFBD>
commandbuf[12] = 2;
break;
case 2: // ѡ<><D1A1><EFBFBD><EFBFBD>
commandbuf[12] = 1;
break;
case 3: // ѡ<><D1A1>ʧ<EFBFBD><CAA7>
default:
commandbuf[8] = 0x40;
commandbuf[12] = 0;
break;
}
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>
if(STEP_YKYT_SELECT == step)
{
commandbuf[8] |= 7;
// DCS/RCS
commandbuf[12] |= 0x80;
}
else if(STEP_YKYT_EXEC == step)
{
commandbuf[8] |= 7;
}
else if(STEP_YKYT_CANCEL == step)
{
commandbuf[8] |= 9;
// DCS/RCS
commandbuf[12] |= 0x80;
}
else// <20><><EFBFBD><EFBFBD>֡
{
commandbuf[8] = 10;
}
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = LOBYTE((WORD)(pnt+pPortParam->iYkBaseAddr));
commandbuf[11] = HIBYTE((WORD)(pnt+pPortParam->iYkBaseAddr));
commandbuf[13] = CalBuban101Lpc(&commandbuf[4], commandbuf[1]);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 15);
if(ShmGetDispYkYtFlag())
{
printf("TIP_(%04d): commid =%d ykytpnt=%d, op=%d checked.\n", getpid(), commid, pnt, op);
}
}
void ProvBuban101SendClass1(int commid)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
WORD wStartAddr;
int iLenth, iSendCount=1;
int j, iDataNum;
DI_DEF pntmsg;
PROV_DI_PNT *diprovptr;
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
// wen 2005.01.15 <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
wStartAddr = pPortParam->iDiBaseAddr;
commandbuf[0] = 0x68;
commandbuf[3] = 0x68;
//commandbuf[4] = 0x08;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 1;//=3,Ϊ˫<CEAA><CBAB>
//commandbuf[8] = 3;
commandbuf[8] = 5;// Ӧ<><D3A6>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
commandbuf[9] = pPortParam->LinkAddr;
diprovptr = (PROV_DI_PNT *)pPortParam->m_psBaoHu->DiPtr;
for(j = 0, iDataNum = 0, iLenth = 10; j < pPortParam->m_psBaoHu->DiNum; j++)
{
if(diprovptr[j].ChangeFlag)
{
iDataNum++;
commandbuf[iLenth++] = (char)(wStartAddr+j);
commandbuf[iLenth++] = (char)((wStartAddr+j)>>8);
GetPntMsg(diprovptr[j].PortNo, diprovptr[j].PntNo,
&pntmsg, DI_PNT_TYPE, PNT_STATUS);
diprovptr[j].ChangeFlag = FALSE;
commandbuf[iLenth++] = pntmsg.Status;
if(iLenth > 256)
{
break;
}
}
}
if(j >= pPortParam->m_psBaoHu->DiNum)
{
pPortParam->m_psBaoHu->DiChange = FALSE;
}
if(pPortParam->m_psBaoHu->DiChange)
{
commandbuf[4] = 0x28;
}
else
{
commandbuf[4] = 0x08;
}
commandbuf[7] = (char)iDataNum;
commandbuf[1] = (char)(iLenth-4);
commandbuf[2] = commandbuf[1];
commandbuf[iLenth++] = CalBuban101Lpc( &commandbuf[4], commandbuf[1]);
commandbuf[iLenth++] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, iLenth);
}
void ProvBuban101SendClass2(int commid)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
BOOL bHaveData = FALSE;
WORD wStartAddr, wmSec;
int iLenth;
int j, iDataNum;
AI_DEF pntmsg;
SOE_DEF soemsg;
PROV_AI_PNT *aiprovptr;
BUBAN101PORTPARAM *pPortParam;
iDataNum = 0;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
commandbuf[0] = 0x68;
commandbuf[3] = 0x68;
if(pPortParam->m_psBaoHu->DiChange)
{
commandbuf[4] = 0x28;
}
else
{
commandbuf[4] = 0x08;
}
commandbuf[5] = pPortParam->LinkAddr;
//commandbuf[8] = 3;
commandbuf[8] = 5;
commandbuf[9] = pPortParam->LinkAddr;
//SOE <20><><EFBFBD><EFBFBD>
if(ProvHaveSoeData(commid) > 0)
{
// <20><><EFBFBD><EFBFBD>
commandbuf[6] = 2;
bHaveData = TRUE;
iLenth = 10;
// wen 2005.01.15 <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
wStartAddr = pPortParam->iDiBaseAddr;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// wen 2006.07.12 <20>޸<EFBFBD>soeΪ<65><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
/*
while(ProvAndDelGetSoeData(commid, &soemsg) > 0)
{
iDataNum++;
commandbuf[iLenth++] = (char)(wStartAddr+soemsg.iPntNo);
commandbuf[iLenth++] = (char)((wStartAddr+soemsg.iPntNo)>>8);
commandbuf[iLenth++] = soemsg.bStatus;
wmSec = soemsg.SoeTime.mSec + soemsg.SoeTime.Sec*1000;
commandbuf[iLenth++] = LOBYTE(wmSec);
commandbuf[iLenth++] = HIBYTE(wmSec);
commandbuf[iLenth++] = soemsg.SoeTime.Min;
if(iLenth >= 255)
{
break;
}
}
*/
//===========================================================
while(ProvHaveSoeData(commid) > 0)
{
ProvAndDelGetSoeData(commid, &soemsg);
iDataNum++;
commandbuf[iLenth++] = (char)(wStartAddr+soemsg.iPntNo);
commandbuf[iLenth++] = (char)((wStartAddr+soemsg.iPntNo)>>8);
commandbuf[iLenth++] = soemsg.bStatus;
wmSec = soemsg.SoeTime.mSec + soemsg.SoeTime.Sec*1000;
commandbuf[iLenth++] = LOBYTE(wmSec);
commandbuf[iLenth++] = HIBYTE(wmSec);
commandbuf[iLenth++] = soemsg.SoeTime.Min;
if(iLenth >= 255)
{
break;
}
};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
else
{
// wen 2005.01.15 <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
wStartAddr = pPortParam->iAiBaseAddr;
commandbuf[6] = 21;
//ң<><D2A3>ֵ
aiprovptr = (PROV_AI_PNT *)pPortParam->m_psBaoHu->AiPtr;
for(j = 0, iDataNum = 0, iLenth = 10; j < pPortParam->m_psBaoHu->AiNum; j++)
{
if(aiprovptr[j].ChangeFlag)
{
iDataNum++;
bHaveData = TRUE;
commandbuf[iLenth++] = (char)(wStartAddr+j);
commandbuf[iLenth++] = (char)((wStartAddr+j)>>8);
GetPntMsg(aiprovptr[j].PortNo, aiprovptr[j].PntNo,
&pntmsg, AI_PNT_TYPE, PNT_RAWVALUE);
aiprovptr[j].ChangeFlag = FALSE;
commandbuf[iLenth++] = (char)(pntmsg.RawValue);
commandbuf[iLenth++] = (char)((pntmsg.RawValue&0xff00)>>8);
if(iLenth >= 255)
{
break;
}
}
}
}
if(bHaveData)
{
commandbuf[7] = (char)iDataNum;
commandbuf[1] = (char)(iLenth-4);
commandbuf[2] = commandbuf[1];
commandbuf[iLenth++] = CalBuban101Lpc( &commandbuf[4], commandbuf[1]);
commandbuf[iLenth++] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, iLenth);
}
else
{
if(pPortParam->m_psBaoHu->DiChange)
{
commandbuf[0] = 0x10;
commandbuf[1] = 0x29;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[3] = CalBuban101Lpc(&commandbuf[1], 2);
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 5);
}
else
{
commandbuf[0] = 0xE5;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 1);
}
}
}
void ProvMakeBuban101Command(int commid, u_char cmdidx)
{
u_char commandbuf[MAX_POLLCMD_BUF_LEN];
BUBAN101PORTPARAM *pPortParam;
pPortParam = (BUBAN101PORTPARAM *)SioParam[commid].ExtInfo;
switch(cmdidx)
{
case ASK_LINK: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·
commandbuf[0] = 0x10;
commandbuf[1] = 0xc9;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[3] = CalBuban101Lpc(&commandbuf[1], 2);
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 5);
break;
case RST_LINK: // <20><>λ<EFBFBD><CEBB>·
commandbuf[0] = 0x10;
commandbuf[1] = 0xc0;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[3] = CalBuban101Lpc(&commandbuf[1], 2);
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 5);
break;
case ASK_SECOND_DATA: // <20>ٻ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ProvBuban101SendClass2(commid);
break;
case ASK_FIRST_DATA: // <20>ٻ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ProvBuban101SendClass1(commid);
break;
case ACK: // ȷ<>ϻش<CFBB>
commandbuf[0] = 0x10;
commandbuf[1] = 0x00;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[3] = CalBuban101Lpc(&commandbuf[1], 2);
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 5);
break;
case ANS_LINK: // <20>ش<EFBFBD><D8B4><EFBFBD>·״̬
commandbuf[0] = 0x10;
commandbuf[1] = 0x0b;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[3] = CalBuban101Lpc(&commandbuf[1], 2);
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 5);
break;
case ASK_DATA_NO: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
commandbuf[0] = 0x10;
commandbuf[1] = 0x09;
commandbuf[2] = pPortParam->LinkAddr;
commandbuf[3] = CalBuban101Lpc(&commandbuf[1], 2);
commandbuf[4] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 5);
break;
case ASK_ALLDATA_END: // <20><><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>֡
commandbuf[0] = 0x68;
commandbuf[1] = 9;
commandbuf[2] = 9;
commandbuf[3] = 0x68;
commandbuf[4] = 0x08;
commandbuf[5] = pPortParam->LinkAddr;
commandbuf[6] = 100;
commandbuf[7] = 1;
commandbuf[8] = 10;
commandbuf[9] = pPortParam->LinkAddr;
commandbuf[10] = 0;
commandbuf[11] = 0;
commandbuf[12] = 0x14;
commandbuf[13] = CalBuban101Lpc(&commandbuf[4], 9);
commandbuf[14] = 0x16;
PutPollCmdToBuf(commid, FAST_POLL_CMD, 0, (char *)commandbuf, 15);
break;
case RTU_TIME: // ʱ<><CAB1>ͬ<EFBFBD><CDAC>
break;
case ASK_DI_DATA: // <20>ٻ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>YX
break;
case ASK_AI_DATA: // <20>ٻ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>YC
break;
case ASK_PI_DATA: // <20>ٻ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>YM
break;
case ASK_PI: //<2F>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case ASK_ALL_DATA: // <20>ٻ<EFBFBD><D9BB><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
}
}
//===========================ת<><D7AA><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>===============================//
//===========================<3D><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>===============================//