시리얼 폴링은 GPIB 디바이스가 서비스를 요청할 때 특정 정보를 얻는 방법입니다. 시리얼 폴을 수행할 때, 컨트롤러는 SRQ를 지정한 디바이스를 찾는 각 디바이스를 쿼리합니다. 디바이스는 상태 바이트의 값을 반환하여 폴에 응답합니다. 사용 가능한 데이터의 존재 또는 에러 조건과 같은 디바이스에 따라 이 값이 결정됩니다. ANSI/IEEE 표준 488.1-1987은 상태 바이트인 비트 6에서 오직 하나의 비트만을 지정합니다. 이는 디바이스가 서비스를 요청하는 경우 참입니다. 상태 바이트의 다른 비트는 인스트루먼트 제조업체가 정의할 수 있습니다. 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는 단일 디바이스에서 Status Byte의 값을 반환합니다. 즉, 단일 시리얼 폴을 수행합니다. 디바이스가 서비스를 요청했는지 확인하려면 프로그램이 Status Byte 값에서 RQS 비트를 수동으로 확인해야 합니다.
TestSRQ은 SRQ 라인이 지정되었는지 지정되지 않았는지 결정합니다.
[SRQ 기다림]은 [ SRQ 테스트]와 비슷하지만, [ SRQ 기다림]은 SRQ이 지정되거나 타임아웃이 초과될 때까지 어플리케이션 프로그램을 일시 정지합니다.
다음 QuickBASIC 예제는 SRQ 서비스를 수행한 후 NI-488.2 루틴을 사용하여 어떤 디바이스가 서비스를 요청했는지 확인합니다. 다음 예에서 다음과 같은 가정이 이루어집니다: 3개의 디바이스가 GPIB의 주소 3, 4, 5에 있고, GPIB 인터페이스는 버스 인덱스 0으로 지정됩니다.
REM $include: 'qbdecl.bas'
NI-488.2 루틴을 사용하는 REM SRQ 서비스 프로그램. 이 코드 REM은 루프에서 SRQ가 지정될 때까지 무한정 기다립니다. REM SRQ가 지정되면, 프로그램은 디바이스를 시리얼 폴링하고 REM 시리얼 폴 상태 바이트를 분석할 수 있는 사용자 정의 REM 서브루틴으로 이동합니다.
.
. 보드% = 0
100 CALL TestSRQ(board%, result%) IF result% = 1 THEN
CALL serial.poll ELSE
GOTO 100 END IF
또는 다음 예제와 같이 같은 작업을 수행하도록 기다림SRQ 루틴을 구현할 수 있습니다. 주요한 차이점은 SRQ가 지정되거나 타임아웃 제한이 초과될 때까지 작업이 일시 정지된다는 점입니다.
CALL WaitSRQ(board%, result%) IF result% = 1 THEN
CALL serial.poll ELSE
인쇄 "기다림 SRQ 타임아웃; SRQ 없음" END IF
GPIB 컨트롤러가 NI-488.2 루틴 중 하나를 사용하여 SRQ 라인을 감지하면, 다음 단계는 각 디바이스를 직렬 폴링하는 것입니다. 각 디바이스가 반환하는 시리얼 폴 상태 바이트는 디바이스가 서비스 요청 여부와 이유와 같은 중요한 상태 정보를 제공합니다. 컨트롤러는 각 디바이스에서 가져온 시리얼 폴 상태 바이트를 분석하여 이 정보를 얻을 수 있습니다.
FindRQS 루틴을 사용하여 어떤 디바이스가 서비스를 요청했는지 확인할 수 있습니다. FindRQS는 각 디바이스를 시리얼 폴링하고 서비스를 요청한 디바이스의 상태 바이트만을 반환합니다. 루틴은 각 시리얼 폴 상태 바이트에서 RQS 비트가 있는지 자동으로 확인합니다. 주소 배열에 나열된 서비스 요청 디바이스의 인덱스는 ibcnt 글로벌 변수에 반환됩니다. 다음 예에서, 주소 3, 4, 5에 있는 3개의 디바이스가 GPIB에 연결되어 있고, 이 중 하나가 SRQ를 지정했다고 가정합니다.
REM $include: 'qbdecl.bas'
DIM 주소리스트%(3) .
주소리스트% (0) = 3 주소리스트% (1) = 4 주소리스트% (2) = 5 주소리스트% (3) = NOADDR
호출 FindRQS (0, addresslist% (), result%)
인덱스에 있는 장치;ibcnt;"요청된 서비스"
REM 분석 결과%를 통해 디바이스가 SRQ를 지정한 이유를 확인합니다. REM 시리얼 폴 상태 바이트 정의에 대한 자세한 내용은 디바이스와 함께 제공되는 문서를 참조하십시오.
AllSpoll 또는 ReadStatusByte를 사용하여 디바이스를 직렬 폴링할 수 있습니다. 다음 코드는 AllSpoll의 가능한 구현을 보여줍니다. 주소 3, 4, 5의 세 개의 디바이스가 GPIB에 있고 SRQ가 컨트롤러에 의해 감지되었다고 가정합니다. 각 디바이스의 시리얼 폴 상태 바이트는 추가 분석을 위해 배열 resultlist%()에 저장됩니다.
REM $include: 'qbdecl.bas'
DIM resultlist% (2) .
.
AllSpoll 호출 (0, addresslist% (), resultlist% ())
여기서 i = 0, 1, ..., n ― 2
resultlist% (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 비트를 확인하거나 iblines를 사용하여 수행할 수 있습니다.
다음 코드는 자동 시리얼 폴링이 비활성화된 경우 일반적인 SRQ 서비스 상황에서 ibwait 및 ibrsp 함수를 사용하는 방법을 보여줍니다. ibwait은 GPIB에서 특정 조건이 충족될 때까지 프로그램 실행을 중지합니다.
REM $include: 'qbdecl.bas'
REM 이 예제에서는 두 개의 디바이스가 GPIB에 REM으로 연결되어 있다고 가정합니다. 두 디바이스 모두 SRQ를 지정할 수 있습니다. REM 디바이스 중 하나는 오실로스코프(스코프) REM이고 다른 하나는 디지털 멀티미터(dmm)입니다.
REM 첫 번째 작업은 SRQ 라인이 지정될 때까지 기다리는 것입니다. 이 REM은 ibwait 0 또는 iblines 함수를 사용하여 SRQI용 ibwait 또는 루프 구조 REM으로 수행할 수 있습니다. 이 그림에서 REM은 ibwait 함수를 사용하여 SRQI 비트가 REM이 설정되거나 타임아웃될 때까지 기다립니다.
ibfind 호출("gpib0", brd0%) ibfind 호출("dev1", 스코프%) ibfind 호출("dev2", dmm%)
CALL ibwait (brd0%, SRQI|TIMO)
REM SRQI가 설정되어 ibwait이 종료된 경우, REM 디바이스를 폴링하고 반환된 상태 바이트를 해석하여 REM이 모두 아닌 경우 어떤 서비스가 요청되었는지 확인합니다.
IF (ibsta% AND SRQI) THEN
REM 이 경우, 자동 폴링이 활성화되어 있지 않기 때문에 ibrsp REM은 gpib 버스를 사용하여 스코프에서 상태 바이트를 가져옵니다. ibrsp(scope%, spr.scope%) IF (spr.scope% AND &H40)를 호출한 후 "Scope asserted SRQ"를 인쇄합니다.
REM 여기서 시리얼 폴 상태 바이트(REM spr.scope%)를 분석하여 SRQ의 원인을 결정합니다.
ibrsp(dmm%, spr.meter%) 호출
IF (spr.meter% AND &H40) THEN PRINT "DMM asserted SRQ."
REM 시리얼 폴 상태 바이트의 나머지 부분인 REM spr.meter %를 분석하여 SRQ의 원인을 확인합니다.
END IF
자동 폴링이 활성화된 경우, 해당 디바이스에 대한 ibsta의 RQS 비트를 사용하여 디바이스가 서비스를 요청했는지 확인해야 합니다. ibrsp 는 다시 상태 바이트를 반환하는데 사용되지만, 이번에는 RQS 비트가 단일 디바이스 기반에서 확인되기 때문에 비트 6이 이미 설정되어 있다는 것을 알 수 있습니다. 또한, ibrsp은 이전에 자동 폴링 루틴에 의해 수집되고 저장된 상태 바이트에만 접근합니다.
REM 자동 폴링이 활성화된 경우, 다음 코드 추출은 REM 서브루틴으로 사용하여 특정 디바이스가 REM 요청 서비스인지 확인할 수 있습니다.
SUB RQScheck(device%)
CALL ibwait (device%, 0) IF (ibsta% AND RQS) THEN
인쇄 "디바이스가 SRQ를 지정했습니다."
REM 이 경우 ibrsp는 디바이스를 폴링하지 않지만 REM은 메모리로부터 응답 바이트를 반환합니다. REM 상태 바이트를 사용하여 디바이스의 REM 서비스를 결정할 수 있습니다.
ibrsp 호출 (디바이스%, spr.device%)
END IF
END SUB
이 문서에서는 GPIB 컨트롤러가 NI-488.2 소프트웨어를 사용하여 버스에서 IEEE 488 디바이스의 서비스 요청을 감지하고 이에 응답하는 방법을 설명합니다. 이 문서에 설명된 NI-488.2 루틴 및 NI-488 함수를 구현하면 SRQ 서비스 및 직렬 폴링을 수행할 수 있습니다. 코드 예제는 어플리케이션 프로그램에서 루틴과 함수를 사용하는 방법을 보여줍니다.