串口轮询是在GPIB设备请求服务时获取特定信息的方法。进行串行轮询时,控制器将查询每个设备,查找置SRQ有效的设备。设备通过返回其状态字节的值来响应轮询。取决于设备的条件(例如,存在可用数据或错误条件)可确定该值。ANSI/IEEE Standard 488.1-1987在状态字节(位6)中仅指定一个位,如设备请求服务,该值为TRUE。状态字节中的其他位由仪器制造商定义。IEEE 488.1兼容仪器的位数决定了仪器是否发生错误或设备是否进行自检。不同仪器供应商的位定义不一致,确定服务请求原因的方法因设备而异。
ANSI/IEEE Standard 488.2-1987定义了特定的服务请求条件,使一个模型描述了所有兼容设备的状态字节。位6,即设备请求服务(RQS)位,保持IEEE 488.1的定义。如设置了比特6,设备将请求服务。IEEE 488.2标准定义了位4和5;仪器制造商定义了剩余的位(0至3和7)。位4是可用消息(MAV)位。如之前已查询设备的数据且设备有待发送的数据消息,则设置该位。位5是事件状态位(ESB)。发生一个或多个启用IEEE 488.2定义的事件时设置该位。这些事件包括上电、用户请求、命令错误、执行错误、设备相关错误、查询错误、请求控制和操作完成。设置ESB或MAV或发生制造商定义条件时,设备可置SRQ有效。
NI-488.2程序基于IEEE 488.2标准中的序列。与SRQ服务和串行轮询相关的程序有:AllSpoll、FindRQS、ReadStatusByte、TestSRQ和WaitSRQ。
AllSpoll可通过单个例程调用串行轮询多个设备。AllSpoll将每个被轮询仪器的状态字节放入预定义数组。必须手动检查每个设备状态字节中的RQS位,以确定该设备是否请求服务。
FindRQS可串行轮询多个设备。如某个设备通过置SRQ有效请求服务,程序将返回请求服务的设备的索引和状态字节值。
ReadStatusByte返回单个设备的状态字节的值,即执行单个串行轮询。程序必须手动检查状态字节值中的RQS位,以确定该设备是否请求服务。
TestSRQ确定SRQ线有效还是无效。
WaitSRQ与TestSRQ类似,区别在于WaitSRQ挂起应用程序,直至SRQ有效或超时。
下列QuickBASIC范例执行SRQ服务,然后使用NI-488.2程序确定请求服务的设备。在下列范例中,假设GPIB上的地址为3、4和5,且GPIB接口被指定为总线索引0。
REM $include: 'qbdecl.bas'
使用NI-488.2程序的REM SRQ服务程序。该代码REM在循环中无限等待SRQ置为有效。置REM SRQ有效后,程序跳转到用户定义的REM子程序,该子程序可能串行轮询设备并分析REM串行轮询状态字节。
导入层定义文件(LPF)。
.板卡% = 0
100 CALL TestSRQ(板卡%, 结果%) IF结果% = 1 THEN
调用serial.poll ELSE
GOTO 100结束IF
或者实现WaitSRQ例程来执行相同的任务,如下例所示。主要区别在于,操作被挂起,直至SRQ有效或超过超时限制。
调用WaitSRQ(板卡%, 结果%) IF结果% = 1 THEN
调用 serial.poll ELSE
打印“等待SRQ超时;无SRQ”结束IF
一旦GPIB控制器使用NI-488.2程序检测到SRQ线,下一步就是串行轮询每个设备。每个设备返回的串行轮询状态字节提供有价值的状态信息,例如,设备是否请求服务及其原因。控制器可分析从每个设备获取的串行轮询状态字节以获取该信息。
可使用FindRQS例程确定请求服务的设备。FindRQS串行轮询每个设备,仅返回请求服务的设备的状态字节。程序自动检查每个串行轮询状态字节中的RQS位。ibcnt全局变量返回地址数组中列出的请求服务的设备的索引。在下列范例中,假设地址为3、4和5的三台设备连接至GPIB,且其中一台已置SRQ有效。
REM $include: 'qbdecl.bas'
DIM地址列表%(3) 。
.地址列表%(0) = 3地址列表%(1) = 4地址列表%(2) = 5地址列表%(3) = NOADDR
调用FindRQS (0, 地址列表% (), 结果%)
PRINT "Device at index";ibcnt;"requested service"
REM分析结果%确定设备置SRQ有效的原因。REM 关于串行轮询状态字节定义的更多信息,见设备随附的文档。
可使用AllSpoll或ReadStatusByte串行轮询设备。以下代码显示了AllSpoll的可能实现。假设GPIB上有三个地址为3、4、5的设备,且控制器检测到SRQ。每个设备的串行轮询状态字节存储在数组结果列表%()中,以便进一步分析。
REM $include: 'qbdecl.bas'
DIM结果列表% (2) 。
导入层定义文件(LPF)。
调用所有轮询(0, 地址列表% (), 结果列表% ())
其中,i% = 0, 1, …, n – 2
如果结果列表% (i%) AND H40 THEN
打印"索引处的设备";i%;"请求的服务" END IF
下一个i%
NI-488函数是仪器控制应用的行业标准。本节介绍检测SRQ和进行串行轮询所需的函数。
NI-488函数分为两组:设备函数和板卡函数。设备函数在一次调用中完成设备的寻址和数据传输。相比之下,一个板卡函数可能寻址GPIB板卡上的设备,而另一个可能实际执行数据传输。函数是被指定为板卡函数还是设备函数取决于作为函数参数之一传递的单位描述符值。如单元描述符指向接口板卡,函数将被指定为板卡函数。
用于串行轮询的NI-488函数是ibrsp。ibrsp执行单个串行轮询并将串行轮询响应字节返回给应用程序。它类似于上述NI-488.2 ReadStatusByte程序。
NI-488.2驱动程序具有自动串行轮询或自动轮询的内部功能。如自动轮询处于活动状态且SRQ线变为高电平,驱动程序将自动执行下列操作:1) 开始串行轮询每个已被ibfind或ibdev打开的设备,SRQ线变低时停止轮询;2) 将串行轮询响应状态字节存储在内存队列中,以备后用;3) 在每个返回状态字节(已设置位6)的设备的状态字(ibsta)中设置RQS位。
必须启用和允许自动轮询,才可启用。是否启用自动轮询由驱动程序配置程序或ibconfig函数决定。注意,所有NI驱动程序随附的自动轮询功能默认由驱动程序配置程序启用。执行NI-488设备级函数后允许自动轮询。在执行NI-488板卡级函数或NI-488.2程序后,不允许自动轮询。
如GPIB板卡分配了中断,只要GPIB I/O未处于运行状态,自动轮询可立即响应SRQ线。如板卡没有中断,自动轮询只能在设备等待RQS期间或设备功能完成并即将返回应用程序后直接响应服务请求。
使用自动轮询的主要优点是,请求服务的设备被尽快轮询。如GPIB板卡分配了中断,自动轮询是一种中断服务程序,可确保对设置的SRQ线作出最快响应。使用自动轮询的缺点是,编程应用程序时必须谨慎,以确保自动轮询处于活动状态(启用和允许)。
从编程的角度来看,自动轮询最适合一次只有一个设备请求服务的情况。这是因为当自动轮询处于活动状态时,监控SRQ线作为服务请求的指示并不可靠。因此,要在自动轮询处于活动状态时检查服务请求,必须在每个可能需要服务的设备的ibsta状态字中检查RQS位。如自动轮询未处于活动状态,可通过检查SRQ线来监控服务请求,这可通过检查任意ibsta的SRQI位或使用ibline来完成。
下列代码演示了禁用自动串行轮询时,ibwait和ibrsp函数在典型SRQ服务中的用法。 ibwait将暂停程序执行,直至GPIB满足特定条件。
REM $include: 'qbdecl.bas'
REM 本范例假设两个设备已连接REM至GPIB。任何设备均可置SRQ有效。REM 其中一个设备是示波器(称为示波器)REM,另一个是数字万用表(称为dmm)。
REM 第一个任务是等待SRQ线置为有效。该REM可由SRQI的ibwait或循环结构REM使用ibwait 0或iblines函数完成。在该例中,我们使用ibwait函数等待REM的SRQI位设置或超时。
调用ibfind ("gpib0", brd0%) 调用ibfind ("dev1", scope%) 调用ibfind ("dev2", dmm%)
调用ibwait (brd0%, SRQI|TIMO)
REM 如设置SRQI导致ibwait终止,轮询REM设备并解析返回的状态字节,以查看哪个(如REM未同时满足)请求服务。
如果(ibsta% AND SRQI) THEN
REM 在该例中,由于自动轮询未处于活动状态,ibrsp REM使用gpib总线从范围中获取状态字节。调用ibrsp(scope%, spr.scope%) IF (spr.scope% AND &H40) THEN print "Scope asserted SRQ."
REM在这里,您将分析串行轮询状态字节REM spr.scope%,以确定SRQ的原因。
调用ibrsp(dmm%, spring.meter%)
如果(spr.meter% AND &H40) THEN 打印"DMM置SRQ有效。"
REM 分析串行轮询状态字节REM spr.meter%的剩余部分,以确定SRQ的原因。
结束IF
如自动轮询处于活动状态,必须使用该设备ibsta的RQS位来确定该设备是否已请求服务。注意,ibrsp再次用于返回状态字节,但这次我们知道位6已被设置,因为RQS位是基于单个设备检查的。此外,ibrsp仅访问之前由自动轮询程序获取和存储的状态字节。
REM 自动轮询处于活动状态时,可将以下代码节选作为子程序,以检查特定设备是否为请求服务的REM。
SUB RQScheck(设备%)
调用ibwait (device%, 0) IF (ibsta% AND RQS) THEN
打印"设备置SRQ有效"
REM 在该情况下,ibrsp不轮询设备,REM 仅从内存中返回响应字节。REM 状态字节将用于确定如何对设备进行REM服务。
调用ibrsp (device%, spring.device%)
结束IF
ENDSUB
本文档介绍了GPIB控制器如何使用NI-488.2软件检测和响应总线上IEEE 488设备的服务请求。通过实现本文档中介绍的NI-488.2例程和NI-488函数,可进行SRQ服务和串行轮询。代码范例演示了如何在应用程序环境中使用例程和函数。