티스토리 뷰

SCADA

오픈소스 Web SCADA ScadaBR의 구조 1

록개발자 2018. 11. 9. 11:41

SCADABR 1.0의 설치 프로그램을 통해서 SCADABR의 연관 패키지와 시스템 구조를 알아보고자 합니다.
SCADABR은 NSIS를 활용하여 설치 프로그램을 제작하기 때문에 NSIS 스크립트를 보면 SCADABR의 설치 과정과 연관 패키지 및 시스템 구조를 개략적으로 파악할 수 있습니다. NSIS에 대해서는 간단하게 설치 프로그램 제작하기 - NSIS를 참조하세요.
 
SCADABR 코드를 체크 아웃 받아 scadabr\Win32 Installer\ScadaBR CE 1.0를 보면 NSIS 스크립트의 확장자인 *.nsi 파일 두개를 확인 할 수 있는데 ScadaBRINSTALL.nsi 를 통해서 설치 과정을 분석하고자 합니다. 
 
  
다음은 설치 스크립트중에 설치 과정을 이끌어가는 페이지 정의 부분으로 이 부분을 중심으로 분석해 갈 수 있습니다.

......
  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_LICENSE $(LicenseRTF)
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  Page custom SetConfiguration Void "$(TEXT_CONF_PAGETITLE)"
  Page custom SetChooseJVM Void "$(TEXT_JVM_PAGETITLE)"
  Page custom VerifyJRE Void ""
  !insertmacro MUI_PAGE_INSTFILES
  Page custom CheckUserType
  Page custom SetChooseBD Void "$(TEXT_BD_PAGETITLE)"
  Page custom VerifyBD Void ""
  !insertmacro MUI_PAGE_FINISH

 ;Uninstall Page order
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES

  !insertmacro MUI_RESERVEFILE_LANGDLL
  !insertmacro MUI_LANGUAGE "PortugueseBR" ;first language is the default language
  !insertmacro MUI_LANGUAGE "English"
  !insertmacro MUI_LANGUAGE "Spanish"
......

 

▶ 설치 언어 선택 페이지

설치 프로그램은 MUI_LANGUAGE 매크로로 정의된 설치 프로그램의 언어 선택으로 시작합니다. 설치 각 단계 마다 텍스트 출력이 있는 곳에 언어별 스크링을 정의하고 사용자가 선택한 언어에 따른 인터페이스를 제공합니다. 여기서 선택하는 언어는 설치 프로그램의 언어이지 실제 SCADABR 프로그램의 구동 환경의 언어를 의미하지 않습니다.
설치 언어 선택 창에 표시하는 아이콘은 "!define MUI_ICON scadabr.ico"로 정의합니다.
 

▶ 첫 페이지

Welcome 페이지로 패키지 이름(Name "ScadaBR")과 배너 이미지(!define MUI_WELCOMEFINISHPAGE_BITMAP scadabrlogo.bmp)로 지정한 텍스트와 NSIS 자체의 언어 설정에 따른 텍스트(NSIS설치 위치>Contrib\Language files에 저장)로 화면을 구성하고 설치 옵션 설정을 시작합니다.
 

▶ 라이선스 동의 페이지

MUI_PAGE_LICENSE 매크로로 지정한 RTF 형태의 라이선스 파일을 출력하고 동의 여부를 입력받습니다.
이 페이지 부터의 화면 디자인은 아래와 같은 정의의 설정으로 표시됩니다.
 

  !define MUI_HEADERIMAGE
  !define MUI_HEADERIMAGE_RIGHT
  !define MUI_HEADERIMAGE_BITMAP header.bmp

 

▶ 설치 컴포넌트 선택 페이지

MUI_PAGE_COMPONENTS 매크로로 페이지를 표시합니다.
각 컴포넌트는 Section ~ SectionEnd 블럭에 설치 작업을 기술하고 컴포넌트를 트리 구조로 선택할 수 있도록 할 경우에는
SubSection ~ SubSectionEnd 블럭을 상위 단계로 지정하고 그 안에 Section ~ SectionEnd 블럭들을 위치시키면 자연스럽게 트리 구조로 컴포넌트를 선택할 수 있습니다. SCADABR의 컴포넌트 구조는 아래의 그림과 같습니다.




옵션 중에 어떤 설치 타입을 사용할 지를  아래와 같이 지정할 수 있습니다.
 
  InstType Normal ; 1
  InstType Minimum ; 2
  InstType Full ; 3
 
설치 타입은 순서대로 1부터 숫자로 대응되어 특정 Section을 어떤 설치 타입에 표시할지를 지정하는 SectionIn 옵션에서 아래와 같은 형태로 지정할 수 있습니다. 끝에 RO를 붙이면 변경할 수 없는 컴포넌트로 지정합니다(예, 기본 컴포넌트의 필수 내역등)
 
SectionIn 1 2 3 RO
각 컴포넌트에 대한 자세한 내역은 실제 설치 시점에 다룹니다.
 

▶ 디렉토리 선택 페이지

MUI_PAGE_DIRECTORY 매크로로 페이지를 표시합니다. 사용자가 선택한 설치경로는 $INSTDIR 변수에 저장됩니다.
 

▶ 톰캣 환경 설정 페이지

SetConfiguration 함수를 통해 톰캣 서버의 구동 환경을 설정하는 페이지로 상세 내용은 아래와 같습니다.
 
  !insertmacro MUI_HEADER_TEXT "$(TEXT_CONF_TITLE)" "$(TEXT_CONF_SUBTITLE)"


  SectionGetFlags ${SecManager} $0
  IntOp $0 $0 & ${SF_SELECTED}
  IntCmp $0 0 0 Enable Enable
  SectionGetFlags ${SecHostManager} $0
  IntOp $0 $0 & ${SF_SELECTED}
  IntCmp $0 0 Disable 0 0


Enable:
  ; Enable the user and password controls if the manager or host-manager app is
  ; being installed
  !insertmacro INSTALLOPTIONS_READ $0 "config.ini" "Field 5" "HWND"
  !insertmacro INSTALLOPTIONS_WRITE "config.ini" "Field 5" "Flags" ""
  EnableWindow $0 1
  !insertmacro INSTALLOPTIONS_READ $0 "config.ini" "Field 7" "HWND"
  !insertmacro INSTALLOPTIONS_WRITE "config.ini" "Field 7" "Flags" ""
  EnableWindow $0 1
  Goto Display


Disable:
  ; Disable the user and password controls if neither the manager nor
  ; host-manager app is being installed
  !insertmacro INSTALLOPTIONS_READ $0 "config.ini" "Field 5" "HWND"
  !insertmacro INSTALLOPTIONS_WRITE "config.ini" "Field 5" "Flags" "DISABLED"
  EnableWindow $0 0
  !insertmacro INSTALLOPTIONS_READ $0 "config.ini" "Field 7" "HWND"
  !insertmacro INSTALLOPTIONS_WRITE "config.ini" "Field 7" "Flags" "DISABLED"
  EnableWindow $0 0
  ; Clear the values
  !insertmacro INSTALLOPTIONS_WRITE "config.ini" "Field 5" "State" ""
  !insertmacro INSTALLOPTIONS_WRITE "config.ini" "Field 7" "State" ""


Display:
  !insertmacro INSTALLOPTIONS_DISPLAY "config.ini"
 
MUI_HEADER_TEXT 매크로로 페이지의 제목과 부제를 지정합니다. SectionGetFlags ${SecManager} $0는 SecManager로 지정한 섹션에서 섹션 옵션을(해당 세션이 선택 되었는지 여부) 읽어 $0에 저장하라는 명령입니다. IntOp 는 연산 명령으로 IntOp $0 $0 & ${SF_SELECTED}는 $0과 컴포넌트의 선택 여부를 확인할 수 있는 비트 마스크를 마스킹한 결과를 $0에 입력합니다.
IntCmp는 두개의 변수를 비교하고 결과에 따라 같을때 이동할곳, 작을때, 클때 이동할 곳을 지정합니다. IntCmp $0 0 0 Enable Enable는 $0가 0이면 이동하지 않고(0), 작거나 크면(컴포넌트가 선택) "Enable"로 이동합니다.
Enable: 또는 Disable: 루틴에서 INSTALLOPTIONS_READ로 "config.ini"파일의 User/Password 항목인  "Field 5", "Field 7"를 가져와서 INSTALLOPTIONS_WRITE로 DISABLED 여부를 지정하는 플래그를 설정합니다. 최종적으로 INSTALLOPTIONS_DISPLAY 매크로로 config.ini로 정의되어 있는 톰캣 설정 페이지를 표시하고 입력 받습니다.
 
정리해보면, 컴포넌트 선택에서 "Manger" 또는 "Host Manager"를 선택한 경우에는 톰캣 관리자의 사용자 아이디와 비밀번호와 한께 톰캣 커넥터 포트를 입력 받을 수 있도록 설정하고, 둘다 선택하지 않은 경우에는 톰캣 커넥터 포트만 입력받도록 페이지를 구성합니다.
 
 다음은 config.ini의 일부 내용입니다.
[Settings]
NumFields=9


[Field 1]
Type=Label
Text=HTTP/1.1 Connector Port
left=0
right=150
top=5
bottom=20


[Field 2]
Type=Text
State=8080
MaxLen=5
left=150
right=200
top=5
bottom=18


[Field 3]
Type=Label
text=Tomcat Administrator Login (optional)
left=0
right=300
top=30
bottom=45

 

▶ JVM 설정 페이지

SetChooseJVM 함수를 통해 JVM 환경을 설정합니다. findJavaPath 함수로 우선 JAVA 경로를 찾습니다.
JAVA 경로 검색은(findJavaPath) "%PROGRAMW6432%" 환경 변수를 읽고(ExpandEnvStrings) 해당 환경변수가 있으면 32비트 레지스트리 환경으로 없으면 64비트 환경(SetRegView 64)으로 레지스트리 읽기를 수행합니다. JRE(1.6기준)의 JavaHome을 리턴합니다.(Push-Pop)
findJavaPath로 정상 경로가 넘어오지 않으면 정상적인 JRE 경로를 선택하라는 메시지와 함께 INSTALLOPTIONS_DISPLAY 매크로로 jvm.ini로 정의되어 있는 JVM 설정 화면을 표시하고 입력 받습니다. 아래는 폴더를 입력받기 위한 jvm.ini 파일의 일부입니다.
[Field 2]
Type=DirRequest
Left=0
Right=-1
Top=65
Bottom=78

 

▶ JRE 검증 단계

VerifyJRE 함수로 페이지는 출력하지 않고 JRE 환경 검증과 실패시 JVM 설정 페이지로 재이동하는 작업을 수행합니다.
jvm.ini 파일에서 사용자가 입력한 폴더 정보를 읽어서 $dest변수에 저장합니다.(!insertmacro INSTALLOPTIONS_READ $dest "jvm.ini" "Field 2" "State") $dest에 입력된 JAVA HOME 폴더 아래 "lib\ext" 폴더, "bin"폴더에 파일이 존재하는지 검사하고(IfFileExists) 없으면 오류 메시지와 함께  JVM 설정 페이지로 재이동하고 존재하면 다음 단계로 진행합니다.
 

▶ 설치 진행 페이지

MUI_PAGE_INSTFILES 매크로로 실제 설치 작업을 진행합니다. 사용자가 선택한 컴포넌트를 기준으로 각 Section에서 정의된 내용대로 설치를 수행합니다. SCADABR 1.0 설치 시점에 유저 선택에 따라 설치하는 패키지는 다음과 같습니다.
  • JAVA 환경은 미리 준비되어야 합니다(JRE 환경 검사)
  • Open-source SCADA
    • Core : Apache Tomcat 6.0(Apache License) 
      설치 폴더와 하위 lib, logs, work, temp, bin, conf, webapps/ROOT폴더에 파일및 디렉토리를 복사합니다.
      configure 함수를 통해서 config.ini를 기반으로 conf/server.xml과 conf/tomcat-users.xml를 작성합니다.
      bin/tomcat6w.exe를 복사하고 CPU 타입에(x86, x64, i64) 따른 tomcat6.exe를 복사하고 실행시킵니다.
    • Mango 1.12.4 : SCADABR의 원천 코드인 Mango(GPL)
      원천 코드인 Mango 1.12.4 압축 파일을 복사하고 webapps/ScadaBR 폴더에 압축을 해제합니다.
    • ScadaBR : ScadaBR 코드
      Mango 코드를 풀어놓은 webapps/ScadaBR 폴더에 ScadaBR에서 변경 및 수정한 내용을 반영합니다.
      installRXTX 함수를 통해서 자바 실행 경로의 lib/ext/RXTXcomm.jar과 CPU 타입별 bin/rxtxSerial.dll을 복사합니다.
      - Rxtx 2.1-7-bins-r2(LGPL)
    • ClienteJavaWeb : 클라이언트 서비스 코드
      webapps/ClienteJavaWeb에 JSP 코드와 폴더를 복사합니다.
    • Samples : API 사용 예제
      Samples 폴더의 엑셀, PHP, Python 예제 복사
    • Service : 서비스 등록
      톰캣 서비스가 가동시키고(nsExec::ExecToLog)
      톰캣 서비스가 시스템 부팅시 자동으로 시작하도록 WriteRegStr를 이용해서 ApacheTomcatMonitor로 동작하도록 등록합니다.
    • Native : Tomcat Native Library
      보안 모듈(TLS/SSL)등이 포함된 Tomcat Native Library를 CPU 타입에 따라 bin/tcnative-1.dll로 복사합니다.
  • Start Menu Items : 시작 메뉴 및 바로가기 설정
    바탕화면에 "http://localhost:8080/ScadaBR/"를 웹브라우저로 여는 바로가기를 등록합니다.
     "http://localhost:8080/ScadaBR/"를 웹브라우저로 여는 바로가기를 시작 메뉴>ScadaBR에 등록합니다.
    매뉴얼 2종을 시작 메뉴>ScadaBR>Docs에 등록합니다.
    설치폴더>webapps/manager 폴더가 있으면 "http://localhost:8080/manager/html" 주소를 여는 바로가기를 "Tomcat Manager"로 등록합니다.
    설치폴더>webapps/webapps/tomcat-docs 폴더가 있으면 톰캣 문서 바로가기를 등록합니다.
    설치제거 프로그램으로의 링크를 등록합니다.
    톰캣 모니터/설정하기를(tomcat6w.exe) 등록합니다.
  • Documentation : 톰캣 문서화 자료
    webapps/docs 폴더의 문서 및 폴더를 복사합니다.
  • Manager : 톰캣 호스트 매니저
    webapps/manager 폴더의 문서 및 폴더를 복사합니다.
  • Host Manager : 톰캣 호스트 매니저
    webapps/host-manager 폴더의 문서 및 폴더를 복사합니다.
  • Examples : 톰캣 서브릿/JSP 예제
    webapps/examples 폴더의 문서 및 폴더를 복사합니다.

 

▶ 사용자 권한 검사

CheckUserType 함수로 설치를 진행하는 사용자가 "Admin"권한이 있는지 검사하고(UserInfo::GetAccountType) "Admin"이 아니면 톰캣 서버를 서비스로 띄우지 못함을 표시하고 계속 진행합니다.
 

▶ 데이터베이스 선택 페이지

SetChooseBD 함수로 기본 데이터베이스를 선택합니다.  뒤로 돌아갈 수 없도록 버튼을 잠그고 INSTALLOPTIONS_DISPLAY 매크로로 bd.ini로 정의되어 있는 DB 선택 페이지을 표시하고 입력 받습니다.  데이터베이스 선택은 아래의 db.ini 내용과 같이 Derby와 MySQL를 리스트 박스로 할 수 있습니다.
[Settings]
NumFields=3


[Field 1]
Type=Label
Text=""
left=0
right=300
top=5
bottom=40


[Field 2]
Type=Label
Text=""
left=40
right=140
top=70
bottom=85


[Field 3]
Type=DropList
State=Derby
left=140
right=250
top=68
bottom=100
ListItems=MySql|Derby

 

▶ 데이터베이스 설정 단계

별도의 페이지 표시는 없고 VerifyBD 함수로 SCADABR 구동 환경에($INSTDIR\webapps\ScadaBR\WEB-INF\classes\env.properties) 해당 데이터베이스 정보를 설정합니다.(envmysql.properties 또는 envderby.properties)
다음은 MySQL 설정 파일의 일부입니다. DB 이름과 사용자 아이디/비밀번호 등은 적절하게 설정해 주어야 합니다.
db.type=mysql
db.url=jdbc:mysql://localhost/scadabr
db.username=root
db.password=
db.pool.maxActive=10
db.pool.maxIdle=10

 

▶ 설치 종료 페이지

MUI_PAGE_FINISH 매크로로 설치 종료 페이지를 표시하고 설치를 종료합니다. 설치 종료 페이지와 관련한 옵션은 아래와 같이 설정되어 있습니다.
  !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\webapps\ROOT\RELEASE-NOTES.txt"
  !define MUI_FINISHPAGE_RUN $INSTDIR\bin\tomcat6w.exe
  !define MUI_FINISHPAGE_RUN_PARAMETERS //MR//Tomcat6
  !define MUI_FINISHPAGE_NOREBOOTSUPPORT

 
Readme 표시를 위한 파일 설정, 프로그램 실행을 위한 경로와 파라미터(톰캣 서버), 시스템 리부팅  여부(하지 않음)를 지정하는 것을 확인 할 수 있습니다.(자세한 내용은 NSIS 메뉴중 "Modern UI 2"문서를 확인 할수 있습니다)
 
 
 
설치 과정을 분석해 보면 톰캣 서버가 SCADABR의 기반 서비스를 담당하고 Mango라는 웹기반 SCADA 패키지를 수정한 SCADABR의 모습을 확인할 수 있었습니다.
 
결론적으로 정리해보면 톰캣을 다운로드 받아 설치해보신 분들이라면 바로 느끼실수 있을 정도로 톰캣 설치 파일을 수정해서 SCADABR설치 과정을 제작했고, 톰캣 설치에 응용 프로그램인 SCADABR을 포함했구나! 입니다.
 
다음 포스팅에서는 웹브라우저와 PLC 신호 까지의 정보 흐름을 중심으로한 시스템 구조를 파악해 볼까 합니다.

 

 

(주)동운시스템 전화 041-358-3760
동운 HMI 소개 바로가기
[온라인 문의 및 견적요청]


 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함