메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

임베디드 장치용 실행 가능 명령 시퀀스 작성하기

OpenOffice Spreadsheet, XML, PHP 및 BLOB을 사용하여 명령을 작성한다.

Thomas Freund, Senior Technical Staff Member, IBM
Thomas Freund는 웹을 통해 산업용 장비에 액세스하여 이러한 장비를 제어하고 모니터링하고 진단할 수 있는 소프트웨어 기술을 개발하는 데 35년간 전념했다. 또한, IEEE 1175.5 표준 위원회의 구성원이기도 하다(CASE 메타모델 표기법).

요약:  장치 프로토콜 메시지에 대한 상위 레벨의 설명이 포함된 스프레드시트와 XML 문서로 저장된 스프레드시트를 활용하는 방법론을 살펴봅니다. 그런 다음, 데이터베이스의 BLOB으로 설명을 저장하는 PHP 스크립트를 사용하여 XML 문서를 처리합니다.

원문 게재일:  2010 년 3 월 30 일 번역 게재일:   2010 년 5 월 18 일
난이도:  중급 영어로:  보기 PDF:  A4 and Letter (82KB | 12 pages)Get Adobe® Reader®
페이지뷰:  2594 회
의견:  


Microsoft® Office Excel®과 OpenOffice.org Calc에는 본래 스프레드시트를 XML 문서로 변환하는 기능이 있다. 이러한 기능은 눈에 보이는 것 이상의 다양한 유용성을 제공하며 특히 임베디드 시스템을 개발하고 테스트하는 경우에는 더욱 그렇다.

자주 사용하는 약어

  • CLI: Command-line interface
  • DOM: Document Object Model
  • SQL: Structured Query Language
  • TCP/IP: Transmission Control Protocol/Internet Protocol
  • XML: Extensible Markup Language

임베디드 시스템 개발자는 일련의 테스트 시나리오를 생성하여 디자인 프로토타입이나 초도품의 유효성을 확인할 수 있는 방법이 필요하다. 그리고 이러한 시나리오를 생성하는 데 필요한 비용은 최소로 유지되어야 한다. 이러한 요건은 매우 작은 메모리 용량을 사용하는 특수한 펌웨어를 생성하는 데 필요한 개발 환경(비용 면에서 효과적인)을 구축하는 경우에도 동일하다.

여기에서 설명하는 방법론에서는 OpenOffice.org Calc 및 XML, PHP를 사용하여 무료 테스트 시나리오를 작성하거나 펌웨어 개발 환경을 구축한다. 이 방법론은 Modbus 명령 테스트 시나리오를 생성하는 예제를 사용하여 설명한다.

스프레드시트를 XML 문서로 변환하기

Excel과 마찬가지로 OpenOffice.org Calc에는 스프레드시트를 표현하는 XML 문서를 두 가지 형식 중 하나를 사용하여 생성할 수 있는 기능이 있다. Microsoft Office Excel 2003 XML은 XML(.xml) 파일을 생성한다. 반면에 OpenOffice.org Calc 일반 XML은 FODS(.fods) 파일을 생성한다. 예를 들면, MovieSchedule.xls는 지역 영화관의 상영 일정이 표시된 스프레드시트이다. 그림 1에는 스프레드시트의 내용이 있다. (그림 1의 텍스트 전용 버전 보기)


그림 1. 영화 상영 일정이 표시된 스프레드시트
영화 제목 2개, 영화관 2개 및 상영 시간이 표시된 vMovieSchedule 스프레드시트의 캡처 화면

다음은 PHP CLI를 통해 PHP 스크립트를 실행하여 테스트 시나리오 스펙의 시퀀스가 포함된 스프레드시트를 그와 등가의 2진 형식으로 변환한다. Listing 1에는 이 스프레드시트의 내용이 기술된 스프레드시트 XML 문서(Excel 2003 형식)의 섹션이 표시되어 있다.


Listing 1. 영화 상영 일정을 표시하는 XML 문서

<ss:Worksheet ss:Name="Movies">
     <Table ss:StyleID="ta1">
          <Column ss:Width="127.8144"/>
          <Column ss:Width="127.0512"/>
          <Column ss:Width="191.34"/>
          <Row ss:Height="14.2848">
               <Cell>
                    <Data ss:Type="String">Title</Data>
               </Cell>
               <Cell>
                    <Data ss:Type="String">Theater</Data>
               </Cell>
               <Cell>
                    <Data ss:Type="String">Schedule</Data>
               </Cell>
          </Row>
          <Row ss:Height="14.2848">
               <Cell>
                    <Data ss:Type="String">Avatar</Data>
          </Cell>
               <Cell>
                    <Data ss:Type="String">Criterion</Data>
               </Cell>
               <Cell>
                    <Data ss:Type="String">3:00 PM, 7:00 PM,
                    10:30 PM</Data>
               </Cell>
          </Row>
          <Row ss:Height="14.2848">
               <Cell>
                    <Data ss:Type="String">Surrogates</Data>
               </Cell>
               <Cell>
                    <Data ss:Type="String">Palace</Data>
               </Cell>
               <Cell>
                    <Data ss:Type="String">5:00 PM, 8:00 PM,
                    11:00 PM</Data>
               </Cell>
          </Row>
     </Table>
     <x:WorksheetOptions/>
</ss:Worksheet>


PHP를 사용하여 XML 문서를 BLOB으로 변환하기

스프레드시트로 구성된 XML 문서를 어떻게 2진 코드로 변환할 수 있을까? PHP 스크립트를 통해 다음과 같은 기능을 하는 클래스를 사용하면 가능하다.

  1. PHP DOM 클래스를 통해 XML 문서를 순회한다.
  2. 순회한 요소의 내용을 일련의 중간 표현으로 변환하여 배열로 저장한다.
  3. 변환 데이터베이스를 사용하여 중간 표현을 대상 2진 코드로 변경한다.
  4. 변경된 2진 코드를 BLOB으로 변환 데이터베이스에 저장한다.

XML 문서를 순회하여 내용을 중간 표현으로 변환하는 과정은 도메인마다 다르다. 다시 말해서 XML 문서는 사용된 스프레드시트의 구조에 맞추어 사용자 정의된다. 예를 들면, 프로토콜 테스트 스프레드시트에서는 특정 프로토콜의 구조에 맞게 사용자 정의된 두 개의 클래스를 사용한다. 변환 데이터베이스에는 중간 "코드"를 해당 2진 시퀀스에 맵핑하는 데 사용하는 변환 참조 테이블과 입력 XML 스프레드시트 문서에 해당하는 2진 시퀀스를 저장하는 2진 시퀀스 테이블, 이렇게 두 개의 테이블이 있다.


예제: Modbus 테스트 시나리오 시퀀스 작성하기

이러한 모든 것을 표현하기 위해 Modbus 명령으로 구성된 시퀀스를 지정하는 데 사용할 수 있는 스프레드시트를 작성한다. 이 Modbus 명령으로 구성된 시퀀스는 직렬 인터페이스(즉, RS-232 또는 RS485)를 기반으로 하는 장치와 직렬 통신을 하기 위한 테스트 시나리오로 사용한다. 이 OpenOffice.org Calc 스프레드시트 파일(ModbusExample.ods)의 워크북은 두 개의 워크시트로 구성된다. Modbus는 마스터-슬레이브 애플리케이션 레벨 프로토콜이다. 다시 말해서, Modbus는 호스트와 일련의 슬레이브 장치 간의 통신을 지원하는 기본 네트워크 유형에 독립적이다. 일반적으로 Modbus는 직렬 통신 네트워크에서 사용되지만 TCP/IP를 기반으로 운영되는 장치에서 사용되는 경우도 있다.

요청 명령은 기본 네트워크 패킷의 데이터나 메시지 섹션에 포함되어 있다. 이 명령은 장치의 신호 데이터가 포함된 Modbus 장치의 레지스터 내용을 요청한다. 요청 명령은 다음과 같은 형식을 따른다.

[Device address][Request command][Start register][End register]

[Device address]는 Modbus 장치의 주소(1 - 255)이며 1바이트 long형이다. [Request command]도 1바이트 long형이며 값은 주소가 지정된 레지스터의 유형에 따라 설정된다. 레지스터 값을 읽는 방법은 다음과 같다.

  • 1 = Coil(이벤트 표시기: 1비트 long형)
  • 2 = Status(이벤트 표시기: 1비트 long형)
  • 3 = Hold(내부 장치 신호 값: 4바이트 float형 또는 2바이트 integer형 값)
  • 4 = Input(장치의 입력 신호 값: 4바이트 float형 또는 2바이트 integer형 값)

다른 명령을 사용하여 레지스터에 쓸 수도 있지만 일반적으로 Read access 명령을 더 사용한다. [Start register][End register]는 모두 2바이트 long형이며 값이 요청된 레지스터의 주소 범위를 지정한다. Modbus 프로토콜에 대한 자세한 세부사항은 참고자료에 있는 Modbus 표준 링크를 참조한다.


그림 2. 장치의 통신 설정값
장치의 통신 설정값이 있는 스프레드시트를 캡처한 화면

다시 예제 스프레드시트 워크북을 살펴보면 테스트 중인 장치를 액세스하는 데 필요한 직렬 통신 설정값이 첫 번째 워크시트(그림 2에 있는 장치의 통신 설정값)에 다음과 같은 매개변수로 되어 있다는 것을 알 수 있다. (그림 2의 텍스트 전용 버전 보기)

  • Address. 테스트 중인 장치의 Modbus 네트워크 주소
  • Type. 테스트 중인 장치와 통신하는 데 사용하는 프로토콜로 문서용으로만 사용
  • Interface. 테스트 중인 장치와 호스트를 링크하는 데 사용하는 실제 케이블 커넥터 유형
  • Baud. 테스트 중인 장치와 호스트 간에 이루어지는 통신의 데이터 전송율
  • Data. 통신 패킷의 데이터 비트 수
  • Parity. 테스트 중인 장치와 호스트 간의 통신에 사용되는 패리티 설정
  • Stop. 테스트 중인 장치와 호스트 간의 통신에 사용되는 중지 비트의 수

두 번째 워크시트인, Modbus 요청 시나리오(그림 3 참조)에서는 다음을 지정한다.

  • Register Type. 주소가 지정된 Modbus 레지스터의 유형(input, hold, coil, status).
  • Start Register. 레지스터 테스트 범위에 있는 시작 Modbus 레지스터 주소
  • End Register. 레지스터 테스트 범위에 있는 마지막 Modbus 레지스터 주소
  • Type. 레지스터 범위에서 예상되는 응답 값의 데이터 유형. 이 셀의 내용은 예상되는 응답 값에 맞는 예상 바이트 수로 변환된다. Int형은 2로 변환되며 float형은 4로 변환된다. 비트는 다음과 같은 공식으로 변환된다.
    Number of bytes =int((Number of bits + 1) / 8) + 1
    

    여기서 int([arg])[arg] 값의 정수 부분이다.

  • Min. Modbus 응답 패킷에 있는 모든 레지스터 값의 최소 유효값
  • Max. Modbus 응답 패킷에 있는 모든 레지스터 값의 최대 유효값

그림 3의 텍스트 전용 버전 보기


그림 3. Modbus 요청 시나리오
Modbus 요청 시나리오를 캡처한 화면

PHP 스크립트인 ProtoConvert.php(다운로드에서 사본을 얻을 수 있음)는 스프레드시트 XML 문서를 Modbus 요청 패킷을 통해 요청된 레지스터 범위를 위에 있는 스프레드시트의 각 행을 대상으로 검색하는 2진 명령 시퀀스로 변환하고 Modbus 응답 패킷의 레지스터 값을 해당 유효값 범위에 대조하여 검증한다. 이 스크립트는 다음과 같은 다섯 개의 클래스를 기반으로 한다.

  • SupportDB. 지원 데이터베이스와의 연결을 설정하고 데이터베이스를 쿼리하고 업데이트할 수 있는 액세스 방법을 제공한다. 이 스크립트에서 사용한 데이터베이스 패키지는 MySQL이지만 IBM® DB2®나 PostgreSQL과 같은 데이터베이스 패키지를 적당한 곳에 사용할 수도 있다.
  • XMLWorkbook. 스프레드시트 XML 문서 파일의 내용을 추출한다.
  • CommSheet. 해당 XML 문서에서 스프레드시트의 "장치의 통신 설정값" 워크시트 부분의 내용을 추출한다.
  • ScenarioSheet. 해당 XML 문서에서 스프레드시트의 "Modbus 요청 시나리오" 워크시트 부분의 내용을 추출한다.
  • ModbusReqSet. "장치의 통신 설정값"과 "Modbus 요청 시나리오" 워크시트의 내용에서 생성된 실행 가능한 명령의 시퀀스를 생성한다.

이러한 클래스를 사용하는 데 근간이 되는 기본 로직은 다음과 같다.

  1. 지원 데이터베이스(ProtoTransDB)에 연결한다. 이 데이터베이스의 메타데이터는 Listing 2에 있다.

    Listing 2. 변환 데이터베이스 메타데이터
    
    # 
    #       Protocol test translation support database schema 
    # 
    # 
    
    DROP DATABASE IF EXISTS ProtoTransDB; 
    CREATE DATABASE ProtoTransDB; 
    USE ProtoTransDB; 
    
    # 
    #     Repository of translated protocol test sequences 
    # 
    #     NOTES - 
    # 
    #          (1) TestID = test sequence ID consisting of: 
    # 
    #               1. <TestSpec> = Name of the test sequence 
    #                         specification spreadsheet 
    #               2. <TestStored> = Time stamp when test sequence 
    #                         was translated 
    # 
    #               stored in the format <TestSpec>_<TestStored> 
    # 
    #          (2) TestSequence = executable test sequence 
    # 
    #          (3) The contents of TestSequence consists of 
    #               a sequence of commands as follows: 
    # 
    #               <set_comm> 
    #               <request_1> 
    #               <response_1_verify> 
    #               .................... 
    #               <request_N> 
    #               <response_N_verify> 
    # 
    #          where, 
    #               <set_comm> = communication port configuration 
    #                         consisting of the following: 
    # 
    #                    1. test sequence command (0x0A) 
    #                    2. interface type (0x01 = RS232, 
    #                                   0x02 = RS485 2 wire, 
    #                                   0x03 = RS485 4 wire) 
    #                    3. baud rate (2 bytes) 
    #                    4. number of data bytes (1 byte) 
    #                    5. parity (0x00 = none, 
    #                              0x01 = odd, 
    #                              0x02 = even) 
    #                    6. number of stop bits (1 byte) 
    # 
    #               <request_i> = register value request consisting of the following 
    # 
    #                    1. register requested command (0x0B) 
    #                    2. Modbus register request command (6 bytes): 
    #                         Device address (1 byte) 
    #                         Register read command (1 byte) 
    #                         Start register (2 bytes) 
    #                         End register (2 bytes) 
    # 
    #               <response_i_verify> = register value response verification rule 
    #                    for preceding request consisting of the following: 
    # 
    #                    1. verification rule command (0x0C) 
    #                    2. Bytes per value (Int = 0x02, Float = 0x04, Bit = 0x00) 
    #                    3. Total number of value bytes (2 bytes, 
    #                              Bytes per value * 
    #                              (End register - Start register + 1)) 
    #                    4. Valid minimum for each register value (2 bytes) 
    #                    5. Valid maximum for each register value (2 bytes) 
    #
    
    CREATE TABLE TestScenario 
    ( 
         TestID                         VARCHAR(50) NOT NULL, 
         TestSequence         BLOB,	 
         PRIMARY KEY (TestID ASC) 
    ); 
    

  2. 스프레드시트 XML 문서의 내용을 추출한다.
  3. 이 XML 문서 중 "장치의 통신 설정값" 워크시트의 내용을 추출한다.
  4. 이 XML 문서의 "Modbus 요청 시나리오" 워크시트의 내용을 추출한다.
  5. "장치의 통신 설정값" 워크시트와 "Modbus 요청 시나리오" 워크시트의 내용을 Modbus 프로토콜을 통해 통신하는 장치에 대한 테스트 시퀀스를 정의하는 실행 가능한 명령으로 구성된 시퀀스로 변환한다.

다음 명령을 사용하여 PHP 스크립트를 실행할 수 있다.

php ProtoConvert.php <database_access> <XML_doc>

여기에서 <database_access>는 데이터베이스 연결 매개변수가 포함된 파일의 완전한 경로 이름이며 <XML_doc>은 Modbus 테스트 시퀀스 스프레드시트를 표현하는 XML 문서가 포함된 파일의 완전한 경로 이름이다.

1단계에서 4단계까지 진행하는 과정에서 장애가 발생하면 후속 단계는 수행되지 않는다. 또한, Listing 2에는 데이터베이스에 BLOB으로 저장된 테스트 시퀀스 명령에 대한 설명이 있다. 변환 참조 정보는 PHP 스크립트에 삽입되기 때문에 이 예제의 데이터베이스에는 테스트 시퀀스를 저장할 테이블만 하나 존재한다.

그림 2그림 3에 있는 Modbus 스프레드시트의 테스트 시퀀스는 Listing 3에 있다. 사실상, 이 시퀀스는 연속된 바이트 스트림(16진 값)이다. 그러나 이 시퀀스의 구성요소를 강조하기 위해 Listing 2에 16진 값으로 표시된 메타데이터 설명에서 기술한 테스트 시퀀스 구조에 따라 구성요소를 나누었다.


Listing 3. 테스트 명령의 샘플 시퀀스

0A 01 2580 08 00 01 

0B 02 04 0136 0136 
0C 02 0002 0000 0190 

0B 02 03 01C2 01C4 
0C 02 0006 0014 015E 

0B 02 03 0212 0217 
0C 02 000C 0000 0064 

0B 02 01 011D 0122 
0C 00 0001 0000 0001

0A로 시작하는 명령은 직렬 통신의 구성 설정값을 나타낸다. 0B0C로 시작하는 다음 명령 쌍은 각각 요청과 검증 규칙 명령이며 테스트 중인 장치의 Modbus 레지스터에서 값을 추출하여 검사하기 위해 사용된다.

런타임 환경은 직렬 회선을 통해 테스트 중인 장치에 연결된 호스트 컴퓨터로 구성된다. 호스트에서는 다음과 같은 각 명령을 실행하는 테스트 시퀀스 명령 해석기가 실행된다.

  • Serial port settings(0A). 호스트를 테스트 중인 장치에 연결하는 직렬 포트를 설정한다.
  • Register address request(0B). 테스트 중인 장치의 Modbus 레지스터의 내용을 표준 Modbus 명령을 통해 요청한다.
  • Verification rule(0C). 앞서 레지스터 주소를 요청하는 과정에서 리턴된 값을 유효 한계값과 비교하여 테스트한다.

또한, 테스트 시퀀스 명령 해석기는 각 명령에 대한 응답을 로그하여 나중에 분석할 수 있게 한다.


결론

OpenOffice.org Calc의 XML 문서 생성 기능과 PHP의 DOM 순회 기능 그리고 BLOB 표현 데이터베이스를 사용하여 스프레드시트에 있는 테스트 시나리오의 스펙을 테스트 명령 시퀀스로 성공적으로 변환할 수 있다. 그러나 이러한 기술을 사용하면 보다 다양한 작업을 수행할 수 있다.

ModbusExample.ods 스프레드시트에서는 스펙을 효과적으로 명령 시퀀스로 변환했다. 적당한 스프레드시트 구조를 사용하여 다음과 같은 유사한 스펙 - 명령 시퀀스 변환 도구를 작성할 수 있다.

  • 입/출력(I/O) 스펙을 기반으로 하는 배치 프로덕션 제어 시퀀스 생성기
  • 장치 스펙에 따라 자동화된 테스트 장비 프로그램 생성
  • 감소된 지시사항 세트를 사용하여 장치의 펌웨어 생성


다운로드 하십시오

설명이름크기다운로드 방식
Command conversion compilerProtoConvert.zip4KBHTTP

다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기

토론

필자소개

Thomas Freund는 웹을 통해 산업용 장비에 액세스하여 이러한 장비를 제어하고 모니터링하고 진단할 수 있는 소프트웨어 기술을 개발하는 데 35년간 전념했다. 또한, IEEE 1175.5 표준 위원회의 구성원이기도 하다(CASE 메타모델 표기법).

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=XML
ArticleID=490427
ArticleTitle=임베디드 장치용 실행 가능 명령 시퀀스 작성하기
publish-date=03302010
author1-email=tjfreund@us.ibm.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.