티스토리 뷰

NI DIAdem을 통해서 MySQL 서버의 데이터를 가지고 오는 방법은 없을까요? 기존의 DIAdem의 기능으로는 MySQL에 접속할 수 있는 방법은 없습니다. 하지만 DIAdem은 VBScript를 통해서 추가적인 기능을 구현할 수 있죠. VBScript를 활용한다면 충분히 DIAdem에서도 Database에 접속하여 데이터를 가져올 수 있습니다. 



그럼 DIAdem에서 Database에 접속하기 위해 필요한 내용을 확인해 볼까 합니다.


DIAdem에서 Database에 접속하기 위해서는 ADO(ActiveX Data Object)를 사용해야 합니다. ADO는 Database를 다루는 객체입니다. 이는 마이크로소프트 사에서 제공하는 데이터 접근 기술의 하나로, OLEDB 기반의 인터페이스 입니다. OLEDB 보다 상위 인터페이스 이므로 간단한 객체 모형을 이용하여 사용자는 Database에 접근을 할 수 있습니다. ADO의 장점은 속도가 빠르고 VB, VC++, VB 스크립트, 자바 등 다양한 언어를 사용하여 호출될 수 있어 사용할 수 있습니다. 


그럼 OLE DB(OLE For Database)는 무엇일까요? 

OLE는 마이크로소프트 사의 UDA(Universal Data Access) 전략에 핵심이 되는 아키텍쳐로 COM 기반의 저 수준 프로그래밍 인터페이스입니다. MS가 COM기술을 활용하여 이를 데이터베이스에 접목하였습니다. 따라서 OLE는 COM 개체의 집합체라고 볼 수 있습니다. OLE DB를 통해서 사용자는 다수의 데이터베이스에 접속을 할 수 있습니다. 


이해하기 어렵다면, MS에서 만든 Database에 접속할 수 있는 라이브러리라고 생각을 하면 됩니다. 아래의 그림은 Database를 사용하는데 활용되는 ADO, OLEDB의 아키텍처 그림입니다. 




ADO를 활용하여 프로그래밍을 하기 위해서는 마이크로소프트사에서 제공하는 ADO 문서를 통해서 확인할 수 있습니다. 문서의 링크는아래와 같습니다. 



ADO의 계층 구조는 아래와 같습니다. Connection, Command, Recordset, Record, Stream 기반의 프로그래밍을 할 수 있습니다. 



Database에 접속을 하여 데이터를 가져오기 위해서는 다양한 방법을 사용할 수 있습니다. 연결 및 데이터 가져오는 방법은 아래와 같습니다. 


연결 개체 ADO 내에서 열려면 여러 가지가 있습니다.

  • 유효한 연결 ConnectionString 속성을 설정하면 문자열 및 Open() 메서드를 호출하는. 이 연결 문자열은 공급자에 따라 다릅니다.
  • 올바른 연결 문자열을 Open() 메서드의 첫 번째 인수를 전달하여.
  • 유효한 명령 전달하여 레코드 집합의 Open 메서드의 첫 번째 인수를 개체입니다.
  • ODBC 데이터 원본 이름 및 필요에 따라 사용자 ID 및 암호를 연결 개체 Open() 메서드에 전달합니다.


ADO 내에서 Recordset 개체 열려면 세 가지가 있습니다.

  • 해당 Connection.Execute() 해제 Recordset 열어 메서드.
  • 해당 Command.Execute() 해제 Recordset 열어 메서드.
  • 연결 또는 명령 개체 제외하고 Recordset 개체를 열고 Recordset.Open() 메서드의 두 번째 인수를 올바른 연결 문자열을 전달합니다.

[참조 : 마이크로 소프트 서포트 페이지]


아래의 코드는 ADO 객체를 이용하여 DB에 접속한뒤, Execute 함수를 통해서 쿼리를 날리고, 이에 대한 값을 받아와 DIAdem의 그룹과 채널을 생성하는 결과입니다. 처리되는 알고리즘의 그림은 아래와 같습니다. 




관련 코드는 아래와 같습니다. 주의를 해야 하는 부분은 conn.ConnectionString 부분에 자신의 DSN을 입력해야 합니다. 


'-------------------------------------------------------------------------------

'-- VBS script file

'-- Created on 01/28/2015 21:09:52

'-- Author: 

'-- Comment: 

'-------------------------------------------------------------------------------

Option Explicit  'Forces the explicit declaration of all the variables in a script.


' 컬럼 이름 배열

Dim ColumnNameArray

ColumnNameArray = Array("Motor", "Bearing1", "Bearing2" , "ShaftX", "ShaftY")


Dim SQL_DSNName

Dim initValue

Dim tableName


' Connection개체 생성

Dim conn : Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = "DSN="&"insight" 

conn.Open


' 테이블 이름 가져오기

If (conn.errors.count = 0) Then

Dim TablesSchema : Set TablesSchema = Conn.OpenSchema(20)

initValue = 0

Do While Not TablesSchema.EOF

tableName = TablesSchema("TABLE_NAME")

    

'cbTables.Items.Add tableName,i

initValue = initValue + 1

TablesSchema.MoveNext

Loop


End If


' 테이블의 행의 갯수 가져오기

Dim objRecordSet

Set objRecordSet = conn.Execute("Select count(Date) from " + tableName)

Dim count : count = cint(objRecordSet(0).value)


' Select 구문 실행

Set objRecordSet = conn.Execute("Select * from " + tableName)


Data.Root.Clear

Call GroupCreate("Monitoring",1) 

Dim forIndex, forJIndex

for forIndex = 0 to 4

  Call ChnAlloc(ColumnNameArray(forIndex), count, 1,DataTypeFloat64,"Text")

Next


' 채널에 읽어온 값 할당

For forIndex = 1 to count

  For forJIndex = 1 to 5

    CHD(forIndex,"/" + ColumnNameArray(forJIndex-1)) = objRecordSet(forJIndex).Value

  Next

  Call objRecordSet.MoveNext

Next


' 접속 종료

conn.Close


이상 DIAdem에서 MySQL에 접근하여 데이터를 가져오는 방법에 대해서 알아보았습니다.


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.


댓글