link101.c
来自「电力变电站RTU监控软件(80C196NT单片机) 遥控」· C语言 代码 · 共 880 行 · 第 1/2 页
C
880 行
}
*(Arg->TxdBuf+Length+4)=chsum;
*(Arg->TxdBuf+Length+5)=0x16;
Sum=Length+6;
}
Tputc(Arg->ComTaskNo,1); //01H
ChangeProWarn(Arg->ComTaskNo,1,Sum);
SetTimer(Arg->ComTaskNo,0);
if(Sum >255) Count=255;
else Count=Sum;
Arg->TxdPtr=Count;
Tputs(Arg->ComTaskNo,&Count,(char FARDATA *)Arg->TxdBuf);
Arg->TxdBufLength=Sum;
Arg->TxdPtr -=Count;
if(Arg->TxdBufLength>Arg->TxdPtr) Arg->TxdStatus=SEND;
}
void IEC101LinkRxFrameType(struct TIEC101LinkStruct FARDATA *Arg)
{
unsigned char ch,control,code,type,TYP,COT,QCC,QOI,DCO,RCO,FrameType;
type=0xff;
control=Arg->TrnLetter[6];//控制帧
ch=control;
code=control;
ch=ch & 0xc0;
code=code & 0x0f;
switch(ch)
{
case HSHUP:/* 主站向子站传输 主站为启动站 */
switch(code)
{
case 0x00:/* 发送/确认帧 复位远方链路 */
type=C_RL_NA_1_SEND;
/* 子站接收到 复位远方链路发送帧 */
break;
case 0x01:/* 发送/确认帧 复位远动终端的用户进程 */
type=C_RP_NA_1ACT;
/* 子站接收到 复位远动终端发送帧 */
break;
case 0x02:/* 发送/确认帧 用于平衡式传输过程测试链路功能 */
type=C_TS_NA_1ACT;
/* 测试通道发送帧 */
break;
case 0x03:/* 发送/确认帧 传送数据 */
TYP=Arg->TrnLetter[8]; /* 类型标识 */
COT=Arg->TrnLetter[10]; /* 传送原因 */
switch(TYP)
{
case 0x46: if(COT==6)
{
DCO=Arg->TrnLetter[14];
if(DCO>=0x80)
{
type=C_DC_NA_1ACT;
/* 遥控选择命令发送帧 */
}else
{
type=C_DC_NA_1EXCO;
/* 遥控执行命令 发送帧 */
}
}else
{
type=C_DC_NA_1DEACT;
/* 遥控撤消命令 发送帧 */
}
break;
case 0x47: if(COT==6)
{
RCO=Arg->TrnLetter[14];
if(RCO>=0x80)
{
type=C_RC_NA_1ACT;
/* 升降选择命令发送帧 */
}else
{
type=C_RC_NA_1EXCO;
/* 升降执行命令 发送帧 */
}
}else
{
type=C_RC_NA_1DEACT;
/* 升降撤消命令 发送帧 */
}
break;
case 0x48: type=C_SE_NA_1ACT;
/* 设点命令 发送帧 */
break;
case 0x64: QOI=Arg->TrnLetter[14];/* 命令限定词 */
if(QOI==20)
{
type=C_IC_NA_1ACT;
/* 子站接收到 总召唤命令帧 */
}else
{
type=C_IC_NA_1CYCLICACT;
/* 子站接收到 分组召唤发送帧 */
}
break;
case 0x65: QCC=Arg->TrnLetter[14];/* 命令限定词 */
QCC=QCC & 0x3f;
if(QCC==05)
{
type=C_CI_NA_1ACT;
/*子站接收到 冻结和召唤电能脉冲 发送帧 */
}else
{
type=C_CI_NA_TACT;
/*子站接收到 分组召唤电能脉冲计数量请求帧*/
}
break;
case 0x66: type=C_RD_NA_1ACT;
/*子站接收到 读数据命令发送帧 */
break;
case 0x67: type=C_CS_NA_1ACT;
/*子站接收到 时钟同步发送帧 */
break;
case 0x6E: type=P_ME_NA_1ACT;
/*子站接收到 设置参数的发送帧 */
break;
case 0x71: type=P_AC_NA_1ACT;
/*子站接收到 设置参数的发送帧 */
break;
case 0x7A: type=F_SC_NA_1ACT;
/*子站接收到 召唤文件 目录 节 文件选择命令*/
break;
case 0x7C: type=F_AF_NA_1ACTCON;
/*子站接收到 文件、节的确认帧 */
break;
default: break;
}
break;
case 0x04:/* 发送/无回答 传送数据 */
type=M_RL_NA_1;
/*子站接收到 主站初始化结束响应帧 */
break;
case 0x08:/* 请求/响应帧 响应帧应说明访问要求 */
type=C_PA_NA_1;
/*子站接收到 召唤要求访问位的请求帧 */
break;
case 0x09:/* 请求/响应帧 召唤链路状态 */
type=C_RQ_NA_1_LNKREQ;
/*子站接收到主站 请求链路状态 */
break;
case 0x0A:/* 请求/响应帧 召唤用户1级数据 */
type=C_P1_NA_1;
/*子站接收到主站 召唤1级数据 */
break;
case 0x0B:/* 请求/响应帧 召唤用户2级数据 */
type=C_P2_NA_1;
/*子站接收到主站 召唤2级数据 */
break;
case 0x05:/* 备用 */
case 0x0C:/* 备用 */
case 0x0D:/* 备用 */
break;
case 0x06:/* 制造厂和用户协商后定义 */
case 0x07:/* 制造厂和用户协商后定义 */
case 0x0E:/* 制造厂和用户协商后定义 */
case 0x0F:/* 制造厂和用户协商后定义 */
break;
}
break;
case SHHUP:/* 子站向主站响应 主站为启动站 */
switch(code)
{
case 0x00:/* 确认帧 */
FrameType=Arg->TrnLetter[3];//帧状态
switch(FrameType)
{
case 0x00:/* 固定帧 */
switch(Arg->TxStatus)
{
case C_RL_NA_1_SEND: type=M_RL_NA_1_CON;
/* 复位远方链路确认帧 */
break;
case C_RD_NA_1ACT: type=M_CON_NA_1ACTCON;
/* 读数据命令的确认帧 */
break;
default: type=0xff;
break;
}
break;
case 0x01:/* 可变帧 */
TYP=Arg->TrnLetter[8]; /* 类型标识 */
COT=Arg->TrnLetter[10];/* 传送原因 */
switch(TYP)
{
case 0x0f:if(COT==3)
{//突发
type=M_IT_NA_1CYCLIC;
/*响应主站电能脉冲计数量响应帧*/
}else
{
type=M_IT_NA_1;
/*分组召唤电能脉冲计数量响应帧*/
}
break;
case 0x10:if(COT==3)
{//突发
type=M_IT_TA_1CYCLIC;
/*带时标电能脉冲计数量响应帧*/
}else
{
type=M_IT_TA_1;
/* 分组带时标电能脉冲计数量响应帧*/
}
break;
case 0x46:if(COT==7)
{
DCO=Arg->TrnLetter[14];
if(DCO>=0x80)
{
type=C_DC_NA_1ACTCON;
/* 遥控选择命令 确认帧 */
}else
{
type=C_DC_NA_1EXCOCON;
/* 遥控执行命令 确认帧 */
}
}else
{
type=C_DC_NA_1DEACTCON;
/* 遥控撤消命令 确认帧 */
}
break;
case 0x47: if(COT==7)
{
RCO=Arg->TrnLetter[14];
if(RCO>=0x80)
{
type=C_RC_NA_1ACTCON;
/* 升降选择命令 确认帧 */
}else
{
type=C_RC_NA_1EXCOCON;
/* 升降执行命令 确认帧 */
}
}else
{
type=C_RC_NA_1DEACTCON;
/* 升降撤消命令 确认帧 */
}
break;
case 0x48: type=C_SE_NA_1ACTCON;
/* 设点命令 确认帧 */
break;
case 0x64: QOI=Arg->TrnLetter[14]; /* 命令限定词 */
if(QOI==20)
{
type=C_IC_NA_1ACTCON;
/* 总召唤确认帧 */
}else
{
type=C_IC_NA_1CYCLICACTCON;
/* 分组召唤响应帧 */
}
break;
case 0x65: if(COT==7)
{//激活确认
type=C_CI_NA_1ACTCON;
/*冻结和召唤电能脉冲确认帧*/
}else
{
type=C_CI_NA_1ACTTERM;
/* 电能脉冲计数量结束帧*/
}
break;
case 0x67: type=C_CS_NA_1ACTCON;
/* 时钟同步确认帧 */
break;
case 0x68: type=C_TS_NA_1ACTCON;
/* 测试通道的确认帧 */
break;
case 0x69: type=C_RP_NA_1ACTCON;
/* 复位远动终端确认帧 */
break;
case 0x6E: type=P_ME_NA_1CON;
/* 设置参数的确认帧 */
break;
case 0x71: type=P_AC_NA_1CON;
/* 设置激活的确认帧 */
break;
case 0x78: type=F_FR_NA_1ACTCON;
/* 文件准备好确认帧 */
break;
case 0x79: type=F_SR_NA_1ACTCON;
/* 节准备好确认帧 */
break;
case 0x7b: type=F_LS_NA_1ACTCON;
/* 最后节、最后段的确认帧 */
break;
case 0x7c: type=F_AF_NA_1ACTCON;
/* 文件、节的确认帧 */
break;
case 0x7d: type=F_SG_NA_1ACTCON;
/* 段的响应帧 */
break;
case 0x7E: type=F_DR_TA_1ACTCON;
/*126*//* 目录响应帧 */
break;
}
break;
default: type=0xff;
break;
}
break;
case 0x01:/* 确认帧 链路忙、未接收报文 */
switch(Arg->TxStatus)
{
case C_RQ_NA_1_LNKREQ:type=M_RQ_NA_1_LNKRES;
/* 链路状态响应帧链路忙 */
break;
default:
break;
}
break;
case 0x08:/* 响应帧 以数据响应请求帧 */
switch(Arg->TxStatus)
{
case C_IC_NA_1ACTSTS:type=M_IC_NA_1ACTSTS;
/* 带品质描述的遥测帧 */
/* 不带品质描述的遥测帧 */
/* 单点遥信帧 */
/* 双点遥信帧 */
/* 变压器分接头帧 */
/* 状态和状态变位的遥信帧 */
/* 远动终端状态帧 */
/* BCD码响应帧 */
/* 总召唤结束帧 */
break;
case C_P1_NA_1: type=M_P1_NA_1STS;
/* 子站响应1级数据 */
break;
case C_P2_NA_1: type=M_P2_NA_1STS;
/* 子站响应2级数据 */
break;
default:
break;
}
break;
case 0x09:/* 响应帧 无所召唤的数据 */
type=M_NV_NA_1;
/* 无所请求的数据帧 */
break;
case 0x0B:/* 响应帧 以链路状态或访问请求回答请求帧 */
switch(Arg->TxStatus)
{
case C_PA_NA_1: type=C_PA_NA_1RES;
/* 召唤要求访问位的响应帧 */
break;
case C_RQ_NA_1_LNKREQ:type=M_RQ_NA_1_LNKRES;
/* 链路状态响应帧链路完好 */
break;
default:
break;
}
break;
case 0x0E:/* 响应帧 链路服务未工作 */
type=M_RQ_NA_1_LNKRES;
/* 链路状态响应帧链路服务未工作 */
break;
case 0x0F:/* 响应帧 链路服务未完成 */
type=M_RQ_NA_1_LNKRES;
/* 链路状态响应帧链路服务未工作 */
break;
case 0x02:/* 备用 */
case 0x03:/* 备用 */
case 0x04:/* 备用 */
case 0x05:/* 备用 */
case 0x0A:/* 备用 */
case 0x0C:/* 备用 */
break;
case 0x06:/* 制造厂和用户协商后定义 */
case 0x07:/* 制造厂和用户协商后定义 */
case 0x0D:/* 制造厂和用户协商后定义 */
break;
}
break;
case HSSUP:/* 子站向主站传输 子站为启动站 */
switch(code)
{
case 0x00:/* 发送/确认帧 复位远方链路 */
break;
case 0x01:/* 发送/确认帧 复位用户进程 */
break;
case 0x02:/* 发送/确认帧 主站链路功能测试*/
break;
case 0x03:/* 发送/确认帧 向主站传送数据 */
break;
case 0x04:/* 发送/无回答 传送数据 */
break;
case 0x09:/* 请求/响应帧 请求链路状态 */
break;
case 0x05:/* 备用 */
case 0x0C:/* 备用 */
case 0x0D:/* 备用 */
break;
case 0x06:/* 制造厂和用户协商后定义 */
case 0x07:/* 制造厂和用户协商后定义 */
case 0x0E:/* 制造厂和用户协商后定义 */
case 0x0F:/* 制造厂和用户协商后定义 */
break;
default:
break;
}
break;
case SHSUP:/* 主站向子站响应 子站为启动站 */
switch(code)
{
case 0x00:/* 确认帧 确认 */
break;
case 0x01:/* 确认帧 链路忙、未接收报文 */
break;
case 0x0B:/* 响应帧 链路状态 */
break;
case 0x0E:/* 链路服务没工作 */
break;
case 0x0F:/* 链路服务没完成 */
break;
case 0x02:/* 备用 */
case 0x03:/* 备用 */
case 0x04:/* 备用 */
case 0x05:/* 备用 */
case 0x0C:/* 备用 */
break;
case 0x06:/* 制造厂和用户协商后定义 */
case 0x07:/* 制造厂和用户协商后定义 */
case 0x0D:/* 制造厂和用户协商后定义 */
break;
default:
break;
}
break;
}
Arg->TrnLetter[4]=type; //功能码
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?