Microsoft® Office Excel®과 OpenOffice.org Calc에는 본래 스프레드시트를 XML 문서로 변환하는 기능이 있다. 이러한 기능은 눈에 보이는 것 이상의 다양한 유용성을 제공하며 특히 임베디드 시스템을 개발하고 테스트하는 경우에는 더욱 그렇다.
임베디드 시스템 개발자는 일련의 테스트 시나리오를 생성하여 디자인 프로토타입이나 초도품의 유효성을 확인할 수 있는 방법이 필요하다. 그리고 이러한 시나리오를 생성하는 데 필요한 비용은 최소로 유지되어야 한다. 이러한 요건은 매우 작은 메모리 용량을 사용하는 특수한 펌웨어를 생성하는 데 필요한 개발 환경(비용 면에서 효과적인)을 구축하는 경우에도 동일하다.
여기에서 설명하는 방법론에서는 OpenOffice.org Calc 및 XML, PHP를 사용하여 무료 테스트 시나리오를 작성하거나 펌웨어 개발 환경을 구축한다. 이 방법론은 Modbus 명령 테스트 시나리오를 생성하는 예제를 사용하여 설명한다.
Excel과 마찬가지로 OpenOffice.org Calc에는 스프레드시트를 표현하는 XML 문서를 두 가지 형식 중 하나를 사용하여 생성할 수 있는 기능이 있다. Microsoft Office Excel 2003 XML은 XML(.xml) 파일을 생성한다. 반면에 OpenOffice.org Calc 일반 XML은 FODS(.fods) 파일을 생성한다. 예를 들면, MovieSchedule.xls는 지역 영화관의 상영 일정이 표시된 스프레드시트이다. 그림 1에는 스프레드시트의 내용이 있다. (그림 1의 텍스트 전용 버전 보기)
그림 1. 영화 상영 일정이 표시된 스프레드시트
다음은 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>
|
스프레드시트로 구성된 XML 문서를 어떻게 2진 코드로 변환할 수 있을까? PHP 스크립트를 통해 다음과 같은 기능을 하는 클래스를 사용하면 가능하다.
- PHP DOM 클래스를 통해 XML 문서를 순회한다.
- 순회한 요소의 내용을 일련의 중간 표현으로 변환하여 배열로 저장한다.
- 변환 데이터베이스를 사용하여 중간 표현을 대상 2진 코드로 변경한다.
- 변경된 2진 코드를 BLOB으로 변환 데이터베이스에 저장한다.
XML 문서를 순회하여 내용을 중간 표현으로 변환하는 과정은 도메인마다 다르다. 다시 말해서 XML 문서는 사용된 스프레드시트의 구조에 맞추어 사용자 정의된다. 예를 들면, 프로토콜 테스트 스프레드시트에서는 특정 프로토콜의 구조에 맞게 사용자 정의된 두 개의 클래스를 사용한다. 변환 데이터베이스에는 중간 "코드"를 해당 2진 시퀀스에 맵핑하는 데 사용하는 변환 참조 테이블과 입력 XML 스프레드시트 문서에 해당하는 2진 시퀀스를 저장하는 2진 시퀀스 테이블, 이렇게 두 개의 테이블이 있다.
이러한 모든 것을 표현하기 위해 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. Modbus 요청 시나리오
PHP 스크립트인 ProtoConvert.php(다운로드에서 사본을 얻을 수 있음)는 스프레드시트 XML 문서를 Modbus 요청 패킷을 통해 요청된 레지스터 범위를 위에 있는 스프레드시트의 각 행을 대상으로 검색하는 2진 명령 시퀀스로 변환하고 Modbus 응답 패킷의 레지스터 값을 해당 유효값 범위에 대조하여 검증한다. 이 스크립트는 다음과 같은 다섯 개의 클래스를 기반으로 한다.
SupportDB. 지원 데이터베이스와의 연결을 설정하고 데이터베이스를 쿼리하고 업데이트할 수 있는 액세스 방법을 제공한다. 이 스크립트에서 사용한 데이터베이스 패키지는 MySQL이지만 IBM® DB2®나 PostgreSQL과 같은 데이터베이스 패키지를 적당한 곳에 사용할 수도 있다.XMLWorkbook. 스프레드시트 XML 문서 파일의 내용을 추출한다.CommSheet. 해당 XML 문서에서 스프레드시트의 "장치의 통신 설정값" 워크시트 부분의 내용을 추출한다.ScenarioSheet. 해당 XML 문서에서 스프레드시트의 "Modbus 요청 시나리오" 워크시트 부분의 내용을 추출한다.ModbusReqSet. "장치의 통신 설정값"과 "Modbus 요청 시나리오" 워크시트의 내용에서 생성된 실행 가능한 명령의 시퀀스를 생성한다.
이러한 클래스를 사용하는 데 근간이 되는 기본 로직은 다음과 같다.
- 지원 데이터베이스(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) );
- 스프레드시트 XML 문서의 내용을 추출한다.
- 이 XML 문서 중 "장치의 통신 설정값" 워크시트의 내용을 추출한다.
- 이 XML 문서의 "Modbus 요청 시나리오" 워크시트의 내용을 추출한다.
- "장치의 통신 설정값" 워크시트와 "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로 시작하는 명령은 직렬 통신의 구성 설정값을 나타낸다. 0B와 0C로 시작하는 다음 명령 쌍은 각각 요청과 검증 규칙 명령이며 테스트 중인
장치의 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 compiler | ProtoConvert.zip | 4KB | HTTP |
교육
- Read and write Excel data with PHP Using XML support(Jack Herrington, developerWorks, 2004년 8월): 스프레드시트를 XML로 변환하는 방법에 관해 자세히 읽어보자.
- OpenOffice.org: OpenOffice 홈 페이지에서 OpenOffice에 관한 자세한 정보를 찾아보자.
- Modbus application protocol specification V1.1b: 이 기사의 예제에서 사용한 Modbus 프로토콜에 관한 자세한 정보를 찾아보자.
- LibModbus: 이 Linux®용 Modbus 도구 상자는 Linux를 기반으로 Modbus 프로토콜 메시지를 처리하는 무료 툴킷이다. 해당 소스는
C로 작성되었다. - jamod: 이 Java™ Modbus Library는 Java 언어로 작성된 Modbus 프로토콜 메시지를 처리하는 무료 툴킷이다.
- developerWorks의 XML 영역: XML 분야의 기술을 향상시키는 데 도움이 되는 참고자료를 얻을 수 있다.
- IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.
- XML Technical library: developerWorks XML 영역에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다.
- developerWorks 기술 행사 및 웹 캐스트: 이들 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.
- Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.
- developerWorks
팟캐스트: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.
제품 및 기술 얻기
- IBM 제품 평가판을 다운로드하거나 IBM SOA Sandbox의 온라인 시험판을 살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및
WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.
토론
- XML 영역 토론 포럼: 여러 XML 관련 토론에 참여해 볼 수 있다.
- developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.