[SCADA] [스크립트] 보고서 기능과 같은 엑셀파일 쓰기 및 출력 방법을 알고싶습니다
2014.07.18

안녕하세요.

CIMON입니다.

 

보고서 기능처럼 엑셀 파일에 데이터를 쓰기 및 출력하고자 할 때, 다음 예제에서 제시되는 스크립트를 통해 기능을 설정할 수 있습니다.

 

[적용 방법]

1. 데이터 베이스에서 보고서 데이터로 등록할 태그를 생성합니다.

값1, 값2, 값3은 ‘ANA1’, ‘ANA2’,  ‘ANA 3’ 태그로 등록합니다.

쓰기 신호는 ‘SIN’ 태그로 등록합니다.

제품코드는 ‘제품코드’ 태그, 제품명은 ‘제품명’ 태그로 등록합니다.

 

2. 사전에 설정하여야 할 내용은 다음과 같습니다.

*모든 경로는 ‘C:\보고서’입니다. 엑셀 파일을 출력하기 전에 폴더를 만들어 주시거나, 스크립트 내에 입력된 경로들을 동일하게 변경해 주시기 바랍니다.

*보고서 폴더 내에 Test.xls라는 양식 파일이 존재해야 합니다.

*쓰기 신호(‘SIN’ 태그)가 1일 때 보고서 실행을 하면 현재 태그 값이 엑셀에 입력됩니다. 저장 형식은 ‘제품코드-금일 날짜’입니다.

* 제품 코드가 다르거나 날짜가 다를 경우 새로운 파일을 생성하게 됩니다.

* 생성된 파일은 코드 별 날짜 별로 저장이 되기 때문에 금일의 날짜를 기준으로 3일 이전의 파일들은 자동적으로 삭제됩니다.

*엑셀 파일을 출력하고자 할 때, ‘파일 불러오기’ 버튼을 눌러 저장 폴더의 목록을 불러와 파일 선택 후, ‘인쇄’ 버튼을 눌러 출력할 수 있습니다.

 

3. [도구]-[스크립트]에 진입하여 다음과 같이 메인 스크립트를 작성합니다.

Sub Main()

While 1

SetTagVal”ANA1″,Random(0,100)

SetTagVal”ANA2″,Random(0,100)

SetTagVal”ANA3″,Random(0,100)   ‘테스트임으로 각 태그의 값을 랜덤으로 받습니다.

sleep(1000)

Wend

End Sub

===========================================================

아래 그림과 같이 스크립트를 등록합니다.

 

4. 각 버튼 오브젝트를 다음과 같이 생성합니다.

RUN 버튼을 등록하고, 명령식 동작으로 Runscript(“Scr”)을 입력합니다.

RUN 버튼으로 구동할 스크립트는 다음과 같이 작성합니다.

 

Sub Scr()

Dim DelFileName(2)

‘신호태그를 불러와 신호 태그가 1이 됐을 경우만 스크립트를 실행한다.

WT = GetTagVal(“SIN”)

Code$ = GetTagVal(“제품코드”)

If WT = 1 Then

‘오늘 부터 3일치 이후의 같은 코드의 파일을 삭제 한다.

For i = 0 to 2

TStr$ = ReportTimeStr(“-” & i+3 & “일”,14)

DelFileName(i) = Left(TStr$,4) & Mid(TStr$,6,2) & Right(TStr$,2)

FileDel$ = “C:\보고서” & Code$ & “-” & DelFileName(i) & “.xls”

If FileExists(FileDel$) Then Kill FileDel$

Next i

‘엑셀파일 경로

FileName$ = “C:\보고서” & Code$ & “-” & TimeStr(50) & TimeStr(51)& TimeStr(52) & “.xls” ‘생성될 파일

FileOld$ = “C:\보고서\Test.xls” ‘양식 파일

If FileExists(FileName$) Then ‘동일한 파일이있면 파일에 계속 쓴다.

Else

FileCopy FileOld$, FileName$ ‘없으면 양식 파일에서 복사해 새로운 파일을 만듬

End If

Set ExcelApp = CreateObject(“Excel.Application”)

Set ExcelFile = ExcelApp.Workbooks.Open(FileName$)

Set ws=ExcelFile.sheets.item(“sheet1”)

‘엑셀 파일에 저장될 행을 불러온다.

Cell_Cnt = ws.range(“A1”).currentregion.rows.count + 1

‘태그들의 값을 가져온다.

Val1% = GetTagVal(“ANA1”)

Val2% = GetTagVal(“ANA2”)

Val3% = GetTagVal(“ANA3”)

‘엑셀 파일에 데이터 쓰기                 ‘행,     열

 

ws.Cells(Cell_Cnt,1) = Cell_Cnt – 3 ‘카운트

ws.Cells(Cell_Cnt,2) = TimeStr(37) ‘시간 출력

ws.Cells(Cell_Cnt,3) = Val1%

ws.Cells(Cell_Cnt,4) = Val2%

ws.Cells(Cell_Cnt,5) = Val3%

ws.Calculate

ExcelFile.Save

ExcelApp.Quit

Set ExcelApp = Empty

End If

End Sub

===============================================

아래 그림과 같이 스크립트를 등록합니다.

 

5. ‘파일 불러오기’ 버튼을 등록하고, 명령식 동작으로 Runscript(“FileListLoad”)를 입력합니다.

‘파일 불러오기’ 버튼으로 실행할 스크립트는 다음과 같이 작성합니다.

 

Sub FileListLoad()

On Error Goto Pass

‘ ListBox에 있는 파일 리스트 초기화

wcDeleteAll “List1”

FilePathLoad$ = “C:\보고서”

Dim FileName$()

FileList FileName$, FilePathLoad$+”*.xls”

‘ ListBox에 파일 리스트 추가

i% = 0

While ( FileName$(i) <> “” )

WcInsertItem “List1”, -1, FileName$(i%)

i% = i%+1

Wend

Pass:

End Sub

==========================================

아래 그림과 같이 스크립트를 등록합니다.

6. ‘파일 인쇄’ 버튼을 등록하고, 명령식 동작으로 Runscript(“Scr1”)을 입력합니다.

 

‘파일 인쇄’ 버튼으로 실행할 스크립트는 다음과 같이 작성합니다.

Sub Scr1()

a$=wcGetData(“List1”,-1)

FileName$ = “C:\보고서” & a$

Set ExcelApp = CreateObject(“Excel.Application”)

Set ExcelFile = ExcelApp.Workbooks.Open(FileName$)

Set ws=ExcelFile.sheets.item(“sheet1”)

ws.PrintOut

ExcelApp.Quit

End Sub

=============================================

아래 그림과 같이 스크립트를 등록합니다.

7. CimonX를 실행한 후 각 버튼을 누를 때 다음과 같이 동작합니다.

쓰기 신호(‘SIN’ 태그)가 1인 상태에서 RUN버튼을 눌렀을 때, TEST.XLS양식 파일을 바탕으로 데이터가 엑셀에 입력되면서 제품코드-금일 날짜 형태의 데이터가 생성됩니다.

제품코드가 CIMON001일 경우, RUN버튼을 누른 후 ‘파일 불러오기’ 버튼을 누르면   CIMON001-20171014 라는 파일이 생성됩니다.

 

언제나 고객을 먼저 생각하는 CIMON이 되겠습니다.

감사합니다.