GENESIS SCADA: ตัวอย่างการเก็บข้อมูลOPCด้วยScriptWorX Print
Tuesday, 09 December 2014 17:17

GENESIS32 และ GENESIS64 สามารถเก็บข้อมูลจากOPC Serverด้วยTrendWorX แต่ถ้าต้องการเก็บข้อมูลในรูปแบบที่เราต้องการเช่นสามารถออกแบบคอลัมน์และการจัดเรียงคอลัมน์ตามต้องการได้เองก็สามารถใช้ScriptWorXซึ่งมีความยืดหยุ่นในก่ารเก็บข้อมูลจากOPC Serverไว้ในDatabaseได้ บทความนี้จะแสดงตัวอย่างการเก็บในMS SQLครับ

สร้างตารางเก็บข้อมูล

ก่อนอื่นสร้างตารางเก็บข้อมูลในMS SQL Server เสียก่อน เช่นในตัวอย่างนี้สร้างตารางชื่อswxที่มีคอลัมน์time_date, v1, v2 เพื่อเก็บค่าวันเวลาและค่าOPC tagสองตัวตามลำดับ โดยเก็บในDtabaseชื่อtestในMS SQL Server (เราสามารถออกแบบคอลัมน์ได้ตามที่ต้องการ)

image

 

สร้างScriptในScriptWorX

เปิดโปรแกรมScriptWorX 2010หรือใหม่กว่าขึ้นมา(โมดูลหนึ่งของGENESIS32/GENESIS64)แล้ว คลิ้กขวาที่โปรเจ็คที่สร้างขึ้นมาแล้ว > เลือก New > Designer/Threadเพื่อสร้างDesignerขึ้นมาใหม่

image

ตั้งชื่อDesignerเช่น dbrec แล้วคลิ้กApply

image

สร้าง New > Script

image

ตั้งชื่อScriptเช่นrec1 จากนั้นคลิ้กปุ่ม…เพื่อเลือกTriggerมาสั่งงานScriptให้ทำงาน

image

ในที่นี้จะให้Scriptทำงานทุก 15 วินาทีก็เลือกTime TriggerคือEvery 15 sec แล้วคลิ้กOK (ถ้าต้องการสร้างTriggerใหม่ให้คลิ้กNew)

image

คลิ้กApply แล้วคลิ้กEdit VBA Codeเพื่อเข้าไปเขียนโค้ด

image

โปรแกรมScriptWorXจะเปิดโค้ดดังรูป จะพบSubชื่อเดียวกับScriptที่ตั้งชื่อไว้ และจะให้เราเขียนโค้ดใต้ตัวอักษรสีเขียว

image

โค้ดดังต่อไปนี้ใช้ในการสั่งบันทึกข้อมูลลงใน MS SQL Serever

Shell "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe –S “ _
&”(local)\sqlexpress2 -d test -Q ""insert into swx (v1,v2,time_date) “ _
& ”values (" & v1 & "," & v2 & ",getdate())"""



ซึ่งจะอยู่ในรูปแบบ

Shell “พาธโปรแกรมsqlcmd –S ชื่อคอมพิวเตอร์\ชื่อInstance –d ชื่อDatabase –Q ""คำสั่งQueryที่ต้องการ””

ซึ่ง –S ใช้ระบุชื่อคอมพิวเตอร์และInstance

-d ใช้ระบุชื่อDatabase

-Q ใช้ระบุQuery String ซึ่งในที่นี้ใช้คำสั่งInsert

พาธของโปรแกรม MS SQL Management Studio (sqlcmd.exe) ของผมอยู่ใน C:\Program Files\Microsoft SQL Server\100\Tools\Binn\ (ค้นหาไฟล์ sqlcmd.exe ก็จะรู้พาธที่แท้จริง)

ส่วนชื่อคอมพิวเตอร์และInstanceในที่นี้คือ (local)\sqlexpress2 (ดูจากโปรแกรมMS SQL Management Studio)

ชื่อของDatabaseคือ test และตารางข้อมูลชื่อswxโดยจะInserข้อมูลในคอลัมน์v1, v2 และ time_date

ทดสอบเก็บค่า Random

ทดสอบเก็บค่าRandomโดยใช้โค้ดดังต่อไปนี้

 

Public Sub rec1(td As TriggerData)

    On Error GoTo ErrHandler

    ' TODO: Add your code here

    Dim v1 As Variant, v2 As Variant

 

    Randomize (DateTime.Second(DateTime.Now))

    v1 = Rnd(1) * 100

    v2 = Rnd(2) * 100 

    Shell "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe -S" _

     & " (local)\sqlexpress2 -d test -Q ""insert into swx (v1,v2,time_date) " _ 

    & " values (" & v1 & "," & v2 & ",getdate())"""  

 

    Exit Sub

ErrHandler:

    g.ConsoleMsg MSG_SEVERE_ERROR, "Script", "'rec1' failed"

End Sub

 

จากโค้ดจะเป็นการนำค่าRandomมาเก็บในตัวแปร v1 และ v2 ก่อนที่จะเอา v1, v2 ไปInserในMS sQLด้วยคำสั่งShell

ทำการบันทึกไฟล์โดยคลิ้กไอคอนSave

image

 

สร้างไฟล์ DLL ดังรูป

 

image

 

กลัมาที่หน้าScriptWorxปกติ แล้วเลือก Make All VBA DLLs

 

image

 

แล้วคลิ้กไฟจราจรให้เป็นสีเขียวเพื่อทดสอบ

 

image

 

ข้อมูลจากค่าRandomจะถูกเก็บในคอลัมน์ v1, v2 ทุก 15 วินาที พร้อมวันที่เวลา

 

image

ทดสอบเก็บค่าOPC tag

เปลี่ยนจากค่าRandomเป็นค่าจากOPC Severได้ โดย

ก่อนอื่นเลือกเมนู Tools > References แล้วเลือกGenClientWrapper 1.0 Type Library เพื่อให้สามารถใช้ไลบรารี่เกี่ยวกับการติดต่อOPC Serverจากนั้นคลิ้กOK

image

เปลี่ยนโค้ดจากที่ให้ v1, v2 รับค่าจาก Random มาเป็นรับค่าจากOPC tag

 

Public Sub rec1(td As TriggerData)
    On Error GoTo ErrHandler
    ' TODO: Add your code here
    Dim v1 As Variant, v2 As Variant
    Dim gc(1 To 2) As New OpcHelper
   
   
    v1 = gc(1).Read("ICONICS.Simulator.1\SimulatePLC.Sine")
    v2 = gc(2).Read("ICONICS.Simulator.1\SimulatePLC.Random")
   
    Shell "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe -S" _
    & " (local)\sqlexpress2 -d test -Q ""insert into swx (v1,v2,time_date) " _
    & " values (" & v1 & "," & v2 & ",getdate())"""

    Exit Sub
ErrHandler:
    g.ConsoleMsg MSG_SEVERE_ERROR, "Script", "'rec1' failed"
   

End Sub

 
จากโค้ด ให้v1รับค่าจากOPC tagชื่อSine และv2รับค่าจากRandom (เราสามารถCopyพาธของOPC tagมาจากProcessPointในGrahWorXได้)

จากนั้น Save และเลือก File > Make … DLL

กลับไปที่หน้า ScriptWorXปกติแล้วเลือก File > Make All VBA DLLs

รันScriptWorXเพื่อทดสอบค่าจากOPC tagก็จะถูกเก็บในตารางที่เราออกแบบไว้

ประโยชน์ของการทำDataLoggerวิธีนี้คือความยืดหยุ่น ออกแบบตารางตามต้องการและจัดดเรียงคอลัมน์ได้ตามที่เรากำหนดครับ

image

 

ถ้าต้องการเก็บข้อมูลตามเงื่อนไขสัญญาณ เช่นเมื่อเปลี่ยนจาก Off > On หรือ On > Off หรือเมื่อสัญญาณเปลี่ยนจากเดิม หรือสูง/ต่ำกว่ากำหนด ฯลฯ ให้ใช้ Data TriggerควบคุมแทนTime Triggerครับ (ลองดูตัวอย่างการสร้างData TriggerในUDM)

 

ชมเวอร์ชั่นVDOได้ที่นี 

สอบถาม : This e-mail address is being protected from spambots, you need JavaScript enabled to view it หรือ 0817062072 

Last Updated ( Thursday, 20 July 2017 15:14 )