GPIB错误代码常用解决方法

概述

本文档介绍GPIB错误代码的解决方法。

 

以下内容大部分来自NI-488.2 User Manual for Windows(请参考下文的其他资源)。

内容

EDVR (0)

错误条件:驱动程序错误。

描述:当GPIB硬件配置不正确,或传递给ibfind函数的接口名称或设备名称不正确时,会返回EDVR。

可能原因:通常,EDVR错误是由板卡接口名称或仪器设备名称拼写错误引起的。例如,NI板卡的默认接口名称是GPIB0,但可能会将其拼错为GPIBO(英文字母O,而不是数字零)。若传递给ibdev函数的板卡索引不正确,也可能发生该错误。板卡索引是GPIB板卡接口名称的数字部分,但许多人错误地认为它是板卡的主地址。例如,我可以在电脑中安装一块PCI-GPIB板卡,并将主地址设为2。板卡的默认接口名称是GPIB0,所以它的板卡索引为0,而不是2。

解决方法:

  • 在GPIB配置工具中使用GPIB硬件的默认设置(即接口名称为GPIB0,主地址为0)。
  • 使用ibdev函数,而不是ibfind函数来打开与仪器的通信(以避免使用其设备名称)。
  • 如果您必须为仪器使用设备名称,请确保其已在GPIB配置工具的设备模板中正确配置(更多详情,请参考NI-488.2用户手册)。
  • 使用从ibdevibfind返回的单元描述符作为后续NI-488函数的第一个参数。检查故障函数之前的变量,确保其值未被破坏。

ECIC (1)

错误条件:函数要求GPIB板卡充当管理控制器(CIC)。

描述:某些函数要求GPIB板卡充当CIC-这些函数收录在NI-488.2函数参考手册中(请参考下文的相关链接)。默认情况下,GPIB板卡将作为系统控制器,但这并不等于管理控制器。系统控制器可以随时成为CIC(在给定的通用接口总线上可有一个系统控制器)。

可能原因:通常,当您未在程序开始时发送接口清零以确保GPIB板卡作为CIC时,会发生ECIC错误。

解决方法:

  • 若您的GPIB板卡支持作为系统控制器,请使用ibrsc 1,确保GPIB板卡配置为系统控制器。
  • 若您的GPIB板是系统控制器,则使用ibsic函数(或SendIFC函数)发送接口清零。这将使您的GPIB板卡成为CIC(同时也将重置总线上的GPIB通信)。
  • 若您的GPIB板卡是总线上的几个控制器之一,在尝试调用任何需要GPIB板卡具有CIC状态的函数前,请始终检查状态字ibsta的CIC位。若该位没有出现,则可调用ibwait函数(设置CIC位的等待掩码)以延迟进一步处理,直到GPIB板卡获得控制权。

ENOL (2)

错误条件:函数未检测到侦听器。

描述:GPIB通信需要一个通话器(用于写入数据消息)和一个或多个侦听器(用于读取数据消息)。当尝试写入操作,但不存在带地址的侦听器,或指定地址不存在侦听器时,会发生ENOL错误。对于设备写入,ENOL表示您尝试与之通信的GPIB地址与连接到总线的设备的GPIB地址不匹配。

可能原因:您尝试与之通信的仪器不在预期的主地址、仪器未通电或者仪器的电缆未连接或已断开。

解决方法:

  • 确保设备的GPIB地址与要写入数据的设备的GPIB地址相匹配。
  • 确认电缆已正确连接到仪器。尝试切换电缆以确认电缆未损坏。
  • 确保至少有三分之二的设备已开机。
  • 对于板卡级通信,请在ibcmd函数使用中适当的十六进制代码以指定设备作为侦听器。
  • 调用ibpad函数(如有必要,还可以使用ibsad)来设置设备的主地址。ibpad函数将返回设备先前的设置,您可以检查配置的地址是否与设备的实际地址相匹配。

EADR (3)

错误条件:GPIB板卡(GPIB0GPIB1)地址设置错误。

描述:当GPIB板卡是管理控制器(CIC),且在读取和写入函数之前未正确设置自身地址时,会发生EADR。当请求了影子握手功能,且GPIB ATN线已置无效时,ibgts函数也会返回EADR。在这种情况下,影子握手是无法实现的,返回该错误是为了通知您这一事实。

可能原因:您的GPIB板卡与尝试通信的仪器具有相同的主地址。

解决方法:

  • 切勿将GPIB板卡地址配置得与设备相同。您应该始终(绝大多数情况下)将您的GPIB板卡配置为主地址0,而不是次地址。在程序开始时调用ibpad 0ibsad 0以正确配置主板的地址。
  • 调用ibrd、ibwrt、RcvRespMsgSendDataBytes前,确保GPIB板卡地址设置正确。
  • 避免调用ibgts,除非紧接在ibcmd调用之后。ibcmd函数使ATN线置为有效,从而让仪器预期命令消息,而不是数据消息。

EARG (4)

错误条件:函数调用的参数无效。

描述:当无效参数传递给函数调用时,将导致EARG。

可能原因:以下是一些例子:调用ibtmo时的值不在0到17范围内(可能的超时值对应于一个表格,其值在0到17之间,默认值为13,表示10秒超时);调用ibeos时,第二个参数的高字节中含有无意义的位,或使用无效地址调用ibpad(或ibsad)。

解决方法:

  • 对照NI-488.2函数参考手册(见下文相关链接),确保您的参数有效。
  • 请勿在板卡级函数中使用设备描述符,或在设备级函数中使用板卡描述符。

ESAC (5)

错误条件:GPIB板卡不是所需的系统控制器。

描述:若GPIB板卡不具备系统控制器功能,在调用ibsic、ibsre、SendIFCEnableRemote时,会发生ESAC。

可能原因:GPIB板卡未配置为系统控制器。

解决方法:

  • 调用ibrsc 1或使用GPIB配置工具来赋予GPIB板卡系统控制器功能。

EABO (6)

错误条件:I/O操作中止。

描述:EABO表示由于某种原因,I/O操作已被取消。

可能原因:EABO错误通常是由读取或写入操作期间的超时导致的,但也可能是由于在I/O操作期间调用ibstop函数、ibclr函数或类似函数导致的。若未启用PCI总线控制(计算机BIOS中的选项),则在使用PCI-GPIB板卡进行写入操作期间可能会收到超时。若您正在读取的仪器不理解上一条命令,该仪器没有任何信息发送给您,您将在读取操作期间收到超时。仪器没有任何信息可发送,可能有几种原因:

  • 发送给仪器的消息可能存在拼写错误。例如,"*IDN?"是IEEE 488.2兼容仪器的常见识别查询。该信息很容易拼错成"*IND?",这是该仪器无法理解的,所以它不会生成消息字符串,供您从仪器中读取。
  • 发送给仪器的消息可能包含无法被仪器理解的命令。例如,上一个例子中的"*IDN?"消息只能被IEEE 488.2 兼容仪器理解。若您使用的是旧的、不兼容IEEE 488.2的设备,那么它不会理解"*IDN?",因此也不会生成消息字符串,供您从仪器中读取。
  • 仪器使用了特定的EOS(字符串结束)字符作为其终止方法,但您可能忘记将此终止字符添加到消息中。例如,若您的仪器需要一个换行符作为EOS字符,那么"ID?"将不起作用,但是"ID?\n"(其中\n代表IBIC中的换行符)可以。\n例如,若您的仪器需要一个换行符作为EOS字符,那么"ID?"将不起作用,但是"ID?\n"(其中\n代表IBIC中的换行符)可以。 \n 例如,若您的仪器需要一个换行符作为EOS字符,那么"ID?"将不起作用,但是"ID?\n"(其中\n代表IBIC中的换行符)可以。
  • 您可能希望将EOI(结束或识别,五条总线管理线之一)作为终止方法,但若仪器在完成发送其消息时未设置EOI线,您执行的任何读取操作都将超时。

解决方法:

  • 确保消息中的命令可被仪器理解。检查设备的用户手册,查看可使用的命令列表。
  • 检查用户手册,查看您的仪器是否需要处于GPIB或488.2模式才能成为GPIB侦听器。  通常,仪器只在置于该模式后才响应标准命令,否则即使发送了有效的命令,仪器也会发出错误。
  • 确认您的仪器使用了正确的终止方法。字节数(您期望在消息中接收一定数量的字节)总是被使用,但是一些仪器使用EOS和字节数,一些使用EOI和字节数,另一些只使用字节数。检查设备的用户手册,了解仪器可用的终止方法。
  • 若终止方法是EOS,那么一定要将终止符附加到消息的末尾。您可以在GPIB配置工具中指定终止字符,但NI-488.2驱动程序不会自动为您添加。
  • 使用ibtmo命令延长I/O操作的超时时间。
  • 如果您收到所有数据并接收到EABO错误,请查找特定的字符串字符结尾(例如,换行或回车),并配置GPIB板卡使用ibeos函数终止对该字符的读取。

ENEB (7)

错误条件:不存在的GPIB板卡。

描述:当GPIB配置工具中指定的I/O地址不存在GPIB板卡时,将发生ENEB。板卡未物理插入系统、配置过程中指定的I/O地址与实际板卡设置不匹配、基本I/O地址存在系统冲突或板卡的接口名称与设备相关联的板卡的接口名称不一致时,会发生该错误。

解决方法:

  • 查看GPIB配置工具,确定板卡的基本I/O地址。检查系统的资源管理器,查看另一块板卡是否尝试使用部分或全部地址范围。确保板卡的接口名称和应当与设备通信的板卡的接口名称相同。
  • 对于传统板卡,请确保跳线和DIP开关设置与GPIB配置工具认为它正在使用的资源设置相同。
  • 关闭计算机,确保板卡牢固地插在插槽中。

EDMA(8)

错误条件:使用DMA进行数据传输时发生错误。

描述:若NI-488.2驱动程序尝试使用DMA通过GPIB传输数据时遇到系统DMA错误,则会发生EDMA。

解决方法:

  • 您可以使用GPIB配置工具重新配置GPIB板卡,修复硬件中的EDMA问题,使其不再使用DMA资源。
  • 您可以使用ibdma函数禁用DMA,以修正软件中的EDMA问题。

EOIP (10)

错误条件:正在进行异步I/O时不支持函数。

描述:进行其他GPIB调用前,若异步I/O操作未完成,则会发生EOIP。您只能在异步I/O操作期间使用ibstop、ibnotify、ibwaitibonl函数。若尝试其他GPIB调用,则返回EOIP。

可能原因:在异步I/O期间调用任何不受支持的GPIB函数。

解决方案:

  • 在进行进一步的GPIB调用前,重新同步驱动程序和您的应用程序。使用以下函数之一来完成重新同步:ibnotify(若传递给ibnotify回调的ibsta值包含CMPL,驱动程序和应用程序将重新同步);ibwait(若返回的ibsta包含CMPL,则驱动程序和应用程序将重新同步);ibstop(这将取消异步I/O操作,导致驱动程序和应用程序立即重新同步);或ibonl(这将取消异步I/O操作并重置接口,导致驱动程序和应用程序立即重新同步)。

ECAP (11)

错误条件:无法进行操作。

描述:当您的GPIB板卡无法进行操作,或软件中的特定功能已被禁用且发生了需要该功能的调用,会发生ECAP。

解决方案:

EFSO (12)

错误条件:文件系统错误。

描述:ibrdfibwrtf调用执行文件操作时遇到问题,会发生EFSO。具体而言,该错误表示函数无法打开、创建、查找、写入或关闭正在访问的文件。ibcntl包含这种情况的特定操作系统错误代码。

解决方法:

EBUS (14)

错误条件:命令字节传输错误。

描述:设备函数执行期间发生某些GPIB总线错误,导致EBUS。所有设备函数都发送命令字节以执行寻址和其他总线管理操作。设备预期在由默认配置或ibtmo函数指定的时间限制内接受这些命令字节。如果发送这些命令字节时发生超时,将发生EBUS。

可能原因:没有GPIB设备连接到GPIB控制器。这可能是因为所有仪器都已关闭、仪器之一出现了错误且正在将握手线置有效、GPIB电缆与主板断开连接或GPIB电缆已断开。

解决方法:

  • 确认所有仪器运行正常,且您希望与之通信的仪器确实已打开电源。
  • 断开所有仪器,然后一台一台依次连接,以确定是否有一台仪器导致了问题。
  • 检查布线是否松动或有故障,并确保至少2/3的仪器已通电(这是IEEE 488规范的要求)。
  • 如果驱动程序发送命令字节的超时时间太短,请增加超时时间。

ESTB (15)

错误条件:串口轮询状态字节丢失。

描述:ESTB仅由ibrsp函数报告。ESTB表示由于缺少存储空间,从自动串行轮询接收到的一个或多个串行轮询状态字节已被丢弃。几个较旧的状态字节可用。但是,最早的是由ibrsp调用返回的。

可能原因:仪器反复将SRQ线置有效。

解决方法:

  • 更频繁地调用ibrsp来清空队列。
  • 使用ibconfig函数(选项IbcAUTOPOLL)禁用自动轮询或在GPIB配置工具中禁用自动轮询。

ESRQ (16)

错误条件:SRQ保持在ON位置。

描述:ESRQ只能由设备级别的ibwait调用返回,前提是您已将ibwait函数配置为在状态字(ibsta)的RSQ位置为有效时返回。ESRQ表示无法等待RQS,因为GPIB SRQ线卡在ON位置。

可能原因:可能原因:这种情况可能是由以下事件引起的:布线问题可能导致SRQ线保持在置有效;软件未知的设备正在将SRQ线置有效-因为软件不知道该设备,它永远不会串行轮询设备以将SRQ线置无效;或者GPIB总线测试仪(或类似设备)强行将SRQ线置有效。

解决方法:

  • 检查总线上是否有一个设备(即使应用程序未使用的设备)正在将SRQ线置有效。必要时将它们从GPIB断开。
  • 检查GPIB电缆并确保连接器正确安装。

ETAB (20)

错误条件:表格问题。

描述:ETAB仅在FindLstnFindRQS函数期间发生。ETAB表明这些函数使用的表格存在一些问题。

可能原因:使用FindLstn时,ETAB表示给定的表格没有足够的空间来容纳找到的所有侦听器地址。使用FindRQS时,ETAB意味着给定的表格中没有任何设备请求服务。

解决方法:

  • 使用FindLstn时,请增加结果数组的大小。
  • 使用FindRQS时,请检查应用程序未使用的其他设备是否正在将SRQ置有效。必要时将它们从GPIB断开。

ELCK (21)

错误条件:GPIB接口被锁定,无法访问。

可能原因:当两个或更多进程想要访问同一接口,并且一个进程已经锁定接口时,会发生该错误。由于接口上存在的锁定而无法执行操作时,会返回该错误。当进程试图解锁不存在锁定的接口时,也会返回该错误。

解决方案:

  • 避免ELCK错误的方法是:尝试再次锁定接口之前等待一段随机时间。如果您使用iblck命令来锁定接口,请增加LockWaitTime并等待其他进程放弃对接口的控制。同时,还要确保进程在整个执行期间不会锁定接口。

EARM (22)

错误条件:ibnotify回调重置失败。

可能原因:在NI-488.2应用程序中使用异步通知(ibnotify)时会发生该错误。若您希望应用程序在一个或多个GPIB事件发生时收到异步通知,该函数非常有用。该事件通知是通过回调函数执行的。发生ibnotify调用时,回调函数与NI-488.2驱动程序一同注册。该错误表明该回调通知无法通过返回非法值进行重置,或发生严重驱动程序错误(EDVR)。

解决方法:

EHDL (23)

错误条件:输入句柄无效。

可能原因:几条GPIB命令将板卡或设备的输入句柄作为输入参数,可能是该错误的原因。该错误可能在多种情况下发生。例如:

  • 有效的板卡句柄作为设备句柄参数传入,或有效的设备句柄作为板卡句柄参数传入。
  • 无效的板卡或设备描述符作为输入传递给任意NI-488.2函数。
  • 0-99范围外的板卡ID被传递至传统NI-488.2板卡级函数或NI-488.2程序
  • ibconfigibmask通过设备单元描述符和仅板卡配置选项调用,或通过板卡单元描述符和仅设备配置选项调用。

解决方法:

  • 检查是否在调用函数时混淆了设备级函数和板卡级函数。
  • 同时,检查传递给NI 488.2调用的板卡索引是否是有效的索引编号。

EWIP (26)

错误条件:等待指定输入句柄。

可能原因:若同一进程中有多个线程,且有两个或更多线程访问同一个接口,则会发生此错误。EWIP表示指定单元描述符上已经存在进行中的ibwait调用,当一个线程已经使用相同的描述符运行ibwait,且另一线程尝试对同一描述符调用ibwait时,就会发生EWIP。

解决方案:

  • 确保在任何给定的时间点,只有一个线程对给定的单元描述符执行ibwait调用。

ERST (27)

错误条件:由于接口重置,已取消事件通知。

可能原因:由于接口重置而取消事件通知时,会发生ERST。下列情况中,驱动程序中待处理的ibwait调用将返回ERST:

  • 同一进程中的另一个线程使用与ibwait相同的单元描述符调用ibonl
  • 另一个线程或进程发起了板卡级ibonl 1

下列情况中,ibnotify回调可能会引发ERST:

  • 另一进程发起了板卡级ibonl 1

解决方法:

  • 当驱动程序中存在待处理的ibwait调用时,请勿调用ibonl
  • 使用iblck锁定接口,阻止其他应用程序调用ibonl

EPWR (28)

错误条件:接口断电。

可能原因:接口断电时将发生EPWR。当系统进入待机状态并从待机状态返回时,通常会发生这种情况。

解决方法:

  • 使所有句柄离线,并重新初始化应用程序。
  • 退出应用程序,并重启系统。
  • 禁用PC上的待机和休眠模式。

Was this information helpful?

Yes

No