From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

NI產品與技術 討論區

取消
顯示結果 
搜尋替代 
您的意思是: 

GPIB ibwrt一直出現EABO(6) 錯誤的通訊問題~

已解決!
前往解決方案

之前已經跟很多台 Handler/Prober做過 GPIB的通訊,都能正常。只有這一台Handler的通訊一直無法成功~

Handler提供的指令很簡單,就是收到SRQ 0x41後,就用ibwrt指令詢問一個資訊,再用ibrd讀回。

但是現在ibwrt的指令一直出現EABO (6)錯誤,也確定不是線的問題了。以下是我的代碼,不知道是哪邊有錯…

跟其他家handler的通訊模式也是類似,就可以正常,另外附上NI IO Trace 抓到的log

 

GHostUD = ibfind("GPIB0");
 if (ibsta & ERR) {  
        error_flag |=1;
        GpibError("ibdev0 Error");
 }

 GDevUD = ibdev(   /* Create a unit descriptor handle         */
                GPIB0,          /* Board Index (GPIB0 = 0, GPIB1 = 1, ...) */
                5, /* primary address  */
                0,              /* Device secondary address                */
                T10s ,//T3s, /* Timeout setting (T3s = 3 seconds)       */ //josh 2k50822
                1,              /* Assert EOI line at end of write         */
                0x0C0A);             /* EOS termination mode                    */
 if (ibsta & ERR) {   /* Check for GPIB Error                    */
       error_flag |= 2;
       GpibError("ibdev Error");
 }

 if (!error_flag) {
         ibrsc( GHostUD , 1) ; // request system control.
         ibsic( GHostUD);      //assert interface clear

         ibclr(GDevUD);
         ibtmo(GDevUD, 12);

         ibconfig(GDevUD,IbcUnAddr,1);      // Send UNT abd UNL at the end of device-lelvel reads and writes
         
        Sleep(100);
        
  }
  
  char   srq;
  
  while (!Exit_Flag)  //receive srq
  {
      ibwait(GDevUD, 0);
    
      ibrsp(GDevUD,&srq); 
      
      if ((s&0x41)!=0x41)
      {
                 ibwrt(GDevUD, "FULLSITES?\r\n",12);                                 
                         
                 ibrd(GDevUD,Gcmds, 64);
                 .....
                 .....
      }
              
  } 

 

0 積分
1 條訊息(共 4 條)
4,452 檢視

您好,
請問實際遇到的問題是EABO(6)錯誤,還是EBUS(14)錯誤?因爲從附上的圖看到的是EBUS(14)錯誤。

0 積分
2 條訊息(共 4 條)
4,435 檢視

不好意思 我附錯圖 應該是附件這一張 

是先出現 EABO (6)  我再試著讀一次,才出現EBUS(14)...

另外我附的source中有的判斷式是手誤,應該是  if (srq & 0x41 ==0x41)

0 積分
3 條訊息(共 4 條)
4,425 檢視
解決方案
由主題作者所接受 ychch

通常在讀取或寫入操作期間發生timeout,就會導致EABO(6)錯誤,不過也可能是因為在進行I/O 操作時,呼叫ibclr函式或類似函式而導致。若未啟用 PCI 匯流排主控 (在電腦 BIOS 中的選項),則在透過 PCI-GPIB 介面卡進行寫入操作時,即可能收到逾時。 若您正在讀取的儀器無法理解先前指令,因此沒有可向您寫入的資訊,也可能使您在讀取操作期間收到逾時的情況。 有數項原因可能讓儀器沒有可提供的資訊:
-傳給儀器的訊息可能拼寫錯誤。 例如,「*IDN?」是相容於 IEEE 488.2 儀器的常用識別查詢。 這很容易誤拼為「*IND?」,讓儀器無法理解,因此就不會產生可供您從儀器讀取的訊息字串。
-傳給儀器的訊息可能包含儀器無法理解的指令。 例如,只有相容於 IEEE 488.2 的儀器可理解先前範例中的「*IDN?」訊息。 如果儀器是不相容於 IEEE 488.2 的舊版裝置,那麼即無法理解「*IDN?」,因此也不會產生可供您從儀器讀取的訊息字串。
-儀器可能使用特定的 EOS (字串結束) 字元做為終止方法,但是您可能忘記在訊息中附加該終止字元。 例如,若儀器預期以換行字元做為 EOS 字元,那麼使用「ID?」即無效,而是需使用「ID?\n」(其中「\n」代表 IBIC 的換行字元) 才會有效。
-可能預期 EOI (end or identify,即「結束或識別」,5 條匯流排管理通道的其中之一) 為終止方法,但是若儀器在結束傳送訊息時並未設定 EOI 通道,則進行的任何讀取操作皆會逾時。

 

解決方案:​​

> 確定您的訊息由儀器可理解的指令組成。 查看裝置的使用者手冊以取得可能指令的清單。
> 查看使用者手冊,確認儀器是否需要處於 GPIB 或 488.2 模式才可成為 GPIB 接收器。 通常當儀器處於前述模式時,僅會對標準指令做出回應,否則即使傳送有效指令至該儀器,亦會發生錯誤。
> 確認您對儀器使用的終止方法正確。 雖然一律會使用位元組數 (預期會在訊息中收到特定數量的位元組),但是部分儀器為使用 EOS 與位元組數、某些使用 EOI 與位元組數,某些則僅使用位元組數。 查看裝置的使用者手冊,了解可搭配儀器使用的可能終止方法。
> 如果終止方法為 EOS,則請確定將終止字元附加至訊息結尾處。 可在 GPIB 設定公用程式中指定終止字元,但是 NI-488.2 驅動程式不會自動附加該項目
> 使用 ibtmo 指令延長 I/O 操作的逾時期間。
> 如果收到所有資料與 EABO 錯誤,那麼請找出特定的字串結束字元 (例如換行字元或歸位字元),並設定 GPIB 介面卡,以利用 ibeos 函式終止讀取該字元。

 

然後,EBUS(14)是命令字節傳輸錯誤。設備會在默認配置或ibtmo功能指定的時間限制內接受這些命令字節。如果在發送這些命令字節時發生逾時,則會產生EBUS結果。

因此,可試試增加逾時時間。

 

附上 NI-488.2 適用於 Windows 的使用者手冊

http://www.ni.com/pdf/manuals/321819e.pdf

0 積分
4 條訊息(共 4 條)
4,409 檢視