📄 101.c
字号:
#include "101.h"
#include "yx_key.h"
#include "static.h"
#include "DataDef.h"
void EncodeFixedLenFrame(void)
{
BYTE temp;
strcontrol.DIR=1;
strcontrol.PRM=0;
TCommCode[0]=0x10; //start code
memcpy(&TCommCode[1],&strcontrol,1);
memcpy(&TCommCode[2],&TTU_RunParam.AddrOfTTU,1);
temp=CheckSum(&TCommCode[1],2);
memcpy(&TCommCode[3],&temp,1);
TCommCode[4]=EndCode; //end code
m_EnCur=5;
CommState.TxWait=1;
TxGap=TTU_RunParam.PWM_SET; ; //发送间隙
CS485TransmitEnable; //485发送使能
IE2 |= UTXIE1;
}
void EncodeVariableLenFrame(BYTE nTypeIdentity,BYTE nCause,BYTE nFuction,BYTE nGroup)//..........................................0
{
EncodeASDUFrame(nTypeIdentity,nCause,nFuction,nGroup);
EncodeStartFrame(nASDULen);
EncodeEndFrame(nASDULen);
m_EnCur=nASDULen+8; //length of the whole frame
CommState.TxWait=1;
TxGap=TTU_RunParam.PWM_SET; ; //发送间隙
if(TTU_RunParam.TTU_Control_Param & BIT1 ) //发送间隙变长,用于载波通讯
{
if(m_EnCur >128)
TxGap <<=2; //发送间隙
else
{
if(m_EnCur >64)
TxGap <<=1; //发送间隙
}
}
CS485TransmitEnable;
IE2 |= UTXIE1;
}
void EncodeStartFrame(BYTE nASDULen)//...........................................................................................2
{
TCommCode[0]=StartCode;
TCommCode[1]=nASDULen+2; //L
TCommCode[2]=nASDULen+2; //L
TCommCode[3]=StartCode;
memcpy(&TCommCode[4],&strcontrol,1);
TCommCode[5]=TTU_RunParam.AddrOfTTU; //the address of substation
}
void EncodeASDUFrame(BYTE nTypeIdentity,BYTE nCause,BYTE nFuction,BYTE nGroup)//................................................1
{
int i;
BYTE nRecords=0,temp=0;
BYTE *pd;
long tt;
strcontrol.DIR=1;
strcontrol.PRM=0;
strcontrol.FUNCTION=nFuction;
nVarQualifier.SQ=1;
nTransCause.PN=0;
TCommCode[6]=nTypeIdentity; //type indentity
nTransCause.T=0;
nTransCause.CAUSE=nCause;
memcpy(&TCommCode[8],&nTransCause,1);
TCommCode[9]=TTU_RunParam.AddrOfTTU; //application sevice data unit address
if(nTypeIdentity==C_TS_NB_1) //test channel
{
nTransCause.T=1;
memcpy(&TCommCode[8],&nTransCause,1);
nVarQualifier.SQ=0;
nVarQualifier.NumsOfObject=1;
memcpy(&TCommCode[7],&nVarQualifier,1);
TCommCode[10]=0; //INFORMATION OBJECT ADDRESS
TCommCode[11]=0;
TCommCode[12]=0xAA;
TCommCode[13]=0X55;
nASDULen=8;
}
//DATA UNIT INDENTIFIER
if(nTypeIdentity==C_IC_NA_1) // Total Interrogation command confirm
{
if(nGroup==20) //总召唤确认帧
{
nVarQualifier.SQ=0;
nVarQualifier.NumsOfObject=1;
memcpy(&TCommCode[7],&nVarQualifier,1);
TCommCode[10]=0; //INFORMATION OBJECT ADDRESS
TCommCode[11]=0;
TCommCode[12]=20; //QOI
nASDULen=7;
return;
}
//************
if(nGroup==29) //分组召唤第9组响应 不带品质描述 图105
{
nVarQualifier.NumsOfObject= P_YC_MAX; //32 yc value here (把时间做为最后一个遥测量)
memcpy(&TCommCode[7],&nVarQualifier,1);
TCommCode[10]=0x01; //INFORMATION OBJECT ADDRESS
TCommCode[11]=0x07;
memcpy(&TCommCode[12],&BD_data.Ua,58);
nASDULen= 64;
return;
}
if(nGroup==21) //第1组分组召唤响应 图106
{
TCommCode[6]=0x01;
nVarQualifier.NumsOfObject=20;
memcpy(&TCommCode[7],&nVarQualifier,1);
TCommCode[10]=0x01; //INFORMATION OBJECT ADDRESS
TCommCode[11]=0x0;
//yao xin value
for(i=1;i<5;i++)
{
TCommCode[11+i] = (YxNew>>i) & (BIT0);
}
temp=16;
for(i=0;i<16;i++)
{
TCommCode[temp++] = (YxInNew>>i) & (BIT0);
}
nASDULen=26;//58
return;
}
//*********************
}
if(nTypeIdentity==M_SP_NA_1) //单点遥信或单点遥信变化响应 1
{
nVarQualifier.SQ=0;
strcontrol.FUNCTION=8;
nVarQualifier.NumsOfObject=20; //20路遥信
memcpy(&TCommCode[7],&nVarQualifier,1);
temp=10;
for(i=1;i<5;i++)
{
TCommCode[temp++]= i; //information address
TCommCode[temp++]=0;
TCommCode[temp++] = (YxNew>>i) & (BIT0);
}
for(i=0;i<16;i++)
{
TCommCode[temp++]= i+5; //information address
TCommCode[temp++]=0;
TCommCode[temp++] = (YxInNew>>i) & (BIT0);
}
nASDULen=64;
return;
}
if(nTypeIdentity==M_ME_ND_1) //M_ME_ND_1 , 不带品质描述的遥测
{
nVarQualifier.NumsOfObject=P_YC_MAX; //32个量
memcpy(&TCommCode[7],&nVarQualifier,1);
nTransCause.CAUSE=nCause;
TCommCode[10]=0x01; //information object address
TCommCode[11]=0x07;
memcpy(&TCommCode[12],&BD_data.Ua,58);
nASDULen=64;
return ;
}
if(nTypeIdentity==C_IC_NA_1) // Total Interrogation command end
{
nVarQualifier.NumsOfObject=1;
memcpy(&TCommCode[7],&nVarQualifier,1);
TCommCode[10]=0; //INFORMATION OBJECT ADDRESS
TCommCode[11]=0;
TCommCode[12]=20; //QOI
nASDULen=7;
return;
}
if(nTypeIdentity==M_EI_NA_1) //End of initialisation
{
nVarQualifier.SQ=0;
nTransCause.PN=0;
nVarQualifier.NumsOfObject=1;
memcpy(&TCommCode[7],&nVarQualifier,1);
TCommCode[10]=0; //INFORMATION OBJECT ADDRESS
TCommCode[11]=0;
TCommCode[12]=nCOI; //COI mark the cause of initialisation
nASDULen=7;
return;
}
if(nTypeIdentity== 9) //无品质描述的遥测数据变化响应
{
nTransCause.PN=0;
nVarQualifier.NumsOfObject=P_YC_MAX;
memcpy(&TCommCode[7],&nVarQualifier,1);
temp=10;
pd=(BYTE*)(&BD_data);
TCommCode[temp++]=0x01;
TCommCode[temp++]=0x07;
for(i=0;i<29;i++)
{
TCommCode[temp++]=*pd;pd++;
TCommCode[temp++]=*pd;pd++;
TCommCode[temp++]=0;
}
nASDULen=temp-6; //29*4+4;
return;
}
if(nTypeIdentity==M_SP_TA_1) //Single-point information with time tag (here is SOE)
{
nVarQualifier.SQ=0;
temp=10;
if(DeviceState.bSOEOverFlow==0)
{
for(i=0;i<nSOERecords;i++)
{
TCommCode[temp++]=soe[i].SOE_ID; //INFORMATION OBJECT ADDRESS
TCommCode[temp++]=0x00;
TCommCode[temp++]=soe[i].SPI;
TCommCode[temp++]=(BYTE)soe[i].MillSecond; //ms
TCommCode[temp++]=(BYTE)(soe[i].MillSecond>>8); //ms
TCommCode[temp++]=soe[i].Minute; //minu
}
nVarQualifier.NumsOfObject=nSOERecords; //16 SOE here
}
else
{
nRecords=nSOERecords;
for(i=0;i<16;i++)
{
TCommCode[temp++]=soe[nRecords].SOE_ID; //INFORMATION OBJECT ADDRESS
TCommCode[temp++]=0x00;
TCommCode[temp++]=soe[nRecords].SPI;
TCommCode[temp++]=(BYTE)soe[nRecords].MillSecond; //ms
TCommCode[temp++]=(BYTE)(soe[nRecords].MillSecond>>8); //ms
TCommCode[temp++]=soe[nRecords].Minute; //minu
nRecords++;
if(nRecords>15)
nRecords=0;
}
nVarQualifier.NumsOfObject=16; //16 SOE here
}
memcpy(&TCommCode[7],&nVarQualifier,1);
nASDULen=nVarQualifier.NumsOfObject*6+ 4 ;
return;
}
if(nTypeIdentity==M_IT_NA_1) //某一组的电能脉冲记数量
{
TCommCode[6]=M_IT_NA_1;
if(nGroup==0x41) //the first group 电镀量
{
nVarQualifier.NumsOfObject=MAXDD; // 4 sequence information
nVarQualifier.SQ=0;
memcpy(&TCommCode[7],&nVarQualifier,1);
temp=10;
for(i=0;i<MAXDD;i++)
{
TCommCode[temp++]=0x01+i; //INFORMATION OBJECT ADDRESS
TCommCode[temp++]=0x0c;
tt = ReadOneD2(i);
//Read1024(0,PVPOWERB+(i<<2),TCommCode+temp,4);
memcpy(&TCommCode[temp],&tt,4);
temp += 4;
}
nASDULen= 32+8;
return ;
}
if(nGroup==0x42) //the second sequence 停电记录
{
nVarQualifier.NumsOfObject=RunState.nOffRecords; // 9 sequence information
nVarQualifier.SQ=0;
memcpy(&TCommCode[7],&nVarQualifier,1);
temp=10;
for(i=0;i<RunState.nOffRecords;i++)
{
TCommCode[temp++]=0x05+i; //INFORMATION OBJECT ADDRESS
TCommCode[temp++]=0x0C;
memcpy(TCommCode+temp, &off_time[i].DomainFlag,sizeof(OffTimeData) );
temp+=sizeof(OffTimeData);
}
nASDULen= temp-6;// nOffRecords*8+4 ;
return;
}
if(nGroup==0x43) //遥测越县记录
{
nVarQualifier.NumsOfObject=RunState.ValidRecords; // 8 sequence information
nVarQualifier.SQ=0;
memcpy(&TCommCode[7],&nVarQualifier,1);
temp=10;
//yc overlimits records
for(i=0;i<RunState.ValidRecords;i++)
{
TCommCode[temp++]=0x0e+i; //INFORMATION OBJECT ADDRESS
TCommCode[temp++]=0x0C; //
TCommCode[temp++]=over_limit[i].YCcode;
TCommCode[temp++]=over_limit[i].OverLimitCode;
TCommCode[temp++]=over_limit[i].OverLimitValue;
TCommCode[temp++]=over_limit[i].OverLimitValue>>8;
TCommCode[temp++]=over_limit[i].UpTimeStart;
TCommCode[temp++]=over_limit[i].UpTimeStart>>8;
TCommCode[temp++]=over_limit[i].UpTimeEnd;
TCommCode[temp++]=over_limit[i].UpTimeEnd>>8;
TCommCode[temp++]=i+1; //mark sequence
}
nASDULen= RunState.ValidRecords*11+4 ;
return;
}
if(nGroup==0x44) //统计数据状态记录
{
nVarQualifier.NumsOfObject=sizeof(RTSTATE); // 9 sequence information
nVarQualifier.SQ=0;
memcpy(&TCommCode[7],&nVarQualifier,1);
memcpy(&TCommCode[10],&(RunState.ARunTime),sizeof(RTSTATE));
nASDULen=sizeof(RTSTATE)+4 ;
return;
}
}
if(nTypeIdentity==C_DC_NA_1) // yk command confirm frame 46
{
if(nGroup==1)
{
nTransCause.PN=1; //否定认可
memcpy(&TCommCode[8],&nTransCause,1);
}
nVarQualifier.SQ=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -