마크베이스 사용방법


마크베이스 5.0 : Tutorial 3 (Real Time Stream Insert : Many Sensors)

작성자
machbase
작성일
2018-08-20 12:31
조회
92

마크베이스 5.0 센서 데이터 : 세 번째 Tutorial


다수(18개)의 센서 데이터를 로딩하면서 백그라운드의 마크베이스 STREAM 기능을 활용하여 실시간으로 TAG 테이블에도 동시에 입력하는 방법을 수행해 본다.


세 번째 튜토리얼 수행하기


튜토리얼 개요


이 튜토리얼의 의미는 실제 센서를 통해서 PLC 형태로 마크베이스에 전달되는 경우 이 데이터를 STREAM 기능을 활용하여 TAG 테이블로 실시간으로 반영할 수 있다는 것이다.


첫 번째 튜토리얼에서 한 바와 같이 Tag 테이블의 입력 형태로 파일을 만들지 않고도 실시간으로 변환, 데이터를 넣을 수 있다는 것이 큰 의미가 있다.


그러나 이러한 STREAM 의 갯수가 많아지면 그만큼 시스템의 부하가 커지기 때문에 시스템 성능과 적절하게 조화를 이룰 수 있도록 한다.



테스트 디렉토리 확인


두번째 튜토리얼과 거의 유사하지만,  stream 관련 파일이 하나 추가된 것을 볼 수 있다.


Host:~/work/MyTutorial/edu_3_plc_stream$ ls -al
합계 363700
drwxrwxr-x 2 sjkim2 sjkim2 4096 8월 15 12:54 .
drwxrwxr-x 6 sjkim2 sjkim2 4096 8월 14 18:35 ..
-rw-rw-r-- 1 sjkim2 sjkim2 107 8월 14 18:35 1_create_tag.sql
-rw-rw-r-- 1 sjkim2 sjkim2 32 8월 14 18:35 2_load_meta.sh
-rw-rw-r-- 1 sjkim2 sjkim2 162 8월 14 18:35 2_tag_meta.csv
-rw-rw-r-- 1 sjkim2 sjkim2 263 8월 14 18:35 3_create_plc_tag_table.sql
-rw-rw-r-- 1 sjkim2 sjkim2 2313 8월 15 16:02 4_plc_stream_tag.sql <=== 추가된 스트림 파일
-rw-rw-r-- 1 sjkim2 sjkim2 372389876 8월 14 18:35 5_plc_tag.csv
-rw-rw-r-- 1 sjkim2 sjkim2 93 8월 15 12:54 5_plc_tag_load.sh
Host:~/work/MyTutorial/edu_3_plc_stream$

태그 테이블 생성 & 태그 메타 로딩 & PLC 테이블 생성


두번째 튜토리얼과 완전히  동일하다. 자세한 설명은 생략하도록 하겠다.


## 1. 태그 테이블 생성 
Mach> create tagdata table tag (name varchar(32) primary key, time datetime basetime, value double summarized);
Executed successfully.
Elapsed time: 3.667

## 2. 태그 메타 로딩
Host:~/work/MyTutorial/edu_3_plc_stream$ sh 2_load_meta.sh (혹은 tagmetaimport -d 2_tag_meta.csv)
Import time : 0 hour 0 min 0.05 sec
Load success count : 18
Load fail count : 0

## 3. PLC 로그 테이블 생성
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.055

스트림 동작  시키기


구동 파일 준비


이제 PLC 데이터가 입력되는 중에 TAG 테이블로 센서 데이터를 입력하는 스트림을 동작시켜 보자.


아래의 파일 4_plc_stream_tag.sql 을 수행하면, 18개의 스트림 객체가 마크베이스에서 동작한다.


plc_tag_table 테이블에 데이터가 입력되는 순간 각 스트림이 동작하면서 자신의 데이터를 TAG 테이블에 입력한다.


# 스트림 객체를 생성한다. 아직 동작중은 아님.
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 테이블에 데이터가 입력되는 순간 TAG 테이블로 데이터를 입력한다.
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);

스트림 생성 및 수행


Host:~/work/MyTutorial/edu_3_plc_stream$ machsql -f 4_plc_stream_tag.sql
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를 지원한다.


아래와 같은 질의를 수행함으로써 현재 수행 중인 스트림의 개수와 질의, 상태, 에러 메시지 등을 확인할 수 있다.


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>
Mach> select state, name, table_name, query_txt from v$streams;
STATE NAME TABLE_NAME QUERY_TXT
------------------------------------------------------------------------------------------------
RUNNING EVENT_V0 PLC_TAG_TABLE insert into tag select 'MTAG_V00', tm, v0 from plc_tag_table;
RUNNING EVENT_V1 PLC_TAG_TABLE insert into tag select 'MTAG_V00', tm, v1 from plc_tag_table;
RUNNING EVENT_C0 PLC_TAG_TABLE insert into tag select 'MTAG_C00', tm, c0 from plc_tag_table;
RUNNING EVENT_C1 PLC_TAG_TABLE insert into tag select 'MTAG_C01', tm, c1 from plc_tag_table;
RUNNING EVENT_C2 PLC_TAG_TABLE insert into tag select 'MTAG_C02', tm, c2 from plc_tag_table;
RUNNING EVENT_C3 PLC_TAG_TABLE insert into tag select 'MTAG_C03', tm, c3 from plc_tag_table;
RUNNING EVENT_C4 PLC_TAG_TABLE insert into tag select 'MTAG_C04', tm, c4 from plc_tag_table;
RUNNING EVENT_C5 PLC_TAG_TABLE insert into tag select 'MTAG_C05', tm, c5 from plc_tag_table;
RUNNING EVENT_C6 PLC_TAG_TABLE insert into tag select 'MTAG_C06', tm, c6 from plc_tag_table;
RUNNING EVENT_C7 PLC_TAG_TABLE insert into tag select 'MTAG_C07', tm, c7 from plc_tag_table;
RUNNING EVENT_C8 PLC_TAG_TABLE insert into tag select 'MTAG_C08', tm, c8 from plc_tag_table;
RUNNING EVENT_C9 PLC_TAG_TABLE insert into tag select 'MTAG_C09', tm, c9 from plc_tag_table;
RUNNING EVENT_C10 PLC_TAG_TABLE insert into tag select 'MTAG_C10', tm, c10 from plc_tag_table;
RUNNING EVENT_C11 PLC_TAG_TABLE insert into tag select 'MTAG_C11', tm, c11 from plc_tag_table;
RUNNING EVENT_C12 PLC_TAG_TABLE insert into tag select 'MTAG_C12', tm, c12 from plc_tag_table;
RUNNING EVENT_C13 PLC_TAG_TABLE insert into tag select 'MTAG_C13', tm, c13 from plc_tag_table;
RUNNING EVENT_C14 PLC_TAG_TABLE insert into tag select 'MTAG_C14', tm, c14 from plc_tag_table;
RUNNING EVENT_C15 PLC_TAG_TABLE insert into tag select 'MTAG_C15', tm, c15 from plc_tag_table;
[18] row(s) selected. Elapsed time: 0.002
Mach>

위와 같이 스트림이 모두 동작 중임을 알 수 있다.


PLC 데이터 로딩


이제 데이터를 로딩할 차례이다.


machloader나 collector, 또는 ODBC, JDBC, machsql, 어느것으로 입력을 하든 무관하게 입력된 데이터를 자동적으로 TAG 테이블로 변환되어 입력이 될 것이다.


이번 튜토리얼에서는 두 번째와 마찬가지로 machloader를 통해서 입력하고, TAG로 입력되는 것을 확인해 보자.


준비된 스크립트 5_plc_tag_load.sh를 수행하면, 이제 데이터를 로딩한다.


로딩과정에서 다른 창으로 TAG의 데이터를 확인하면 실시간으로 입력이 되는 것을 아래와 같이 확인할 수 있다.


TAG 테이블 레코드 개수 증가 확인


# 전체 레코드가 증가하는 것을 확인할 수 있다.
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

스트림 동작 확인


아래와 같이 스트림이 동작하고 있는 것을 확인할 수 있다.


그리고 end_rid는 각 스트림이 읽고 있는 소스 테이블 (plc_tag_table)의 위치를 나타내고 있다.


만일 이 값이  해당 소스 테이블이 가진 레코드 개수(2,000,000건) 와 동일하면 더 이상 읽을 것이 없다는 뜻이기도 하다.


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

입력 완료시 스트림 상태 확인


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.

위와 같이 모든 레코드를 처리한 것을 확인할 수 있다.


Tag 테이블 확인


레코드 개수 검증


이제 정말 TAG 테이블에 데이터가 모두 들어 갔는지 확인해 보면 아래와 같다.


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>

Tag 테이블에 성공적으로 총 3천 6백만건의 센서 데이터가 성공적으로 들어가 있음을 확인할 수 있다.


또한, 시간도 2009년 1월 28일 오전 7시 3분 34초에서 당일 12시 36분 58초 20 까지의 범위라는 것을 알 수 있다.


PLC 테이블 레코드 입력 및 스트림 검증


그럼 이번에는 실제로 insert into 구문으로 PLC 테이블 마지막에 하나의 레코드를 더 넣어서 실제로  TAG 반영되고, 그래프에도 나오는지 확인해 보도록 하자.


아래와 같이 하나의 레코드를 더 입력하였고, 표시가 잘 나게 하기 위해 큰 값 50000을 모든 센서에게 넣었다.


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

변경 사항에 대한 스트림 처리 확인


아래와 같이 각 스트림의 end_rid가 1건 늘어 2000001 건이 된 것을 확인할 수 있다.


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>

Tag Analyzer 그래프 확인


이제 위의 데이터를 그래프로 확인해 보면 아래와 같다.



가장 우측에 그래프가 튀어 올라온 것이 보이며, 이는 PLC에 입력된 데이터가 실제 Tag 테이블에 반영된 것을 나타낸다.


 


http://www.machbase.com/download


Contact the Machbase team with your questions!
info@machbase.com

전체 24
번호 제목 작성자 작성일 추천 조회
24
마크베이스 V5 : Tutorial 6 (RestAPI with curl)
machbase | 2018.09.18 | 추천 0 | 조회 51
machbase 2018.09.18 0 51
23
마크베이스(Machbase) Tag Analyzer 사용법
machbase | 2018.08.27 | 추천 1 | 조회 114
machbase 2018.08.27 1 114
22
마크베이스 5.0 : Tutorial 4 (실제 데이터를 통한 Tag Analyzer 기초 활용)
machbase | 2018.08.27 | 추천 1 | 조회 89
machbase 2018.08.27 1 89
21
마크베이스 5.0 : Tutorial 5 (Tag Table with RestAPI)
machbase | 2018.08.24 | 추천 0 | 조회 100
machbase 2018.08.24 0 100
20
Machbase 5.0 : 센서데이터 홍수의 유일한 해결책
machbase | 2018.08.21 | 추천 1 | 조회 213
machbase 2018.08.21 1 213
19
마크베이스 5.0 : Tutorial 3 (Real Time Stream Insert : Many Sensors)
machbase | 2018.08.20 | 추천 0 | 조회 92
machbase 2018.08.20 0 92
18
마크베이스 5.0 : Tutorial 2 (Batch Loading : Many Sensors)
machbase | 2018.08.17 | 추천 0 | 조회 76
machbase 2018.08.17 0 76
17
마크베이스 5.0 : Tutorial 1 (Quick Start)
machbase | 2018.08.17 | 추천 0 | 조회 156
machbase 2018.08.17 0 156
16
마크베이스 5.0
machbase | 2018.08.16 | 추천 0 | 조회 246
machbase 2018.08.16 0 246
15
Machbase 5.0 TAG Table 사용법
machbase | 2018.08.10 | 추천 1 | 조회 149
machbase 2018.08.10 1 149