• 제품선택
  • VB  함수를 이용하여   스크립트를 작성하시면 됩니다.

      

    아래의 예제를 참조하시면 지정된 Excel 파일의 모든 시트 이름을 표시합니다.  

     

    Sub ReadExcelSheet()

    Dim ExcelApp As Object

    Dim DayRpt As Object

    ‘ Read  파일 이름
    fName$ = “C:Sample.xlsx”

    ‘ Excel  실행
    Set ExcelApp = CreateObject(“Excel.Application”)

    ‘ Excel  파일 열기
    Set DayRpt = ExcelApp.Workbooks.Open (fName$)

    ‘ Excel  파일의 모든 시트를 돌며 시트의 이름을 가져와서 표시한다.
    For nIdx = 1 To DayRpt.Worksheets.Count

    shname = DayRpt.Worksheets(nIdx).Name
    msgbox shname

    Next nIdx

     파일을 닫는다.
    DayRpt.Close

    ‘ Excel 를 종료한다.
    ExcelApp.Quit

    End Sub

     

    #시트이름#시트#엑셀시트#Sheet#ExcelSheet

  • 트랜드 오브젝트의 데이터를 엑셀파일로 출력하는 예제 입니다.  

    [예제]   

    ●예제프로젝트 설명 

    Cycle태그(초단위 주기) 설정에 따라 트랜드 오브젝트에 표시된 데이터를 엑셀 파일로 출력하는 예제  

     

    1.       아래와 같이 데이터 수집모델을 생성합니다. 

             수집방법 : 정주기로 수집 

             수집주기 : 1초

     

    2.       데이터베이스에 3개의 태그를 생성

     

    3.       ANA1과 ANA2에 데이터수집 태그로 설정합니다.  

     

    4.       트랜드 오브젝트를 생성하여 아래와 같이 설정합니다. 

             오브젝트 이름 : Trend 

             펜등록 : ANA1, ANA2

     

     

     

    5.       스크립트를 작성

    아래와 같이 스크립트를 작성합니다.

    Sub StatusSave()

     If GetTagVal(“CYCLE”) <> 0 Then

     ‘주기가 0이 아닐경우

               Set ExcelApp = CreateObject(“Excel.Application”)

                          fFormName$ = “D:TESTSCADAReport양식양식.xlsx”

                          ‘양식파일 위치

                          fTodayName$ = “D:TESTSCADAReport출력”+TimeStr(44)+”.xlsx”

                          ‘생성될 파일 위치

                          If (FileExists(fTodayName$) <> True) Then

                          ‘파일이 없을 경우

                                    FileCopy fFormName$ , fTodayName$

                                    ‘양식파일 복사

                          End If

                          Set DayRpt = ExcelApp.Workbooks.Open(fTodayName$)

                          ‘Excel Workbook Open

                          Set Sheet1 = DayRpt.Worksheets(1)

                                    If GetTrendMode(“Trend”) = 1 Then

                                    ‘과거 트랜드 모드일 경우

                                               hsTrendTime& = TrendGetTime(“Trend”, 4)

                                               ‘트랜드 시작시간

                                               heTrendTime& = TrendGetTime(“Trend”, 5)

                                               ‘트랜드 끝시간

                                               hTrendCycleCounter% = ((heTrendTime& – hsTrendTime&) – ((heTrendTime& – hsTrendTime&) Mod GetTagVal(“Cycle”))) / GetTagVal(“Cycle”)

                                               ‘데이터 갯수

                                               For i = 0 to hTrendCycleCounter%

                                                         hTrendTime& = hsTrendTime& + (i * GetTagVal(“Cycle”))

                                                         ‘시각값

                                                         hTrendTimeStr$ = TimeToStr(hTrendTime&, 12) + TimeToStr(hTrendTime, 5)

                                                         ‘시간 값을 YYYY년MM월DD일hh시mm분ss초 변환

                                                         Set Cell = Sheet1.Range(“A”+CSTR(i + 1))

                                                         Cell.Value = hTrendTimeStr$

                                                         Set Cell = Sheet1.Range(“B”+CSTR(i + 1))

                                                         Cell.Value = Dlogval(“ANA1”,hTrendTimeStr$)

                                                         ‘ANA1의 수집데이터를 셀에 출력

                                                         Set Cell = Sheet1.Range(“C”+CSTR(i + 1))

                                                         Cell.Value = Dlogval(“ANA2”,hTrendTimeStr$)

                                                         ‘ANA2의 수집데이터를 셀에 출력

                                               Next i

                                    Else

                                               ‘과거 트랜드 모드일 경우

                                               rsTrendTime& = TrendGetTime(“Trend”, 0)

                                               ‘트랜드 시작시간

                                               reTrendTime& = TrendGetTime(“Trend”, 1)

                                               ‘트랜드 끝시간

                                               rTrendCycleCounter% = ((reTrendTime& – rsTrendTime&) – ((reTrendTime& – rsTrendTime&) Mod GetTagVal(“Cycle”))) / GetTagVal(“Cycle”)

                                               ‘데이터 갯수

                                               For i = 0 to rTrendCycleCounter%

                                                         rTrendTime& = rsTrendTime& + (i * GetTagVal(“Cycle”))

                                                         ‘시각값

                                                         rTrendTimeStr$ = TimeToStr(rTrendTime&, 12) + TimeToStr(rTrendTime&, 5)

                                                         ‘시간 값을 YYYY년MM월DD일hh시mm분ss초 변환

                                                         Set Cell = Sheet1.Range(“A”+CSTR(i + 1))

                                                         Cell.Value = rTrendTimeStr$

                                                         Set Cell = Sheet1.Range(“B”+CSTR(i + 1))

                                                         Cell.Value = Dlogval(“ANA1”,rTrendTimeStr$)

                                                         ‘ANA1의 수집데이터를 셀에 출력

                                                         Set Cell = Sheet1.Range(“C”+CSTR(i + 1))

                                                         Cell.Value = Dlogval(“ANA2”,rTrendTimeStr$)

                                                         ‘ANA2의 수집데이터를 셀에 출력

                                               Next i

                                    End If

                                    Sheet1.Calculate

                          ‘ Sheet1.PrintOut

                          DayRpt.Save

               ExcelApp.Quit

               Set ExcelApp = Empty

     End If

    End Sub

    이후 CIMONX 실행 후 스크립트 동작 시 설정한 주기로 엑셀파일이 생성되는 것을 확인 할 수 있습니다.  

     

    #트랜드#트렌드#Trend#엑셀#excel#엑셀파일#트렌드데이터#트랜드데이터#data

  • CIMON-SCADA월보인 경우는 3개월을 저장하고 있습니다. 따라서 3개월 이전의 값을 유지 하시려면 가상태그를 만들어서 보관한 후 보고서로 출력할 때 사용 하십시오.

     

    [ 예제설명]       

    스크립트에서 TimeStr(51)  함수를 사용해서 현재 월을 가져옵니다.  

    예제는 ANA1 을 실 태그로 두시고, SUM01~SUM12 는 가상태그입니다.  

    보고서에 출력 전 스크립트를 사용해서 RunScript  를 사용 하시면 됩니다.   

     

    [ 적용방법]  

    ‘ SUM01, SUM02 ~ SUM12  까지가 ANA1  태그에 대한 월 적산합이 들어 갑니다.  

     보고서 셀에는 TLogVal(“SUM01~SUM12″,”-1 “, 적산합) 이 아닌 그냥 SUM01, SUM02  처럼 쓰면 됩니다.  

      

    prevMon$ = TimeStr(51) 

    curMon$ = prevMon$ 

    curMon$ = TimeStr(51) 

        if curMon$ <> prevMon$ then               달이 바뀌었는지 체크  

    nSum = TLogVal (“ANA1″,”-1 “,” 적산값“)               ‘ 전월 적산값을 구한다  

           SetTagVal   “SUM”+prevMon$ , nSum                  전월 태그에 값을 밀어 넣는다  

           prevMon$ = curMon$ 

        end if 

    End Sub 

     

  • 명령식과 스크립트는 태그값 쓰기의 표현 형식 및 내부 함수 사용시 표현 형식에서 차이가 있습니다.

     

    [ 예문]  

     

    1.  태그값 쓰기 (  예를 들어 TAG1  TAG2의  값을 넣을 경우 )  

    ex)

    Sub changevlaue()

    vlaue = gettagval(“TAG1”)

    settagval “TAG2”, value

    end sub

     

    2. 내부함수 사용

    내부 함수를 사용시 명령식은 도움말의 내부함수 표현을 그대로 사용하면 됩니다.  하지만 스크립트의 경우 함수를 사용하여 어떤 값을 쓰거나 지령을 내릴 경우 함수에 괄호가 들어가지 않으며,  그 반대로 값을 불러오거나 상태를 받아올 경우 괄호가 들어 갑니다.

    예를 들어 다음 과 같은 경우 차이점이 발생 합니다.

    1) 트렌드 모드 변경 함수를 이용하여 지령을 내릴 경우

     TrendSetPenVal() 의 자세한 내용은 도움말에 연산식 및 명령식에서 확인하실 수 있습니다.

     – 값 종류에 따라 다음과 같은 Pen에 관련된 값이 설정 됩니다.

    0 : Pen의 이름 (설정값을 문자열로 입력합니다.)

    1 : Pen의 주석 (설정값을 문자열로 입력합니다.)

    2 : Pen에 설정된 최소값

    3 : Pen에 설정된 최대값

    4 : Pen의 연결방법 (0:표시없음, 1:선연결, 2:계단형)


    2) 
    트렌드 모드 함수를 이용하여 펜의 상태를 확인하는 경우

    ※ GetTrendMode()의 자세한 내용은 도움말에 연산식 및 명령식에서 확인하실 수 있습니다.

    – 지정된 Trend Object가 RealTime 트렌드인 경우에는 0을, Historical Trend인 경우에는 1을 출력합니다.

    [T I P] 스크립트 함수와 내부함수의 차이점  

    • 스크립트 : Microsoft 사의 Visual Basic 을 기반으로 만들어진 일종의 컴파일러( 컴퓨터가 인식할 수 있는 언어) 를 사용합니다.  여기서 제공되는 함수를 이용하여Cimon 의 데이터를 접근하여 수정할 수 있습니다.
    • 내부함수( 연산식) : Microsoft 사의 Visual Basic 에서 제공하는 라이브러리를 이용하여 Cimon 을 실행할 때 유용한 함수를 직접 만들어서 Cimon 프로그램 내부에서만 이용할 수 있도록 되어진 함수 입니다.  예를 들어 태그동작이나 터치동작 같은 오브젝트 사용시 동작명령어에 사용할 수 있습니다.  이러한 내부함수는 스크립트 내부에서 사용이 가능합니다.

     

  • CIMON-SCADA 에서 FEP 포트는 UDP 1609 입니다.

    • 적용방법
    1. IPTIME 공유기를 예를 들어 설명하겠습니다.
    2. 공유기 웹 설정화면에서 고급설정 → NAT/라우터 관리 → 포트포워드 설정 선택 합니다.
    3. 규칙이름 입력 → 내부 IP 입력( 현재 접속된 PC 의 IP 를 사용하려면 IP 입력란 아래 항목을 체크)
       → 프로토콜 입력 ( Cimon-FEP 는 UDP 1609 포트를 사용합니다. 외부포트, 내부포트 입력란에 1609 을 입력합니다.) → 추가를 선택합니다.

  • XG 5000 디바이스 모니터의 데이터 표시 형식이 16진수로 기본 설정되어 있어 주의가 필요합니다. 

    CIMON-SCADA 에서 데이터를 읽어올 때 아날로그 값은 기본적으로10진수로 표현이 됩니다.  

     

     [적용방법] 

    XG5000에서 디바이스 모니터로 값을 입력할 경우 데이터 표시 형식이Default 16진수 입력으로 설정되어 있습니다.  

    예를 들어 디바이스 모니터D00000 어드레스에 10을 입력하면 CIMON-SCADA 에서는 16으로 모니터 됩니다. 

    XG 5000의 데이터 표시 형식을 10진수로 변경 할 경우 [1]에서 선택을 할 수 있습니다 .

    [1] 에서 알맞은 데이터 형식을 선택 하고 입력을 하면 됩니다.  

     

  • 스크립트를 작성하실 경우  While문, For 문 중간에 Sleep이 없으면 리소스를
    계속 점유하여 CPU 사용율이 100%까지 올라가게 됩니다.
    While ~ WEnd문이 실행되고 있다면 이 문장 사이에 sleep이 있어야 이런 현상을 막을 수 있습니다.

    예) While 1
    SetTagVal “TAG1”, 1
    SetTagVal “TAG2”, 1
    Sleep(100)
    Wend

     

    #스크립트#느려짐#제어안됨#제어#자동종료#종료

  • Q)

    일보에서 1시부터 24시까지 평균값을 월보에 1일 평균값을 나타내고 싶습니다.

    월보에 합한값이 나와서 평균값을 나타내게 하려면 어떤함수를 이용해야하는지 알고싶습니다.

     

    A)

    문의 하신 일일 평균값을 구하고자 하신다면 TLogVal()함수에서 시간 값을 일단위로 사용하시면 됩니다.

    예를들어 TLogVal(“태그 이름”, “-1일”, “평균값”) 으로 사용하시면 어제의 평균값을 구하실 수 있습니다.

    월보에서의 평균값은 내부적으로 일일 평균값을 저장하고 있기 때문에 다음과 같이 사용하시면 됩니다.

    TLogVal(“태그이름”, “-1월1일”, “평균값”) – 저번달 1일의 평균값

     

     

  • 태그동작/태그동작실행 기능은 태그값이 변화했을때만

    해당 스크립트를 실행하게 됩니다.

    그러므로 PLC의 전원이 재부팅 되는 것은 태그값이 변화한 것이 아니므로

    태그값이 동기화 되지 못합니다.

    이때 PLC의 전원이 재부팅 되어도 태그값을 자동으로 동기화 시킬 수 있도록 구성한 예제 입니다.

     

    1. 태그 A , B 생성

    2. 태그 A의 값이 변할 때 마다 B의 값도 똑 같은 값으로

    동기화 하기 위해 태그 A에 태그동작을 지정함 / 태그값 변경시

    태그 동작을 지정함 체크

    3. 태그동작 탭에 아래와 같이 작성

    B=A  (B의 값을 A에 써준다는 뜻)

    4. 스크립트 작성

    * commstatus함수 사용방법은 cimonD 도움말을 참고해 주시기 바랍니다.

    #태그동작기능 #재부팅태그동작 #SCADA부팅태그동작 #태그동기화 #태그자동동기화 #SCADA전원태그동기화 #SCADA동기화 #자동동기화 #스카다태그자동동기화 #스카다태그동기화 #스카다동기화 #스카다부팅태그동작 #스카다태그동작기능

     

  •  

    Q: Script 제한 스펙이 있나요?

    A: Script 라이브러리 제한사항입니다.

     

    1. Script 모델 개수에 대한 제한은 없습니다.


    2. Script 사양

    #스크립트제한 #스크립트라이브러리 #스크립트모델몇개 #스크립트모델개수 #스크립트라이브러리모델 #Script 제한 #Script 라이브러리 #Script 모델몇개 #Script 모델개수 #Script 라이브러리모델 #스카다스크립트제한 #스카다스크립트라이브러리 #스카다스크립트모델몇개 #스카다스크립트모델개수 #스카다스크립트라이브러리모델 #스카다Script 제한 #스카다Script 라이브러리 #스카다Script 모델몇개 #스카다Script 모델개수 #스카다Script 라이브러리모델 #SCADA스크립트제한 #SCADA스크립트라이브러리 #SCADA스크립트모델몇개 #SCADA스크립트모델개수 #SCADA스크립트라이브러리모델 #SCADA Script 제한 #SCADAScript 라이브러리 #SCADA Script 모델몇개 #SCADA Script 모델개수 #SCADA Script 라이브러리모델