📄 tcp103.cpp
字号:
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)
&& (bNode == m_iAddress))
{
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x12;
DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;
DataInfo.AsduHead.bAsduType = 0x01;
DataInfo.AsduHead.bAsduVsq = 0x81;
DataInfo.AsduHead.nAsduCot = 0x0009;
DataInfo.AsduHead.nAsduComAddr = bNode*0x100 + bSector;
DataInfo.AsduHead.bAsduFun = 0xb2;//??
GetLocalTime(&systime);
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
nNumber = g_devdata.CountDevData(m_nPortNo, DATA_YX);
///////////////////
// nNumber = 10;
///////////////////
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);
DataInfo.bDataVec.push_back(systime.wMilliseconds % 1000);
DataInfo.bDataVec.push_back(systime.wMilliseconds / 1000);
DataInfo.bDataVec.push_back(systime.wMinute & 0x3f);
DataInfo.bDataVec.push_back(systime.wHour & 0x1f);
DataInfo.bDataVec.push_back(0);//(m_bRii);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
}
//总召唤结束
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x0d;
DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;
DataInfo.AsduHead.bAsduType = 0x08;
DataInfo.AsduHead.bAsduVsq = 0x81;
DataInfo.AsduHead.nAsduCot = 0x000a;
DataInfo.AsduHead.nAsduComAddr = bNode*0x100 + bSector;
DataInfo.AsduHead.bAsduFun = 0xff;
DataInfo.AsduHead.bAsduInf = 0x00;
DataInfo.bDataVec.clear();
DataInfo.bDataVec.push_back(m_bRii);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
m_bRii = (m_bRii++) & 0xff;
}
return;
}
/*====================================================================================
*
* Subroutine : CheckNode()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 节点检测
*
* Return : (!=0) 节点通信正常
* 0 通信不正常
*
* Modification:
* 2004-06-29:
*
*====================================================================================*/
int CTcp103::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 CTcp103::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[14] + m_bFrameBuf[15]*0x100)%1000;
systime.wSecond = (m_bFrameBuf[14] + m_bFrameBuf[15]*0x100)/1000;
systime.wMinute = m_bFrameBuf[16] & 0x3f;
systime.wHour = m_bFrameBuf[17] & 0x1f;
systime.wDay = m_bFrameBuf[18] & 0x1f;
systime.wMonth = m_bFrameBuf[19] &0x0f;
systime.wYear = (m_bFrameBuf[20])%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 = 0x13;
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 = 0x06;
DataInfo.AsduHead.bAsduVsq = 0x81;
DataInfo.AsduHead.nAsduCot = 0x0008;
DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
DataInfo.AsduHead.bAsduFun = 0xff;
DataInfo.AsduHead.bAsduInf = 0x00;
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
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]);
DataInfo.bDataVec.push_back(m_bFrameBuf[20]);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
return;
}
/*====================================================================================
*
* Subroutine : NormalCommand()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 一般命令
*
* Return :
*
*
* Modification:
* 2004-12-22:
*
*====================================================================================*/
void CTcp103::NormalCommand(void)
{
int nResult = 0; //常用变量,返回值
int pot = 0; //CDT信息值,返回值
unsigned char bNode = 0; //节点号
unsigned char bInf = 0; //信息序号
CTRL_VALUE CtrlValue; //下发命令结构体
bool bSign = false; //肯定否定信号
memset(&CtrlValue, 0x00, sizeof(CTRL_VALUE));
bNode = m_bFrameBuf[11];
bInf = m_bFrameBuf[13];
nResult = CheckNode();
if (bInf == 0x13) //信息序号为19表示LED复归
{
if (nResult != 0)
{
CtrlValue.eCmdType = COMMAND_BAOHU_RESET;
CtrlValue.bAddress = bNode;
g_soedata.InsCtrlData(CtrlValue);
bSign = true;
NormalAnswer(bInf, bSign);
}
else
{
NormalAnswer(bInf);
}
}
else if ((bInf > 0x63) && (bInf < 0x6c)) //切换定值区
{
//装置未通信
bInf = 0xe0;
NormalAnswer(bInf);
}
else //软压板投退
{
pot = ReadYXInfCDT(m_bFrameBuf[13]);
if ((nResult != 0) && (pot != 0)) //装置通信正常
{
CtrlValue.eCmdType = COMMAND_SET_RYB;
CtrlValue.bAddress = bNode;
CtrlValue.bSwitch = 0xff;//??当前区
CtrlValue.nPotValue = pot;
CtrlValue.iValue = m_bFrameBuf[14];
g_soedata.InsCtrlData(CtrlValue);
}
else //装置未通信
{
NormalAnswer(bInf);
}
}
}
/*====================================================================================
*
* Subroutine : NormalAnswer()
*
* Parameters : bInf 信息序号
* nSign 肯定否定回答标志
*
* Called from : NormalCommand()
*
* Description : 一般命令回答
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CTcp103::NormalAnswer(unsigned char bInf, bool bSign)
{
SYSTEMTIME systime;
DATA_STR DataInfo; //数据信息格式
memset(&DataInfo, 0x00, sizeof(DATA_STR));
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x13;
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 = 0x01;
DataInfo.AsduHead.bAsduVsq = 0x81;
if (bSign)
{
DataInfo.AsduHead.nAsduCot = 0x0014; //成功
}
else
{
DataInfo.AsduHead.nAsduCot = 0x0015; //失败
}
DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
DataInfo.AsduHead.bAsduFun = 0xb2;//??
DataInfo.AsduHead.bAsduInf = bInf;
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
DataInfo.bDataVec.push_back(m_bFrameBuf[14]);
GetLocalTime(&systime);
DataInfo.bDataVec.push_back(systime.wMilliseconds % 1000);
DataInfo.bDataVec.push_back(systime.wMilliseconds / 1000);
DataInfo.bDataVec.push_back(systime.wMinute & 0x3f);
DataInfo.bDataVec.push_back(systime.wHour & 0x1f);
DataInfo.bDataVec.push_back(m_bFrameBuf[15]); //RII标示号
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
return;
}
/*====================================================================================
*
* Subroutine : SettingOperate()
*
* Parameters : bInf: 信息序号
*
*
* Called from : UnpackData()
*
* Description : 定值操作
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CTcp103::SettingOperate(unsigned char bInf)
{
SettingNo(bInf);
return;
}
/*====================================================================================
*
* Subroutine : SettingNo()
*
* Parameters : bInf: 信息序号
*
*
* Called from : SettingOperate()
*
* Description : 装置未连接时定值命令的打包数据
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CTcp103::SettingNo(unsigned char bInf, bool bSign)
{
int i = 0; //常用变量
unsigned char bVsq = 0; //可变结构限定词
DATA_STR DataInfo; //数据信息格式
memset(&DataInfo, 0x00, sizeof(DATA_STR));
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x13;
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 = 0x61;
DataInfo.AsduHead.bAsduVsq = m_bFrameBuf[7];
DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
DataInfo.AsduHead.bAsduFun = 0xb2;//??
DataInfo.AsduHead.bAsduInf = m_bFrameBuf[13];
if (bSign)
{
DataInfo.AsduHead.nAsduCot = 0x0014;
}
else
{
DataInfo.AsduHead.nAsduCot = 0x0015;
}
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
DataInfo.bDataVec.push_back(m_bFrameBuf[14]);
DataInfo.bDataVec.push_back(m_bFrameBuf[15]);
for (i=0; i<bVsq; ++i)
{
if (m_bFrameLen <= (10+i*3))
{
break;
}
DataInfo.bDataVec.push_back(m_bFrameBuf[16+i*3]);
DataInfo.bDataVec.push_back(m_bFrameBuf[17+i*3]);
DataInfo.bDataVec.push_back(m_bFrameBuf[18+i*3]);
}
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
}
/*====================================================================================
*
* Subroutine : RtuControl()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 控制命令
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CTcp103::RtuControl(void)
{
int nResult = 0; //常用变量,返回值
int pot = 0; //CDT信息点
unsigned char bNode = 0; //节点号
CTRL_VALUE CtrlValue; //下发命令结构体
unsigned char bType = 1; //1为无用
memset(&CtrlValue, 0x00, sizeof(CTRL_VALUE));
bNode = m_bFrameBuf[11];
nResult = CheckNode();
pot = ReadYXInfCDT(m_bFrameBuf[13]);
if ((nResult != 0) && (pot != 0)) //装置通信正常
{
CtrlValue.bAddress = bNode;
CtrlValue.nPotValue = pot;
CtrlValue.iValue = m_bFrameBuf[14] & 0x03;
bType = m_bFrameBuf[14] >> 6;
switch (bType)
{
case 0x02: //选择
CtrlValue.eCmdType = COMMAND_SEL_CTRL;
g_soedata.InsCtrlData(CtrlValue);
break;
case 0x00://执行
CtrlValue.eCmdType = COMMAND_EXE_CTRL;
g_soedata.InsCtrlData(CtrlValue);
break;
case 0x03://撤销
CtrlValue.eCmdType = COMMAND_CANCEL_CTRL;
g_soedata.InsCtrlData(CtrlValue);
break;
case 0x01://无用
break;
default:
break;
}
}
else //装置未通信
{
RtuAnswerNo();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -