90 likes | 355 Views
GLOFAView 에서의 EXCEL 리포트. 자동화기기 마케팅팀 황의완 / 김남용. .GLOFAVIew 에서의 EXCEL 리포트. GLOFAView 에서는 저장된 데이터 ( 아카이브 태그 ) 에 대해 다양한 형태의 리포트를 출력해 볼 수 있습니다 . Report Designer 를 통해 리포트 폼을 만들고 원하는 시간의 데이터를 자동 및 수동으로 출력해 볼 수 있습니다 . 또한 , 스크립트를 이용하여 원하는 데이터를 원하는 형태의 Excel 리포트로 출력해 볼 수 있습니다 .
E N D
GLOFAView에서의 EXCEL 리포트 자동화기기 마케팅팀 황의완/김남용
.GLOFAVIew에서의 EXCEL 리포트 GLOFAView에서는 저장된 데이터(아카이브 태그)에 대해 다양한 형태의 리포트를 출력해 볼 수 있습니다. Report Designer를 통해 리포트 폼을 만들고 원하는 시간의 데이터를 자동 및 수동으로 출력해 볼 수 있습니다. 또한, 스크립트를 이용하여 원하는 데이터를 원하는 형태의 Excel 리포트로 출력해 볼 수 있습니다. GLOFAView에서 리포트를 Excel로 출력하기 위해서는 C와 Visual Basic 스크립트를 사용해야만 합니다.
.GLOFAVIew에서의 EXCEL 리포트 원하는 리포트 형태를 Excel 파일로 먼저 구성합니다. Excel 리포트는 MS-SQL 데이터 베이스에 원하는 시간의 데이터를 요구하여 응답 온 데이터를 미리 작성한 Excel Sheet 폼의 각 셀에 기록해 줌으로써 완성됩니다. • 리포트를 출력하기 위해서는 먼저 MS-SQL에 저장된 • 프로젝트의 DSN (Data Source Name)과 리포트에 • 사용될 태그명, 시작시간, 종료시간이 필요합니다. • “ProjectDSN”, “begintime”, “endtime”이라는 이름으로 문자열 태그를 내부태그로 추가합니다. • 시작시간(begintime)과 종료시간(endtime)은 I/O 필드를 사용하여 직접 입력합니다. • Graphic Designer를 통해 새로운 그림 파일을 하나 추가합니다. • Graphic Designer의 메뉴 중 [보기]->[속성]을 선택합니다. • 이벤트 속성 중 [기타]->[그림열기]에서 오른쪽 마우스를 눌러 [C-동작…]을 선택합니다.
.GLOFAVIew에서의 EXCEL 리포트 C 스크립트 입력 창에 아래의 코드를 입력하여 DSN을 얻습니다. (전역 스크립트에 추가해도 됨) #include "apdefap.h" void OnOpenPicture(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { CMN_ERROR Error; DM_PROJECT_INFO Info; DWORD dwSize; BOOL ret; TCHAR szProject[_MAX_PATH + 1]; TCHAR szD[_MAX_PATH + 1]; dwSize=128; if(!DMGetRuntimeProject(szProject, dwSize, &Error)) { printf("\r\n ERROR!!"); } else { printf("\r\n %s", szProject); SetTagChar("ProjectPath",szProject); //Return-Type: BOOL ret = DMGetProjectInformation(szProject, &Info, &Error); if(ret == 1) { sprintf(szD,"%sR" , Info.szDSNName); SetTagChar("ProjectDSN",szD); } } } 프로젝트의 DSN을 얻는다.
.GLOFAVIew에서의 EXCEL 리포트 버튼의 이벤트를 통해 EXCEL 리포트를 출력하는 VB 동작을 스크립트로 작성합니다. Dim sPro, sDsn, sSer,sCon, sSql Dim sVid, sVal, lRet, sRel Dim V,Sum,Avg,Std,i,Min,Max,k,j,btime,etime,count,c,temp Dim conn, oRs, oCom, oList, oItem Dim m,n,s,nRec,nn Dim a(3) Dim strSql, stime, sStart, sStop Dim objExcelApp Set objExcelApp = CreateObject("Excel.Application") objExcelApp.Visible = True objExcelApp.Workbooks.Open "C:\REPORT.xls" a(1)="'ProcessValueArchive\D000'" a(2)="'ProcessValueArchive\D001'" a(3)="'ProcessValueArchive\D002'" btime =Left(CStr(HMIRuntime.Tags("begintime").Read),10) etime =Left(CStr(HMIRuntime.Tags("endtime").Read),10) sDsn = HMIRuntime.Tags("ProjectDSN").Read sPro = "Provider=WinCCOLEDBProvider.1;" sDsn = "Catalog=" + sDsn + ";" sSer = "Data Source=" + sSer + ".\WinCC" sCon = sPro + sDsn + sSer count = 5 nRec = 24 리포트에 출력할 아카이브 태그명
.GLOFAVIew에서의 EXCEL 리포트 With objExcelApp .Worksheets("Sheet1").Select .Worksheets("sheet1").Range("A1").select .Worksheets("sheet1").Range("A5")=“TIME" .Worksheets("sheet1").Range("A3")=btime .Worksheets("sheet1").Range("A4")=etime End With stime = btime & " 00:00:00" etime = btime & " 23:59:00" sStart = SetLocalTime(stime) sStop = SetLocalTime(etime) For k=1 To 3 strSql="TAG:R," & a(k)& ",'" & sStart & ",'" & sStop & "'" sSql = strSql Set conn = CreateObject("ADODB.Connection") conn.ConnectionString = sCon conn.CursorLocation = 3 'adUseClient conn.Open Set oRs = CreateObject("ADODB.Recordset") Set oCom = CreateObject("ADODB.Command") oCom.CommandType = 1 ' adCmdText = 1 Set oCom.ActiveConnection = conn oCom.CommandText = sSql 'lRet = MsgBox("Opened with " & vbCr & sCon & vbCr & sSql & vbCr, vbOKCancel) ' If lRet <> 1 Then Exit Sub 리포트로 출력할 데이터의 시작시간과 끝시간 설정
.GLOFAVIew에서의 EXCEL 리포트 On Error Resume Next Set oRs = oCom.Execute n = 0 Do While Not oRs.EOF n=n+1 If( n <= nRec ) Then objExcelApp.Cells(5, k+1).Value=b(k) objExcelApp.Cells(count+n,1).Value= Left(CStr(GetLocalTime(oRs.Fields(1).Value)),18) objExcelApp.Cells(count+n,k+1).Value=FormatNumber((oRs.Fields(2).Value),1) End If oRs.MoveNext Loop Next Set oRs = Nothing conn.Close Set conn = Nothing objExcelApp.Application.DisplayAlerts = False objExcelApp.ActiveWorkbook.SaveAs "c:\report" & btime & ".xls" objExcelApp.Application.DisplayAlerts = True objExcelApp.Workbooks.Close objExcelApp.Quit Set objExcelApp = Nothing EXCEL Sheet에 데이터 입력하는 부분
.GLOFAVIew에서의 EXCEL 리포트 GLOFAView에서는 데이터 저장을 표준 시간대(GMT/UTC)에 맞추어 저장하기 때문에 우리나라의 시간대와 차이가 있습니다. 따라서 원하는 시간의 데이터를 얻고자 한다면 시간대를 계산하여 데이터를 요구해야 합니다. 요구 시에는 9시간을 빼고, 기록 시에는 9시간을 더하여야 하는 번거로움이 있습니다만, 반드시 처리해 주어야 정확한 데이터를 얻을 수 있습니다. Function GetLocalTime(Date) ‘시간 얻어오는 함수 Dim dt,result,ct dt = CDate("9:00:00") ct = CDate(Date) result = ct + dt GetLocalTime = result End Function Function SetLocalTime(strTime) ‘시간 설정하는 함수 Dim dt,st,ct, result Dim sYear, sMonth, sDay, sH, sM, sS dt = CDate("9:00:00") st = CDate(strTime) ct = st - dt sYear = CStr(Year(ct)) sMonth = CStr(Month(ct)) sDay = CStr(Day(ct)) sH = CStr(Hour(ct)) sM = CStr(Minute(ct)) sS = CStr(Second(ct)) result = sYear & "-" & sMonth & "-" & sDay & " " & sH & ":" & sM '& ":" & sS & ".000" SetLocalTime = result End Function VB Script Editor에서 함수 작성
.GLOFAVIew에서의 EXCEL 리포트 이상과 같이 스크립트를 작성하여 리포트로 작성하고자 하는 시작 시간과 종료 시간을 입력하여 버튼을 클릭하면 미리 작성된 Excel 보고서 폼에 데이터가 기록되어 출력됩니다. 자동 출력이 필요한 리포트(일보/월보)의 경우는 전역 스크립트를 이용하여 앞장에 사용된 스크립트를 VB Script Editor에 작성하고, 트리거 조건을 매일 또는 매월로 지정해 주면 됩니다.