?? iec104.cpp
字號:
m_bSendBuf[index++] = DataInfo.ApduHead.bStartCode;
m_bSendBuf[index++] = DataInfo.ApduHead.bApduLength;
m_bSendBuf[index++] = DataInfo.ApduHead.bControlCode1;
m_bSendBuf[index++] = DataInfo.ApduHead.bControlCode2;
m_bSendBuf[index++] = DataInfo.ApduHead.bControlCode3;
m_bSendBuf[index++] = DataInfo.ApduHead.bControlCode4;
m_bSendBuf[index++] = DataInfo.AsduHead.bAsduType;
m_bSendBuf[index++] = DataInfo.AsduHead.bAsduVsq;
m_bSendBuf[index++] = DataInfo.AsduHead.nAsduCot % 0x100;
m_bSendBuf[index++] = DataInfo.AsduHead.nAsduCot / 0x100;
m_bSendBuf[index++] = DataInfo.AsduHead.nAsduComAddr % 0x100;//單元公共地址
m_bSendBuf[index++] = DataInfo.AsduHead.nAsduComAddr / 0x100;//單元公共地址
m_bSendBuf[index++] = DataInfo.AsduHead.bAsduInf;//inf
bLength = DataInfo.bDataVec.size();
for (i=0; i<bLength; ++i)
{
m_bSendBuf[index++] = DataInfo.bDataVec[i];
}
m_wSendLen = index;
}
return;
}
/*====================================================================================
*
* Subroutine : GeneralInquire()
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 總召喚響應
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CIEC104::GeneralInquire(void)
{
int i = 0; //常用變量
int nResult; //常用變量,返回值
int nNumber; //遙信數量
unsigned char bSector = 0;; //扇區
unsigned char bNode = 0; //節點號
SYSTEMTIME systime; //時間結構體
DATA_STR DataInfo; //數據信息格式
DATAGROUP DataGroup; //存儲數據結構體
memset(&DataGroup, 0x00, sizeof(DATAGROUP));
memset(&DataInfo, 0x00, sizeof(DATA_STR));
bSector = m_bFrameBuf[10];//m_bFrameBuf[4];
bNode = m_bFrameBuf[11];//m_bFrameBuf[5];
nResult = CheckNode();
if ((nResult != 0) && (bSector == 0))
{
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x12;
DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;
DataInfo.AsduHead.bAsduType = 0x64;
DataInfo.AsduHead.bAsduVsq = 0x01;
DataInfo.AsduHead.nAsduCot = 0x0007;
DataInfo.AsduHead.nAsduComAddr = bNode*0x100 + bSector;
DataInfo.AsduHead.bAsduInf = 0x00;
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
DataInfo.bDataVec.push_back(20);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
DataInfo.AsduHead.bAsduType = 0x03;
DataInfo.AsduHead.bAsduVsq = 0x01;
DataInfo.AsduHead.nAsduCot = 0x0020;
GetLocalTime(&systime);
nNumber = g_devdata.CountDevData(m_nPortNo, DATA_YX);
for (i=0; i<nNumber; ++i)
{
DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;
g_devdata.GetFixDevData(m_nPortNo, i, DATA_YX, DataGroup);
DataInfo.AsduHead.bAsduInf = DataGroup.nSerial;//??
DataInfo.bDataVec.push_back(DataGroup.nValue & 0xff);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
}
}
//總召喚結束
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x0c;
DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;
DataInfo.AsduHead.bAsduType = 0x64;
DataInfo.AsduHead.bAsduVsq = 0x01;
DataInfo.AsduHead.nAsduCot = 0x000a;
DataInfo.AsduHead.nAsduComAddr = bNode*0x100 + bSector;
DataInfo.AsduHead.bAsduInf = 0x00;
DataInfo.bDataVec.push_back(20);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
}
/*====================================================================================
*
* Subroutine : CheckNode()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 節點檢測
*
* Return : (!=0) 節點通信正常
* 0 通信不正常
*
* Modification:
* 2004-06-29:
*
*====================================================================================*/
int CIEC104::CheckNode(void)
{
int nResult = 0; //返回值變量
enum GateDevStatus eStatus = GATE_UNKNOW;
g_glonet.GetDevStatus(eStatus);
if (eStatus != 0)
{
nResult = 1;
}
return nResult;
}
/*====================================================================================
*
* Subroutine : CalibrateTime()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 校時函數,校正時間
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CIEC104::CalibrateTime(void)
{
SYSTEMTIME systime; //時間結構
unsigned char bNode = 0; //節點號
int nResult; //常用變量,返回值
CTRL_VALUE CtrlValue; //下發命令結構體
DATA_STR DataInfo; //數據信息格式
memset(&DataInfo, 0x00, sizeof(DATA_STR));
memset(&CtrlValue, 0x00, sizeof(CTRL_VALUE));
bNode = m_bFrameBuf[11];
nResult = CheckNode();
systime.wMilliseconds = (m_bFrameBuf[13] + m_bFrameBuf[14]*0x100)%1000;
systime.wSecond = (m_bFrameBuf[13] + m_bFrameBuf[14]*0x100)/1000;
systime.wMinute = m_bFrameBuf[15] & 0x3f;
systime.wHour = m_bFrameBuf[16] & 0x1f;
systime.wDay = m_bFrameBuf[17] & 0x1f;
systime.wMonth = m_bFrameBuf[18] &0x0f;
systime.wYear = (m_bFrameBuf[19])%100 + 2000;
SetLocalTime(&systime);//校對本機時間
if (nResult != 0)
{
CtrlValue.eCmdType = COMMAND_CALI_TIME;
CtrlValue.bAddress = m_bFrameBuf[11];
g_soedata.InsCtrlData(CtrlValue);
}
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x12;
DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;
DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;
DataInfo.AsduHead.bAsduType = 0x67;
DataInfo.AsduHead.bAsduVsq = 0x01;
DataInfo.AsduHead.nAsduCot = 0x0007;
DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
DataInfo.AsduHead.bAsduInf = 0x00;
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
DataInfo.bDataVec.push_back(m_bFrameBuf[13]);
DataInfo.bDataVec.push_back(m_bFrameBuf[14]);
DataInfo.bDataVec.push_back(m_bFrameBuf[15]);
DataInfo.bDataVec.push_back(m_bFrameBuf[16]);
DataInfo.bDataVec.push_back(m_bFrameBuf[17]);
DataInfo.bDataVec.push_back(m_bFrameBuf[18]);
DataInfo.bDataVec.push_back(m_bFrameBuf[19]);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
return;
}
/*====================================================================================
*
* Subroutine : RtuControl()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 控制命令
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CIEC104::RtuControl(void)
{
int nResult = 0; //常用變量,返回值
unsigned char bNode = 0; //節點號
int pot = 0; //信息點號
CTRL_VALUE CtrlValue; //下發命令結構體
unsigned char bType = 0xff; //0xff為無用
memset(&CtrlValue, 0x00, sizeof(CTRL_VALUE));
bNode = m_bFrameBuf[11];
nResult = CheckNode();
pot = ReadYXInfCDT(m_bFrameBuf[12]);
if ((nResult != 0) //裝置通信正常
&& (pot != 0))
{
CtrlValue.bAddress = bNode;
CtrlValue.nPotValue = pot;
CtrlValue.iValue = m_bFrameBuf[13] & 0x03;
bType = m_bFrameBuf[13] >> 7;
switch (bType)
{
case 0x01: //選擇或撤消
if (m_bFrameBuf[9] == 6)
{
CtrlValue.eCmdType = COMMAND_SEL_CTRL;
g_soedata.InsCtrlData(CtrlValue);
}
else if (m_bFrameBuf[9] == 8)
{
CtrlValue.eCmdType = COMMAND_CANCEL_CTRL;
g_soedata.InsCtrlData(CtrlValue);
}
break;
case 0x00://執行
CtrlValue.eCmdType = COMMAND_EXE_CTRL;
g_soedata.InsCtrlData(CtrlValue);
break;
default:
RtuAnswerNo();
break;
}
}
else //裝置未通信
{
RtuAnswerNo();
}
return;
}
/*====================================================================================
*
* Subroutine : RtuAnswerNo()
*
* Parameters :
*
*
* Called from : RtuControl()
*
* Description : 控制命令不成功
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CIEC104::RtuAnswerNo(void)
{
DATA_STR DataInfo; //數據信息格式
memset(&DataInfo, 0x00, sizeof(DATA_STR));
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x0c;
DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;
DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;
DataInfo.AsduHead.bAsduType = m_bFrameBuf[6];
DataInfo.AsduHead.bAsduVsq = 0x01;
DataInfo.AsduHead.nAsduCot = 0x000a; //失敗
DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
DataInfo.AsduHead.bAsduInf = m_bFrameBuf[12];
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
DataInfo.bDataVec.push_back(m_bFrameBuf[13]);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
return;
}
/*====================================================================================
*
* Subroutine : GetYC()
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 遙測量響應
*
* Return :
*
*
* Modification:
* 2004-12-28:
*
*====================================================================================*/
void CIEC104::GetYC(void)
{
int i = 0; //常用變量
int nResult; //常用變量,返回值
int nNumber; //遙信數量
DATA_STR DataInfo; //數據信息格式
DATAGROUP DataGroup; //存儲數據結構體
memset(&DataGroup, 0x00, sizeof(DATAGROUP));
memset(&DataInfo, 0x00, sizeof(DATA_STR));
nResult = CheckNode();
if (nResult != 0)
{
nNumber = g_devdata.CountDevData(m_nPortNo, DATA_YC);
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x12;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -