久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2411|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

關(guān)于載波環(huán)回的處理辦法

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82781 發(fā)表于 2015-6-13 15:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

日照高科園
小ARM菜菜



      這幾天被電力載波的環(huán)回?cái)?shù)據(jù)搞得焦頭爛額,起因是在一次測(cè)試中,發(fā)現(xiàn)有一個(gè)通道的數(shù)據(jù)時(shí)斷時(shí)續(xù),開始懷疑是終端控制器程序問(wèn)題,后來(lái)鎖定通道板的數(shù)據(jù)交換問(wèn)題,隨著一天天的測(cè)試查找,終于鎖定問(wèn)題的所在,是這樣的,三相電每一相上都有一個(gè)載波接受的芯片在等待數(shù)據(jù),但是,A相數(shù)據(jù)正常,BC兩張的數(shù)據(jù)不正常,時(shí)斷時(shí)續(xù),正事那個(gè)現(xiàn)象!后來(lái)發(fā)現(xiàn)了問(wèn)題那就是在A相發(fā)送載波的時(shí)候莫名其妙的耦合到了BC兩相,但是為什么A像正常呢?因?yàn)锳相啟動(dòng)載波發(fā)送后,馬上轉(zhuǎn)換成接受在搜索數(shù)據(jù)同步偽碎碼,恰巧此事終端設(shè)備的回復(fù)來(lái)了,所以正好A相對(duì)其解碼,正常工作而,但是BC就慘了他那里的波形是什么呢?A相出來(lái)的序列和終端回復(fù)的序列擠在一起,導(dǎo)致了B相直接不知道該怎么辦了!這是因?yàn)檩d波的協(xié)議決定的,載波沒(méi)有FIFO,所以。。。。可想而知,沒(méi)有硬件的支持軟件要顯得很忙碌!但是此時(shí)的軟件沒(méi)有容錯(cuò)處理,他凌亂了!他不知道那里是幀頭,因?yàn)橹辽儆袃蓚(gè)幀頭!所以此時(shí)的現(xiàn)象時(shí)數(shù)據(jù)時(shí)有時(shí)無(wú),我今晚對(duì)他進(jìn)行了改進(jìn),首先用頭的首位作為數(shù)據(jù)上行和下行的標(biāo)志,然后在對(duì)數(shù)據(jù)長(zhǎng)度進(jìn)行容錯(cuò)處理,保證在協(xié)議允許范圍內(nèi),如果不符合條件統(tǒng)統(tǒng)過(guò)濾并且重要的是重新啟動(dòng)硬件的枕頭搜索,這樣的結(jié)果是成功的濾除了A相的發(fā)射干擾保留了終端的回復(fù)!哈哈,當(dāng)然還要測(cè)試一段時(shí)間!不過(guò)那個(gè)現(xiàn)象已經(jīng)沒(méi)有了!全是我想要 數(shù)據(jù)!正確的數(shù)據(jù)!真是!不容易啊!哈哈!加油啊!



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:82781 發(fā)表于 2015-6-13 15:49 | 只看該作者
此程序成功解決換回問(wèn)題
奮戰(zhàn)好幾天幾度陷入入僵局!
終于攻破!哈哈,高興ing
2013年6月8日
小ARM菜菜
很好!
日照高科園
#include<string.h>
#include <PL3201_Addr_Map.h>
#include "pl3201.h"
#include "usart.h"
#include "string.h"
extern void Protocol_analysis (unsigned char *buf,unsigned char len) ;

sbit  PLC_RX=P1^5;
sbit USART_TX=P2^2;
sbit USART_RX=P3^3;


uchar  data    PLC_Rxd_pointer;           
uchar  data    PLC_Rxd_tlen;      
uchar  data    PLC_send_pointer;   
uchar  data    PLC_timer;           
uchar  data    PLC_total_len;      
uchar  data    PLC_Rxd_timer;   

uchar  data    WDI;                 

bit    bdata   PLC_Rxd_state;   
bit    bdata   PLC_Rxd_OK;        
bit    bdata   PLC_sending;         
bit  data    PLC_TX_EN=0;       
uchar    xdata PLC_recv_buf[50];   
uchar  xdata   PLC_Tx_Buf[50];  

  
uchar put_buf=0;
  uint8_t start_rec_data;
uint8_t  rec;

unsigned char nk;

void Check_sys_plc(void)
{
  WDI=0x9a;                  
      
       if(!(PLC_Rxd_timer||PLC_sending))        // no sending and receiving
       {
               PLC_rset();
       }

   
     //  initsys_ref();
}


extern void send_usart_data(char *ptr,char len) ;
uint8_t usart_send_ok=0;
uint8_t plc_ok=0;
void Input_Rx_Process(void)
{
       

//if((PLC_recv_buf[3]==0)&(PLC_recv_buf[4]==0xff))  //回應(yīng)信號(hào)
//{       
        plc_ok=5;

while(plc_ok);
EA=0;       
send_usart_data("B",1);
send_usart_data(PLC_recv_buf,1);
send_usart_data(PLC_recv_buf,PLC_recv_buf[0]);
usart_send_ok=5;
        EA=1;
         
//}
PLC_Rxd_state=0;


}

extern uint8_t usart_rx_ok;

void  timeint0 ( void ) interrupt 1
{


if(usart_rx_ok>0)
{
        usart_rx_ok--;
USART_RX=0;

}
else
{
        USART_RX=1;
}



   if(usart_send_ok>0)
{

USART_TX=0;
usart_send_ok--;
}
else
{

USART_TX=1;

}

if(plc_ok>0)
{

PLC_RX=0;
plc_ok--;

}else
{

   PLC_RX=1;
}



   
   if ( PLC_Rxd_timer>0 )
   {
      PLC_Rxd_timer--;
   }
   else
   {
      PLC_Rxd_timer=0;
      
     PLC_Rxd_state=0;        // resume receive state
   }
   
   if ( PLC_timer>0 )       
           PLC_timer--;

//nk++;
//if(nk==20){nk=0;PLC_TX_EN=1;}


   TH0=0x63;                                // 置定時(shí)器計(jì)數(shù) 100ms 中斷一次 ( 4.8MHz )
   TL0=0xcc;

   if ( WDI == 0x9a )
   {
      WDT_RST=0xa1;                 // 清看門狗
      WDI=0;
   }
}
   uint8_t n,len;
  
   
void  PLC_int ( void ) interrupt 7
{
     uchar  data state;              
uchar data SSC_adr_bak;
uchar check;
SSC_adr_bak=SSC_ADR;       
     SSC_ADR=0x00;                           
     state= SSC_DAT;
   if ( ( state&0x01 ) == 1 )              //載波發(fā)送狀態(tài)
   { // 載波發(fā)送

   if ( PLC_send_pointer !=PLC_total_len )
     
    {
       SSC_BUF=PLC_Tx_Buf[PLC_send_pointer];                  //發(fā)送下一個(gè)字節(jié)
       PLC_send_pointer++;
    }
    else
    {  //發(fā)送完成
      PLC_sending=0;                        // 清正在發(fā)送標(biāo)志
       SSC_ADR=0X0;       
        SSC_DAT=0X0;                 // 發(fā)送指示燈滅
    }
  }
  else
{

PLC_Rxd_timer=20;              // 最大字節(jié)接收延時(shí)時(shí)間為1S
    if ( ( state&0x04 ) == 0x04 )     //如果接收的是禎頭標(biāo)志
    {
//幀


      if ( PLC_Rxd_state == 0 )      //如果處于等待接收狀態(tài)
      {
          //接收第一個(gè)字節(jié),并準(zhǔn)備接收后面的字節(jié)
         PLC_recv_buf[0]=SSC_BUF;
         PLC_Rxd_pointer=0;       
         PLC_Rxd_state=1;
PLC_Rxd_tlen=PLC_recv_buf[0];
check=PLC_recv_buf[0];
if((check&0x80)!=0x80)
{
PLC_Rxd_state=0;
      SSC_ADR=0X0;       
        SSC_DAT=0X0;

}
else
if((check&0x80)==0x80) //1shangxing 0xiaxing
{
  
PLC_Rxd_tlen&=0x7f;
if(PLC_Rxd_tlen>30)
{
  PLC_Rxd_state=0;
      SSC_ADR=0X0;          //^@%$#^%$&%*&(*&)*()(%$#$@#%@#
        SSC_DAT=0X0;
}
}



      }
      else // translate to rec
      {             
      PLC_Rxd_state=0;
      SSC_ADR=0X0;       
        SSC_DAT=0X0;
      }



    }

   //數(shù)據(jù)流
    else
    {
      if ( PLC_Rxd_state == 1 )       // 如果已經(jīng)接收了禎頭,繼續(xù)接收后續(xù)字節(jié)
      {
      
        PLC_recv_buf[PLC_Rxd_pointer]=SSC_BUF;
if(PLC_Rxd_pointer==0)
{       
PLC_recv_buf[0]&=0x7f;        //%$%$#^&%$&^%*%^(&*(*&)&*)^&%^#$
}
        PLC_Rxd_pointer++;
        if ( PLC_Rxd_pointer==PLC_Rxd_tlen )
        {
           PLC_Rxd_OK=1;
           PLC_Rxd_state=0;
           SSC_ADR=0;       
           SSC_DAT=0;
        }
      }
      else       
      {
      PLC_Rxd_state=0;
      SSC_ADR=0X0;       
        SSC_DAT=0X0;
      }
    }
         
  }
  
SSC_ADR=SSC_adr_bak;
}
/*void set_PLC_3200 ( void )
{
SSC_ADR=0XFF;        
SSC_DAT=0XFF;        // 禁止寫保護(hù)

        SSC_ADR=0x01;        // 選擇3201載波通訊控制寄存器1       
        SSC_DAT=40;        // ZZZ 2007-10-15 前導(dǎo)1bit為40個(gè)

SSC_ADR=0x03;        // 選擇3201載波通訊控制寄存器3       
SSC_DAT=0xc0;        // 開啟載波通訊功能,打開中斷,選擇接收狀態(tài)置為3200模式

SSC_ADR=0x04;        // 設(shè)置捕獲門限
SSC_DAT=LIMIT_3200;

SSC_ADR=0XFF;
SSC_DAT=0XAA;        // 使能寫保護(hù)  
}  */
void set_PLC_3105 ( void )
{
SSC_ADR=0XFF;        // 2005.11.29 LXW
  SSC_DAT=0XFF;        // 禁止寫保護(hù)
       
        SSC_ADR=0x01;        // 選擇3105載波通訊控制寄存器1       
        SSC_DAT=64;        // ZZZ 2007-10-15 前導(dǎo)1bit為64個(gè)

        SSC_ADR=0x03;        // 選擇3201載波通訊控制寄存器3       
        SSC_DAT=0xe0;        // 開啟載波通訊功能,打開中斷,選擇接收狀態(tài)置為3105模式
         
        SSC_ADR=0x04;        // 設(shè)置捕獲門限
  SSC_DAT=LIMIT_3105;
  
  SSC_ADR=0XFF;
  SSC_DAT=0XAA;        // 使能寫保護(hù)  
}
void initsys ( void )
{  // 控制看門狗喂狗時(shí)間長(zhǎng)度                         
  CKCON=0xfF;
  // 8位/16位運(yùn)算模式選擇位設(shè)置
  ALU_MOD=0;      // 設(shè)置成8位運(yùn)算模式
  //載波通訊配置
//************   3201的載波寄存器設(shè)置  **********//
  set_PLC_3105 ( );        //上電為3105模式
  
  SSC_ADR=0xFF;
  SSC_DAT=0xFF;
  SSC_ADR=0x02;
  SSC_DAT=0x1F;
  SSC_ADR=0xFF;
  SSC_DAT=0x00;
  
//************   3201的載波寄存器設(shè)置  **********//
  EIE=0X01;       //  ( A9H 使能INT2中斷(EX2=1)
  IT2=1;                  //  ( C8H ) 為邊沿觸發(fā)方式(IT2=1)
  
//串口通訊配置
  TMOD1 = 0x10 ;                     // 設(shè) T/C1 為1分頻模式,ZZZ
  TMOD = 0x21 ;                     // 設(shè) T/C1 為定時(shí)方式2 設(shè)置為8位自裝載計(jì)數(shù)器  T/C0 為定時(shí)方式 1
  SCON=0x50;                           // 工作方式1
  
  PCON=0x80;                           // 波特率加倍
  TH1=BPS2400;
  TL1=BPS2400;                        // 加倍設(shè)定波特率 9.6MHz ( 按1分頻2400計(jì)算)
  TR1=1;                               // 啟動(dòng)定時(shí)器1
   



  // 定時(shí)器0中斷配置
  TH0=0x63;
  TL0=0xcc;   // 定時(shí) 50 ms 一個(gè)定時(shí)中斷
  TR0 = 1;               // 啟動(dòng) T0 定時(shí)器
  // 中斷級(jí)別設(shè)置
  IP=0x42;                      // 定時(shí)器 T0 中斷為高級(jí)中斷
  EIP=1;                 // 外部中斷2 為高級(jí)中斷
  // 中斷允許設(shè)置
  IE=0x82;

  ES=1;

  EA=1;


                      // 允許ET0=1定時(shí)器 T0 中斷;  開放中斷
  }


void initsys_ref( void )
{  // 載波設(shè)置重置
   uchar  data s1;
   uchar  data GOLD_KSAMI;

   if ( EIE!=1 )
      EIE=0X01;       //  ( A9H 使能INT2中斷(EX2=1)
   if ( IT2!=1 )       
      IT2=1;                 //  ( C8H ) 為邊沿觸發(fā)方式(IT2=1)

   SSC_ADR=0x02;
   GOLD_KSAMI=SSC_DAT;
   if ( GOLD_KSAMI!=0x1F )
   {
      SSC_ADR=0xFF;
      SSC_DAT=0xFF;
      SSC_ADR=0x02;
      SSC_DAT=0x1F;
      SSC_ADR=0xFF;
      SSC_DAT=0x00;
   }

   // 串口設(shè)置重置
   if ( TMOD1!=0x10 )        //2007-10-15 ZZZ
      TMOD1 = 0x10 ;   //1分頻模式
   if ( TMOD!=0x21 )
      TMOD = 0x21 ;   // 設(shè) T/C1 為定時(shí)方式2 設(shè)置為8位自裝載計(jì)數(shù)器  T/C0 為定時(shí)方式 14
   if ( PCON!=0x80 )
      PCON=0X80;      // 波特率加倍

   s1=SCON;
   s1=s1&0xf0;
   if ( s1!=0x50 )
     initsys ();

   if ( TH1!=BPS2400 )
      TH1=BPS2400;
   if ( TR1!=1 )
      TR1=1;          // 啟動(dòng)定時(shí)器1
      // 定時(shí)器0重置


  /*嘻嘻,*/
/*                
  TMOD1=0x32; //time2方式2
  SCON1=0x50; //
  TH2=OMG;
  TL2=OMG;
  TR2 =1;
*/
  
   if ( TR0!=1 )
     TR0 = 1;        // 啟動(dòng) T0 定時(shí)器

   // 中斷設(shè)置重置
   if ( IE!=0x82 )
      IE=0x82;
   if ( IP!=2 )
      IP=2;
   if ( EIP!=1 )
      EIP=1;         // 外部中斷2 為高級(jí)中斷


ES=1;
}


void PLC_rset(void)
{
  uchar s1;

/*if( function_now == 0 )         
        {
           // MEAN 3200 FUNCTION
SSC_ADR=0x03;
s1=SSC_DAT;
if ( ( s1&0xf0 )!=0xc0 )
set_PLC_3200 ();
} */
//else if ( function_now == 0xff )        //3105
   //{
SSC_ADR=0x03;
s1=SSC_DAT;
if ( ( s1&0xf0 )!=0xe0 )
set_PLC_3105 ();
  // }
}
  void init_PLC3201(void)
  {
  
  uchar data i;
   uchar data j;

   for ( i=0; i<5; i++ )        //wait for the stabilization of power
   {
      for ( j=0; j<0xff; j++ );
   }  

   for ( i=0; i<5; i++ )
   {
      for ( j=0; j<0xff; j++ );
   }         
   
   PLC_Rxd_OK=0;
   PLC_sending=0;
//   PLC_Rxd_state=0;
    PLC_Rxd_timer=0x00;

  
  
  }
uint8_t Send_PLC_Data( const uint8_t *Src,uint8_t len)
{

memcpy (PLC_Tx_Buf ,Src, len);
   PLC_total_len=len ;
         PLC_send_pointer=0;                                           
         PLC_sending=1;                   
         SSC_ADR=0x03;
        SSC_DAT= ( SSC_DAT|0x01 );
SSC_BUF= PLC_Tx_Buf[PLC_send_pointer];  
         PLC_timer=30;         // 載波發(fā)送過(guò)程延時(shí)控制1.5秒


while (PLC_sending)
  {
  
  if( 0==PLC_timer) return 0;//超時(shí)

  }
    if ( PLC_timer == 0 )        // PLC sending finish
  {
  SSC_ADR=0x03;
  SSC_DAT= (SSC_DAT&0xFE);       // 設(shè)置3201為REC狀態(tài)REDUNDANCY
  PLC_sending=0;

  }
return 1;//成功




}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 极品在线 | www.黄色在线观看 | 日本不卡一区二区三区 | 久久精品99| 国产精品国产成人国产三级 | 国产精品欧美一区二区三区不卡 | 91精品午夜窝窝看片 | 仙人掌旅馆在线观看 | 国产毛片久久久久久久久春天 | 日韩精品 | 亚洲国产精品久久久久秋霞不卡 | 日韩伦理一区二区 | 婷婷久久网 | 日韩一二区在线 | 伊人免费观看视频 | 免费激情网站 | 久久久91精品国产一区二区三区 | 日本特黄a级高清免费大片 国产精品久久性 | 精品一区二区三区免费视频 | 黄色网址免费在线观看 | 国产在线观看免费 | 久久三区| 亚洲欧美成人 | 久久精品国产一区 | 91视频18| 日韩一二区| 亚洲三区视频 | 欧美精品成人一区二区三区四区 | 一区二区三区中文字幕 | 日韩精品视频在线 | 午夜久久久 | 色综合色综合色综合 | 日韩精品一区二区三区在线观看 | 大乳boobs巨大吃奶挤奶 | 99久久久久 | 成人精品一区二区三区 | 欧美一区二区二区 | 国产精品欧美一区二区三区不卡 | 午夜看片网站 | 日本成人午夜影院 | 欧美综合国产精品久久丁香 |