6. 측정 동기화

측정 동기화는 원격 제어 애플리케이션을 작성할 때 염두에 두어야 할 가장 중요한 항목 중 하나입니다. 프로그램의 이 측면을 간과할 경우 예측할 수 없는 동작과 반복할 수 없는 결과가 나타날 수 있으며 많은 혼란으로 이어질 수 있습니다. 측정 동기화가 필요치 않은 경우는 애플리케이션을 실행하기 위해 애플리케이션에 고정적인 일시정지를 삽입해야 하는 경우입니다.

가장 먼저 이 장의 목적에 따라 측정 동기화를 정의하겠습니다.

오늘날의 측정 기기는 자체 운영체제를 탑재한 복잡한 기기입니다. 측정 애플리케이션은 기기 상태를 항상 확인하지 않아도 됩니다. 측정 동기화는 프로그램(SyncPoints)의 중요 시점에 기기가 정상 상태임을 확인하기 위한 방법입니다.

다음은 오실로스코프와 DUT의 측정 동기화로 비주기적 신호를 발생하는 예제입니다.

CH6_MeasSyncWithScope_16x9.png

아래 그림을 보면 프로그램 중 기기가 동작할 때까지 기다리는 유휴 섹션이 있습니다. 이러한 유휴 시간은 길이가 동적입니다. 따라서 각각 다른 조건(예: PC 속도, 기기의 다른 정착(settling) 및 획득 시간)에 대응해야 합니다. 어떻게 가능할까요? 가장 좋은 방법은 기기가 준비 상태가 되었을 때 알려주도록 하는 것입니다. 각 동기화 방법에 대한 설명은 아래 참고사항 다음에 나와 있습니다.

추가 참고사항:

  • 획득 기기(오실로스코프, 스펙트럼 분석기, 파워미터 등)를 언제나 단일 획득 모드로 작동하십시오. 그래야만 완료 전 획득 또는 완료되지 않은 획득에서 측정 결과를 가져오지 않고 마지막으로 완료된 획득에서 측정 결과를 가져올 수 있습니다. 가장 중요한 것은 단일 획득 모드에서만 동기화 방법이 정상적으로 작동한다는 것입니다.
  • 기본 설정과 트리거 설정은 동기화하지 않아도 됩니다. 가장 중요한 핵심은 모든 설정이 적용되었는지를 확인(SyncPoint ‘SettingsApplied’)하려는 마지막에 있습니다.
  • 트리거가 도착하면 오실로스코프가 파형 획득을 시작합니다. 프로그램은 이 작업이 완료될 때까지 기다려야 합니다(SyncPoint ‘AcquisitionFinished’).
  • 이 SyncPoint 이후의 파형을 읽음으로써 최근 획득에서 결과를 가져올 수 있습니다.

동기화 메커니즘 개요

아래 네 소제목에서 가장 단순한 방식부터 가장 복잡한 방식까지 각가의 동기화 메커니즘에 대해 소개합니다.

  • *OPC? 쿼리
  • STB(Status Byte) 폴링
  • SRQ(Service Request) 대기
  • SRQ(Service Request) 이벤트

*OPC? 쿼리 동기화

이 방식이 가장 쉬우면서 가장 자주 사용되는 동기화 방식입니다.

*OPC? 쿼리를 기기에 전송하면 기기는 보류 중인 모든 작업이 완료될 때까지 응답을 지연합니다. 따라서 프로그램이 기기에서 *OPC? 쿼리에 응답할 때를 기다리는 VISA Read 연산에서 프로그램 유휴 기간이 발생합니다. 여기에서 중요한 것은 응답 자체가 아니라 그에 따라 발생하는 지연입니다.

중요! *OPC?는 쿼리이므로 사용자가 VISA Read() 함수를 사용해 기기에서 보내는 응답을 읽어야 합니다. 그렇지 않을 경우 기기는 다음 쿼리로 'Query Interrupted'(쿼리 중단됨) 에러를 발생합니다. 이는 *OPC? 쿼리뿐만 아니라 모든 쿼리에 중요합니다.

여기에서 한 가지 파라미터, 즉, VISA Timeout을 추가로 설명해야 합니다. VISA Timeout은 VISA Read 연산이 VISA Timeout 에러로 종료되기 전까지 대기할 수 있는 최대 시간을 정의하는 메커니즘을 정의합니다. 이 값은 개별적이고 현재 작업의 지속시간에 따라 달라지기 때문에 VISA Timeout을 적절히 설정해야 합니다. Timeout(시간 초과)이 너무 작을 경우 정상 연산 중 불필요한 에러가 발생할 수 있고 Timeout이 너무 클 경우에는 실제 에러가 발생했을 때 프로그램이 응답하지 않을 수 있습니다.

장점:

  • 간단하며 대부분의 경우에 효과적입니다.
  • 세션의 제어 채널을 사용하지 않으므로(STB 폴링 방법 참조) RawSocketSerial연결에서도 작동합니다.

단점:

  • 기기가 응답할 때까지 기기와의 통신을 차단합니다. 이 점은 긴 연산에서 애플리케이션 응답이 없을 때 심각한 문제가 될 수 있습니다.

STB(Status Byte) 폴링 동기화

STB 폴링 동기화는 로데슈바르즈 기기 드라이버가 사용하는 방식입니다. Direct SCPI 명령을 사용할 경우 이 페이지 마지막에 나오는 구현 예제를 확인해 보십시오. 가장 먼저, 절차를 나타낸 흐름도를 살펴보겠습니다. 설명은 흐름도 다음에 나옵니다.

흐름도를 설명하려면 기기의 상태 서브시스템, 즉, STB(Status Byte)라고 하는 주 레지스터가 맨 위에 오는 레지스터의 계층적 구조를 말합니다. 각 비트는 다른 의미를 가지며 상태 레지스터 계층 체인의 마지막까지 레지스터의 요약 플래그 역할을 합니다. 전체 상태 서브시스템 구조는 로데슈바르즈 기기 원격 제어 사용자 매뉴얼에서 검색할 수 있습니다('Status Byte' 용어 검색). 아래 그림에 Status Byte 레지스터와 보조 레지스터 ESR(Event Status Register)가 나와 있습니다.

  • 흐름도의 첫 번째 연산은 ESE Filter를 1로 설정합니다(Bit 0 = 1). 이는 ESR Bit 0 - OPC만 확인하면 되는 것을 의미합니다. 이 명령은 연결이 시작된 이후 또는 *RST 명령 다음에 한 번만 전송하면 됩니다.
  • 다음 연산은 *ESR?명령으로 ESR 레지스터 값을 쿼리합니다. 이 레지스터는 EVENT 레지스터이며 이 값을 읽으면서 값을 지웁니다. 그러면 ESR Bit 0 - OPC가 0으로 초기화됩니다.
  • 다음 연산은 동기화하려는 명령을 전송합니다. 이 사례에서는 오실로스코프에서 1회 획득을 수행하도록 하는 SCPI 명령인 SING을 전송합니다 문자열 마지막의 *OPC(물음표 없이)는 기기에 다음과 같이 지시하는 것입니다. 즉, 이 문자열의 모든 명령이 실행 및 완료된 후 ESR Bit 0 - OPC를 1로 설정할 것을 지시합니다. 따라서 그 전에 이 값을 0으로 초기화해야 합니다. 그렇지 않을 경우 일부 이전 작업으로 인해 1로 설정되고 STB 폴링 루프가 1차 반복 후 잘못 종료될 수 있습니다.
  • 다음 작업은 Status Byte 폴링 루프입니다. 사용자는 Bit 5 - Event Status Summary가 1로 설정될 때까지 Status Byte를 쿼리합니다. Status Byte 값은 두 가지 방식, 즉, *STB? 또는 ReadSTB()라고 하는 특수 VISA 함수를 사용해 검색할 수 있습니다. 어떤 차이가 있을까요? *STB?는 VISA I/O 버퍼를 사용하는 기본 SCPI 명령입니다. ReadSTB() 함수는 Control Channel이라고 하는 별도 채널을 통해 통신하며 표준 SCPI write/read 통신을 간섭하지 않습니다. 이 함수는 또한 더 빠른 응답 시간에 맞게 최적화되었습니다. 이 루프 안에 점진적 폴링 지연을 포함하는 것이 좋습니다. 예를 들어, 최초 10x는 지연 없음, 다음 100x는 1ms 지연, 다음 1000x는 10ms 지연을 포함하는 것입니다. 로데슈바르즈 기기 드라이버는 무한 루프를 방지하기 위해 OPC Timeout이라는 시간 초과를 사용합니다.
  • 루프가 끝난 다음 ESR Bit 0 - OPC는 SCPI 명령 *ESR?으로 다시 초기화됩니다.

장점:

  • 기기와의 통신을 차단하지 않습니다. SCPI 명령을 전송하는 동시에 응답을 수신할 수 있습니다.
  • 길게 소요되는 작업에 적합합니다. 예를 들어, 자체 정렬 또는 자체 테스트에 적합합니다.

단점:

  • 구현이 더 복잡합니다.
  • 제어 채널 함수 VISA ReadSTB()를 지원하지 않으므로 RawSocket 및 Serial 연결에 사용할 수 없습니다.

SRQ(Service Request)를 이용한 고급 방법

SRQ(Service Request) 동기화 대기

이 방법은 이전 Status Byte 폴링 동기화와 유사하지만 STB 폴링 루프 대신 Service Request 이벤트를 대기하도록 구성된 VISA WaitOnEvent()함수를 사용합니다. 이러한 유형의 동기화의 예는 이 장의 마지막에서 확인할 수 있습니다.

이 메커니즘을 사용하려면

  • *ESE 1;*SRE 32초기화 후 1회 설정을 수행합니다(위 그림의 기기 상태 서브시스템 레지스터 참조). 그러면 ESE Filter는 이전 동기화에서 STB 폴링을 사용하는 것과 같은 방법으로 ESR OPC 비트에 응답합니다. "*SRE 32"는 STB 레지스터의 Event Status Summary 비트가 1로 설정된 경우 SRE Filter에서 서비스 요청을 발생하도록 설정합니다.
  • 동기화 명령을 전송하기 전에 VISA EnableEvent()함수로 서비스 요청 이벤트를 활성화하십시오.
  • 끝에 ;*OPC를 포함해 동기화 명령을 전송합니다.
  • VISA WaitOnEvent()함수를 호출합니다. 이 함수는 Service Request 이벤트가 도착하거나 Timeout이 만료할 때까지 기다립니다.
  • VISA DisableEvent()함수로 Service Request 이벤트를 비활성화합니다.

장점:

  • 이전 방법에 비해, STB 폴링 루프 구현이 필요하지 않습니다.
  • IO Trace가 더 짧고 더 쉽게 판독 가능합니다.

단점:

  • VISA WaitOnEvent()실행 중에는 애플리케이션(LabVIEW 및 MATLAB)을 중단할 수 없습니다. 이 상황은 완료까지 오래 소요되는 명령의 경우 문제가 될 수 있습니다. 예: 자체테스트 쿼리 *TST?
  • RawSocket 및 Serial 연결과 함께 지원되지 않습니다.

SRQ(Service Request) 이벤트 동기화

주요 개념은 기기 작업을 시작하고 사용자는 다른 작업에 집중하는 것입니다. 기기가 작업을 마치면 VISA는 사용자가 선택한 함수를 호출합니다. 이 함수를 이벤트 핸들러라고 합니다.

이러한 유형의 동기화(C# 및 LabWindows/CVI)는 이 장의 마지막에서 확인할 수 있습니다.

Service Request 이벤트 동기화 메커니즘을 사용하려면

  • *ESE 1;*SRE 32초기화 후 1회 설정을 수행합니다(위 그림의 기기 상태 서브시스템 레지스터 참조). 그러면 ESE Filter는 이전 동기화에서 STB 폴링을 사용하는 것과 같은 방법으로 ESR OPC 비트에 응답합니다. *SRE 32STB 레지스터의 Event Status Summary bit가 1로 설정된 경우 SRE Filter에서 Service Request를 발생하도록 설정합니다.
  • 동기화 명령을 전송하기 전에 VISA InstallHandler()함수로 콜백 함수를 등록하고 VISA EnableEvent()function 함수로 Service Request 메커니즘을 활성화해야 합니다.
  • 끝에 ;*OPC를 포함해 동기화 명령을 전송합니다. 명령 실행이 완료된 후 VISA가 등록된 함수를 호출합니다.

장점:

  • 중간에 다른 작업을 수행할 수 있습니다.
  • 멀티-트레딩 애플리케이션에 적합합니다.

단점:

  • 구현이 더 복잡합니다.
  • RawSocket 및 Serial 연결과 함께 지원되지 않습니다.
  • LabVIEW 및 MATLAB에서 지원되지 않습니다.

Direct SCPI 명령 예제

위 측정 작업에 *OPC? query synchronization과 아래 작업을 이용한 예제

  • STB 폴링 동기화
  • Service Request 동기화 대기
  • Service Request 이벤트 동기화(Python, C#, LabWindows/CVI)

기기 드라이버 예제

위 측정 작업의 예제:

기타 리소스

측정 동기화 관련 주제에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

Request information

Do you have questions or need additional information? Simply fill out this form and we will get right back to you.

마케팅 동의

신청하신 내용이 제출되었습니다. 빠른 시일 내 회신 받으실 것입니다.
An error is occurred, please try it again later.