Posting

Machbase의 최신 소식을 지금 만나보세요

[MACHBASE 기초] TAG TABLE 03 – STREAM

이번 포스트에서도 TAG TABLE로 다수(18개)의 센서 데이터를 처리하는 방법에 대해서 소개해 드리겠습니다. 이번에는 저번에 소개드린 BULK 처리와 다르게 마크베이스의 STREAM 기능을 활용하여 실시간으로 TAG 테이블에 전송해 보겠습니다.

1. 개요

STREAM 기능을 사용하면 마크베이스의 로그 테이블에 PLC 형태의 데이터가 도착함과 동시에 TAG 테이블로 실시간 변환이 가능합니다. 즉, BULK입력과 마찬가지로 TAG 테이블을 직접 사용하지 않고도 실시간 입력과 변환이 가능합니다. 하지만 STREAM의 갯수가 많아지면 그만큼 시스템의 부하가 커지기 때문에 시스템 성능을 고려하여 적절하게 사용해야 합니다.

2. 실습

2-1. 자료 확인

이번 포스트에서 사용되는 파일들 또한 두번째 튜토리얼과 거이 중복됩니다. 다만, 4_plc_stream_tag.sql라는  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

2-2. 테이블 생성

태그 테이블 생성, 태그 메타 로딩, 로그 테이블 생성 모두 두번째 튜토리얼과 완전히  동일합니다. 자세한 설명은 생략하도록 하겠습니다.

## 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

2-3. 스트림 구동

이제 STREAM을 사용하여 PLC 데이터가 입력되는 중에 TAG 테이블로 센서 데이터를 입력되도록 만들어 보겠습니다. 4_plc_stream_tag.sql 파일에는 스트림 객체 생성과 동작에 필요한 명령어가 저장되어 있습니다.

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_V01'', 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;');

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);

SELECT * from v$streams;
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_V01'', 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;');

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);

SELECT * from v$streams;

 스크립트는 스트림 객체 생성과 스트림 동작 명령어로 구분되어 있는 것을 확인하실 수 있습니다. EXEC STREAM_CREATE 명령어로 STREAM의 명칭과 실행될 SQL명령을 지정합니다. BULK 입력 때 사용했던 INSERT INTO 구문을 동일하게 적용하였습니다.

# 스트림 객체를 생성한다. 아직 동작중은 아님.
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);

이제 machsql로 4_plc_stream_tag.sql 파일을 실행하겠습니다. STREAM 생성과 구동이 성공적으로 끝나면 이제 부터 plc_tag_table 테이블에 데이터가 입력되는 순간 각 스트림이 동작하면서 자신의 데이터를 TAG 테이블에 입력합니다.

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

2-4. 스트림 상태 확인

마크베이스는 내부에서 동작하는 스트림의 상태를 확인할 수 있도록 가상 테이블 v$streams를 지원합니다. 아래와 같은 질의를 통해 현재 수행 중인 스트림의 개수와 질의, 상태, 에러 메시지 등을 확인할 수 있습니다.

Mach> desc v$streams;
[ COLUMN ]
----------------------------------------------------------------------------------------------------
NAME                                                        NULL?    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
FREQUENCY                                                            ulong               20

아래와 같이 스트림이 모두 동작(RUNNING) 중임을 확인하실 수 있습니다.

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

2-5. PLC 데이터 로딩

이제 PLC데이터를 로딩해 보겠습니다. 참고로 PLC_TAG_TABLE에는 아직 아무런 데이터도 입력되어 있지 않습니다.

Mach> select count(*) from plc_tag_table;
count(*)
-----------------------
0
[1] row(s) selected.

STREAM을 사용하면 machloader나 collector, 또는 ODBC, JDBC, machsql, 어떤 유틸리티를 사용하여 데이터를 입력하더라도 무관하게 자동적으로 TAG 테이블로 변환되어 입력이 될 것입니다. 이번 튜토리얼에서는 두 번째와 마찬가지로 machloader를 통해서 입력하고, TAG 테이블로 자동 입력되는 것을 확인해 보겠습니다. machloader 실행 스크립트는 5_plc_tag_load.sh에 저장되어 있습니다.

$ cat 5_plc_tag_load.sh

machloader  -t plc_tag_table -i -d 5_plc_tag.csv -F "tm YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn"

실행과 동시에 데이터가 로딩됩니다.

$ sh 5_plc_tag_load.sh
-----------------------------------------------------------------
     Machbase Data Import/Export Utility.
     Release Version 6.1.11.official
     Copyright 2014, MACHBASE Corporation or its subsidiaries.
     All Rights Reserved.
-----------------------------------------------------------------
NLS            : US7ASCII            EXECUTE MODE   : IMPORT
TARGET TABLE   : plc_tag_table       DATA FILE      : 5_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
                                               80000                    0

로딩과정에서 다른 창에서 TAG 테이블을 연속으로 확인하면 실시간으로 데이터가 입력이 되는 것을 확인할 수 있습니다.

# 전체 레코드가 증가하는 것을 확인할 수 있다.
Mach> select count(*) from TAG;
count(*)
-----------------------
16775979
[1] row(s) selected.
Elapsed time: 0.000
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

2-6. STREAM 동작 확인

아래와 같이 스트림이 동작하고 있는 것을 확인할 수 있습니다. end_rid는 각 스트림이 읽고 있는 소스 테이블 (plc_tag_table)의 위치를 나타냅니다.

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

end_rid가 아래와 같이 해당 소스 테이블이 가진 레코드 개수(2,000,000건) 와 동일하면 더 이상 읽을 것이 없다는 뜻입니다.

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테이블에 데이터가 입력되어 있다면 STREAM으로 PLC_TAG_TABLE의 데이터가 실시간으로 입력된 것입니다. Tag 테이블에 성공적으로 총 3천 6백만건의 센서 데이터가 성공적으로 들어가 있습니다.

Mach> select count(*) from TAG;
count(*)
-----------------------
36000000
[1] row(s) selected.
Elapsed time: 0.001

입력된 데이터들의 시간 범위는 2009년 1월 28일 오전 7시 3분 34초에서 당일 12시 36분 58초 20 까지입니다.

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

2-7. 데이터 추가

그럼 이번에는 실제로 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

PLC_TAG_TABLE에 레코드 하나를 더 추가한 순간 아래와 같이 각 스트림의 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

3. Tag Analyzer 그래프

위에서 STREAM으로 실시간 입력된 데이터들의 그래프를 Tag Analyzer로 확인해 보겠습니다. 마지막으로 50000을 넣었기 때문에 그래프의 가장 우측이 튀어 올라와 있습니다. 

4. 맺음말

이렇게 STREAM 기능으로 PLC에 입력되는 센서 데이터가 Tag 테이블로 실시간  저장되는 것을 알아봤습니다.

연관 포스트

C언어로 Binary data를 Machbase에 넣기

1.개요 Data를 다루다 보면 numeric, varchar 형 데이터뿐만 아니라 JPG, PNG, MP3와 같은 Binary data도 database에 저장해야 할 때가 존재한다. 그러나 일반 data들과는 달리 Binary

[MACHBASE 연동] Android studio에서 JDBC 연결하기

마크베이스 기술지원본부 이현민 1. 개요 수많은 데이터들이 많은 환경에서 생성되고 있는 오늘날, 우리 현대인들의 동반자인 스마트폰 또한 데이터생성의 주체로써 또는 전달자로서 알게 모르게 그 구실을