NI-488.2软件LabVIEWSRQ服务

概述

GPIB控制器的功能之一是检测和响应总线上设备的服务请求。GPIB上的服务请求线(SRQ)用于在服务请求待处理时向控制器发送信号。然后控制器必须确定哪个设备置SRQ线有效并作出相应响应。最常见的SRQ检测和服务方法是串行轮询。本应用说明介绍了NI-488.2软件如何检测和响应IEEE 488设备的服务请求。此外,本应用笔记还包括演示如何在LabVIEW程序中实现NI-488.2软件例程和函数的代码范例。

内容

必要性课堂类比

GPIB控制器和仪器之间的通信可以比作教室中教师和学生之间的通信。在课堂上,教师负责课堂并控制活动。GPIB的工作方式与此类似,控制器决定何时执行任务。在教室中,学生必须拥有大声说话的权限,在GPIB上,任何设备都必须在总线上讲话才能进行通信。但是,如果设备无法在控制器未通知的情况下开始与控制器通话,如何让控制器知道设备有通信内容?

这个问题在课堂上可以解释为,如果教师不说,学生怎么可能让教师知道他或她有话要说?好的方法是让学生举手。同样,仪器可置名为SRQ的硬件线有效。这是GPIB总线中一条独立的线,专门用于通知控制器需要注意的设备。

为什么设备需要请求服务?在某些情况下,控制器可向设备请求数据(写入设备),并在写入操作完成后立即将数据读回。但并非所有情况都是如此。有时,控制器可能会在数据可用之前尝试从仪器读取数据(仪器生成数据可能需要较长时间),并发生超时错误。这种情况类似于教授在学生完成问题之前询问学生问题的答案。在这种情况下,教授宁愿等到学生完成问题后举手。一旦学生举手,教授将询问学生答案。但在GPIB中,由于所有设备共享SRQ线,控制器不知道请求服务的是哪个设备。需要串行轮询,以便控制器能够找到需要关注的设备。

理论


串口轮询是在GPIB设备请求服务时获取特定信息的方法。进行串行轮询时,控制器将查询每个设备,搜索置SRQ线有效的设备。每个设备通过返回其状态字节寄存器中包含的状态字节的值来响应轮询(见图1)。取决于设备的条件(例如,存在可用数据或错误条件)可确定该值。ANSI/IEEE Standard 488.1-1987指定,如设备请求服务,状态字节中的一位RQS位(位6)为TRUE。状态字节中的其他位由仪器制造商定义。兼容IEEE 488.1的仪器可能包含判定仪器是否发生错误或设备是否进行自检的位。由于仪器供应商的位定义不一致,确定服务请求原因的方法因设备而异。


图1.状态字节寄存器

ANSI/IEEE Standard 488.2-1987定义了特定的服务请求条件,使一个模型描述了所有符合488.2标准的设备的状态字节。IEEE 488.2标准基于并扩展了上一节讨论的IEEE 488.1状态字节(见图2)。IEEE 488.2与IEEE 488.1标准一样定义了RQS位。IEEE 488.2添加可用消息(MAV)位和事件状态位(ESB)。如设备已被查询数据且有待发送的数据消息,则设置MAV位。ESB位表示标准事件状态寄存器中定义的某个标准事件发生。通过在标准事件状态启用寄存器中设置相应的位,可定义设置ESB的标准事件。这些事件包括上电、用户请求、命令错误、执行错误、设备相关错误、查询错误、请求控制和操作完成。通过在服务请求启用寄存器中设置相应的位,可配置仪器在设置ESB或MAV或发生制造商定义条件时置SRQ线有效。


图2.IEEE 488.2状态报告模型

用于LabVIEW函数

LabVIEW GPIB 488子选板中包含下列函数,在LabVIEW中执行串行轮询时必不可少:

GPIB串口轮询(NI-488中的ibrsp)执行串口轮询并从单个设备返回状态字节的值。程序必须手动检查状态字节值中的RQS位,以确定该设备是否请求服务。

GPIB等待(NI-488中的ibwait)等待特定GPIB总线中指定的状态字掩码指定的状态。状态字是一个全局变量(16位),包含GPIB信息、SRQ线的状态(位12,SRQI)和设备是否已请求服务(位11,RQS)。如传递的向量等于0,则不等待任何指定分支并更新ibsta或状态字。但是,如果掩码被设置为检查位12 (SRQI),函数将等待直到该特定线被置为特定GPIB板卡有效,该板卡的地址在GPIB等待中指定。

等待GPIB RQS(NI-488中的ibwait,掩码为位11)类似于使用GPIB等待函数,掩码为位11,但使用特定设备地址的GPIB地址,而不是GPIB板卡地址(等待位12时)。该函数等待特定设备请求服务,而不是等待板卡(可连接多个设备)接收服务请求。该函数将等待直到RQS位置有效或超时。

下列范例演示了如何使用LabVIEW GPIB函数为SRQ提供服务并串行轮询设备。

在LabVIEW范例1(图3)中,将命令写入NI Instrument Simulator。该命令包含操作完成事件在事件状态寄存器(ESR)中注册时仪器生成服务请求(SRQ)的说明。前两个命令将这些指令写入服务请求启用寄存器和事件状态启用寄存器(IEEE-488.2规范)。第三个命令要求仪器仿真器生成正弦波;最后一个命令生成操作完成事件。以下代码等待通过检查状态字的位12生成SRQ。生成后,将在设备仿真器上执行串行轮询以读取状态字节并了解生成SRQ的原因。如设置了位5(来自已设置操作完成位的事件状态寄存器)和位6(RQS,设备已请求服务),控制器将继续从设备仿真器读取数据。请注意,必须清除ESR寄存器。这样可避免仪器生成不需要的服务请求。



图3.LabVIEW范例1

LabVIEW范例2(图4)显示了等待设备请求服务的另一种方式。但是,在最后一个范例中,处理器停止并等待,不执行任何其他操作。在第一个例子中,等待设备请求服务时,其他操作可以并行执行。



图4.LabVIEW范例2

LabVIEW GPIB 488.2函数

GPIB 488.2函数为串行轮询增加了新的功能,用户可通过GPIB命令轮询多个设备。LabVIEW将这些函数包括在GPIB 488.2函数子选板-AllSpoll和FindRQS中。

AllSpoll可通过单个例程调用串行轮询多个设备。AllSpoll将每个被轮询仪器的状态字节放入预定义数组。必须手动检查每个设备状态字节中的RQS位,以确定该设备是否请求服务。

FindRQS可串行轮询多个设备。如某个设备通过置SRQ有效请求服务,程序将返回第一个请求服务的设备的索引和状态字节值。

如已知只有一个仪器置SRQ有效,且想知道哪个仪器及其串行轮询响应字节,可使用查找RQS函数。如怀疑多个仪器置SRQ有效,可使用AllSpoll从所有设备接收串行轮询响应字节。如状态字节已设置位6,表示设备已请求服务。换言之,当设备请求服务时,状态字节的值至少为十六进制40。

LabVIEW范例3(图5)演示了如何使用LabVIEW NI-488.2函数执行串行轮询。请注意,该GPIB 488.2范例与之前显示的GPIB范例非常相似。大多数LabVIEW GPIB函数已被替换为等效的LabVIEW GPIB 488.2函数,例如,使用“发送”和“接收”替代“GPIB写入”和“GPIB读取”;使用“读取状态”替代“GPIB串行轮询”;使用“测试SRQ”替代“GPIB等待”并将掩码设置为0。此外,本范例演示了使用移位寄存器在While循环周期之间传递错误簇,从而控制程序中可能的错误的更好方法。



图5.LabVIEW范例3

总结

本应用笔记介绍了GPIB控制器如何使用NI-488软件检测和响应总线上IEEE 488设备的服务请求。还包括演示如何使用LabVIEW GPIB函数串行轮询设备的LabVIEW代码范例。

Was this information helpful?

Yes

No