⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 user.c

📁 Philips单片机P89C51RD和西门子Profibus工业总线的接口程序,硬件是鼎实公司的实验板,使用的鼎实公司的总线桥.
💻 C
📖 第 1 页 / 共 3 页
字号:
   REN=1;                            /*---- 允许接收                           ---------*/
   re_er=0;                          /*---- re_er偶校验错标志                  ---------*/
   for (j=0;j<49;j++)
   {                                /*---- 接受回答报文共49个字节             ---------*/
     nw=0;
     while ((RI==0)&&(S_RTS==1)) {}; /*---- SE正在发送、实验板正在接收一个字符 ---------*/
     if (RI==1)
      {/*---- RI==1:实验板接收到一个字符 ---------*/
       ACC=SBUF;
       if (P!=RB8){ re_er=1;};           /*---- 偶校验错,置偶校验错标志           ---------*/           
       rebox[j]=SBUF;                    /*---- 接收一个字符送串口输入缓冲区       ---------*/
       RI=0;
      }
     else
      {/*---- (RI==0)&&(S_RTS==0):SE报文全部发送完毕而实验板还没有接收到预期的长度 ---------*/
       j=100;                            /*---- 退出等待接收                       ---------*/
      }
  };
  //WQY DEBUG:调试通过
  //pb_out[0]=rebox[0];
  //pb_out[1]=rebox[48];
  //steout0_7(pb_out[0]);
  //steout8_15(pb_out[1]);
  //for(;;) {};

/*--------------- 接收回答报文结束         -------------------------------------------*/
/*--------------- 以下分析接口板SE的回答报文 -----------------------------------------*/
if (j==49)
{ /*---- (j==49):实验板接收回答报文长度正确 ---------*/
 if (re_er==0)                    /*---- 没有字符偶校验错?                  ---------*/
  {
    x=0;
    for (i=0;i<48;i++)            /*---- 求校验和                           ---------*/
    {
      x=x+rebox[i];
     };
    if (x==rebox[48])
     {                            /*---- 校验和正确?                       ----------*/
      if (rebox[0]==br_num)       /*---- 返回的波特率号是5?                ----------*/     
       { 
        if (rebox[1]==0)          /*---- 初始化报文错误号N=0?              ----------*/   
         {
          x=0;
          for (i=2;i<48;i++)      /*---- byte2~byte47都是0xaa?             ----------*/
           {
            if (rebox[i]!=0xaa)
             {
              x=1;
             };
           };
          if (x==0)
           {                     
           y=1;                 /*---- byte2~byte47都是0xaa,初始化成功,y=1,准备退出while (y==0) ----*/  
           }
          else
           {x=0x11;};            /*---- byte2~byte47不都是0xaa!错误标记=0x11;                   ----*/
         }
        else
         {x=rebox[1];};          /*---- 初始化报文错误号N<>0,错误标记=返回错误号                ----*/
       }
      else
       {x=0x77;};                /*---- 返回的波特率号不是5, 错误标记=0x77;                      ----*/
     }
    else
     {x=0xff;};                  /*---- 校验和不正确正确,    错误标记=0xff;                      ----*/
   }
  else
  {x=0xee;};                     /*---- 发生了字符偶校验错   错误标记=0xee;                      ----*/
 }
else
 {
  x=0xcc;                        /*---- j!=49发生了接收报文长度错   错误标记=0xee;               ----*/
 };

 if (y==0)
  {                              /*---- 初始化失败       ----*/
   for (nw=0;nw<10000;nw++)
   {
    steout0_7(br_num);           /*---- 显示返回波特率号 ----*/
    steout8_15(x);               /*---- 显示返回错误号   ----*/
   };
  }; 
        
 }; /*---- 如果y==0,返回while (y==0) ----*/

//WQY DEBUG:运行正确时y=1,x=0。该段程序调试正确。
//steout0_7(y);
//steout8_15(x);
//for(;;) {};






/*==================================================================================================*/
/*               实验板对PROFIBUS接口板初始化成功,进数据交换状态的无限循环中                       */
/*               trbox[]/rebox[]是串口发送/接收数组,发送/接收格式见《SE手册》                      */
/*--------------------------------------------------------------------------------------------------*/

dil=data_in_len-1;                  /*---- data_in_len=50, dil=49                               ----*/
dol=data_out_len-1;                 /*---- data_out_len==50, dol==49                            ----*/
for (i=0;i<data_in_len;i++)
  {
    trbox[i]=0;                     /*---- 清发送、接收缓冲区                                   ----*/
  };
for (i=0;i<data_out_len;i++)
  {
    rebox[i]=0;                     /*---- 清发送、接收缓冲区                                   ----*/
  };
 
/*=============================== 进数据交换状态的无限循环中 =======================================*/
while (REQ_IT==0) 
{ /*---- (REQ_IT==0):SE处在数据交换状态  ------*/
 trbox[0]=req_com=0;           /*---- 没有用户参数,请求数据命令永远是req_com=0,只请求A型报文  ------*/
 trbox[1]=di0_7;               /*---- di0_7是输入键输入I0~I7当前值,作为PROFIBUS输入的第1字节   ------*/
 trbox[2]=di8_15;              /*---- di8_15是输入键输入I8~I15当前值,作为PROFIBUS输入的第2字节 ------*/
 //WQY DEBUG
 trbox[1]=0x11;
 trbox[2]=0xff;

 for (i=3;i<dil;i++)
  {
   trbox[i]=0x5a;              /*---- 其它PROFIBUS输入数据(3~48)本例定为0x5a                    ------*/
  };

 x=0;
 for (i=0;i<dil;i++)           /*---- 求校验和                                                  ------*/
  {
   x=x+trbox[i];
  };
 trbox[dil]=x;                 /*---- 置校验和                                                  ------*/
  
 REN=0;
 
 while (S_RTS==1) {};          /*---- S_RTS==1:接口板没有准备好接收数据                        ------*/ 
 
 for (i=0;i<data_in_len;i++)   /*---- 发送数据交换报文共50字节                                  ------*/
  {
    TI=0;
    ACC=trbox[i];
    TB8=P;                     /*---- 形成偶校验位                                              ------*/
    SBUF=trbox[i];
    while (TI==0) {};    
  };

 while (S_RTS==0) {};          /*---- SE 没有接收完毕                                           ------*/

/*=============================发送数据交换报文结束,等待接收接口板SE的回答。=========================*/

re_er=0;                            /*------ re_er偶校验错标志                                 ------*/
 RI=0;
 REN=1;                              /*------ 允许接收                                          ------*/
 for (j=0;j<data_out_len;j++ )       /*------ 等待接收接口板的回答数据交换报文共50字节          ------*/
 {
     while ((RI==0)&&(S_RTS==1)) {}; /*---- SE正在发送、实验板正在接收一个字符                  ------*/
     if (RI==1)
      {/*---- RI==1:实验板接收到一个字符 ---------*/
       ACC=SBUF;
       if (P!=RB8) {re_er=1;};       /*------ 偶校验错,置偶校验错标志                          ------*/
       rebox[j]=SBUF;                /*------ 接收一个字符送串口输入缓冲区                      ------*/
       RI=0;
      }
     else
      {/*---- (RI==0)&&(S_RTS==0):SE报文全部发送完毕而实验板还没有接收到预期的长度 ---------*/
       j=data_out_len+1;             /*---- 退出等待接收                       ---------*/
      };
  };

//WQY DEBUG: 一次数据通信 
//trbox[]中数据发送给接口板,从接口板接收数据至rebox[]
//pb_out[0]=rebox[1];
//pb_out[1]=rebox[2];
//steout0_7(pb_out[0]);
//steout8_15(pb_out[1]);
//for(;;) {};



/*=============================接收完毕===============================================================*/

if (j==data_out_len)
{/*---- (j==data_out_len):实验板接收回答报文长度正确 ---------*/
 if (re_er==0)
  {                                  /*------ 无偶校验错                                        ------*/ 
      x=0;
      for (i=0;i<dol;i++)
       {
         x=x+rebox[i];               /*------ 求校验和                                          ------*/ 
       };
      if (x==rebox[dol])
       {
          y=dol-1;                   /*------ y=49-1=48,PROFIBUS输出数据长度                    ------*/
          for (i=1;i<dol;i++)
           {
            pb_out[i-1]=rebox[i];    /*------ 接收到的48个PROFIBUS输出数据送数据区pb_out[0~47]  ------*/ 
           };
       }
      else
       {
        error=0x81;                  /*------ 校验和错                                          ------*/
       };
  }
 else
  {
    error=0x83;                      /*------ 偶校验错                                          ------*/
  };
 }
else
 {
  error=0x84;                        /*------ 接收字符数不够                                   ------*/
 };
/*====================================================================================================*/
/*-----------------------------显示部分---------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------*/
 
 scanin();                           /*------ 输入键扫描                                        ------*/
 steout0_7(pb_out[0]);               /*------ PROFIBUS输出数据第一个字节送Q0-Q7显示             ------*/
 steout8_15(pb_out[1]);              /*------ PROFIBUS输出数据第一个字节送Q0-Q7显示             ------*/
  
};/*---- while (REQ_IT==0):SE处在数据交换状态,返回数据交换状态的无限循环中  ------*/
};/*---- (REQ_IT==1):SE退出数据交换状态,返回初始化                          ------*/
}











⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -