📄 sypbprotocol.cpp
字号:
}
count+=8;
count+=2;
if(mTreadBuf->DataBuf[count] == 0x01 && mTreadBuf->DataBuf[count+1] == 0x00) /*正确确认*/
{
pQueueEle->cnCtl[0] = 0x03;
pQueueEle->nDataLenth =1;
pQueueEle->strData = new char[pQueueEle->nDataLenth];
pQueueEle->strData[0] = 14;
nFlag = 1;
}
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x00) /*错误确认*/
{
pQueueEle->cnCtl[0] = 0x04;
pQueueEle->nDataLenth =1;
pQueueEle->strData = new char[pQueueEle->nDataLenth];
pQueueEle->strData[0] = 1;
nFlag = 1;
}
count+=2;
break;
case YHAFN_RESET: //复位
switch(mTreadBuf->DataBuf[count+7]&0x60 >> 5) //SEQ判断是否有后续帧
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
}
if(mTreadBuf->DataBuf[count] & 0x40 >>6) //表示是自动任务上报
{
}
count+=8;
if(mTreadBuf->DataBuf[count]==0 && mTreadBuf->DataBuf[count+1]==0)
{
pQueueEle->devAddr[5] = 0x00;
}
else
{
nTemp=(int)(log10(mTreadBuf->DataBuf[count+1])/log10(2));
pQueueEle->devAddr[5] = nTemp*8 + (int)(log10(mTreadBuf->DataBuf[count])/log10(2)) + 1;
}
count+=2;
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x00)
{
}
break;
case YHAFN_CHECK: //链路检查
switch(mTreadBuf->DataBuf[count+7]&0x60 >> 5) //SEQ判断是否有后续帧
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
}
if(mTreadBuf->DataBuf[count] & 0x40 >>6) //表示是自动任务上报
{
}
count+=8;
if(mTreadBuf->DataBuf[count]==0 && mTreadBuf->DataBuf[count+1]==0)
{
pQueueEle->devAddr[5] = 0x00;
}
else
{
nTemp=(int)(log10(mTreadBuf->DataBuf[count+1])/log10(2));
pQueueEle->devAddr[5] = nTemp*8 + (int)(log10(mTreadBuf->DataBuf[count])/log10(2)) + 1;
}
count+=2;
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x00)
{
}
break;
case YHAFN_RELAY: //中继
switch(mTreadBuf->DataBuf[count+7]&0x60 >> 5) //SEQ判断是否有后续帧
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
}
if(mTreadBuf->DataBuf[count] & 0x40 >>6) //表示是自动任务上报
{
}
count+=8;
if(mTreadBuf->DataBuf[count]==0 && mTreadBuf->DataBuf[count+1]==0)
{
pQueueEle->devAddr[5] = 0x00;
}
else
{
nTemp=(int)(log10(mTreadBuf->DataBuf[count+1])/log10(2));
pQueueEle->devAddr[5] = nTemp*8 + (int)(log10(mTreadBuf->DataBuf[count])/log10(2)) + 1;
}
count+=2;
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x00)
{
}
break;
case YHAFN_SETDATA: //设置参数
switch(mTreadBuf->DataBuf[count+7]&0x60 >> 5) //SEQ判断是否有后续帧
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
}
if(mTreadBuf->DataBuf[count] & 0x40 >>6) //表示是自动任务上报
{
}
count+=8;
if(mTreadBuf->DataBuf[count]==0 && mTreadBuf->DataBuf[count+1]==0)
{
pQueueEle->devAddr[5] = 0x00;
}
else
{
nTemp=(int)(log10(mTreadBuf->DataBuf[count+1])/log10(2));
pQueueEle->devAddr[5] = nTemp*8 + (int)(log10(mTreadBuf->DataBuf[count])/log10(2)) + 1;
}
count+=2;
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x00)
{
}
break;
case YHAFN_CORTROL: //控制命令
switch(mTreadBuf->DataBuf[count+7]&0x60 >> 5) //SEQ判断是否有后续帧
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
}
if(mTreadBuf->DataBuf[count] & 0x40 >>6) //表示是自动任务上报
{
}
count+=8;
if(mTreadBuf->DataBuf[count]==0 && mTreadBuf->DataBuf[count+1]==0)
{
pQueueEle->devAddr[5] = 0x00;
}
else
{
nTemp=(int)(log10(mTreadBuf->DataBuf[count+1])/log10(2));
pQueueEle->devAddr[5] = nTemp*8 + (int)(log10(mTreadBuf->DataBuf[count])/log10(2)) + 1;
}
count+=2;
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x00)
{
}
break;
case YHAFN_LOOKUP: //查询参数
switch((mTreadBuf->DataBuf[count+7] & 0x60) >> 5) //SEQ判断是否有后续帧
{
case 0:
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x10; //多帧标志上行数据
pQueueEle->bGetCTData = true;
break;
case 1:
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x00; //多帧最后一帧标志上行数据
pQueueEle->bGetCTData = false;
break;
case 2:
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x10; //多帧标志上行数据
pQueueEle->bGetCTData = true;
break;
case 3:
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x00; //单帧标志上行数据
pQueueEle->bGetCTData = false;
break;
}
if(mTreadBuf->DataBuf[count] & 0x40 >>6) //表示是自动任务上报
{
pQueueEle->autoTaskInfo.chAutoTask = 1;
pQueueEle->nCountRTU = mTreadBuf->DataBuf[count] & 0x0f;
}
count+=8;
if(mTreadBuf->DataBuf[count]==0 && mTreadBuf->DataBuf[count+1]==0)
{
pQueueEle->devAddr[5] = 0x00;
}
else
{
nTemp=(int)(log10(mTreadBuf->DataBuf[count+1])/log10(2));
pQueueEle->devAddr[5] = nTemp*8 + (int)(log10(mTreadBuf->DataBuf[count])/log10(2)) + 1;
}
count+=2;
if(mTreadBuf->DataBuf[count] == 0x04 && mTreadBuf->DataBuf[count+1] == 0x00) //IP与端口号
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x13;
pQueueEle->cnCtl[2] = 0x01;
}
if(mTreadBuf->DataBuf[count] == 0x01 && mTreadBuf->DataBuf[count+1] == 0x10) //终端通信方式及参数
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x13;
pQueueEle->cnCtl[2] = 0x02;
pQueueEle->nDataLenth =71;
pQueueEle->strData = new char[pQueueEle->nDataLenth];
memset( pQueueEle->strData, 0, pQueueEle->nDataLenth );
memcpy( pQueueEle->strData, &mTreadBuf->DataBuf[count+2], pQueueEle->nDataLenth);
nFlag = 1;
}
if(mTreadBuf->DataBuf[count] == 0x80 && mTreadBuf->DataBuf[count+1] == 0x02) //抄表间隔
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x13;
pQueueEle->cnCtl[2] = 0x04;
pQueueEle->nDataLenth =1;
pQueueEle->strData = new char[pQueueEle->nDataLenth];
memset( pQueueEle->strData, 0, 1 );
memcpy( pQueueEle->strData, &mTreadBuf->DataBuf[count+2], 1 );
nFlag = 1;
}
if(mTreadBuf->DataBuf[count] == 0x01 && mTreadBuf->DataBuf[count+1] == 0x08) //读一类任务数据
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x14;
pQueueEle->cnCtl[2] = 0x01;
}
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x08) //读二类任务数据
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x14;
pQueueEle->cnCtl[2] = 0x01;
}
if(mTreadBuf->DataBuf[count] == 0x80 && mTreadBuf->DataBuf[count+1] == 0x00) //读终端告警项
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x16;
pQueueEle->cnCtl[2] = 0x02;
pQueueEle->nDataLenth =1;
pQueueEle->strData = new char[pQueueEle->nDataLenth];
memset( pQueueEle->strData, 0, 1 );
if((mTreadBuf->DataBuf[count+4] & 0x10) == 0x10) //终端故障
pQueueEle->strData[0] |= 0x10;
if((mTreadBuf->DataBuf[count+3] & 0x02) == 0x02) //电压异常
pQueueEle->strData[0] |= 0x01;
if((mTreadBuf->DataBuf[count+3] & 0x01) == 0x01) //电流异常
pQueueEle->strData[0] |= 0x02;
if((mTreadBuf->DataBuf[count+3] & 0x04) == 0x04) //相序异常
pQueueEle->strData[0] |= 0x04;
if((mTreadBuf->DataBuf[count+3] & 0x20) == 0x20) //终端停上电
pQueueEle->strData[0] |= 0x08;
nFlag = 1;
}
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x01) //读终端表号
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x17;
pQueueEle->cnCtl[2] = 0x02;
}
if(mTreadBuf->DataBuf[count] == 0x04 && mTreadBuf->DataBuf[count+1] == 0x05) //读终端滑差时间
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x0D;
pQueueEle->cnCtl[2] = 0x01;
}
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x08) //查询2类数据自动任务
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x15;
pQueueEle->cnCtl[2] = 0x01;
}
if(mTreadBuf->DataBuf[count] == 0x01 && mTreadBuf->DataBuf[count+1] == 0x03) //电能表基本参数
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x1A;
pQueueEle->cnCtl[2] = 0x01;
pQueueEle->nDataLenth =8;
pQueueEle->strData = new char[pQueueEle->nDataLenth];
memset( pQueueEle->strData, 0, 8 );
memcpy( pQueueEle->strData, &mTreadBuf->DataBuf[count+2], 8 );
nFlag = 1;
}
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x03) //电能表限制参数
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueEle->cnCtl[1] = 0x1A;
pQueueEle->cnCtl[2] = 0x02;
pQueueEle->nDataLenth =27;
pQueueEle->strData = new char[pQueueEle->nDataLenth];
memset( pQueueEle->strData, 0, 27 );
memcpy( pQueueEle->strData, &mTreadBuf->DataBuf[count+2], 27 );
nFlag = 1;
}
break;
case YHAFN_ASKONEDATA:
switch((mTreadBuf->DataBuf[count+7] & 0x60) >> 5) //SEQ判断是否有后续帧
{
case 0:
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x10; //多帧标志上行数据
pQueueEle->bGetCTData = true;
break;
case 1:
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x00; //多帧最后一帧标志上行数据
pQueueEle->bGetCTData = false;
break;
case 2:
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x10; //多帧标志上行数据
pQueueEle->bGetCTData = true;
break;
case 3:
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x00; //单帧标志上行数据
pQueueEle->bGetCTData = false;
break;
}
if(mTreadBuf->DataBuf[count] & 0x40 >>6) //表示是自动任务上报
{
pQueueEle->autoTaskInfo.chAutoTask = 1;
pQueueEle->nCountRTU = mTreadBuf->DataBuf[count] & 0x0f;
}
count+=8;
if(mTreadBuf->DataBuf[count]==0 && mTreadBuf->DataBuf[count+1]==0)
{
pQueueEle->devAddr[5] = 0x00;
}
else
{
nTemp=(int)(log10(mTreadBuf->DataBuf[count+1])/log10(2));
pQueueEle->devAddr[5] = nTemp*8 + (int)(log10(mTreadBuf->DataBuf[count])/log10(2)) + 1;
}
count+=2;
if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x00) //读终端时间
{
pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x03;
pQueueE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -