El sondeo en serie es un método para obtener información específica de los dispositivos GPIB cuando solicitan servicio. Cuando realiza una encuesta en serie, el controlador consulta cada dispositivo buscando el que afirmó SRQ. El dispositivo responde a la encuesta devolviendo el valor de su byte de estado. Las condiciones dependientes del dispositivo, como la presencia de datos disponibles o una condición de error, determinan este valor. El Estándar ANSI/IEEE 488.1-1987 especifica solo un bit en el Byte de Estado, Bit 6, que es VERDADERO si el dispositivo solicita servicio. Los otros bits del byte de estado se dejan al fabricante del instrumento para definirlos. Los instrumentos compatibles con IEEE 488.1 tienen bits que determinan si se ha producido un error en el instrumento o si el dispositivo está realizando una autoprueba. Estas definiciones de bits no son consistentes entre los proveedores de instrumentos y el método para determinar la causa de una solicitud de servicio varía con cada dispositivo.
El estándar ANSI/IEEE 488.2-1987 resuelve este problema definiendo ciertas condiciones de solicitud de servicio de modo que un modelo describe el byte de estado para todos los dispositivos compatibles. El bit 6, el bit de servicio de solicitud de dispositivo (RQS), mantiene la definición IEEE 488.1. Si el bit 6 está configurado, el dispositivo solicitó servicio. El estándar IEEE 488.2 define los bits 4 y 5; los fabricantes de instrumentos definen los bits restantes (0 a 3 y 7). El bit 4 es el bit de Mensaje Disponible (MAV). Este bit se establece si el dispositivo ha sido consultado previamente para obtener datos y el dispositivo tiene un mensaje de datos pendiente para enviar. El bit 5 es el bit de estado del evento (ESB). Este bit se establece si se produce uno o más de los eventos definidos de IEEE 488.2 habilitados. Estos eventos incluyen encendido, solicitud de usuario, error de comando, error de ejecución, error dependiente del dispositivo, error de consulta, control de solicitud y operación completa. El dispositivo puede afirmar SRQ cuando se configura ESB o MAV, o cuando se produce una condición definida por el fabricante.
Las rutinas NI-488.2 se basan en aquellas secuencias que se encuentran en el estándar IEEE 488.2. Las rutinas pertinentes para el servicio de SRQ y el sondeo en serie son AllSpoll, FindRQS, ReadStatusByte, TestSRQ y WaitSRQ.
AllSpoll puede sondear en serie varios dispositivos con una sola llamada de rutina. AllSpoll coloca el byte de estado de cada instrumento sondeado en una matriz predefinida. Debe comprobar manualmente el bit RQS en el byte de estado de cada dispositivo para determinar si ese dispositivo solicitó servicio.
FindRQS puede sondear en serie varios dispositivos. Si uno de los dispositivos solicita servicio mediante la afirmación de SRQ, la rutina devuelve el índice y el valor de octeto de estado del dispositivo que solicita el servicio.
ReadStatusByte devuelve el valor del Status Byte desde un solo dispositivo, es decir, realiza una sola encuesta en serie. El programa debe verificar manualmente el bit RQS en el valor de Status Byte para determinar si ese dispositivo solicitó servicio.
TestSRQ determina si la línea SRQ está activada o no.
WaitSRQ es similar a TestSRQ, excepto que WaitSRQ suspende el programa de aplicación hasta que se afirma SRQ o se excede el tiempo de espera.
El siguiente ejemplo de QuickBASIC realiza el servicio de SRQ y, a continuación, utiliza las rutinas NI-488.2 para determinar qué dispositivo solicitó el servicio. En el siguiente ejemplo, se hacen estas suposiciones: tres dispositivos están presentes en el GPIB en las direcciones 3, 4 y 5, y la interfaz GPIB se designa como índice de bus 0.
REM $include: 'qbdecl.bas'
REM Programa de servicio de SRQ que utiliza rutinas NI-488.2. Este código REM espera indefinidamente en un bucle a que se active la línea SRQ. Cuando REM SRQ se activa, el programa salta a una subrutina REM definida por el usuario que podría sondear en serie los dispositivos y analizar REM el byte de estado de sondeo en serie.
.
. board% = 0
100 CALL TestSRQ(board%, result%) IF result% = 1 THEN
CALL serial.poll ELSE
GOTO 100 END IF
Alternativamente, puede implementar la rutina WaitSRQ para realizar la misma tarea, como se muestra en el siguiente ejemplo. La principal diferencia es que las operaciones se suspenden hasta que se afirma SRQ, o se excede el límite de tiempo de espera.
CALL WaitSRQ(board%, result%) IF result% = 1 THEN
CALL serial.poll ELSE
PRINT "Se agotó el tiempo de espera de WaitSRQ; no hay señal SRQ" END IF
Una vez que el controlador GPIB detecta la línea SRQ utilizando una de las rutinas NI-488.2, el siguiente paso es sondear en serie cada dispositivo. El byte de estado de sondeo en serie devuelto por cada dispositivo proporciona información de estado valiosa, como si el dispositivo solicitó servicio y por qué. El controlador puede analizar el byte de estado de sondeo en serie recuperado de cada dispositivo para obtener esta información.
Puede utilizar la rutina FindRQS para determinar qué dispositivo solicitó el servicio. FindRQS serial sondea cada dispositivo y devuelve solo el byte de estado del dispositivo que solicitó el servicio. La rutina comprueba automáticamente el bit RQS en cada byte de estado de sondeo en serie. El índice del dispositivo que solicitó el servicio, como se muestra en la matriz de direcciones, se devuelve en la variable global ibcnt. En el siguiente ejemplo, suponga que tres dispositivos en las direcciones 3, 4 y 5 están conectados al GPIB, y que uno de ellos ha afirmado SRQ.
REM $include: 'qbdecl.bas'
DIM addresslist%(3) .
. addresslist% (0) = 3 addresslist% (1) = 4 addresslist% (2) = 5 addresslist% (3) = NOADDR
CALL FindRQS (0, addresslist% (), result%)
PRINT "El dispositivo en el índice";ibcnt;"solicitó servicio"
REM Analice result% para determinar por qué el dispositivo activó la línea SRQ. REM Consulte la documentación provista con sus dispositivos para REM obtener más información sobre las definiciones del byte de estado de sondeo en serie.
Puede usar AllSpoll o ReadStatusByte para sondear en serie un dispositivo. El siguiente código muestra una posible implementación de AllSpoll. Supongamos que tres dispositivos en las direcciones 3, 4, 5 están presentes en el GPIB y SRQ es detectado por el Controlador. Los bytes de estado de sondeo en serie para cada dispositivo se almacenan en la matriz resultlist%() para su análisis posterior.
REM $include: 'qbdecl.bas'
DIM resultlist% (2) .
.
CALL AllSpoll (0, addresslist% (), resultlist% ())
FOR i% = 0 to 2
IF resultlist% (i%) AND &H40 THEN
PRINT "El dispositivo en el índice";i%;"solicitó servicio" END IF
NEXT i%
Las funciones NI-488 son un estándar industrial para aplicaciones de control de instrumentos. En esta sección se describen las funciones necesarias para detectar SRQ y realizar una encuesta en serie.
Las funciones NI-488 se dividen en dos grupos, funciones del dispositivo y funciones de la placa. Las funciones del dispositivo realizan el direccionamiento de un dispositivo y la transferencia de datos en una sola llamada. En comparación, una función de la placa podría dirigirse a los dispositivos de la placa GPIB y otra podría realizar realmente la transferencia de datos. El hecho de que una función se designe como función de placa o dispositivo depende del valor del descriptor unitario que se pase como uno de los parámetros de la función. Si el descriptor de unidad se refiere a una placa de interfaz, la función se designa como una función de placa.
La función NI-488 utilizada para sondeos en serie es ibrsp. ibrsp realiza un único sondeo en serie y devuelve el byte de respuesta de sondeo en serie al programa de aplicación. Es análogo a la rutina NI-488.2 ReadStatusByte descrita anteriormente.
Los controladores NI-488.2 tienen una característica interna llamada Sondeo automático en serie o Autopolling. Si Autopolling está activo y la línea SRQ se pone alta, el conductor hará automáticamente lo siguiente: 1) comenzar a sondear en serie cada dispositivo que ha sido abierto por ibfind o ibdev, deteniéndose cuando la línea SRQ pasa a nivel bajo; 2) almacenar el byte o bytes de estado de respuesta de sondeo en serie en una cola de memoria para su posterior recuperación; 3) establecer el bit RQS en la palabra de estado (ibsta) de cada dispositivo que devolvió un byte de estado con el Bit 6 establecido.
Para estar activo, Autopolling debe estar habilitado y permitido. Si el Autopolling está activado, lo determina el programa de configuración del controlador o la función ibconfig. Tenga en cuenta que todos los controladores NI se envían con Autopolling activado de forma predeterminada por el programa de configuración de controladores. El autopolling se permite después de la ejecución de cualquier función a nivel de dispositivo NI-488. El autopolling está desautorizado después de la ejecución de cualquier función a nivel de placa NI-488 o rutina NI-488.2.
Si la placa GPIB tiene una interrupción asignada, Autopolling puede responder a la línea SRQ inmediatamente, siempre y cuando la E/S GPIB no esté en progreso. Si la placa no tiene una interrupción, Autopolling puede responder a una solicitud de servicio solo durante una espera de dispositivo para RQS o directamente después de que se haya completado una función de dispositivo y esté a punto de regresar al programa de aplicación.
La principal ventaja que se obtiene al utilizar el Autopolling es que los dispositivos que solicitan servicio se sondean lo más rápido posible. Si la placa GPIB tiene una interrupción asignada, Autopolling es una rutina de servicio de interrupción que garantiza la respuesta más rápida a la línea SRQ que se establece. La desventaja en la que se incurre al usar Autopolling es que debe tener cuidado al programar sus aplicaciones para asegurarse de que Autopolling esté activo (habilitado y permitido).
Desde el punto de vista de la programación, Autopolling es el más adecuado para situaciones en las que solo un dispositivo a la vez solicitará servicio. Esto se debe al hecho de que monitorear la línea SRQ como una indicación de una solicitud de servicio no es confiable cuando Autopolling está activo. Por lo tanto, para comprobar una solicitud de servicio cuando Autopolling está activo, debe comprobar el bit RQS en la palabra de estado ibsta de cada dispositivo que pueda necesitar servicio. Si Autopolling no está activo, las solicitudes de servicio se supervisan comprobando la línea SRQ, lo que se puede lograr simplemente comprobando el bit SRQI de cualquier ibsta o usando iblines.
El siguiente código ilustra el uso de las funciones ibwait e ibrsp en una situación típica de servicio de SRQ cuando se deshabilita el sondeo automático en serie. ibwait suspende la ejecución del programa hasta que se cumplan ciertas condiciones en el GPIB.
REM $include: 'qbdecl.bas'
REM Para este ejemplo, suponga que dos dispositivos están conectados REM a la GPIB. Cualquier dispositivo tiene la capacidad de afirmar SRQ. REM Uno de los dispositivos es un osciloscopio (denominado alcance) REM y el otro es un multímetro digital (denominado dmm).
REM La primera tarea es esperar a que la línea SRQ haga valer. Este REM se puede hacer mediante un ibwait para SRQI o mediante un REM de estructura de bucle usando ibwait 0 o la función iblines. Para esta ilustración, REM usamos la función ibwait para esperar a que el bit SRQI se establezca o a que se agote el tiempo.
CALL ibfind ("gpib0", brd0%) CALL ibfind ("dev1", scope%) CALL ibfind ("dev2", dmm%)
CALL ibwait (brd0%, SRQI|TIMO)
REM Si ibwait terminó debido a la configuración de SRQI, sondee los dispositivos REM e interprete los bytes de estado devueltos para ver cuál, si REM no es el caso, solicitó el servicio.
IF (ibsta% AND SRQI) ENTONCES
REM En este caso, debido a que Autopolling no está activo, ibrsp REM utiliza el bus gpib para obtener el byte de estado del ámbito. CALL ibrsp(scope%, spr.scope%) IF (spr.scope% AND &H40) THEN PRINT "El osciloscopio activó la línea SRQ."
REM Aquí analizaría el byte de estado de sondeo en serie, REM spr.scope%, para determinar la causa del SRQ.
CALL ibrsp(dmm%, spr.meter%)
IF (spr.meter% AND &H40) THEN PRINT "El DMM activó la línea SRQ."
REM Analice el resto del byte de estado de sondeo en serie, REM spr.meter%, para determinar la causa del SRQ.
FIN IF
Si Autopolling está activo, el bit RQS de ibsta para el dispositivo en cuestión debe usarse para determinar si el dispositivo ha solicitado servicio. Tenga en cuenta que ibrsp se utiliza de nuevo para devolver el byte de estado, pero esta vez ya sabemos que el bit 6 se establece porque el bit RQS se comprueba en una sola base de dispositivo. Además, ibrsp solo accede al byte de estado que se obtuvo y almacenó anteriormente por la rutina de Autopolling.
REM Cuando Autopolling está activo, el siguiente fragmento de código se puede usar como subrutina REM para comprobar si un dispositivo en particular está solicitando servicio REM.
SUB RQScheck(device%)
CALL ibwait (device%, 0) IF (ibsta% AND RQS) THEN
PRINT "Dispositivo afirmado SRQ."
REM En este caso, ibrsp no sondea el dispositivo, pero REM simplemente devuelve el byte de respuesta de la memoria. REM El byte de estado se utilizará para determinar cómo dar servicio REM al dispositivo.
CALL ibrsp (device%, spr.device%)
FIN IF
END SUB
Este documento describe cómo el controlador GPIB utiliza el software NI-488.2 para detectar y responder a las solicitudes de servicio de los dispositivos IEEE 488 en el bus. Al implementar las rutinas NI-488.2 y las funciones NI-488 descritas en este documento, puede realizar el servicio de SRQ y el sondeo en serie. Los ejemplos de código demuestran cómo puede utilizar las rutinas y funciones en el contexto de un programa de aplicación.