수동으로 구성 요소 배치를 테스트하는 데 시간을 보낸 적이 있다면, 전체 과정이 얼마나 번거롭고 시간이 많이 걸리는지 잘 알고 있을 것입니다. 각 테스트는 테스트하는 각 항목에 대해 반복되는 기본 단계를 따릅니다. 또한, 이러한 단계를 대신 수행할 수 있는 프로그래밍이 가능한 테스트 장비를 사용하는 것의 힘을 이해할 것입니다. 즉, 모든 것을 설정하고 모든 것을 연결하여 버튼을 눌러 테스트를 수행할 수 있습니다. 컴퓨터 마우스의 클릭 한 번으로 모든 테스트 장비의 구성을 자동화함으로써 더 많은 시간을 절약할 수 있습니다.
그러나 자동화된 테스트 스위트에 추가할 맞춤형 테스트 장비를 만들고 싶다면 어떨까요? 이 단계별 가이드는 컴퓨터에서 네트워크 테스트 장비를 구성할 수 있도록 코드를 작성하는 방법을 보여줄 것입니다.
네트워크 자동화는 각 테스트 장비를 별도로 설정할 필요를 없애고 미래에 동일한 테스트를 반복해야 할 경우 시간을 절약합니다. 보너스는 전원 차단이나 장비의 우발적인 전원 꺼짐 후 설정을 복원하는 것이 빠르고 간단하다는 것입니다.
네트워킹 테스트 장비에 익숙하지 않다면, 프로그래밍 가능한 기기를 위한 표준 명령어(Standard Commands for Programmable Instruments, SCPI)에 대해 알아야 합니다. 옛날에 Hewlett-Packard는 어떤 컴퓨터도 올바른 인터페이스를 가지고 있다면 어떤 테스트 장비에도 연결할 수 있는 표준 인터페이스 버스 개념을 고안했습니다. 이 HPIB 표준은 일반 목적 인터페이스 버스(General Purpose Interface Bus, GPIB)로 알려지게 되었고 자체 IEEE 488 표준 지정을 받았습니다. 이 표준화는 네트워크화된 각 테스트 장비가 컴퓨터의 명령에 응답하여 신호를 출력하거나 측정을 수행하는 기능을 수행할 수 있도록 허용했습니다.
SCPI는 IEEE-488 표준에 추가 계층을 추가하여 테스트 장비가 이해할 수 있는 컴퓨터 명령을 규제함으로써 테스트 장비의 표준화된 네트워킹 원칙을 확장했습니다. 이 접근 방식은 이제 HP에서 만든 오실로스코프가 Keysight에서 만든 오실로스코프와 동일한 명령에 응답한다는 것을 의미합니다. 명령의 표준화 이전에는 종종 동일한 제조업체에서 생산한 다른 모델이 다른 명령에 반응했습니다. 이 표준화는 컴퓨터의 테스트 장비 제어 프로그램이 모든 제조업체와 모델의 실험실 장비와 작동하므로 예를 들어 네트워크 벤치 파워 서플라이를 더 나은 모델로 변경하는 데 제어 프로그램을 변경할 필요가 없음을 의미합니다.
이 표준화는 또한 이 단계별 가이드를 위해 작성된 모든 코드가 적합한 컴퓨터에 연결된 동일한 네트워크 테스트 장비 유형이 있는 다른 실험실에서도 작동한다는 것을 의미합니다.
SPCI 명령어는 읽고 이해하기에 합리적으로 직관적인 간단한 ASCII 문자열 형태입니다. 예를 들어, 테스트 장비에 “*RST” 명령을 보내면 장비가 리셋되고, “*WAI” 명령을 보내면 대기하도록 지시합니다.
SPCI 명령어는 형식에 따라 테스트 장비에 동작을 수행하거나 정보를 요청하도록 지시할 수 있습니다. 예를 들어, “TIM:ACQT 20ms” 명령은 오실로스코프의 취득 시간을 20ms로 변경하고, “TIM:ACQT?” 명령은 현재 취득 시간을 반환하도록 합니다.
중요한 점은 명령어가 대소문자를 구분하지 않으며 축약형을 지원한다는 것입니다. 그래서 예를 들어, “TRIG SOUR CH1”과 “Trigger source Channel1”은 동일한 명령어의 유효한 대체 표현입니다. 명령어를 연결할 수도 있으므로 예를 들어, “TRIG SOUR CH1”, “TRIG LEVEL1 10”, “TRIG POL INV”는 모두 같은 TRIG에 적용되므로 “TRIG:SOUR CH1;LEVEL1 10;POL INV”로 작성할 수 있습니다. 이 명령어들은 소스 채널, 볼트 단위의 레벨, 그리고 극성을 설정합니다. 이 예에서는 채널 1의 레벨을 10V로 설정하고 극성을 반전시킵니다. 트리거 1을 명시할 필요는 없지만, 모호함을 피하기 위해 “TRIG1:”을 사용할 수 있습니다.
이 기사의 동반 비디오는 SCPI 명령어를 사용하는 네트워크 테스트 장비를 직접 만드는 방법을 보여줍니다. 이는 자동화를 위한 테스트 장비와의 통신을 보여주는 이전 비디오를 기반으로 합니다.
이 연습의 목표는 사용자 정의 테스트 하드웨어를 LAN eXtensions for Instrumentation (LXI) 또는 Virtual Instrument Software Architecture (VISA)와 같은 SCPI 명령어를 처리할 수 있는 기존 테스트 소프트웨어에 원활하게 통합할 수 있도록 하는 것입니다. 최종 목표는 마이크로컨트롤러를 자동화된 테스트 하드웨어에 통합하여 종합적인 통합 테스트 장치를 개발하는 것입니다.
프로젝트의 핵심은 산업용 애플리케이션을 위해 제작된 Infineon XMC4700 Relax Kit 개발 보드입니다. 이 보드는 정적 및 동적 메모리, 클록, 전원 공급 장치, 표준 인터페이스, 기본 컨트롤을 포함한 마이크로컨트롤러를 포함하고 있습니다. 또한 네트워킹을 위한 미디어 액세스 컨트롤(MAC) 주소가 있는 온보드 이더넷 연결도 포함하고 있습니다.
이 설정의 주요 이점은 Infineon이 제공하는 Digital Application Virtual Engineer (DAVE) 통합 개발 환경의 사용 가능성입니다. DAVE는 마이크로컨트롤러 애플리케이션을 위한 C 기반 소프트웨어 개발 및 코드 생성 도구입니다. 코딩 과정을 단순화하고 대부분의 설정 작업을 편리하게 처리하여 SCPI 명령어 구현에 집중할 수 있도록 합니다.
우리가 만들 테스트 코드는 버튼의 위치를 읽고 LED의 상태를 제어할 것입니다. 이 단순한 테스트는 이해하기 쉬운 예제를 제공하고 자동화된 테스트의 힘과 이점을 더 탐구하기 위한 훌륭한 출발점이 될 것입니다.
프로젝트 설정:
새 프로젝트를 위해 DAVE 도구를 사용할 때 첫 번째 단계는 “파일 -> 새로 만들기 -> DAVE 프로젝트” 명령 순서를 사용하여 새 프로젝트 파일을 생성하는 것입니다. 이 작업은 새 창을 열어 “DAVE CE 프로젝트” 옵션을 선택하고 적절한 이름을 지정할 수 있게 합니다.
그 다음으로는 대상 하드웨어를 선택해야 합니다; 이 경우에는 XMC4700 Relax Kit입니다.
프로젝트가 리소스 제약을 받지 않는다면, 나노 사이즈 옵션보다는 전체 기능을 갖춘 newlib 표준 라이브러리를 사용하는 것이 항상 좋은 관행입니다.
다음 단계는 “DAVE -> 새로운 APP 추가” 명령을 사용하여 프로젝트의 주변 장치를 설정하는 것입니다.
설정할 첫 번째 구성은 네트워크 연결이며, 이는 “Ethernet -> ETH_LWIP” 명령으로 프로젝트에 가벼운 인터넷 프로토콜(IP) 스택을 추가하여 이 인터페이스를 처리합니다.
또한 이 예제에서는 테스트 장비, 버튼 및 LED 표시등의 입력/출력(IO) 인터페이스를 추가해야 합니다. 두 구성 요소 모두 이산 구성 요소이므로, 각 요소에 대해 하나씩 “DIGITAL_IO 앱” 두 개를 시스템 명령 옵션 아래에 추가해야 합니다.
IO 앱의 이름을 그 기능을 식별할 수 있도록 변경하는 것은 좋은 관행입니다. 이렇게 하면 잘못된 앱에 실수로 접근하는 것을 방지하고 생활을 더 편리하게 만들 수 있습니다. 이러한 오류는 예상치 못한 방식으로 동작하는 테스트 프로그램을 디버깅하려고 할 때 발견하기 어려울 수 있습니다.
또한, “ETH_LWIP App”을 마우스 오른쪽 버튼으로 클릭하고 “Configure APP Instance”를 클릭하여 이더넷 연결을 위한 IP 스택을 구성해야 합니다. XMC4700 Relax Kit는 이미 사전 구성되어 있어 시간을 절약할 수 있습니다. 자동화된 테스트를 위해 사용하는 컴퓨터의 서브넷과 일치하도록 IP 설정 페이지에서 정적 IP 주소를 변경해야 합니다. 또한, 이 예제에서는 사용자 데이터그램 프로토콜(UDP)이 필요하지 않으므로 프로토콜 설정 탭에서 이를 비활성화할 수 있습니다.
마지막으로, 각 구성 요소에 대한 수동 핀 할당 옵션을 사용하여 APP 핀 설정과 마이크로컨트롤러 하드웨어 간의 매핑을 제공해야 합니다. 이산 버튼을 구성하려면 버튼을 마우스 오른쪽 버튼으로 클릭하고 “Manual Pin Allocator” 명령을 선택합니다.
그런 다음 드롭다운 메뉴에서 Relax Kit의 버튼에 적합한 핀 번호를 선택할 수 있으며, 이는 레이블을 제공하여 이 과정을 간단하게 만듭니다. LED와 이더넷 연결 구성도 동일한 과정을 따릅니다. 핀 할당자 기능은 필요한 기능을 가진 핀만 선택할 수 있도록 하여 이 과정을 단순화합니다. 도구는 자동으로 모든 XMC4700 Relax Kit 레이블을 제공하여 이 과정을 간단하게 만듭니다.
이 단계들은 자동화된 테스트 프로젝트 설정을 완료하며, 이제 테스팅 코드를 작성할 준비가 되었습니다.
앱의 코드를 생성하려면 DAVE 툴바에서 "Generate Code" 버튼을 클릭하기만 하면 되며, 그 후 작업이 완료될 때까지 기다리면 됩니다.
분노의 코딩을 시작하기 전에, 권장되는 단계는 마이크로컨트롤러에서 컴퓨터로 콘솔을 전송하여 쉽게 `printf` 접근을 제공하는 것입니다. 이를 통해 데이터를 형식화하고 출력하여 코드 작성 및 디버깅을 더 빠르고 쉽게 할 수 있습니다. 이는 "GDB Semi-Hosting"을 구성 설정에서 활성화함으로써 수행할 수 있습니다. "Project Properties"로 이동한 다음 "C/C++ Build"로 진행하여 "Settings"를 선택함으로써 이를 수행할 수 있습니다.
"ARM-GCC, C Linker, Miscellaneous" 아래에서는 "Other" 플래그에 "--specs=rdimon.specs"를 추가해야 합니다. 이 단계는 링커에 대한 세미 호스팅 구성을 포함합니다.
그런 다음 "ARM-GCC C Compiler, Preprocessor" 섹션으로 이동하여 "XMC_DEBUG_ENABLE"이라는 새로 정의된 심볼을 추가할 수 있습니다. 이 설정은 디버그 빌드 구성에서 콘솔의 리디렉션을 보장합니다.
프로젝트 설정에서 "ARM-GCC C Linker, General" 설정 아래에 "default newlib system calls" 체크박스의 선택을 해제해야 합니다. 이 옵션을 선택한 상태로 두면 모니터 핸들 초기화가 방해받고 빌드가 실패하게 됩니다.
다음으로, 모니터링을 초기화해야 하는데, 이는 코드 시작 부분에 "extern void initialise_monitor_handles(void);"를 추가함으로써 수행할 수 있습니다. 이 함수는 DAVE_Init(); 호출 후에 호출되어야 합니다.
"initialise"의 철자가 영국 영어 변형이라는 점에 유의하세요. ARM 기반이 영국 케임브리지에 있기 때문입니다. 미국식 철자를 사용하면 해결하기 어려운 오류가 발생할 수 있으며, 미묘한 철자 차이를 발견하지 못하면 해결하기 어려울 수 있습니다.
이더넷 네트워크를 작동시키기 위한 첫 번째 단계는 Lightweight IP 스택을 활성화하여 정기적으로 새 메시지를 확인하도록 하는 것입니다. 이는 초기화가 완료된 후 실행되는 무한 while 루프 내에서 "sys_check_timeouts();" 함수를 호출함으로써 수행할 수 있습니다.
이 기능은 마이크로컨트롤러에서 실행되도록 디버깅이 필요합니다. 새 디버그 구성을 생성함으로써 이를 수행할 수 있습니다. 코드가 마이크로컨트롤러가 시작되자마자 실행되도록 하기 위해 “Set breakpoint at: main” 옵션을 끄는 것이 권장됩니다. 디버그 옵션을 선택하면 새 코드가 마이크로컨트롤러에 로드됩니다.
코드가 실행되고 있는지 확인하기 위해 컴퓨터에서 Windows 콘솔을 열고 개발 보드의 IP 주소를 핑하여 확인할 수 있습니다. 이 예에서는 XMC4700 Relax Kit입니다. 개발 보드는 각 핑에 응답해야 하며, 이는 보드가 작동 중이고 네트워크 연결이 작동 중임을 확인합니다.
Lightweight IP 스택 코드는 인터넷 제어 메시지 프로토콜(ICMP) 기능을 자동으로 처리할 것입니다. 그러나, 들어오는 전송 제어 프로토콜(TCP) 연결과 데이터를 처리하기 위한 코드를 생성해야 합니다. 이는 마이크로컨트롤러에 특정되지 않은 표준 Lightweight IP 스택 코드 문을 사용하여 수행할 수 있습니다.
네트워크 연결 구성을 완료했으므로, SCPI 코드가 통신에 사용하는 포트 5025에서 프로토콜 제어 블록을 수신 대기 상태로 설정할 수 있습니다. 모든 새로운 연결을 client_accept라는 함수에 위임하도록 Lightweight IP 스택을 구성해야 하며, 이 함수는 새 클라이언트를 처리하기 위해 확장해야 합니다. 수신된 모든 데이터는 별도의 처리 함수로 리디렉션되어야 하며, 새 연결의 수신을 나타내는 디버그 메시지도 출력해야 합니다.
client_recv 메소드를 구현하면 수신된 데이터를 처리를 위해 버퍼로 복사합니다. 이 함수는 또한 데이터가 없는 연결을 확인해야 하는데, 이는 원격 호스트가 연결을 닫았음을 나타냅니다. 이 조건에 대해, 코드는 닫힌 연결에 의해 남겨진 원치 않는 아티팩트를 제거하기 위한 정리 작업을 수행할 수 있습니다.
코드를 컴파일하면 디버깅할 코딩 오류가 없다면 기능적인 빌드가 생성됩니다.
다음 단계는 “Digital IO Apps”를 구성하여 필요한 작업을 수행하도록 하는 것입니다.
각 앱을 마우스 오른쪽 버튼으로 클릭하고 “Configure App Instance” 옵션을 선택하세요. IO 컴포넌트의 기본 설정은 버튼에 적합한 삼상 입력입니다. 그러나 LED의 경우, 설정을 “입출력”으로 변경하고 강한 구동력과 부드러운 에지를 적용해야 합니다. 이 강한 구동 설정은 보드가 LED를 밝히기에 충분한 구동 전류를 생산하도록 보장합니다. 부드러운 에지 설정은 핀의 에지 전환 속도를 의미합니다. 부드러운 에지는 전력 분배 네트워크에 대한 일시적인 영향을 완화하고 전자기 호환성에 미치는 부정적인 영향의 위험을 줄입니다. 이산 출력에 이 옵션을 사용하는 것은 나노초 에지 속도의 신호가 필요하지 않는 한 좋은 관행입니다.
업데이트된 코드를 재생성하면 이 새로운 변경 사항이 기능적 빌드에 추가됩니다. DAVE 앱에 어떤 변경을 가한 후에는 항상 코드를 재생성해야 한다는 것을 기억하는 것이 중요합니다.
구성 및 초기화 함수가 완료되면, 프로젝트 코딩은 드디어 테스트를 위한 SCPI 명령어 구현으로 이동할 수 있습니다. SCPI 명령어를 처음부터 구현할 필요는 없습니다; Jan Breuer의 뛰어난 SCPI-Parser 라이브러리가 GitHub에서 시작점으로 사용할 수 있습니다.
이 리소스를 활용하려면 libscpi 폴더를 프로젝트의 Libraries 폴더로 추출한 다음 “examples -> common”에서 scpi-def 폴더를 프로젝트 폴더로 추출하세요. 이 단계는 SCPI-Parser 라이브러리를 가져오고 프로젝트를 구현하기 위한 좋은 출발점을 제공합니다.
DAVE의 통합 개발 환경 내에서 libscpi 라이브러리의 테스트 폴더와 메이크파일을 삭제해야 합니다. 이들은 사용 중인 ARM-GCC 라이브러리와 호환되지 않습니다.
그런 다음 “빌드, 설정, 컴파일러, 디렉토리” 아래 프로젝트 속성 창으로 돌아가서 libscpi includes 폴더에 대한 참조를 추가하세요.
또한 scpi-def.c 파일을 열고 “dave.h”를 포함하는 문을 추가하여 IO 함수를 scpi-def 파일에 연결해야 합니다.
참고로, 이 파일에는 디지털 멀티미터의 훌륭한 데모 구현과 자동 테스트를 위한 함수가 포함되어 있습니다. 불행히도, 이러한 함수들은 이 예제에 사용된 ARM 컴파일러와 호환되지 않으므로 제거해야 합니다. 그러나 나중에 자신의 함수를 구현해야 할 경우, 원본 파일을 참조할 수 있습니다.
파일을 편집할 때, 명령 구성 블록에서 모든 DMM 및 테스트 함수를 삭제하지만 TST 명령과 그 다음의 모든 문장, 라이브러리가 처리할 표준 SCPI 명령을 유지하세요.
테스트 설정의 식별 정보를 “scpi-def.h” 파일에서 정의할 수 있으므로 SCPI *IDN 명령을 사용하면 식별 요청에 대한 유용한 정보를 반환합니다.
프로젝트의 “main.c” 파일에서 SCPI 명령을 설정할 수 있습니다. 메인 함수에 SCPI 라이브러리를 초기화할 수 있도록 Lightweight IP 프로토콜 제어 블록에 대한 참조를 전달하는 user_context 속성을 사용하여 SCPI 컨텍스트를 추가해야 합니다. 그런 다음 네트워크 연결을 통해 libscpi가 통신할 수 있도록 함수를 추가해야 합니다. 이 예에서는 다음 함수를 정의해야 합니다:
“SCPI_Write” 함수는 libscpi가 네트워크 연결을 통해 데이터를 전송할 수 있게 합니다.
“SCPI_Flush” 함수는 버퍼에 있는 모든 데이터를 즉시 전송하도록 Lightweight IP 스택에 알립니다.
“SCPI_Error” 함수는 SCPI 오류를 처리하는 수단을 제공합니다. 이 기본 예제의 경우 printf 함수에 대한 간단한 호출로 이를 우회할 수 있습니다.
“SCPI_Control” 함수는 TCP 포트 5026의 제어 채널에 쓸 수 있는 선택적 기능을 제공하지만, 이 예제에서는 필요하지 않습니다.
“SCPI_Reset 함수”는 리셋 명령을 받았을 때 호출되며, 모든 테스트 장비를 기본 설정으로 되돌립니다. 이 기본 예제에는 연결된 테스트 장비가 없으므로 printf 함수에 대한 간단한 호출로 이를 우회할 수 있습니다.
마지막으로, Lightweight IP 스택에 연결할 때 새 클라이언트 연결에 대해 user_context를 설정해야 합니다. 이를 통해 데이터가 버퍼에서 SCPI 라이브러리로 client_recv 함수를 통해 “SCPI_Input”으로 전달되어 처리될 수 있습니다. 이 구현은 동시에 여러 연결을 처리하지 않지만 좋은 네트워크 구성 관행을 나타냅니다.
업데이트된 코드를 컴파일하고 마이크로컨트롤러에 업로드하면 Windows 콘솔에서 핑에 계속 응답할 뿐만 아니라 SCPI 명령에도 응답하는 테스트 시스템이 됩니다.
이 예제 프로젝트는 SCPI 명령을 테스트하기 위해 Rohde & Schwarz VISA Tester 애플리케이션을 사용했습니다.
테스트 장비에 애플리케이션을 연결한 후, 첫 번째 테스트는 신원(IDN?) 요청을 발행하는 것입니다. 이는 권장되는 첫 단계이며, 명령은 SCPI 라이브러리에 의해 전적으로 처리되어 통신이 작동 중이며 라이브러리가 올바르게 설정되었음을 보장합니다. 이는 주변 장치나 테스트 장비로부터 응답을 요구하는 테스트와 관련된 문제를 해결할 때 통신과 라이브러리가 디버깅 과정에서 의심의 대상이 아니라고 가정할 수 있음을 의미합니다.
주변 장치를 테스트하려면 필요한 기능을 구현하기 위해 `scpi_commands` 배열에 새로운 패턴을 추가해야 합니다. 기능의 디버깅을 위해 “printf” 함수 호출을 포함할 수 있으며, 이는 코드 실행을 검증하는 간단한 방법을 제공합니다.
예시에서, 코드는 “scpi_result_t IO_Btn“ 함수를 사용하여 버튼의 상태를 읽으며, 이 함수는 이전에 버튼 핸들러로 설정된 DAVE 앱에서 상태를 “SCPI_ResultBool” 응답을 사용하여 전송합니다. 반환된 값은 이 버튼이 액티브 로우 구성 요소이기 때문에 반전됩니다.
LED 핸들러 함수는 받은 버튼 상태 매개변수를 분석하고 적절한 LED 상태를 설정합니다. 매개변수가 존재하지 않는 경우, 이 예제에서는 아무런 조치도 취하지 않습니다. 이 단계는 “scpi_result_t IO_Led” 함수를 사용하여 기능을 수행합니다.
마이크로컨트롤러를 프로그래밍한 후, DAVE 도구의 콘솔 탭을 사용하여 코드를 테스트할 수 있습니다. 이는 연결의 수신과 신원 요청 명령의 작동을 보여줍니다.
SCPI 쿼리를 보내어 버튼의 상태를 확인하고 버튼을 누를 때 반환된 상태가 변경되는 것을 관찰함으로써 기능을 테스트할 수 있습니다.
켜기 및 끄기 명령을 보내어 LED 기능을 단순히 테스트하고, 빛의 상태를 관찰하며 콘솔의 상태를 모니터링할 수 있습니다.
버튼과 LED가 모두 올바르게 작동하면, 완전히 기능하는 네트워크 연결 기기의 기초를 갖추게 됩니다. 테스트 자동화 플랫폼의 연결 또는 테스트 코드를 작성하면 버튼의 상태를 원격으로 확인하고 LED를 제어할 수 있습니다.
이 기사는 DAVE 통합 테스트 환경을 개발 보드와 함께 사용하면 자체 네트워크 테스트 장비를 만들어 벤치 장비와 통합하고 실험실 테스트를 자동화할 수 있음을 보여줍니다.
이 단계별 가이드는 기본적인 개념 증명 시연을 위한 것이지만, 단계를 따라 작동하는 테스트 시스템을 구축하면 자체 테스트 장비를 만드는 데 필요한 모든 것을 갖추게 됩니다.
이 프로젝트에서 탐구한 원칙을 사용하여 가까운 미래에 실용적인 테스트 장비를 만들 예정이므로, 추가 개발 소식을 기대해 주세요.