마크베이스 태그 테이블 활용
이 장에서는 마크베이스의 태그 테이블에 대한 보다 심도 있는 내용에 대해서 다루도록 한다 특히 이후에 소개되는 예제를 통해 배치로 ., 존재하는 센서뿐만 아니라 실시간으로 로딩되는 센서 데이터를 어떻게 저장하고 이를 시각화할 것인지에 대해 상세하게 설명하기 때문에 실제 비즈니스 응용 개발에 많은 도움이 될 것이다.
Table of Contents |
---|
태그 테이블의 세부 아키텍처
앞 장에서 간단하게 설명했었지만, 마크베이스의 태그 테이블은 다른 테이블과는 달리 내부적으로 많은 기능과 복잡한 구조를 담고 있는 고도의 데이터 처리 모듈이다. 다시 말해 TAG라는 이름을 가진 테이블은 내부적으로 하나의 가상테이블이라는 의미이기도 하다. 실제 내부에서 하는 역할과 연결된 모듈에 대한 그림은 다음과 같다.태그 테이블은 아래의 세 가지 개념적인 데이터 처리 공간을 제공하며, 세부적인 설명은 다음과 같다.Sensor Partition이는 태그 테이블이 생성될 때 사용자가 정의한 스키마를 기준으로 저장되는 내부 센서 데이터 테이블이다(내부적으로는 다수의 Internal table이 생성된다). 이 데이터는 태그 테이블에 대한 SELECT 문을 통해서 추출이 가능하며, 고속으로 초당 수만 건에서 수십만 건의 센서 데이터를 로딩할 수 있다. 또한, 실시간으로 압축된 형태로 저장되며, 사용자 요구에 따라 고속으로 초당 수백만 건의 센서 데이터를 시간 범위의 조건으로 검색할 수 있다. 삭제의 경우에는 시간순으로 오래된 센서 데이터에 대해 순차적으로 가능하다. 이 태그 테이블은 기본적으로 시계열 데이터로서 해당 태그의 이름과 데이터 발생 시간 그리고 64비트 실수 값을 갖는 특정한 데이터형이다.
그리고 사용자가 원하는 경우 위의 , 3가지 컬럼에 연속되는 부가 사용자 확장 컬럼을 추가할 수 있도록 설계되어 있어, 비즈니스 영역에 따라 다양한 스키마를 생성할 수 있다.
ROLLUP Partition이것은 Sensor storage 에 저장된 센서 데이터를 바탕으로 자동으로 통계 데이터를 생성하는 내부 테이블이다. 이는 수일 혹은 수년의 긴 시간 동안의 통계 데이터를 수초 내의 실시간으로 얻을 목적으로 개발되었다. 하나의 Sensor storage 당 Hour, Minute, Second 단위로 3개의 내부 롤업 테이블이 별도로 생성된다. 현재 이 테이블에서는 MIN, MAX, AVG, SUM, COUNT 5 개의 통계 데이터를 지원한다. 이 롤업 결과값을 얻기 위해서는 태그 테이블에 대한 SELECT 문의 힌트(hint) 지정을 통해서 가능하다. 아래는 대표적인 롤업 질의 예를 든 것이다.Code Block | ||
---|---|---|
| ||
SELECT DATE_TRUNC('second', time, 30) time, avg(value) avg FROM
(
SELECT /*+ ROLLUP(TAG, sec) */ time, value
FROM TAG WHERE name = 'EQ8^TAG8287' AND time between to_date('2018-01-01 12:00:00')
and to_date('2018-01-01 12:59:59')
) group by time order by time; |
위의 질의는 테그 이름이 “EQ8^TAG8287” 인 센서의 1 시간 범위의 데이터에서 30초 평균 레코드 총 120개를 얻어내는 것이다.
메타 테이블
메타(META) 테이블은 Sensor Storage 에 저장될 태그의 이름 및 부가 메타 정보를 저장하는 별도의 테이블이다.
이 테이블명은 _tag_meta로 명명되고, 사용자는 이 테이블에 대해 명시적으로 INSERT를 통해 태그의 메타 정보를 생성할 수 있다 . 이뿐만 아니라, 사용자는 이 테이블을 통해 태그 이름에 대한 생성뿐만 아니라, 수정, 삭제도 가능하다. 또한, 사용자 편의를 위해 마크베이스의 APPEND 프로토콜을 사용해서 데이터를 입력하는 경우에는 자동으로 태그 명을 생성하는 기능도 포함되어 있다. 그러나 현재 SQL 구문은 INSERT를 통해서 태그 테이블에 데이터를 입력하는 경우에는 자동으로 태그 이름을 생성해 주지는 않는다( Machbase 6.0에서 지원 예정).
배치형 PLC 데이터 변환 예제개요이 절에서 보일 예제는 일반적인 센서 데이터가 저장된 파일의 구조 형태를 태그 테이블에 로딩을 하는 일련의 과정을 설명한 것이다.가장 흔히 볼 수 있는 형태의 텍스트 저장 파일은 아무런 설명 없이 ,(콤마)나 나뉘어진 다수의 숫자형 값을 그냥 나열한 무작위의 파일 내용인 <값,값,값><값,값,값><반복..> 형태가 대표적이고, 시간을 포함한 파일의 경우에는 <시간,값,값,값> <시간, 값,값,값><반복..> 이런 형태가 가장 흔히 볼 수 있다.
이런 파일의 데이터는 PLC (programmable Logic Controller)라고 불리는 장비에서 1개 이상의 센서 값을 지속적으로 입력된 데이터를 오랜 기간동안 수집했을 경우에 만들어진다.
그런 이유로 인터넷 공간상에 여러 가지 센서 데이터 샘플을 보게 되면, 대부분의 경우 아래 그림과 같은 형태의 구조를 갖고 있는 것이 사실이다.
그런 이유로 이 절에서는 이 파일을 어떻게 마크베이스의 태그 테이블로 한꺼번에 배치 형태로 로딩하는지에 대한 설명을 하려고 한다.데이터 변환 순서도
위의 그림에서 볼 수 있듯이 본 예제에서는 원시 CSV 파일을 마크베이스의 로그 테이블로 한꺼번에 로딩을 한 이후, 이를 태그 테이블로 변환하는 방법에 대해 기술한다.테스트 디렉토리 확인
두 배치형 PLC 데이터 변환 예제
개요
이 절에서 보일 예제는 일반적인 센서 데이터가 저장된 파일의 구조 형태를 태그 테이블에 로딩을 하는 일련의 과정을 설명한 것이다.
가장 흔히 볼 수 있는 형태의 텍스트 저장 파일은 아무런 설명 없이 ,(콤마)나 나뉘어진 다수의 숫자형 값을 그냥 나열한 무작위의 파일 내용인 <값,값,값><값,값,값><반복..> 형태가 대표적이고, 시간을 포함한 파일의 경우에는 <시간,값,값,값> <시간, 값,값,값><반복..> 이런 형태가 가장 흔히 볼 수 있다.
이런 파일의 데이터는 PLC (programmable Logic Controller)라고 불리는 장비에서 1개 이상의 센서 값을 지속적으로 입력된 데이터를 오랜 기간동안 수집했을 경우에 만들어진다.
그런 이유로 인터넷 공간상에 여러 가지 센서 데이터 샘플을 보게 되면, 대부분의 경우 아래 그림과 같은 형태의 구조를 갖고 있는 것이 사실이다.
그런 이유로 이 절에서는 이 파일을 어떻게 마크베이스의 태그 테이블로 한꺼번에 배치 형태로 로딩하는지에 대한 설명을 하려고 한다.
데이터 변환 순서도
위의 그림에서 볼 수 있듯이 본 예제에서는 원시 CSV 파일을 마크베이스의 로그 테이블로 한꺼번에 로딩을 한 이후, 이를 태그 테이블로 변환하는 방법에 대해 기술한다.
테스트 디렉토리 확인
두 번째 디렉토리인 edu_2_pc에는 좀 더 큰 파일들이 아래와 같이 있으며, 각각의 설명은 다음과 같다.
Code Block |
---|
$ dir C:\Machbase-5.5\TagTutorial\edu_2_plc 2019-03-06 오후 02:40 107 1_create_tag.sql # 태그 테이블 생성 2019-03-06 오후 02:40 31 2_load_meta.bat # 태그 이름 로딩 2019-03-06 오후 02:40 32 2_load_meta.sh 2019-03-06 오후 02:40 162 2_tag_meta.csv # 태그 이름 데이터 2019-03-06 오후 02:40 263 3_create_plc_tag_table.sql # 로그 테이블 2018-08-14 오후 05:15 372,389,876 4_plc_tag.csv # 데이터 2019-03-06 오후 02:40 90 4_plc_tag_load.bat # Log à Tag 2019-03-06 오후 02:40 93 4_plc_tag_load.sh 2019-03-06 오후 02:40 1,123 5_plc_to_tag.sql # insert-select |
태그 테이블 생성 및 태그 메타 로딩
태그 테이블 생성은 필요할 경우에는 1_create_tag.sql 을 수행하면 된다. 태그 이름(태그메타)를 등록하는데 이전과 다른 점은 insert into 구문이 아니라, tagmetaimport라는 도구를 이용해서 한꺼번에 로딩하는 점이다. 주로 태그 메타 정보는 엑셀과 같은 곳에서 관리되어 주로 CSV 형태로 존재하기 때문에 로딩하는 것을 편하게 하기 위해서이다. 본 예제에서는 간단하게 17 개의 태그 메타 정보를 이미 CSV 파일에 넣어 두었으니, 다음과 같이 로딩하면 된다.
Code Block |
---|
$ machsql -s 127.0.0.1 -u sys -p manager -f 1_create_tag.sql ================================================================= Machbase Client Query Utility Release Version 5.5.0.official Copyright 2014 MACHBASE Corporation or its subsidiaries. All Rights Reserved. ================================================================= MACHBASE_CONNECT_MODE=INET, PORT=5656 Type 'help' to display a list of available commands. Mach> create tagdata table tag (name varchar(32) primary key, time datetime basetime, value double summarized); Executed successfully. Elapsed time: 3.032 $type 2_tag_meta.csv MTAG_V00 MTAG_V01 MTAG_C00 MTAG_C01 MTAG_C02 MTAG_C03 MTAG_C04 MTAG_C05 MTAG_C06 MTAG_C07 MTAG_C08 MTAG_C09 MTAG_C10 MTAG_C11 MTAG_C12 MTAG_C13 MTAG_C14 MTAG_C15 $ tagmetaimport -d 2_tag_meta.csv Import time : 0 hour 0 min 0.340 sec Load success count : 18 Load fail count : 0 |
위와 같이 성공적으로 태그 메타 정보(이름) 18개가 로딩되었다.
PLC 데이터 로딩을 위한 테이블 생성
아래와 같이 3_create_plc_tag_table.sql 을 수행하면 다음과 같은 로그 테이블이 생성된다.
Code Block |
---|
$ machsql -s 127.0.0.1 -u sys -p manager -f 3_create_plc_tag_table.sql ================================================================= Machbase Client Query Utility Release Version 5.5.0.official Copyright 2014 MACHBASE Corporation or its subsidiaries. All Rights Reserved. ================================================================= MACHBASE_CONNECT_MODE=INET, PORT=5656 Type 'help' to display a list of available commands. Mach> create table plc_tag_table( tm datetime, V0 DOUBLE , V1 DOUBLE , C0 DOUBLE , C1 DOUBLE , C2 DOUBLE , C3 DOUBLE , C4 DOUBLE , C5 DOUBLE, C6 DOUBLE , C7 DOUBLE , C8 DOUBLE , C9 DOUBLE , C10 DOUBLE , C11 DOUBLE , C12 DOUBLE , C13 DOUBLE , C14 DOUBLE , C15 DOUBLE ); Created successfully. Elapsed time: 0.087 |
Warning |
---|
주의할 점은 이 테이블은 로그 테이블 타입이라는 것이다(파일명 때문에 헷갈리지 않도록 하자). 마크베이스에서는 별도의 테이블 지정자를 명시하지 않으면, 로그 테이블로 생성된다. |
PLC 데이터 로딩
위에서 생성한 로그 테이블 plc_tag_table에 4_plc_tag.csv의 데이터 200만 라인이 PLC 입력 형태로 입력된다. 이 4_plc_tag.csv 파일은 첫 컬럼은 시간이며, 이후 순서대로 V0, V1, …C15 까지 컬럼이 나뉘어져 있다. 데이터의 패턴은 1초에 0~99mili second까지 약 100개의 데이터가 입력되고, 100 mili second에서 999까지는 입력이 없다가, 다음 1초 동안 동일한 패턴으로 입력된다. 제공되는 4_plc_tag_load.bat 파일을 수행하여, 200만 건의 원시 PLC 데이터를 로딩할 수 있다.
Code Block |
---|
$ 4_plc_tag_load.bat $ machloader -t plc_tag_table -i -d 4_plc_tag.csv -F "tm YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn" ----------------------------------------------------------------- Machbase Data Import/Export Utility. Release Version 5.5.0.official Copyright 2014, MACHBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- NLS : US7ASCII EXECUTE MODE : IMPORT TARGET TABLE : plc_tag_table DATA FILE : 4_plc_tag.csv IMPORT MODE : APPEND FIELD TERM : , ROW TERM : \n ENCLOSURE : " ESCAPE : \ ARRIVAL_TIME : FALSE ENCODING : NONE HEADER : FALSE CREATE TABLE : FALSE Progress bar Imported records Error records ============================== 2000000 0 Import time : 0 hour 0 min 26.544 sec Load success count : 2000000 Load fail count : 0 |
이제 태그 테이블을 활용할 모든 준비가 완료되었다.
태그 메타 이름 생성 규칙
이제 태그 테이블에 데이터를 넣어서 실제로 Tag Analyzer를 통해서 데이터를 확인할 수 있도록 한다. 이를 위해서 plc_tag_table 의 정보를 모두 태그 테이블에 넣어야 하는데, 이를 위해서 insert-select 구문을 이용해서 한꺼번에 넣는다. 그리고, 각 컬럼의 값이 모든 태그 테이블의 이름과 맵핑이 되어야 하기 때문에 다음과 같이 매타 태그의 이름 정보를 미리 결정하였다.
로그 테이블의 컬럼명 | 태그 테이블의 Name 컬럼에 입력되는 이름 |
---|---|
V0 | MTAG_V00 |
V1 | MTAG_V01 |
C0 | MTAG_C00 |
C1 | MTAG_C01 |
... | |
C15 | MTAG_C15 |
태그 테이블 데이터 로딩
이제 마지막으로 실제 데이터를 태그 테이블로 로딩할 차례이다. 미리 준비된 파일 5_plc_to_tag.sql 을 수행하면 하나씩 순차적으로 태그 테이블에 넣는다. 5_plc_to_tag.sql 파일은 내용은 아래와 같다. 하나의 컬럼의 값을 태그로 변환하여, 데이터를 입력하는 것을 볼 수 있다.
Code Block |
---|
insert into tag select 'MTAG_V00', tm, v0 from plc_tag_table; insert into tag select 'MTAG_V01', tm, v1 from plc_tag_table; insert into tag select 'MTAG_C00', tm, c0 from plc_tag_table; insert into tag select 'MTAG_C01', tm, c1 from plc_tag_table; insert into tag select 'MTAG_C02', tm, c2 from plc_tag_table; insert into tag select 'MTAG_C03', tm, c3 from plc_tag_table; insert into tag select 'MTAG_C04', tm, c4 from plc_tag_table; insert into tag select 'MTAG_C05', tm, c5 from plc_tag_table; insert into tag select 'MTAG_C06', tm, c6 from plc_tag_table; insert into tag select 'MTAG_C07', tm, c7 from plc_tag_table; insert into tag select 'MTAG_C08', tm, c8 from plc_tag_table; insert into tag select 'MTAG_C09', tm, c9 from plc_tag_table; insert into tag select 'MTAG_C10', tm, c10 from plc_tag_table; insert into tag select 'MTAG_C11', tm, c11 from plc_tag_table; insert into tag select 'MTAG_C12', tm, c12 from plc_tag_table; insert into tag select 'MTAG_C13', tm, c13 from plc_tag_table; insert into tag select 'MTAG_C14', tm, c14 from plc_tag_table; insert into tag select 'MTAG_C15', tm, c15 from plc_tag_table; |
수행결과는 다음과 같다.
Code Block |
---|
$ machsql -s 127.0.0.1 -u sys -p manager -f 5_plc_to_tag.sql ================================================================= Machbase Client Query Utility Release Version 5.5.0.official Copyright 2014 MACHBASE Corporation or its subsidiaries. All Rights Reserved. ================================================================= MACHBASE_CONNECT_MODE=INET, PORT=5656 Type 'help' to display a list of available commands. Mach> insert into tag select 'MTAG_V00', tm, v0 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 4.898 Mach> insert into tag select 'MTAG_V01', tm, v1 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 5.577 Mach> insert into tag select 'MTAG_C00', tm, c0 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 6.327 Mach> insert into tag select 'MTAG_C01', tm, c1 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 7.445 Mach> insert into tag select 'MTAG_C02', tm, c2 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 6.898 Mach> insert into tag select 'MTAG_C03', tm, c3 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 7.078 Mach> insert into tag select 'MTAG_C04', tm, c4 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 6.799 Mach> insert into tag select 'MTAG_C05', tm, c5 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 7.210 Mach> insert into tag select 'MTAG_C06', tm, c6 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 9.232 Mach> insert into tag select 'MTAG_C07', tm, c7 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 6.398 Mach> insert into tag select 'MTAG_C08', tm, c8 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 6.432 Mach> insert into tag select 'MTAG_C09', tm, c9 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 6.734 Mach> insert into tag select 'MTAG_C10', tm, c10 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 7.692 Mach> insert into tag select 'MTAG_C11', tm, c11 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 8.628 Mach> insert into tag select 'MTAG_C12', tm, c12 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 8.229 Mach> insert into tag select 'MTAG_C13', tm, c13 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 9.517 Mach> insert into tag select 'MTAG_C14', tm, c14 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 7.231 Mach> insert into tag select 'MTAG_C15', tm, c15 from plc_tag_table; 2000000 row(s) inserted. Elapsed time: 7.830 |
총 3600 만건의 데이터가 로딩된 것을 확인할 수 있다.
Tag Analyzer를 통한 데이터 시각화
이제 Tag Analyzer를 통해서 로딩된 데이터를 간단하게 살펴보자. 아래 그림은 로딩된 이후 즉시 10개의 센서에 대해 1분 통계 차트를 그려본 것이다.
마무리
이 절에서는 형태의 원시 파일을 PLC CSV 마크베이스의 태그 테이블로 한꺼번에 (배치) 로딩하고, 이를 시각화하는 것을 설명하였다. 기존에 가지고 있던 CSV 파일들은 이런 방식을 활용하여 쉽게 로딩 및 시각화할 수 있으며, 많은 활용이 있기를 바란다.것이다.
실시간 PLC 데이터 변환 예제
개요
앞 절에서 PLC 데이터를 배치 형태로 넣은 것을 이 절에서는 실시간으로 PLC 데이터를 태그 테이블로 변환하는 방법에 대해 설명한다. 이를 위해 마크베이스 5부터 제공한 STREAM이라는 실시간 데이터 변환 기능을 활용하도록 한다. 아래 그림은 본 절에서 수행할 예제를 그림으로 나타낸 것이다.
위의 그림이 배치와 거의 유사하지만 로그 , 테이블에서 태그 테이블로 데이터가 변환되는 INSERT-SELECT 구분을 STREAM 에서 실시간으로 실행시키는 것이 다른 핵심이다. 그러나, 이러한 STREAM 의 개수가 많아지면, 그만큼 시스템의 부하가 커지기 때문에 시스템 성능과 적절하게 조화를 이룰 수 있도록 한다.
테스트 디렉토리 확인
두번째 튜토리얼과 거의 유사하지만, stream 관련 파일, 4_plc_stream_tag.sql이 하나 추가된 것을 볼 수 있다.
Code Block |
---|
$ dir C 드라이브의 볼륨: Windows 볼륨 일련 번호: F588-65A4 C:\Machbase-5.5\TagTutorial\edu_3_plc_stream 디렉터리 2019-03-06 오후 02:40 <DIR> . 2019-03-06 오후 02:40 <DIR> .. 2019-03-06 오후 02:40 107 1_create_tag.sql 2019-03-06 오후 02:40 31 2_load_meta.bat 2019-03-06 오후 02:40 32 2_load_meta.sh 2019-03-06 오후 02:40 162 2_tag_meta.csv 2019-03-06 오후 02:40 263 3_create_plc_tag_table.sql 2019-03-06 오후 02:40 2,313 4_plc_stream_tag.sql 2019-03-06 오후 02:40 89,082,205 5_plc_tag.zip 2019-03-06 오후 02:40 90 5_plc_tag_load.bat 2019-03-06 오후 02:40 93 5_plc_tag_load.sh 9 개 파일 89,085,296 바이트 2 개 디렉터리 43,790,446,592 바이트 남음 |
태그 테이블 생성 and 태그 메타 로딩 and PLC 테이블 생성
앞의 배치 예제와 완전히 동일하다. 자세한 설명은 생략하도록 하겠다. 예제 파일 1_create_tag.sql, 2_load_meta.bat, 3_create_plc_tag_table.sql 를 순서대로 수행한다.
스트림 동작의 이해
이제 PLC 데이터가 입력되는 중에 태그 테이블로 센서 데이터를 입력하는 스트림을 동작시켜 보자. 아래의 파일 4_plc_stream_tag.sql 을 수행하면, 18개의 스트림 객체가 마크베이스에서 동작한다.
이 스트림이 하는 일은 로그 테이블 plc_tag_table 테이블에 데이터가 입력되는 순간 각 스트림이 동작하면서 자신의 데이터를 태그 테이블에 실시간으로 데이터를 입력하는 것이다. 아래는 실제 스트림을 등록하고, 이를 실행하는 파일 4_plc_stream_tag.sql의 내용이다.
Code Block |
---|
# 스트림 객체를 생성한다. 아직 동작중은 아님. EXEC STREAM_CREATE(event_v0, 'insert into tag select ''MTAG_V00'', tm, v0 from plc_tag_table;'); EXEC STREAM_CREATE(event_v1, 'insert into tag select ''MTAG_V00'', tm, v1 from plc_tag_table;'); EXEC STREAM_CREATE(event_c0, 'insert into tag select ''MTAG_C00'', tm, c0 from plc_tag_table;'); EXEC STREAM_CREATE(event_c1, 'insert into tag select ''MTAG_C01'', tm, c1 from plc_tag_table;'); EXEC STREAM_CREATE(event_c2, 'insert into tag select ''MTAG_C02'', tm, c2 from plc_tag_table;'); EXEC STREAM_CREATE(event_c3, 'insert into tag select ''MTAG_C03'', tm, c3 from plc_tag_table;'); EXEC STREAM_CREATE(event_c4, 'insert into tag select ''MTAG_C04'', tm, c4 from plc_tag_table;'); EXEC STREAM_CREATE(event_c5, 'insert into tag select ''MTAG_C05'', tm, c5 from plc_tag_table;'); EXEC STREAM_CREATE(event_c6, 'insert into tag select ''MTAG_C06'', tm, c6 from plc_tag_table;'); EXEC STREAM_CREATE(event_c7, 'insert into tag select ''MTAG_C07'', tm, c7 from plc_tag_table;'); EXEC STREAM_CREATE(event_c8, 'insert into tag select ''MTAG_C08'', tm, c8 from plc_tag_table;'); EXEC STREAM_CREATE(event_c9, 'insert into tag select ''MTAG_C09'', tm, c9 from plc_tag_table;'); EXEC STREAM_CREATE(event_c10, 'insert into tag select ''MTAG_C10'', tm, c10 from plc_tag_table;'); EXEC STREAM_CREATE(event_c11, 'insert into tag select ''MTAG_C11'', tm, c11 from plc_tag_table;'); EXEC STREAM_CREATE(event_c12, 'insert into tag select ''MTAG_C12'', tm, c12 from plc_tag_table;'); EXEC STREAM_CREATE(event_c13, 'insert into tag select ''MTAG_C13'', tm, c13 from plc_tag_table;'); EXEC STREAM_CREATE(event_c14, 'insert into tag select ''MTAG_C14'', tm, c14 from plc_tag_table;'); EXEC STREAM_CREATE(event_c15, 'insert into tag select ''MTAG_C15'', tm, c15 from plc_tag_table;'); # 스트림 객체를 구동시킨다. 이것이 구동되면, plc_tag_table 테이블에 데이터가 입력되는 순간 태그 테이블로 데이터를 입력한다. EXEC STREAM_START(event_v0); EXEC STREAM_START(event_v1); EXEC STREAM_START(event_c0); EXEC STREAM_START(event_c1); EXEC STREAM_START(event_c2); EXEC STREAM_START(event_c3); EXEC STREAM_START(event_c4); EXEC STREAM_START(event_c5); EXEC STREAM_START(event_c6); EXEC STREAM_START(event_c7); EXEC STREAM_START(event_c8); EXEC STREAM_START(event_c9); EXEC STREAM_START(event_c10); EXEC STREAM_START(event_c11); EXEC STREAM_START(event_c12); EXEC STREAM_START(event_c13); EXEC STREAM_START(event_c14); EXEC STREAM_START(event_c15); |
스트림 생성 및 수행
아래는 실제 해당 스트림을 등록 실행하는 , 파일을 수행한 것이다. 이를 수행하면, 마크베이스 엔진 내부에 18 개의 독자적인 스트림 엔진이 동작한다.
Code Block |
---|
$ machsql -s 127.0.0.1 -u sys -p manager -f 4_plc_stream_tag.sql ================================================================= Machbase Client Query Utility Release Version 5.5.0.official Copyright 2014 MACHBASE Corporation or its subsidiaries. All Rights Reserved. ================================================================= MACHBASE_CONNECT_MODE=INET, PORT=5656 Type 'help' to display a list of available commands. Mach> EXEC STREAM_CREATE(event_v0, 'insert into tag select ''MTAG_V00'', tm, v0 from plc_tag_table;'); Executed successfully. Elapsed time: 0.011 Mach> EXEC STREAM_CREATE(event_v1, 'insert into tag select ''MTAG_V00'', tm, v1 from plc_tag_table;'); Executed successfully. Elapsed time: 0.006 Mach> EXEC STREAM_CREATE(event_c0, 'insert into tag select ''MTAG_C00'', tm, c0 from plc_tag_table;'); Executed successfully. Elapsed time: 0.010 Mach> EXEC STREAM_CREATE(event_c1, 'insert into tag select ''MTAG_C01'', tm, c1 from plc_tag_table;'); Executed successfully. Elapsed time: 0.006 ..... 생략 .... Mach> EXEC STREAM_CREATE(event_c15, 'insert into tag select ''MTAG_C15'', tm, c15 from plc_tag_table;'); Executed successfully. Elapsed time: 0.006 Mach> EXEC STREAM_START(event_v0); Executed successfully. Elapsed time: 0.012 Mach> EXEC STREAM_START(event_v1); Executed successfully. ..... 생략 .... Mach> EXEC STREAM_START(event_c15); Executed successfully. Elapsed time: 0.012 |
스트림 상태 확인
마크베이스는 내부에서 동작하는 스트림의 상태를 확인할 수 있도록 가상 테이블 v$streams를 지원한다 아래와 같은 질의를 수행함으로써 . 현재 수행 중인 스트림의 개수와 질의, 상태, 에러 메시지 등을 확인할 수 있다.
Code Block |
---|
Mach> desc v$streams; desc v$streams; [ COLUMN ] ---------------------------------------------------------------- NAME TYPE LENGTH ---------------------------------------------------------------- NAME varchar 100 LAST_EX_TIME datetime 31 TABLE_NAME varchar 100 END_RID long 20 STATE varchar 10 QUERY_TXT varchar 2048 ERROR_MSG varchar 2048 Mach>select name, state from v$streams; name state ------------------------------------------------------------------- EVENT_V0 RUNNING EVENT_V1 RUNNING EVENT_C0 RUNNING EVENT_C1 RUNNING EVENT_C2 RUNNING EVENT_C3 RUNNING EVENT_C4 RUNNING EVENT_C5 RUNNING EVENT_C6 RUNNING EVENT_C7 RUNNING EVENT_C8 RUNNING EVENT_C9 RUNNING EVENT_C10 RUNNING EVENT_C11 RUNNING EVENT_C12 RUNNING EVENT_C13 RUNNING EVENT_C14 RUNNING EVENT_C15 RUNNING [18] row(s) selected. Elapsed time: 0.013 Mach> |
위와 같이 스트림이 모두 동작 중임을 알 수 있다.
PLC 데이터 로딩
이제 실제 데이터를 로딩할 차례이다. 여기에서는 앞에서도 마찬가지로 machloader를 통해서 입력하고, TAG 로 입력되는 것을 확인해 본다. 준비된 스크립트 5_plc_tag_load.bat를 수행하면, 이제 데이터를 로딩한다. 로딩 과정에서 다른 창으로 TAG의 데이터를 확인하면 실시간으로 입력이 되는 것을 아래와 같이 확인할 수 있다.
스트림 동작 및 태그 테이블 레코드 개수 증가 확인
로딩 중에 아래와 같은 질의를 수행하면, 스트림이 동작하고 있는 것을 확인할 수 있다. 그리고 end_rid 는 각 스트림이 읽고 있는 소스 테이블 (plc_tag_table)의 위치를 나타내고 있다. 만일 이 값이 해당 소스 테이블이 가진 레코드 개수(2,000,000건)와 동일하면 더는 읽을 것이 없다는 뜻이기도 하다.
Code Block |
---|
Mach> select name, state, end_rid from v$streams; name state end_rid ----------------------------------------------------------------------------------------------------------------------- EVENT_V0 RUNNING 909912 EVENT_V1 RUNNING 1584671 EVENT_C0 RUNNING 1312416 EVENT_C1 RUNNING 1268520 EVENT_C2 RUNNING 1636800 EVENT_C3 RUNNING 1197840 EVENT_C4 RUNNING 622728 EVENT_C5 RUNNING 972780 EVENT_C6 RUNNING 1021512 EVENT_C7 RUNNING 1287474 EVENT_C8 RUNNING 826956 EVENT_C9 RUNNING 1639032 EVENT_C10 RUNNING 725954 EVENT_C11 RUNNING 1511436 EVENT_C12 RUNNING 531079 EVENT_C13 RUNNING 1004400 EVENT_C14 RUNNING 741768 EVENT_C15 RUNNING 746604 [18] row(s) selected. Elapsed time: 0.004 |
또한 에서 태그 테이블을 확인하면 , machsql , 레코드가 증가하는 것을 확인함으로써 실제 스트림이 입력되는 데이터를 성공적으로 태그 테이블에 넣고 있다는 것을 알 수 있다.
Code Block |
---|
# 전체 레코드가 증가하는 것을 확인할 수 있다. Mach> select count(*) from TAG; count(*) ----------------------- 16775979 [1] row(s) selected. Elapsed time: 0.000 Mach> Mach> select count(*) from TAG; count(*) ----------------------- 17609187 [1] row(s) selected. Elapsed time: 0.000 Mach> select count(*) from TAG; count(*) ----------------------- 18238357 [1] row(s) selected. Elapsed time: 0.000 Mach> select count(*) from TAG; count(*) ----------------------- 18718622 [1] row(s) selected. Elapsed time: 0.000 |
입력 완료 시 스트림 상태 확인
만일 스트림이 더 처리할 데이터가 없을 경우에는 아래와 같이 rnd_rid이 더는 증가하지 않는 것을 확인할 수 있다. 아래는 모든 실시간 변환이 완료된 것을 나타낸다.
Code Block |
---|
Mach> select name, state, end_rid from v$streams; name state end_rid ----------------------------------------------------------------------------------------------------------------------- EVENT_V0 RUNNING 2000000 EVENT_V1 RUNNING 2000000 EVENT_C0 RUNNING 2000000 EVENT_C1 RUNNING 2000000 EVENT_C2 RUNNING 2000000 EVENT_C3 RUNNING 2000000 EVENT_C4 RUNNING 2000000 EVENT_C5 RUNNING 2000000 EVENT_C6 RUNNING 2000000 EVENT_C7 RUNNING 2000000 EVENT_C8 RUNNING 2000000 EVENT_C9 RUNNING 2000000 EVENT_C10 RUNNING 2000000 EVENT_C11 RUNNING 2000000 EVENT_C12 RUNNING 2000000 EVENT_C13 RUNNING 2000000 EVENT_C14 RUNNING 2000000 EVENT_C15 RUNNING 2000000 [18] row(s) selected. |
태그 테이블 확인
이제 정말 태그 테이블에 데이터가 모두 들어갔는지 확인해 보면, 아래와 같다.
Code Block |
---|
Mach> select count(*) from TAG; count(*) ----------------------- 36000000 [1] row(s) selected. Elapsed time: 0.001 Mach> select min(time), max(time) from TAG; min(time) max(time) ------------------------------------------------------------------- 2009-01-28 07:03:34 000:000:000 2009-01-28 12:36:58 020:000:000 [1] row(s) selected. Elapsed time: 0.005 Mach> |
태그 테이블에 성공적으로 총 3천 6백만 건의 센서 데이터가 성공적으로 들어가 있음을 확인할 수 있다. 또한, 시간도 2009 년 1월 28일 오전 7시 3 분 34초에서 당일 12시 36분 58 초 20 까지의 범위라는 것을 알 수 있다.
실시간 변환 데이터 입력 및 스트림 처리 여부 확인
그럼 이번에는 실제로 구문으로 insert into PLC 테이블 마지막에 하나의 레코드를 더 넣어서 실제로 TAG 반영되고, 그래프에도 나오는지 확인해 보도록 하자. 아래와 같이 하나의 레코드를 더 입력하였고, 표시가 잘 나게 하기 위해 큰 값 50000을 모든 센서에 넣었다.
Code Block |
---|
Mach> insert into plc_tag_table values(TO_DATE('2009-01-28 12:37:00 000:000:000'), 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000); 1 row(s) inserted. Elapsed time: 0.000 |
그리고, 실제로 스트림이 1건을 처리했는지 아래와 같이 질의를 수행해 보자.
Code Block |
---|
Mach> select name, state, end_rid from v$streams; name state end_rid --------------------------------------------------------------- EVENT_V0 RUNNING 2000001 EVENT_V1 RUNNING 2000001 EVENT_C0 RUNNING 2000001 EVENT_C1 RUNNING 2000001 EVENT_C2 RUNNING 2000001 EVENT_C3 RUNNING 2000001 EVENT_C4 RUNNING 2000001 EVENT_C5 RUNNING 2000001 EVENT_C6 RUNNING 2000001 EVENT_C7 RUNNING 2000001 EVENT_C8 RUNNING 2000001 EVENT_C9 RUNNING 2000001 EVENT_C10 RUNNING 2000001 EVENT_C11 RUNNING 2000001 EVENT_C12 RUNNING 2000001 EVENT_C13 RUNNING 2000001 EVENT_C14 RUNNING 2000001 EVENT_C15 RUNNING 2000001 [18] row(s) selected. Elapsed time: 0.001 Mach> |
각 스트림의 end_rid 가 1 건 늘어 2000001 건이 되어, 실제로 machsql 로 입력된 데이터가 실시간으로 처리된 것을 숫자로 확인할 수 있다.
Tag Analyzer 그래프 확인
Tag Analyzer 에서 입력된 데이터를 볼 수 있는지 확인해 보자. 아래 차트는 데이터 입력 이전의 10 개의 센서 평균이다.
아래는 1건 입력 이후 차트인데, 실제로 그래프가 올라간 것을 확인할 수 있다.
즉, 이는 로그 테이블에 입력된 1건의 데이터가 스트림을 통해 실시간으로 태그 테이블에 반영된 것을 나타내는 것이다.
마무리이 절에서는 마크베이스의 스트림 기능을 활용하여, 로그 테이블에 입력된 데이터를 태그 테이블로 실시간으로 옮기는 것을 해 보았다. 더 빠른 처리를 위해 스트림을 사용하지 않고, 입력 프로그램이 센서로부터 데이터를 읽어, 태그 테이블로 바로 입력하는 방법도 생각해 볼 수 있다. 그러나 본인이 처한 다양한 환경에 맞는 최선의 데이터 입력 방법과 처리 형태를 얼마든지 변형하고 이를 활용할 수 있을 것이다.마치면서이 장에서는 실제 태그 테이블에 대한 로딩과 이에 대한 시각화에 대한 예제를 설명하였다. 비록 이 장에서 JAVA 와 같은 개발 언어를 활용한 실시간 데이터 처리는 없지만, 기본적인 개념을 이해한다면 다양한 언어와의 연동도 쉽게 할 수 있을 것으로 생각된다. 만일 관련된 테스트가 궁금한 독자는 뒷장에서 별도로 소개되는 각종 언어와의 연동을 미리 살펴보도록 하자. 다음 장에서는 센서 데이터 처리를 풍부하게 만들어주는 롤업 기능에 대해서 알아보도록 하겠다차트인데, 실제로 그래프가 올라간 것을 확인할 수 있다.
즉, 이는 로그 테이블에 입력된 1건의 데이터가 스트림을 통해 실시간으로 태그 테이블에 반영된 것을 나타내는 것이다.