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 + -
显示快捷键?