📄 tcp103.cpp
字号:
return;
}
/*====================================================================================
*
* Subroutine : RtuAnswerNo()
*
* Parameters :
*
*
* Called from : RtuControl()
*
* Description : 控制命令不成功
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CTcp103::RtuAnswerNo(void)
{
DATA_STR DataInfo; //数据信息格式
memset(&DataInfo, 0x00, sizeof(DATA_STR));
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x0e;
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 = 0x0076; //失败
DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
DataInfo.AsduHead.bAsduFun = 0xb2;//??
DataInfo.AsduHead.bAsduInf = m_bFrameBuf[13];
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
DataInfo.bDataVec.push_back(m_bFrameBuf[14]);
DataInfo.bDataVec.push_back(m_bFrameBuf[15]); //RII标示号
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
}
/*====================================================================================
*
* Subroutine : GetYC()
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 遥测量响应
*
* Return :
*
*
* Modification:
* 2004-12-28:
*
*====================================================================================*/
void CTcp103::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();
//////////////??
nResult = 1;
//////////////
if (nResult != 0)
{
nNumber = g_devdata.CountDevData(m_nPortNo, DATA_YC);
//////////////??
nNumber = 10;
//////////////
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 = 0x32;
DataInfo.AsduHead.bAsduVsq = (unsigned char)nNumber;//??
DataInfo.AsduHead.nAsduCot = 0x0002;
DataInfo.AsduHead.nAsduComAddr = m_iAddress*0x100 + 0x01;//bSector;//??
DataInfo.AsduHead.bAsduFun = 0xb2;//??
DataInfo.AsduHead.bAsduInf = 0x94;//??
for (i=0; i<nNumber; ++i)
{
g_devdata.GetFixDevData(m_nPortNo, i, DATA_YC, DataGroup);
DataInfo.bDataVec.push_back(DataGroup.nValue & 0xff);
DataInfo.bDataVec.push_back(DataGroup.nValue / 0xff);
if (i<nNumber-1)
{
DataInfo.bDataVec.push_back(0x94+i+1);
}
}
//如果增加频率,可在此处添加
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
}
return;
}
/*====================================================================================
*
* Subroutine : PutSendList()
*
* Parameters :
*
*
* Called from : PackData()
*
* Description : 打包主动上送信息,存入m_SendList队列中
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
int CTcp103::PutSendList()
{
int ret = 0;
int nResult = 0; //返回值变量
int nResult1 = 0; //返回值变量
SOE_STATUS soe_status; //收到信息数据结构
DATA_STR DataInfo; //数据信息格式
enum GateStation eStation; //站类型
memset(&soe_status, 0x00, sizeof(SOE_STATUS));
memset(&DataInfo, 0x00, sizeof(DATA_STR));
GetGateStation(eStation);
nResult1 = g_soedata.GetSoeData(eStation, soe_status);
if (nResult1)
{
DataInfo.ApduHead.bStartCode = 0x68;
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.bAsduVsq = 0x81;
DataInfo.AsduHead.nAsduCot = 0x0001;
DataInfo.AsduHead.bAsduFun = 0xb2;//??
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
//asdu类型需要配置??
switch (soe_status.eType)
{
case INFDATA_YX: //遥信变位
if (soe_status.nPot < 512)
{
DataInfo.AsduHead.nAsduComAddr = m_iAddress * 0x100
+ m_bSector[soe_status.nPot];//??soe_status.bAddress;
DataInfo.AsduHead.bAsduInf = m_bYXInfBuf[soe_status.nPot];//??
}
else
{
//有问题了
}
DataInfo.ApduHead.bApduLength = 0x12;
DataInfo.AsduHead.bAsduType = 0x01;
DataInfo.bDataVec.push_back(soe_status.bStatus);
DataInfo.bDataVec.push_back(soe_status.wMilliseconds % 0x100);
DataInfo.bDataVec.push_back(soe_status.wMilliseconds / 0x100);
DataInfo.bDataVec.push_back(soe_status.bMinute);
DataInfo.bDataVec.push_back(soe_status.bHour);
DataInfo.bDataVec.push_back(0);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
nResult = 1;
break;
case INFDATA_SOE:
DataInfo.AsduHead.nAsduComAddr = m_iAddress * 0x100
+ m_bSector[soe_status.nPot];//??soe_status.bAddress;
ret = ReadSOEInf103(soe_status.nPot);
if (ret!=0)
{
DataInfo.AsduHead.bAsduInf = ret;//??
}
else
{
break;
}
DataInfo.ApduHead.bApduLength = 0x16;
DataInfo.AsduHead.bAsduType = 0x02;
DataInfo.bDataVec.push_back(soe_status.bStatus);
DataInfo.bDataVec.push_back(0);//相对时间
DataInfo.bDataVec.push_back(0);//相对时间
DataInfo.bDataVec.push_back(0);//(soe_status.wSerial % 0x100);//故障信号
DataInfo.bDataVec.push_back(0);//(soe_status.wSerial / 0x100);//故障信号
DataInfo.bDataVec.push_back(soe_status.wMilliseconds % 0x100);
DataInfo.bDataVec.push_back(soe_status.wMilliseconds / 0x100);
DataInfo.bDataVec.push_back(soe_status.bMinute);
DataInfo.bDataVec.push_back(soe_status.bHour);
DataInfo.bDataVec.push_back(0);//SIN=0无关
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
nResult = 1;
break;
case INFDATA_YK_SEL: //遥控返校,选择
case INFDATA_YK_EXE: //遥控返校,执行
if (soe_status.nPot < 512)
{
DataInfo.AsduHead.nAsduComAddr = m_iAddress * 0x100
+ m_bSector[soe_status.nPot];//??soe_status.bAddress;
DataInfo.AsduHead.bAsduInf = m_bYXInfBuf[soe_status.nPot];//??
}
else
{
//有问题了
}
DataInfo.ApduHead.bApduLength = 0x0e;
DataInfo.AsduHead.bAsduType = 0x40;
if ((soe_status.bStatus == 1)
|| (soe_status.bStatus == 2))
{
DataInfo.AsduHead.nAsduCot = 0x000c; //肯定回答
}
else
{
DataInfo.AsduHead.nAsduCot = 0x004c; //否定回答
}
if (soe_status.eType == INFDATA_YK_SEL)
{
DataInfo.bDataVec.push_back(soe_status.bStatus|0x80); //选择
}
else
{
DataInfo.bDataVec.push_back(soe_status.bStatus); //执行
}
DataInfo.bDataVec.push_back(0);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
m_wSendCount += 2; //最低位未使用
nResult = 1;
break;
default:
break;
}
}
return nResult;
}
/*====================================================================================
*
* Subroutine : ID_State()
*
* Parameters : bAddr: 装置地址
* bState: 装置状态 1 投入 2退出
*
*
* Called from : TcpHeart()
*
* Description : 打包装置状态上送信息,存入m_SendList队列中
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void CTcp103::ID_State(BYTE bAddr, BYTE bState)
{
SYSTEMTIME systime; //时间结构体
DATA_STR DataInfo; //数据信息格式
memset(&DataInfo, 0x00, sizeof(DATA_STR));
GetLocalTime(&systime);
DataInfo.ApduHead.bStartCode = 0x68;
DataInfo.ApduHead.bApduLength = 0x14;
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;
DataInfo.AsduHead.nAsduCot = 0x0001;
DataInfo.AsduHead.nAsduComAddr = bAddr*0x100;
DataInfo.AsduHead.bAsduFun = 0xbb;//187
DataInfo.AsduHead.bAsduInf = 0xc0;
if (!DataInfo.bDataVec.empty())
{
DataInfo.bDataVec.clear();
}
DataInfo.bDataVec.push_back(bState);
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(systime.wDay & 0x1f);
DataInfo.bDataVec.push_back(systime.wMonth & 0x1f);
DataInfo.bDataVec.push_back(systime.wYear % 100);
m_SendList.push_back(DataInfo);
DataInfo.bDataVec.clear();
return;
}
/*====================================================================================
*
* Subroutine : ReadYXInf103()
*
* Parameters :
*
*
*
* Called from : CTcp103()
*
* Description : 读取103遥信信息表
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
int CTcp103::ReadYXInf103()
{
FILE *fp;
char Temp_buf[255];
int bNumber = 0;
int bResult = 1;
fp=fopen("yx103.txt","r");
if(fp!=NULL)
{
char* str=fgets(Temp_buf,80,fp);
if (str==0)
{
bResult = 0;
return bResult;
}
sscanf(str,"%d\n",&bNumber);
for (int i=0; i<bNumber; i++)
{
fscanf(fp, "%d %d\n", &m_bSector[i], &m_bYXInfBuf[i]);
}
fclose(fp);
}
else
{
bResult = 0;
}
return bResult;
}
/*====================================================================================
*
* Subroutine : ReadSOEInf103()
*
* Parameters :
*
*
*
* Called from : PutSendList()
*
* Description : 读取103遥信信息表
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
int CTcp103::ReadSOEInf103(int pot)
{
FILE *fp;
char Temp_buf[255];
int bNumber = 0;
int pot103 = 0;
int potCDT = 0;
fp=fopen("soe103.txt","r");
if(fp!=NULL)
{
char* str=fgets(Temp_buf,80,fp);
if (str==0)
{
pot103 = 0;
return pot103;
}
sscanf(str,"%d\n",&bNumber);
for (int i=0; i<bNumber; i++)
{
fscanf(fp, "%d %d\n", &potCDT, &pot103);
if (pot == potCDT) break;
}
fclose(fp);
}
else
{
pot103 = 0;
}
return pot103;
}
/*====================================================================================
*
* Subroutine : ReadYXInfCDT()
*
* Parameters :
*
*
*
* Called from : CTcp103()
*
* Description : 读取CDT遥信信息
*
* Return : CDT信息值
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
int CTcp103::ReadYXInfCDT(BYTE pot)
{
int nResult = 0;
int i = 0;
int size = 0;
size = sizeof(m_bYXInfBuf)/sizeof(BYTE);
for(i=0; i<size; i++)
{
if (m_bYXInfBuf[i] == pot)
{
nResult = i;
break;
}
}
return nResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -