📄 sypbprotocol.cpp
字号:
if(pQueueEle->strData[8+n*3+2] == 0x10 && pQueueEle->strData[8+n*3+3] == 0x05)//日统计无功功率值(日统计数据A、B、C三相)
{
mTreadBuf->DataBuf[count++] = 0x80;
mTreadBuf->DataBuf[count++] = 0x12;
}
}/*end of (for(n=0;n<pQueueEle->strData[8];n++))*/
mTreadBuf->DataBuf[count++] = 0x00; //pw
mTreadBuf->DataBuf[count++] = 0x00;
break;
case 0x02: /*任务启动/停止*/
mTreadBuf->DataBuf[count++] = 0x04; //AFN
mTreadBuf->DataBuf[count++] = 0x60; //SEQ
if(!(pQueueEle->devAddr[5])) //DA
{
mTreadBuf->DataBuf[count++] = 0;
}
else
{
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) % 8));
}
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) / 8-1));
mTreadBuf->DataBuf[count++] = 0x08; //DT
mTreadBuf->DataBuf[count++] = 0x08;
mTreadBuf->DataBuf[count++] = pQueueEle->strData[0];
mTreadBuf->DataBuf[count++] = 0x00; //pw
mTreadBuf->DataBuf[count++] = 0x00;
break;
case 0x03: //AFN //清除自动任务
mTreadBuf->DataBuf[count++] = 0x05; //AFN //清除自动任务
mTreadBuf->DataBuf[count++] = 0x60; //SEQ
mTreadBuf->DataBuf[count++] = 0x00; //p0
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x20; //DT
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = pQueueEle->strData[0];
mTreadBuf->DataBuf[count++] = 0x00; //pw
mTreadBuf->DataBuf[count++] = 0x00;
break;
}/*end of (switch(pQueueEle->cnCtl[2]))*/
break;
case JCCTL_READSUTOMISSION: /*查询自动任务*/
switch(pQueueEle->cnCtl[2])
{
case 0x01: /*查询自动任务*/
mTreadBuf->DataBuf[count++] = 0x0A; //AFN
mTreadBuf->DataBuf[count++] = 0x60; //SEQ
if(!(pQueueEle->devAddr[5]))
{
mTreadBuf->DataBuf[count++] = 0;
}
else
{
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) % 8));
}
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) / 8-1));
mTreadBuf->DataBuf[count++] = 0x02; //二类终端任务DT
mTreadBuf->DataBuf[count++] = 0x08;
break;
}/*end of (switch(pQueueEle->cnCtl[2]))*/
break;
case JCCTL_SETALARM: /*设置告警项*/
switch(pQueueEle->cnCtl[2])
{
case 0x01: /*设置告警项*/
mTreadBuf->DataBuf[count++] = 0x04; //AFN
mTreadBuf->DataBuf[count++] = 0x60; //SEQ
mTreadBuf->DataBuf[count++] = 0x00; //pn
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x80; //DT
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count] = 0x00;
if((pQueueEle->strData[0] & 0x01) == 0x01) //电压异常
{
mTreadBuf->DataBuf[count] |= 0x02;
}
if((pQueueEle->strData[0] & 0x02) == 0x02) //电流异常
{
mTreadBuf->DataBuf[count] |= 0x01;
}
if((pQueueEle->strData[0] & 0x04) == 0x04) //相序异常
{
mTreadBuf->DataBuf[count] |= 0x04;
}
if((pQueueEle->strData[0] & 0x08) == 0x08) //终端停上电
{
mTreadBuf->DataBuf[count] |= 0x20;
}
count++;
mTreadBuf->DataBuf[count] = 0x00;
if((pQueueEle->strData[0] & 0x10) == 0x10) //终端故障
{
mTreadBuf->DataBuf[count] |= 0x10;
}
count++;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0xFF;
mTreadBuf->DataBuf[count++] = 0xFF;
mTreadBuf->DataBuf[count++] = 0xFF;
mTreadBuf->DataBuf[count++] = 0xFF;
mTreadBuf->DataBuf[count++] = 0xFF;
mTreadBuf->DataBuf[count++] = 0xFF;
mTreadBuf->DataBuf[count++] = 0xFF;
mTreadBuf->DataBuf[count++] = 0xFF;
break;
case 0x02: //查询告警事件
mTreadBuf->DataBuf[count++] = 0x0A; //AFN
mTreadBuf->DataBuf[count++] = 0x60; //SEQ
mTreadBuf->DataBuf[count++] = 0x00; //pn
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x80; //DT
mTreadBuf->DataBuf[count++] = 0x00;
break;
}/*end of (switch(pQueueEle->cnCtl[2]))*/
break;
case JCCTL_SETMETERNO: /* 设置表号*/
int i=0;
switch(pQueueEle->cnCtl[2])
{
case 0x01: /*设置表号*/
mTreadBuf->DataBuf[count++] = 0x04; //AFN
mTreadBuf->DataBuf[count++] = 0x60; //SEQ
mTreadBuf->DataBuf[count++] = 0x00; //pn
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x02; //DT
mTreadBuf->DataBuf[count++] = 0x01;
memcpy( &mTreadBuf->DataBuf[count], pQueueEle->strData, pQueueEle->nDataLenth );
for(i=0;i<(unsigned char)pQueueEle->strData[0];i++)
{
mTreadBuf->DataBuf[count+i*17+1] = mTreadBuf->DataBuf[count+i*17+2];
mTreadBuf->DataBuf[count+i*17+3] = 0x01;
mTreadBuf->DataBuf[count+i*17+4] = 0x01;
mTreadBuf->DataBuf[count+i*17+11] = 0x00;
mTreadBuf->DataBuf[count+i*17+12] = 0x00;
mTreadBuf->DataBuf[count+i*17+13] = 0x00;
mTreadBuf->DataBuf[count+i*17+14] = 0x00;
mTreadBuf->DataBuf[count+i*17+15] = 0x00;
mTreadBuf->DataBuf[count+i*17+16] = 0x00;
mTreadBuf->DataBuf[count+i*17+17] = 0x10;
}/*end of (for(i=0;i<(unsigned char)pQueueEle->strData[0];i++))*/
count+=pQueueEle->nDataLenth;
mTreadBuf->DataBuf[count++] = 0x00; //pw
mTreadBuf->DataBuf[count++] = 0x00;
break;
case 0x02: /*读取表号*/
mTreadBuf->DataBuf[count++] = 0x0A; //AFN
mTreadBuf->DataBuf[count++] = 0x60; //SEQ
mTreadBuf->DataBuf[count++] = 0x00; //pn
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x02; //DT
mTreadBuf->DataBuf[count++] = 0x01;
break;
}/*end of (switch(pQueueEle->cnCtl[2]))*/
break;
}/*end of (switch(pQueueEle->cnCtl[1]))*/
}/*end of (switch(pQueueEle->cnCtl[0] & 0x0F) )*/
}/*end of (if(pQueueEle->bAffirm))*/
if(mTreadBuf->DataBuf[13] & 0x80) //如需要时间标签,加入时间标签
{
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x00;
} /*end of (if(mTreadBuf->DataBuf[13] & 0x80))*/
UINT nDataLen=0;
nDataLen = count-6;
nDataLen=(nDataLen<<2) + 0x01;
mTreadBuf->DataBuf[1] = nDataLen & 0x00FF;
mTreadBuf->DataBuf[2] = (nDataLen & 0xFF00) >>8;
mTreadBuf->DataBuf[3] = nDataLen & 0x00FF;
mTreadBuf->DataBuf[4] = (nDataLen & 0xFF00) >>8;
int i=0;
unsigned char usChksum=0x00; //判断校验和
for(i=6;i<count;i++)
{
usChksum+=mTreadBuf->DataBuf[i];
}
mTreadBuf->DataBuf[count++] = usChksum;
mTreadBuf->DataBuf[count++] = 0x16;
return count;
}
extern "C" _declspec(dllexport) BOOL YHIsRcvedFrameDll(ThreadBuf *mTreadBuf, UINT nLenth ) //负责检验终端上报数据是否正确
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
int i,count=0;
if(mTreadBuf->DataBuf[count]!=0x68) //判断数据头
{
return 0;
}
count++;
if(mTreadBuf->DataBuf[count]!=mTreadBuf->DataBuf[count+2])//判断两数据长度是否相同
{
return 0;
}
if(mTreadBuf->DataBuf[count+1]!=mTreadBuf->DataBuf[count+3])
{
return 0;
}
UINT Lenth = 0; //定义数据长度
unsigned char L1,L2;
L1=(mTreadBuf->DataBuf[count+1]<<6 & 0xC0) | mTreadBuf->DataBuf[count]>>2 & 0x3F;
L2=mTreadBuf->DataBuf[count+1]>>2 &0x3F;
Lenth=L1+L2*256;
if((Lenth+8)!=nLenth)
{
return 0;
}
count+=4;
if(mTreadBuf->DataBuf[count]!=0x68) //判断区间同步字
{
return 0;
}
count++;
unsigned char usChksum=0x00; //判断校验和
for(i=0;i<int(Lenth);i++)
{
usChksum+=mTreadBuf->DataBuf[count++];
}
if(mTreadBuf->DataBuf[count]!=usChksum)
{
return 0;
}
count++; //判断数据尾
if(mTreadBuf->DataBuf[count]!=0x16)
{
return 0;
}
return true;
}
extern "C" _declspec(dllexport) UINT YHProtocolToQueueDll(QUEUEELEMENT *pQueueEle, ThreadBuf *mTreadBuf) //负责把厂家协议转化为内部规约
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
UINT count=0;
UINT lenth=0;
int nTemp=0;
int nFlag=0;
if(mTreadBuf->DataBuf[count] != 0x68) //判断帧头
{
return 0;
}
lenth = ((((mTreadBuf->DataBuf[count+2])<<8) + mTreadBuf->DataBuf[count+1]) & 0xFFFC) >> 2;
count+=6;
int nTerAddr=0;
nTerAddr = (mTreadBuf->DataBuf[count+4] << 8) + mTreadBuf->DataBuf[count+3];
CString strAddr;
strAddr.Format("%d",nTerAddr);
CUtilities::StrToBcd( (char *)pQueueEle->TerAddr, strAddr, 2, TRUE ); //区域代码
pQueueEle->TerAddr[2] = mTreadBuf->DataBuf[count+1]; //终端地址
pQueueEle->TerAddr[3] = mTreadBuf->DataBuf[count+2];
pQueueEle->TerAddr[4] = 0x00;
pQueueEle->TerAddr[5] = 0x00;
pQueueEle->cnCtl[0] = 0x00;
UINT nRedLen = 12; //除数据以外的其他数据长度
if(mTreadBuf->DataBuf[count] & 0x20)//存在EC(控制码比较)
{
nRedLen +=2;
}
if(mTreadBuf->DataBuf[count+7] & 0x80)//存在TPV(SEQ比较)
{
nRedLen +=6;
}
switch(mTreadBuf->DataBuf[count] & 0x0f) //银河规约控制码
{
case 0: //返回确认
count+=10;
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 8: //返回数据
switch(mTreadBuf->DataBuf[count] & 0xC0)
{
case 0x80:
switch(mTreadBuf->DataBuf[count+6]) //AFN
{
case YHAFN_AFFIRM: //确认∕否认
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;
} /*end of 有无后续帧判断*/
if(mTreadBuf->DataBuf[count] & 0x40 >>6) //表示是自动任务上报
{
pQueueEle->autoTaskInfo.chAutoTask = 1;
pQueueEle->nCountRTU = mTreadBuf->DataBuf[count] & 0x0f;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -