SYS - SOLAR - 007, 시스템구조 SoCID의시스템구조는수행하는기능에따라크게세개의모듈로나뉘며, 다음과같다 폴링서버 / 클라이언트 1. 폴링클라이언트는각실험장비에설치되어폴링서버로데이터를전송 2. 폴링서버는클라이언트로부터전달받은데

Similar documents
02 C h a p t e r Java

Windows 8에서 BioStar 1 설치하기

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft Word - src.doc

Microsoft PowerPoint - 04-UDP Programming.ppt

Spring Boot/JDBC JdbcTemplate/CRUD 예제

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밊

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

PowerPoint 프레젠테이션

자바-11장N'1-502

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

rmi_박준용_final.PDF

PowerPoint Presentation

PowerPoint Presentation

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

로거 자료실

Secure Programming Lecture1 : Introduction

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Microsoft PowerPoint - Java7.pptx

< 목차 > Ⅰ. 개요 3 Ⅱ. 실시간스팸차단리스트 (RBL) ( 간편설정 ) 4 1. 메일서버 (Exchange Server 2007) 설정변경 4 2. 스팸차단테스트 10

1. Windows 설치 (Client 설치 ) 원하는위치에다운받은발송클라이언트압축파일을해제합니다. Step 2. /conf/config.xml 파일수정 conf 폴더에서 config.xml 파일을텍스트에디터를이용하여 Open 합니다. config.xml 파일에서, 아

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

윈도우시스템프로그래밍

12-file.key

Install stm32cubemx and st-link utility

untitled

Chapter 1

Microsoft PowerPoint - 03-TCP Programming.ppt

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

슬라이드 1

슬라이드 1

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

FileMaker 15 ODBC 및 JDBC 설명서

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

The Pocket Guide to TCP/IP Sockets: C Version

윈도우시스템프로그래밍

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

FileMaker ODBC 및 JDBC 가이드

MasoJava4_Dongbin.PDF

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint 프레젠테이션

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

JMF3_심빈구.PDF

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

DBMS & SQL Server Installation Database Laboratory

4S 1차년도 평가 발표자료

PowerPoint Template

PowerPoint Presentation

슬라이드 1

JUNIT 실습및발표

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

untitled

[ 정보 ] 과학고 R&E 결과보고서 Monte Carlo Method 를이용한 고교배정시뮬레이션 연구기간 : ~ 연구책임자 : 강대욱 ( 전남대전자컴퓨터공학부 ) 지도교사 : 최미경 ( 전남과학고정보 컴퓨터과 ) 참여학생 : 박진명 ( 전

PowerPoint Presentation

PowerPoint 프레젠테이션

게시판 스팸 실시간 차단 시스템

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

Flex Builder 2 & 차트

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

07 자바의 다양한 클래스.key

09-interface.key

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

C# Programming Guide - Types

PowerPoint 프레젠테이션

FileMaker ODBC and JDBC Guide

Javascript.pages

강의 개요

PowerPoint Presentation

어댑터뷰

PowerPoint 프레젠테이션

Microsoft PowerPoint - 10Àå.ppt

Java

Modern Javascript

슬라이드 1

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

System Recovery 사용자 매뉴얼

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Presentation

Tablespace On-Offline 테이블스페이스 온라인/오프라인

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

자바 프로그래밍

Overall Process

Chap7.PDF

NoSQL

Java ...

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

untitled

슬라이드 1

PowerPoint Presentation

제목을 입력하세요.

목 차 1. 드라이버 설치 설치환경 드라이버 설치 시 주의사항 USB 드라이버 파일 Windows XP에서 설치 Windows Vista / Windows 7에서 설치 Windows

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Transcription:

SYS - SOLAR - 007, 2010 1 태양광효율측정장치개발자매뉴얼 Manual for SoCID Developers 박선영 부산대학교컴퓨터공학과 parksy@pusan.ac.kr ABSTRACT 본매뉴얼은 염료감응태양전지성능평가실험을위한통합시뮬레이션소프트웨어개발 과제의개발자매뉴얼이다. SoCID 시스템에대해소개하고시스템의구조와기능적측면에대해서설명하며, 과제의전반적인진행상황을연차별 (1 년차및 2 년차 ) 로분류하여설명한다. 1 년차에는실험결과 DB 구축, 데이터수집모듈, 파서, 홈페이지개발등이주요내용이며, 2 년차에는 FCM 클러스터링모듈개발, 유효성검사및오류정정모듈이주요내용이다. 개발예정기능과시스템의확장방법, 오류의종류및대응방법등에대해서도설명하였다. KEYWORDS SoCID, Developer, Manual 1 개요 1.1 SoCID(Solar Cell Instrument Database) 시스템소개 SoCID는염료감응태양전지성능평가실험에서도출되는데이터를효과적으로관리하기위하여개발된웹기반의통합형데이터관리시스템이다. 2010년 12월말기준으로 2년차분량까지개발되어있으며, 시스템의개념도는그림 1과같다. 그림 1. SoCID 시스템개념도

SYS - SOLAR - 007, 2010 2 1.2 시스템구조 SoCID의시스템구조는수행하는기능에따라크게세개의모듈로나뉘며, 다음과같다. 1.2.1 폴링서버 / 클라이언트 1. 폴링클라이언트는각실험장비에설치되어폴링서버로데이터를전송 2. 폴링서버는클라이언트로부터전달받은데이터를파싱후 DB에저장 1.2.2 분석모듈 1. 데이터에포함된오류탐색및수정후보고 2. DB 에저장된데이터를 FCM 등의방법으로다인자분석 1.2.3 SoCID 홈페이지 1. 사용자인증후실험데이터조회 2. 표, 그래프등으로데이터시각화 1.3 시스템기능 SoCID의주요기능 ( 개발예정기능포함 ) 은다음과같다. 1.3.1 SoCID 홈페이지 1. 사용자인증및관리 2. 실험결과데이터베이스관리 3. 데이터열람및시각화 4. 데이터보고및출력 5. 실험 Class 관리기능 1.3.2 SoCID 데이터수집모듈 1. TCP/IP 기반의실험데이터수집 ( 서버 / 클라이언트모델 ) 2. 수집된데이터자동파싱및데이터베이스화 1.3.3 실험데이터분석및평가모듈 1. 유효성검사및오류정정 2. 실험데이터의다중인자분석및클러스터링 SoCID 의데이터흐름도는그림 2 와같다.

SYS - SOLAR - 007, 2010 3 그림 2. SoCID 시스템데이터흐름도 구분 필요환경 버전 적용범위 OS Windows 계열 XP SP2 서버및 Windows 7 클라이언트 Apache 2.2.14 서버 PHP 5.3.0 서버 Runtime Environment Adobe Flash Player 9.0 클라이언트 Java Runtime Standard 6.0.230 서버및 Environment (JRE) Edition(SE) 실험측정장비 폴링서버및 Development Environment Eclipse SDK 3.5.2 폴링에이전트 Adobe Flex Builder 3.0 SoCID 홈페이지 DB mysql 5.1.39 서버 표 1. SoCID 시스템설치및사용을위한시스템설정 1.4 설치를위한시스템설정 SoCID 시스템을완전히새로설치하기위해서는표 1 과같은시스템설정이필요하다. 2 1 년차결과물 1 년차결과물은실험결과데이터베이스구축, TCP/IP 기반의데이터수집 (Polling) 기능, 자동파싱 및데이터베이스화모듈개발, 데이터검색및조회를위한홈페이지 (SoCID) 개발등이다.

SYS - SOLAR - 007, 2010 4 2.1 실험결과데이터베이스구축 DeVAC 대용량버전은크게 3개의모듈로구성되어있다. 2.1.1 데이터베이스관리체계 (DBMS) 선택 SoCID 에서는 mysql[1] 을데이터베이스관리체계 (DBMS) 로사용한다. mysql 은 Java 를개발한 Sun Microsystems 사에서제공하는 DBMS로써, 동사에서제공하는 Oracle과더불어가장널리사용되고있는 DBMS 중하나이다. mysql을선택한배경은다음과같다. 1. 비용일반적으로시판되는 DBMS를사용하기위해서는수십수백만원정도의라이선스비용이발생하지만 mysql은프리웨어로써라이선스비용이없음 2. 설치및사용편의성 mysql은설치가간편하며, 고가의 DBMS에서제공하는 GUI 기반의관리도구를제공하고있어 DBMS 접근이용이 3. 강력한드라이버지원 mysql은 C/C++, Java, PHP 등대부분의언어에호환되는강력한드라이버및라이브러리를제공하므로확장성이뛰어남 4. 개발편의성위에언급한장점으로인해많은개발자가 mysql을사용하여 DB를구성하는경우가많기때문에개발시정보를얻기쉬움 2.1.2 실험결과데이터분석 SoCID에서다루는데이터는총 4 개의실험장비 (K3000, K3100, K3400, K3600) 에대한실험결과를의미한다. 모든장비에서출력되는데이터를처리할수있는데이터베이스를구축하기위하여실험데이터를분석한결과, 실험데이터는 4 계층으로이루어져있다. 이 4계층을기본으로하여각측정장치별로실험데이터를정확히표현할수있는데이터베이스를설계하였다. 실험데이터의 4계층에대한설명은다음과같다. 1. Class 실험 ( 측정 ) 장비단위를 Class라한다. 예를들어 K3000에서실험한모든데이터는같은 Class 에속하게된다. 따라서 Class가같으면출력파일의포맷이동일하며, Class가다르면출력파일의포맷도상이하다. 2. Experiment 각 Class의실험데이터중파일 1 단위를 Experiment라한다. 예를들어 K3000 장비에서출력된실험결과파일하나가 Experiment가되며, K3000 장비에서 5개의파일이출력되었다면 Experiment 5단위가생성된것이다. 각 Experiment는환경변수를저장하고있으며, 이를위한 DB 스키마도모두정의되어있다.

SYS - SOLAR - 007, 2010 5 3. Sheet 각 Experiment에저장된독립적인실험단위를 Sheet라한다. 1개의 Experiment( 실험파일 ) 내에 Sheet가 1개만존재하는경우도있고여러개가존재할수도있다. 동일한 Experiment 내에있는 Sheet는모두같은환경변수를공유하게되나측정시각의차이는있을수있다. 4. Spot 실험데이터중 1회측정결과 (row data) 를의미한다. 예를들어 K3000에서실험환경변수를제외한각측정결과한줄이 Spot 이된다. 가장중요한데이터이며각 Class( 실험장비 ) 별로스키마를별도로구성하였다. 2.1.3 DB 스키마설계 2.1.2절의데이터분석결과를바탕으로 2010년 12월현재 K3000, K3100, K3400, K3600의 4가지데이터에대해 SoCID DB 스키마에대한설계를완료하였다. 각실험장비별할당된테이블및설명은표 2와같으며, 이를토대로맥사이언스사에서제공한샘플데이터를참조하여각테이블에필요한스키마를표 3과같이정의하였다. 실험장비명 (Class) 테이블명 대응관계 (1:1) 설명 k3000mi Experiment Measurement Information K3000 k3000mr Sheet Measurement Result k3000md Spot IV Raw Data k3100mi Experiment Measurement Information K3100 k3100mc Sheet Measurement Condition k3100md Spot IPCE Raw Data Experiment, K3400 k3400mi Sheet Measurement Information k3400md Spot Raw Data k3600mi Experiment Measurement Information K3600 k3600mr Sheet Measurement Result k3600md Spot Raw Data 표 2. K3000, K3100, K3400, K3600 에대한 DB 테이블 2.2 1.1. TCP/IP 기반의데이터수집 (Polling) 기능데이터수집프로그램 ( 폴링서버 / 에이전트 ) 은각실험장비에서측정된실험데이터파일 (xls, csv) 을관리서버로복사하는역할을수행한다. 실험장비의데이터가저장되는디렉터리를지정해두면, 해당디렉터리와서버의지정디렉터리를동기화하여추가되거나갱신된실험데이터파일이있을경우자동으로전송한다. Java 언어로작성되었으며, GUI 기반의서버-클라이언트모델을사용하고

SYS - SOLAR - 007, 2010 6 테이블명 K3000mi k3000mr k3000rd k3100mi k3100mc k3100rd k3400mi k3400rd k3600mi k3600mr k3600rd 속성명 Idx, Date, Area, InPw, Delay, Start, Stop, Step, Comment Idx, Voc, Isc, Jsc, Pmax, Vmax, Imax, FF, Eff, Rshunt, Rseries No, K3000MI Idx, Vol, Curr, CurrDen, Power, Temp Idx, Filename, CellInfo, DeviceID, Date, UserID, GlassID, Lotid, SamplePos Idx, Bias, StartWL, EndWL, StepWL, Avg, AcqDelay, ChopFreq, Jsc, RangeOfCurr Idx, K3100MI Idx, Ramda, Power, Isc, SRref, SRtar, EQE, Temp Idx, Date, Mode, Bias, Amp, Freq, SwpType, NumOfFreq, Repeat, Lifetime, DiffLen Idx, K3400MI Idx, Freq, Z1, Z2, Time, Ecd, Idc Idx, StartTime, Interval1, ChangeAF, Interval2, IVPoints, VST, SwpDir, Path Idx, K3600MI Idx, Voc, Voc Init, Isc, Isc Init, Jsc, In Power, FF, Pmax, Vmax, Imax, Eff Idx, K3600MI Idx, K3600MR Idx, SysTime, LifeTime, Volt, Curr, Temp, Humi 표 3. 각테이블의속성정의표 있다. 사용을위해서는 Polling Server 프로그램을서버에, Polling Agent 프로그램을각실험장비에 설치하여야한다. 설치는관리자에게압축파일을전달받아그대로해제하여사용하면되며, JRE SE 6.0 이상이필요하다. 서버및에이전트의자세한사용법은 2.2.1 절및 2.2.2 절에서다룬다. 2.2.1 폴링서버 폴링서버프로그램은서버에서수행되며각실험장비의실험데이터를수집하는역할을한다. 폴링 서버의인터페이스는그림 3 과같다. 사용법은설정된서버에서 Polling Server 프로그램을실행한후, Select Download Folder 버튼을눌러실험데이터를다운로드받을디렉터리를선택한다음 Start Server 를누르면서버가에이전트의연결을기다리는상태가된다. 모든로그메시지는중앙의로그기록창에기록되며동시에파일로도저장된다. 주요기능인파일목록일치검사및수신모듈의핵심코드는표 4와같다.

SYS - SOLAR - 007, 2010 7 그림 3. 폴링서버의사용자인터페이스. 다운로드폴더설정과서버시작버튼, Log 출력창등으로구성되어있다. //1. Creating a server socket ServerSocket mserversocket = new ServerSocket(3334); //File ldestdirectory = new File(cStrDestDirectory); FileNameFilterClass lfilenamefilterclass = new FileNameFilterClass(); //1.1 Creating Logger Logger logger = new Logger("Log.txt"); dbw = new DBwriter(); while(true){ //2. Wait for connection logger.write("waiting for connection"); Socket lclientsocket = mserversocket.accept(); logger.write("--------------------------------------------------------"); logger.write("connection received from " + lclientsocket.getinetaddress().gethostname()); //3. get Input and Output streams DataOutputStream out = new DataOutputStream(lClientSocket.getOutputStream()); DataInputStream in = new DataInputStream(lClientSocket.getInputStream()); logger.write("connection successful"); // 0. Read Device Name & create Directory String ldevicename = in.readutf(); File lfinaldestdir = new File(cStrDestDirectory+"\\"+lDeviceName);

SYS - SOLAR - 007, 2010 8 // 1. Read File Name String lfilename = in.readutf(); long lfiledatelong = in.readlong(); logger.write("devicename : " + ldevicename + " File Name:" + lfilename + " Date:" + lfiledatelong); if(!lfinaldestdir.exists()){ lfinaldestdir.mkdir(); if(!lfinaldestdir.isdirectory()){ logger.write("device Directory Error"); continue; lfilenamefilterclass.mcomparefilename = lfilename; File[] lfoundedfiles = lfinaldestdir.listfiles(lfilenamefilterclass); if(lfoundedfiles.length == 0){ logger.write(" 파일이존재하지않음 - Client 파일새로생성하여수신함 "); File lnewfile = new File(lFinalDestDir.getPath() + "\\" + lfilename); lnewfile.createnewfile(); out.writeboolean(true); long lnewfilelength = in.readlong(); FileOutputStream lnewfileoutputstream = new FileOutputStream(lNewFile); byte[] lbuffer = new byte[4096]; int readint; while(lnewfilelength > 0){ if(lnewfilelength > 4096) readint = in.read(lbuffer); else readint = in.read(lbuffer, 0, (int)lnewfilelength); lnewfilelength -= readint; lnewfileoutputstream.write(lbuffer, 0, (int)readint); lnewfile.setlastmodified(lfiledatelong); String FilePath = lnewfile.getpath();

SYS - SOLAR - 007, 2010 9 // 2. 저장이완료된파일을파싱하여 DB에저장 Parse(lDeviceName, FilePath, logger); lnewfileoutputstream.close(); else if(lfoundedfiles.length > 0){ if(lfoundedfiles[0].lastmodified() < lfiledatelong){ out.writeboolean(true); logger.write(" 갱신된파일존재 - Client 파일수신함 "); long lfilelength = in.readlong(); FileOutputStream lfileoutputstream = new FileOutputStream(lFoundedFiles[0]); byte[] lbuffer = new byte[4096]; int readint; while(lfilelength > 0){ if(lfilelength > 4096) readint = in.read(lbuffer); else readint = in.read(lbuffer, 0, (int)lfilelength); lfilelength -= readint; lfileoutputstream.write(lbuffer, 0, (int)readint); lfoundedfiles[0].setlastmodified(lfiledatelong); // 3. 저장이완료된파일을파싱하여 DB에저장 Parse(lDeviceName, FilePath, logger); lfileoutputstream.close(); else{ out.writeboolean(false); logger.write(" 동일한파일존재 - Client 파일수신거부함 "); else{ out.writeboolean(false); logger.write(" 파일크기오류 - Client 파일수신거부함 "); in.close(); out.close();

SYS - SOLAR - 007, 2010 10 if(lclientsocket.isconnected()) lclientsocket.close(); 표 4. 폴링서버 (Polling Server) 의파일목록일치검사및파일수신모듈의소스코드 2.2.2 폴링에이전트파일목록일치검사및파일수신모듈은서버가시작되면자동으로수행되는모듈이며, 수행절차는다음과같다. 1. 에이전트의연결을기다리다가에이전트의연결요청이도착하면이를수락 2. 연결이완료되면에이전트의파일목록 ( 파일명 + 최근갱신시각 ) 을전송받음 3. 에이전트의파일목록과서버의파일목록을대조 4. 갱신되었거나존재하지않는파일의목록을에이전트에송신 5. 에이전트가파일을보내면수신하여설정된디렉터리에저장 폴링에이전트는각실험장비 (K3000, K3100, K3400, K3600) 에설치되어폴링서버에실험데이 터를전송하는역할을한다. 폴링에이전트의사용자인터페이스는그림 4 와같다. 그림 4. 폴링에이전트프로그램의사용자인터페이스 각실험장비마다파일의형식이다르기때문에서버에이를알려주어야하는데, 이를각장비별로변경설정할수있도록하기위하여설정창이따로있으며, ( L =Lock) 버튼을통해이설정창의잠금을해제할수있다. 잠금해제후새로운장비명을설정했다면다시 L 버튼을눌러서이를저장해야한다. Select Data Folder 를통해각장비의실험데이터가저장되는디렉터리를설정할수있다. 서버를새로설정했을경우 Server IP 부분을수정하여설정할수있다. 포트번호는 3334 로내부에서고정되어있다. 데이터디렉터리를설정하였으면 Start Agent 버튼을통해폴링서버와동기화를시작한다. 핵심모듈인디렉터리동기화및송신모듈의소스코드는표 6와같다.

SYS - SOLAR - 007, 2010 11 File lscandirectory = new File(cStrSrcDirectory); HashMap<String, Date> lfilehashmap = new HashMap<String, Date>(); System.out.println(" 클라이언트시작 "); try{ while(true){ // 지정디렉토리에존재하는실험데이터파일스캔 File[] lscanfiles = lscandirectory.listfiles(new FilenameFilter() { public boolean accept(file dir, String name) { return name.endswith(".csv"); ); for (File file : lscanfiles){ Date lfilemodifieddate = lfilehashmap.get(file.getname()); if(lfilemodifieddate!= null){ if(file.lastmodified() > lfilemodifieddate.gettime()){ System.out.println(" 파일전송시도 "); lfilehashmap.put(file.getname(), new Date(file.lastModified())); SendFile(file); else{ System.out.println(" 파일전송시도 "); lfilehashmap.put(file.getname(), new Date(file.lastModified())); SendFile(file); Thread.sleep(1000); catch (Exception e) { System.err.println(e.toString()); 표 5. 폴링에이전트프로그램의디렉터리스캔및파일송신모듈의소스코드

SYS - SOLAR - 007, 2010 12 디렉토리스캔및파일송신모듈은서버에연결된후수행되며지정된디렉토리의모든실험데 이터를스캔한후서버로부터요청된파일을전송한다. 파일전송담당함수 (SendFile) 의소스코드는 표 6 과같다. public void SendFile(File psendfile){ boolean pprocess = true; while(pprocess){ try{ Socket lclientsocket = new Socket(cServerIPAddress, 3334); System.out.println("SendFile 1. 서버접속성공 "); DataInputStream in = new DataInputStream (lclientsocket.getinputstream()); DataOutputStream out = new DataOutputStream (lclientsocket.getoutputstream()); if(cdevicename.isempty()) System.out.println("Device Name Error"); out.writeutf(cdevicename); out.writeutf(psendfile.getname()); out.writelong(psendfile.lastmodified()); System.out.println("SendFile 2. 파일정보전송 " + psendfile.getname() + ": " + psendfile.lastmodified()); if(in.readboolean()){ System.out.println("SendFile 3.1. 서버허가받음 "); FileInputStream fis = new FileInputStream(pSendFile); out.writelong(psendfile.length()); long lfilelength = psendfile.length(); byte[] buf = new byte[4096]; while(lfilelength > 0){ if(lfilelength > 4096){ fis.read(buf); out.write(buf); lfilelength -= 4096; else{ fis.read(buf, 0, (int)lfilelength); out.write(buf, 0, (int)lfilelength); lfilelength = 0;

SYS - SOLAR - 007, 2010 13 fis.close(); else{ System.out.println("SendFile 3.2. 서버거부받음 "); pprocess = false; in.close(); out.close(); if(lclientsocket.isconnected()) lclientsocket.close(); catch (Exception e) { System.err.println(e); 표 6. 폴링에이전트프로그램의파일전송함수 (SendFile) SendFile 함수는각파일의정보를서버에우선전송한후, 서버의허가가떨어지면해당파일을 전송한다. 전송은 TCP/IP 기반으로이루어지며 1 회전송당버퍼크기는 4KB(4096Byte) 이다. 2.3 자동파싱및데이터베이스화모듈개발 자동파싱및데이터베이스 (DB) 화모듈은서버에저장된데이터파일을각실험장비포맷별로파싱하여데이터베이스에입력하는모듈이다. 맥사이언스사에서제공한각실험장비별샘플데이터를분석하여, 입력데이터의개수에상관없이데이터파일이종료될때까지파싱하여해당데이터를읽어들인후 DB에저장한다. 현재는각측정장비별 (K3000, K3100, K3400, K3600) 로파서 (Parser) 가별도구성되어있다. K3000, K3400, K3600의측정데이터는 Java 기반의 CSV Reader 를이용해파싱하고, K3100의측정데이터는 JXL(Java excel Library) 을통해파싱한다. 이는 K3100의 CSV 데이터가확보되면추후수정가능한부분이다. K3000 파서의소스코드는표 7과같다.

SYS - SOLAR - 007, 2010 14 package K3000; import java.io.ioexception; import java.io.inputstreamreader; import java.io.fileinputstream; import java.util.*; import jxl.*; import java.sql.sqlexception; import java.sql.statement; import java.sql.*; import Server.ValidCheck; import au.com.bytecode.opencsv.csvreader; public class K3000Parser{ private K3000MI K3000mi; private K3000MR K3000mr; private List<K3000RD> K3000rds; private List<String> Query; public K3000Parser(String FilePath) throws IOException{ CSVReader K3000Reader = new CSVReader(new InputStreamReader( new FileInputStream(FilePath),"EUC_KR")); K3000mi = new K3000MI(); K3000mr = new K3000MR(); K3000rds = new ArrayList<K3000RD>(); K3000RD K3000rd_tmp;// = new K3000RD(); String [] nextline; ValidCheck vc = new ValidCheck(); // Parse Raw Data int i=0; // attribute name while (nextline[0].compareto("$$")!=0){ K3000rd_tmp = new K3000RD(); K3000rd_tmp.SetNo (new Double(vc.isNumber(nextLine[0])).intValue()); K3000rd_tmp.SetVol(vc.isNumber(nextLine[1])); K3000rd_tmp.SetCurr (vc.isnumber(nextline[2])); K3000rd_tmp.SetCurrDen(vc.isNumber(nextLine[3])); K3000rd_tmp.SetPower(vc.isNumber(nextLine[4]));

SYS - SOLAR - 007, 2010 15 K3000rd_tmp.SetTemp(vc.isNumber(nextLine[5])); K3000rds.add(K3000rd_tmp); i++; // Parse Measurement Information K3000Reader.readNext(); // "$$" // "Test Information" K3000mi.SetDate(nextLine[0]); K3000mi.SetArea(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mi.SetInPw(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mi.SetDelay(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mi.SetStart(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mi.SetStop(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mi.SetStep(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); // Parse Measurement Result K3000Reader.readNext(); K3000Reader.readNext(); // empty row // "Test Result" K3000mr.SetVoc(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mr.SetIsc(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mr.SetJsc(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mr.SetPmax(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mr.SetVmax(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

SYS - SOLAR - 007, 2010 16 K3000mr.SetImax(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mr.SetFF(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mr.SetEff(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mr.SetRShunt(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); K3000mr.SetRSeries(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1])); Query = new ArrayList<String>(); Query.add(K3000mi.GetQuery()); Query.add(K3000mr.GetQuery()); for(i = 0; i < K3000rds.size();i++){ Query.add(K3000rds.get(i).GetQuery(i+1)); public boolean executequery(statement stmt) throws SQLException{ for(int i = 0; i < Query.size(); i++){ stmt.executeupdate(query.get(i)); return true; 표 7. K3000 실험데이터 (CSV) 파서의소스코드 2.1.3 절에서정의한스키마를바탕으로, 맥사이언스사에서제공한샘플데이터를입력한결과는 그림 5(k3000mi), 그림 6(k3600rd) 과같다. 2.4 데이터조회및검색을위한 SoCID 홈페이지개발 SoCID 홈페이지는데이터베이스에저장된실험데이터의조회와검색을위해개발되었다. 인증된사용자만접근가능하며특정조건에맞는실험데이터를검색해서볼수있다. 또한데이터를그래프로표현가능하다. 사용자인증, 게시판등홈페이지의기본적인기능들은 Xpress Engine[2]( 구제로보드 ) 기반으로구성되어있으며데이터검색및조회페이지는 Flex 기반으로개발하여차트등을

SYS - SOLAR - 007, 2010 17 그림 5. k3000mi 테이블에저장된 K3000 측정장비의샘플데이터 그림 6. k3600rd 테이블에저장된 K3600 측정장비의샘플데이터 효과적으로표현가능하도록하였다. 2.4.1 SoCID 홈페이지의기본기능 SoCID 홈페이지는기본적으로 Xpress Engine을기반으로구성되어있으며, 이를사용할경우사용자인증 - 회원가입 ( 그림 7), 로그인등, 게시판등의기능과홈페이지전체레이아웃이패키지혹은위젯형태로제공된다. 이를 Windows 서버에서활용하기위해서는 APMsetup(Windows 용 Apache, PHP, MySQL 패키지 ) 가필요하다. 설치후에는관리모듈이제공되어프로그래머가아니더라도레이아웃과사용자권한, 게시판구성등대부분의기능을원하는대로수정할수있다.

SYS - SOLAR - 007, 2010 18 그림 7. 회원가입창. Xpress Engine 의회원관리기능. 패키지에포함되어있어별 도로개발할필요가없다. 2.4.2 SoCID 데이터조회및검색기능 SoCID 의중요한기능중하나는데이터조회기능이다. 이기능을통해 DB 에저장된실험데이터를 실시간으로조회할수있다. 조회화면은그림 8 과같으며, 각리스트는 Flex 로구현되어있다. 그림 8. SoCID 의데이터조회창. 좌측하단메뉴에서 Class 를선택할수있으며, 클 래스를선택하면우측본화면과같이 Experiment 의리스트가출력된다. Experiment 를선택하면 Spot 을포함한상세한정보를볼수있다. 표 8 은 K3000 의리스트를표시하기위한 Flex 소스코드이다. Flex 소스코드는 Javascript 와유 사하나차이가있으며 PHP 페이지를거쳐 DB 에접근한다.

SYS - SOLAR - 007, 2010 19 <?xml version="1.0" encoding="utf-8"?> <mx:titlewindow xmlns:mx="http://www.adobe.com/2006/mxml" width="800" height="600" layout="absolute" creationcomplete="startapp()" close="this.close()" showclosebutton="true" verticalscrollpolicy="auto" bordercolor="#e2e2e2"> <mx:style> global{ fontsize : 12; </mx:style> <mx:script> <![CDATA[ import mx.rpc.events.faultevent; import mx.rpc.events.resultevent; import mx.controls.alert; import mx.utils.objectutil; import flash.system.system; import mx.events.listevent; import mx.rpc.http.httpservice; import mx.core.iflexdisplayobject; import mx.managers.popupmanager; private var httpservice:httpservice; private var DataGridItem:Object; //xml 데이터를받을시한글깨짐방지 System.useCodePage = true; [Bindable]public var index:string; private function startapp():void{ Helper(); private function close():void{ PopUpManager.removePopUp(this as IFlexDisplayObject); //PopUpManager에서팝업창을제거해준다.

SYS - SOLAR - 007, 2010 20 private function Helper():void{ httpservice = new HTTPService(); // POST 방식으로데이터를전송한다. httpservice.method = URLConfig.method; // 목록을초기화한다. RD.dataProvider = new Array(); httpservice.addeventlistener (ResultEvent.RESULT, resulthandler); httpservice.addeventlistener(faultevent.fault, faulthandler); httpservice.url = URLConfig.K3000Report; httpservice.request.idx = index; ]]> </mx:script> //Alert.show(httpService.request.idx); httpservice.send(); private function resulthandler(event:resultevent):void{ MI1.dataProvider = event.result.root.k3000mi1.entries; MI2.dataProvider = event.result.root.k3000mi2.entries; MR.dataProvider = event.result.root.k3000mr.entries; RD.dataProvider = event.result.root.k3000rd.entries; private function faulthandler(event:faultevent):void{ Alert.show(event.message.toString()," 핸들러오류입니다 "); private function refreshhandler(event:resultevent):void{ //Alert.show(event.message.toString()," 새로고침 "); Helper(); private function itemclickevent(event:listevent):void {// DataGrid 컨트롤의아이템클릭이벤트 DataGridItem = new Object(); DataGridItem = event.target.selecteditem; //Alert.show(" 클릭 ");

SYS - SOLAR - 007, 2010 21 <mx:panel layout="vertical" paddingbottom="10" paddingleft="10" paddingright="10" paddingtop="10" width="98%" height="100%" horizontalalign="center" fontsize="12" y="0" verticalalign="top" x="0"> <mx:vbox width="100%" height="100%"> <mx:label text="i V Report" textalign="center" verticalcenter="center" width="100%" fontsize="40" fontfamily="times New Roman" fontweight="bold" alpha="1.0"/> <mx:label text="measurement Information" width="100%" textalign="center" fontsize="24" fontfamily="times New Roman" fontweight="bold"/> <mx:hbox width="100%"> <mx:datagrid id="mi1" width="50%" headerheight="-1" height="125"> <mx:columns> <mx:datagridcolumn headertext="label" datafield="label"/> <mx:datagridcolumn headertext="value" datafield="value"/> </mx:columns> </mx:datagrid> <mx:datagrid id="mi2" width="50%" headerheight="-1" height="125"> <mx:columns> <mx:datagridcolumn headertext="label" datafield="label"/> <mx:datagridcolumn headertext="value" datafield="value"/> </mx:datagrid> </mx:hbox> <mx:label text="measurement Result" fontsize="24" width="100%" fontfamily="times New Roman" fontweight="bold" textalign="center"/> <mx:datagrid id="mr" width="100%" height="220" sortablecolumns="false"> <mx:columns> <mx:datagridcolumn headertext="items" datafield="items"/> <mx:datagridcolumn headertext="result" datafield="result"/> <mx:datagridcolumn headertext="unit" datafield="unit"/> <mx:datagridcolumn headertext="remark" datafield="remark"/> </mx:datagrid> <mx:label text="iv Raw Data" fontsize="24" fontfamily="times New Roman" fontweight="bold" width="100%" textalign="center"/> <mx:datagrid id="rd" width="100%" height="2425" itemclick="itemclickevent(event)"> <mx:columns>

SYS - SOLAR - 007, 2010 22 <mx:datagridcolumn datafield="no" headertext="no" width="45"/> <mx:datagridcolumn datafield="vol" headertext="voltage(v)"/> <mx:datagridcolumn datafield="curr" headertext="current(ma)"/> <mx:datagridcolumn datafield="power" headertext="current(ma)"/> <mx:datagridcolumn datafield="temp" headertext="current(ma)"/> </mx:datagrid> </mx:vbox> </mx:panel> </mx:titlewindow> 표 8. K3000 List 확인페이지의 Flex 소스코드. PHP와연동하여 DB에접근한다. 그림 8 에서각 Experiment 를선택했을때해당보고서는그림 9 와같이그래프와표를이용해 표시된다. 그래프는 Flex Chart 를이용하였으며 DB 에저장된데이터를불러와서이를그래프로재 구성하는방식을취한다. 그림 9. K3100 Measurement Information 의 2 번 Experiment 를선택한모습. 해당 Experiment 의상세보고서를출력한다. 또한, 특정조건에부합하는데이터를찾아서따로출력하는기능도포함되어있다. 그림 10 과같 이각데이터별검색창에데이터의범위를입력하면해당조건에맞는데이터의리스트를따로출 력해준다.

SYS - SOLAR - 007, 2010 23 그림 10. K3000 데이터의실험데이터검색창. 각데이터속성의범위를지정할수있다. 3 2 년차결과물 3.1 실험데이터의다인자분석을위한 FCM 클러스터링모듈개발 실험데이터의다인자분석 (Multi-variable analysis) 은실험데이터를분석하여최종결과 ( 효율등 ) 에가장큰영향을미치는인자를분석하기위한방법이다. 이를위해 SoCID 시스템에서는클러스터 링방법중하나인 FCM(Fuzzy C Means) 알고리즘을사용한다. 3.1.1 FCM(Fuzzy C-Means) 알고리즘 FCM 알고리즘은하나의클러스터에속해져있는각각의데이터점을소속정도에의해서클러스터에대한데이터의소속정도를일일이열거한데이터분류알고리즘이다. HCM(Hard C Means) 클러스터링을알고리즘을개선하기위하여제안되었으며, HCM과달리변수의소속여부가참또는거짓이아니라 0 1 사이의실수로표현된다는것이특징이다. n 개의벡터 x i, i = 1,..., n 의집합을개의퍼지그룹으로분할하고, 비유사성측정의비용함수가최소가되는것과같은각각의그룹안에서클러스터의중심을찾는다. 데이터집합에대한소속감정도의합은식 (1), (2) 과같이항상 1이다. c u ik = 1, k = 1,..., n (1) i=1 n 0 < u i k < n (2) k=1

SYS - SOLAR - 007, 2010 24 FCM 에대한비용함수 ( 또는목적함수 ) 는다음과같은형태를가지고있다. J(u ik, u i ) = d ik = d(x k v i ) = c i=1 k=1 n u m ik (d ik) 2 (3) [ l ] j=1 (x kj v ij ) 1 2 (4) v i = {v i1, v i2,..., v il (5) 여기서, u ik 는 0과 1사이의수적인값으로 i 번째클러스터에속해져있는 x k 의 k 번째데이터의소속정도를나타낸다. v i 는 i 번째클러스터중심벡터이다. j(j = 1, 2,..., l) 는특성공간상의변수이다. m 은소속함수의퍼지성 ( 애매함 ) 의정도에대한영향을나타내는지수의가중 (exponential weight) 이다. 이값은 m [1, ) 와같은범위를가지고있으며, 분류공정에서퍼지성의양을제어하는파라미터이다. 보통 m 을 2로설정한다. 식 (3) (5) 의목적함수를최소화하기위해서먼저 v i 와 u ik 와의관련된식의목적함수를분화시켜야한다. v ij = n k=1 (u ik) m x kj n k=1 (u ik) m (6) u ik = 1 ( x k v i ) 1 2 m 1 c j=1 ( 1 x k v i 2 ) 1 m 1 = 1 c j=1 [ xk v i x k v j ] 2 m 1 = c j=1 1 [ ] 2 dik m 1 d jk 식 (6) 과 (7) 에의해서묘사되어진시스템은분석적으로해결할수없다. 그러나 FCM 알고리즘은 주어진위치로부터시작해서목적함수의최소로접근하기위해서반복적으로접근한다. FCM 알고리 즘은다음과같이요약된다. Step 1 - 클러스터의개수 c(2 c < n) 을정하고지수의가중 (exponential weight) 을선택한다. 초기소속함수를초기화한다. 알고리즘반복횟수를 r(r = 0, 1, 2, ) 로표시한다. Step 2 - 식 (6) 을이용하여퍼지클러스터중심 {u (r) i r = 1, 2,,, e 을계산한다. Step 3 - 다음과같이새로운소속함수 U {r+1 을계산한다. 이다. u (r+1) ik = 1 또는 u (r+1) ik c j=1[ d r ik d r jk ] 2 m 1 for I k = φ = 0 for all classes i, here i bari k 여기서, I k = {i 2 c < n; d (r) ik = 0 이고 Īk = {1, 2,, c I k 이다. 그리고 i I k u (r+1) ik = 1 Step 4 : 다음식을계산해서만일 > ε 이면 r = r+1 로정하고 Step 2 로가서다시알고리즘을 반복수행하고, ε 이면알고리즘을종료한다. 여기서 ε 는임계값이고, 는다음과같다. (7) = U ( r + 1) U ( r) = max i,k u(r+1) ik u (r) ik (8)

SYS - SOLAR - 007, 2010 25 3.1.2 FCM 클러스터링모듈 FCM 클러스터링모듈은위에서언급한 FCM 알고리즘을다차원데이터에적용할수있는모듈이다. n 개의 d 차원의벡터 ( 데이터 ) 를 c 개의클러스터로나눌수있으며, 지수의가중치 m 과반복횟수, 임계값 ε 등을모두변경할수있도록설계하였다. FCM 클러스터링모듈의소스코드는표 9와같다. public class FCM { private final int c; // 클러스터개수 c=2, 3, 4,... private final int r; // 알고리즘반복회수 r=0, 1, 2,... private final double m; // 지수의가중치 (exponential weight) 1<m< private final double e; // 임계값 private final int d; // 데이터의차원 ArrayList<ArrayList<Double>> prevu; // 이전소속함수 ( 임계값비교를위해 ) ArrayList<ArrayList<Double>> U; // 소속함수 ArrayList<ArrayList<Double>> Data; // 입력데이터 ArrayList<ArrayList<Double>> V; // 각클러스터에대한중심벡터 FCM(final int c, final int r, final double m, final double e, final int d){ // 생성자. 각종변수초기화 this.c = c; this.r = r; this.m = m; this.e = e; this.d = d; setdataarray(); setuarray(); setvarray(); FCMclustering(); // Data vector 초기화 // 소속함수초기화 // 클러스터의중심벡터 0,0 으로초기화 // FCM 클러스터링 @SuppressWarnings("unchecked") // FCM 클러스터링 void FCMclustering(){ // 이전상태를저장할임시소속함수 prevu = (ArrayList<ArrayList<Double>>)U.clone(); for(int i = 0; i < this.r; i++){ // 클러스터의중심벡터계산

SYS - SOLAR - 007, 2010 26 calvarray(); printvarray(); // 각클러스터중심과의거리계산 caluarray(); printprevuarray(); printuarray(); // 임계치종료조건 if(exitcondition(prevu)){ break; prevu = (ArrayList<ArrayList<Double>>)U.clone(); boolean exitcondition(arraylist<arraylist<double>> prevu){ double maxgap = 0; for(int i = 0; i < U.size(); i++){ for(int j = 0; j < U.get(i).size();j++){ double gap = U.get(i).get(j) - prevu.get(i).get(j); if(maxgap < gap) maxgap = gap; if (maxgap < e) return true; else return false; // 클러스터의중심벡터계산 void calvarray(){ for(int i = 0; i < c; i++){ for(int j = 0; j < d; j++){ double numerator=0,denominator=0; for(int k = 0; k < Data.size(); k++){ numerator += denominator += U.get(k).get(i)*U.get(k).get(i);

SYS - SOLAR - 007, 2010 27 V.get(i).set(j, Math.round(numerator / denominator*100)/100.0); // 각클러스터중심과의거리계산 void caluarray(){ for(int i = 0; i < Data.size(); i++){ final double distance [] = new double [c]; for(int j = 0; j < c; j++){ double sum = 0; for(int k = 0; k < d; k++){ sum += (Data.get(i).get(k) - V.get(j).get(k)) * (Data.get(i).get(k) - V.get(j).get(k)); distance[j] = Math.pow(sum, 1/m); for(int j = 0; j < c; j++){ double sum = 0; for(int k = 0; k < c; k++){ sum += (distance[j] / distance[k]) * (distance[j] / distance[k]); if(double.isnan(sum)) sum = 1.0; else sum = 1.0 / sum; U.get(i).set(j, Math.round(sum*1000)/1000.0); // 소속함수초기화 void setuarray(){ U = new ArrayList<ArrayList<Double>>(); ArrayList<Double> u; for(int i = 0; i < Data.size()-1; i++){

SYS - SOLAR - 007, 2010 28 u = new ArrayList<Double>(); u.add(1.0); u.add(0.0); U.add(u); u = new ArrayList<Double>(); u.add(0.0); u.add(1.0); U.add(u); // 클러스터의중심벡터 0,0 으로초기화 void setvarray(){ V = new ArrayList<ArrayList<Double>>(); ArrayList<Double> v; for(int i = 0; i < c; i++){ v = new ArrayList<Double>(); for(int j = 0; j < d; j++){ v.add(0.0); V.add(v); 표 9. FCM 클러스터링을수행하기위한 FCM 클래스의소스코드 3.2 유효성검사및오류정정 실험중여러가지원인으로인하여잘못된데이터가입력될수있다. 효율값이 100% 를초과하는경우나수치데이터에문자열 ( ABC 등 ) 이들어가는경우, 시각데이터에엉뚱한데이터가들어가는경우등을예로들수있다. 잘못된데이터의경우 DB에저장되더라도아무런의미가없으며분석결과의신뢰도를크게떨어뜨린다. SoCID 시스템은각변수별로관리자가미리지정한범위를벗어나거나수치데이터에수치가아닌데이터 ( 문자열, 수식등 ) 가들어가있을경우이를걸러내어오류메시지를출력하고, 설정값에따라약속된값으로치환하거나해당데이터를파기한다. 유효성검사모듈중수치데이터검사모듈의소스코드는표 10과같다.

SYS - SOLAR - 007, 2010 29 public double isnumber(string input, double max, double min) { double value = 0.0; try { value = Double.valueOf(input); if (Double.isInfinite(value)) { value = 99999.99999; logger.write ("Warning 1 : NumberFormatException - Infinity value"); else if (Double.isNaN(value)) { value = -99999.99999; logger.write ("Warning 2 : NumberFormatException - NaN value"); catch (NumberFormatException e) { value = -77777.77777; logger.write("error 1 : NumberFormatException - character"); // min, max 검사 if (new Double(min).compareTo(Double.NaN)!= 0 && new Double(max).compareTo(Double.NaN)!= 0) { if (value > max) { logger.write ("NumberRangeExceptionError : The value is higher than the MAXIMUM Value"); else if (value < min) { logger.write ("NumberRangeExceptionError : The value is lower than the MINUMUM Value"); return value; 표 10. 유효성검사모듈의수치데이터검사모듈의소스코드

SYS - SOLAR - 007, 2010 30 4 개발예정기능 4.1 오류보고기능강화현재의오류보고기능은일반적인수치상의오류혹은문자열오류만검출하도록되어있다. 오류보고기능을강화하여, 실험데이터가축적되면데이터의분석결과를바탕으로발생빈도가매우낮을것으로예측되는값이나계산상발생하기힘든값등을찾아내어이를사용자에게경고할수있다. 4.2 폴링에이전트원격관리기능에이전트프로그램이실행되어있다면폴링주기나에러검출여부등에대한설정을 SoCID 홈페이지의관리자모드에서일괄적으로관리할수있도록폴링서버와에이전트의기능을보강한다. 이를위한인터페이스는그림?? 과같이이미완성하였으며로직을구현중에있다. 그림 11. 폴링에이전트원격관리기능 ( 제어실 ) 인터페이스 4.3 다인자분석을위한클러스터링방법추가 SoCID 시스템은데이터분석을위한클러스터링방법으로 FCM 알고리즘을적용하였다. 데이터의종류등상황에따라여러클러스터링방법중하나를선택하여적용할수있다면기능적측면에서더욱유리할것으로본다. 따라서 FCM 외의클러스터링방법에대해조사해보고적용가능한모델은구현하여적용한다. 4.4 클래스자동확장기능추가현재 SoCID 시스템은 K3000, K3100, K3400 및 K3600 측정장비의실험데이터에대해서 built-in 형식의파싱및 DB 저장모듈이적용되어있다. 추후측정장비의종류가늘어난다면이를확장할필요가있는데, 이경우장비가늘어날때마다수동으로파서및 DB 저장모듈을추가하여야한다. 이러한불편함을최소화하기위하여설정값에따라적절하게파싱이가능한범용파서 (general parser) 개발과함께실험장비추가시클래스를자동으로추가할수있도록하는등시스템의확장성을강화할계획이다.

SYS - SOLAR - 007, 2010 31 5 시스템확장방법 실험데이터의변경혹은장비의추가로인한 SoCID 시스템을확장하기위해서는 built-in 파서를추가하고폴링서버및클라이언트를변경하여야한다. 현재로써는범용파서및자동확장기능이구현되어있지않으므로, 개발자를통하여 built-in 파서를추가하거나수정하여야한다. 추후해당기능이완성되면실험데이터포맷변경및실험장비확장에따른시스템확장방법에대한상세한설명을추가할것이다. 6 오류의종류및대응방법 6.1 설치관련오류 6.1.1 Flash Builder 버전관련오류 SoCID 서버는 Flex Builder 3으로개발하였다. 그러나 Flex Builder가 Flash Builder 4 로통합되면서이전버전으로개발한프로그램과호환이되지않는다. Flash Builder 4는이전버전으로컴파일할수있으므로현재는 3.5 버전으로낮추어컴파일하여야한다. 추후 Flash Builder 4를지원하도록추가할계획이다. 6.1.2 제로보드게시판에 Flex 페이지삽입하기제로보드를홈페이지로사용할경우, Flex 페이지는외부페이지로삽입하여야한다. 그과정은다음과같다. 1. xe를설치한폴더 - layout 폴더 - 스킨을포함한폴더 - js 폴더에표 11 코드파일을추가한다. 2. 레이아웃편집에들어가서제일윗줄에 <!--%import("js/activex.js")--> 를입력한다. 3. swf 파일을포함하고있는 html 파일의내용을모두삭제한다. 4. html 파일에표 12의코드를추가하되 fm 이하는홈페이지의설정에맞추어작성한다. 6.2 수행관련오류 6.2.1 Flex Security Error Flex 수행도중표 13과같은메시지를받았다면, 서버를바꾼후 Flash Builder에서바뀐서버의 IP 와설정에맞게다시컴파일하지않았기때문이다. 새로바뀐서버의설정에맞추어다시컴파일하고, 해당 swf 파일을홈페이지에연결해주면해결된다. 6.2.2 데이터유효성에러실험데이터의유효성검사모듈에서데이터의오류가발생했을경우, 두가지의선택사항이있다. 사용자가오류검사옵션을선택하였다면해당데이터는 DB에기록되지않으며, 옵션을선택하지않

SYS - SOLAR - 007, 2010 32 /*------------------------------------------*/ //ActiveX 적용관련 //------------------------------------------------- //fm(src,id,w,h,t,m) Flash Movie. src: 파일경로, id: 플래시무비아이디, w: 너비, h: 높이, t: 배경투명여부 (Y: 투명, N: 불투명 ), m: 메뉴표시여부 (Y: 표시, N: 미표시 ) /*------------------------------------------------*/ function fm(src, id, w, h, t, m) { var s = ; var s_id = ; var s_t = ; (id == "")? s_id="swf" : s_id = id; (t == "Y")? s_t = <param name="wmode" value="transparent"> : s_t= ; (m == "Y")? m = true : m = false ; s += <object type="application/x-shockwave-flash" ; s += classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ; s += codebase="http://fpdownload.macromedia.com/ ; s += pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" ; s += id=" +s_id+ " width=" +w+ " height=" +h+ "> ; s += <param name="movie" value=" +src+ "> ; s += <param name="quality" value="high"> ; s += s_t; s += <param name="menu" value=" +m+ "> ; s += <param name="swliveconnect" value="true"> ; s += <embed src=" +src+ " quality="high" menu=" +m+ " ; s += width=" +w+ " height=" +h+ " swliveconnect="true" ; s += id=" +s_id+ " name=" +s_id+ " type="application/x-shockwave-flash" ; s += pluginspage="http://www.macromedia.com/go/getflashplayer"><\/embed> ; s += <\/object> ; document.write(s); 표 11. 제로보드내에서 Flash 를삽입하기위한 activex 코드

SYS - SOLAR - 007, 2010 33 <script language="javascript" type="text/javascript"> fm("flash 파일의절대경로 ", "Flash 파일명 ", 창넓이, 창높이,"N","N"); </script> 표 12. 제로보드내에서 Flash를삽입하기위한 activex 코드 <script language="javascript" type="text/javascript"> fm("flash 파일의절대경로 ", "Flash 파일명 ", 창넓이, 창높이,"N","N"); </script> 표 13. Flex Security Error 았으면문제가발생한데이터를특정값으로치환하여데이터베이스에저장하고사용자로그에기록 을남긴다. 이때잘못된데이터를대치하여저장하는값은표 14와같다. 입력된문자열 데이터베이스저장값 NaN -99999.99999 Infinity 99999.99999 의미없는문자열 -77777.77777 표 14. 실수데이터에입력된문자열을대치할값. 데이터베이스에는입력한문자열 이아닌대치한값을저장한다. 7 Contact Us SoCID 시스템에대한의문사항이나조언이있으시면해당담당자에게메일로연락하실수있습니다. 개발및활용총괄 : 조환규교수 (hgcho@pusan.ac.kr) 데이터, 서버, 홈페이지관리 : 김선영연구원 (s.y.kim@pusan.ac.kr) 네트워크, 브라우징, 클라이언트 : 박선영연구원 (hgcho@pusan.ac.kr) SoCID 개발팀연락처 그래픽스응용연구실 : 051-510-2871 조환규교수님 : 051-510-2283 연구실 F A X : 051-582-5009 참고문헌 1. Oracle, Mysql, http://dev.mysql.com/. 2. NHN, Xpressengine, http://www.xpressengine.com/.