หน้าเว็บ

วันอังคารที่ 19 สิงหาคม พ.ศ. 2557

Query SQL Command จากGENESIS32 SCADAอย่างง่าย

ตัวอย่างรันคำสั่งSQLไปยังMS SQL Serverแบบง่าย ใช้ในการประยุกต์เพื่อเก็บข้อมูลในรูปแบบที่ต้องการ ลบข้อมูล อัพเดทข้อมูล เป็นต้นได้
วิธีนี้จะใช้สิทธิ์ Windows NT Authentication ดังนั้นจึงเหมาะกับกรณีที่GENESIS32อยู่ในเครื่องเดียวกับMS SQL Server
ฐานข้อมูลตัวอย่างชื่อ test อยู่ในMS SQL Serverที่อยู่ในคอมพิวเตอร์เดียวกับGENESIS32 มีฃื่อInstanceคือsqlexpress2 ตารางที่ต้องการใช้คือt1มีคอลัมน์ดังแสดงในรูปล่าง
image
เปิดGraphworx32ขึ้นมา แล้วนำอ็อปเจ็ครูปภาพไปวางเพื่อทำงานเป็นปุ่ม ในปุ่มนี้เราจะใส่คำสั่งQueryเพื่อส่งข้อมูลไปเก็บในตารางt1 โดยใส่ค่าใมนคอลัมน์ v1, v2 และ Time_Date
image
ใส่ Dynamic Pick ในปุ่มโดยคลิ้กเลือกปุ่มแล้วคลิ้กไอคอนimageบนDynamic Toolbar
เมื่อหน้าต่างProperty Inspectorปรากฏขึ้นมาให้เลือก Action เป็น Run Script แล้วคลิ้กปุ่ม Create…
image
ตั้งชื่อScriptเช่น sqltest คลิ้ก OK
จะพบหน้าโค้ดให้เราเขียน เราจะใช้โค้ดในรูปแบบดังนี้
Shell “พาธโปรแกรมsqlcmd –S ชื่อคอมพิวเตอร์\ชื่อInstance –d ชื่อDatabase –Q ""คำสั่งQueryที่ต้องการ””
ซึ่ง –S ใช้ระบุชื่อคอมพิวเตอร์และInstance
-d ใช้ระบุชื่อDatabase
-Q ใช้ระบุQuery String
ในตัวอย่างนี้ผมติดตั้งSQL Serverไว้ในพาธC:\Program Files\Microsoft SQL Serverซึ่งจะมีโปรแกรมsqlcmd.exeอยู่ในC:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe"  และเนื่องจาากMS SQL Serverอยู่ในคอมพิวเตอร์เดียวกันก็สามารถใช้ชื่อเครื่องเป็น (local)แทนได้ และSQL Serverของผมมีชื่อ Instanceคือ sqlexpress2 ถ้าไม่รู้สามารถดูในโปรแกรมSql Server Configurationb Manager ได้
image
และในตัวอย่างนี้จะInsertข้อมูลRandomโดยใช้ฟังก์ชั่นRanmdomของSQL Server ให้กับคอลัมน์ v1, v2 ตามลำดับ และใช้ฟังก์ชั่นGetDate()เพื่อเอาวันเวลาปัจจุบันมาใส่ในคอลัมน์Time_Date ก็จะได้โค้ดดังนี้
Shell "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe -S (local)\sqlexpress2 -d test -Q ""insert into t1 (v1,v2,Time_Date) values (RAND(100),RAND(101),getdate())"""

image

เมื่อทดสอบรันGraphWorXและกดปุ่มก็จะได้ข้อมูลใหม่ไปเพิ่มในตารางt1

image



การประยุกต์ใช้กับSCADA

แทนที่จะกำหนดค่าตายตัวหรืือส่งค่าโดยใช้ฟังก์ชั่นของSQL Serverเราสามารถเอาค่าของOPC tagหรือVariableของGENESIS32ส่งไปแทนได้

ตัวอย่างโค้ด (โค้ดดังกล่าวนี้ไม่ได้ป้องกันกรณีสัญญาณOPCเป็นBAD ซึ่งจะทำให้ค่าที่ได้เป็น Null กรณีเช่นนี้จะไม่สามารถส่งค่าให้SQLได้ ควรรับค่าจากOPCด้วยตัวแปรแบบStringเสียก่อนแล้วแปลงเป็นค่าตัวเลขก่อนส่งให้SQL)

'************** ส่วนประกาศตัวแปร ประกาศไว้บนสุดของหน้า **************************************

Dim var1 As Double, var2 As Double, gc(1 To 2) As OpcHelper


'************* ส่วนโค้ดของเรา คัดลอกเอาเฉพาะในSubไปใช้งาน ************************************************

Public Sub NewScript(td As TriggerData)
    On Error GoTo ErrHandler
    ' TODO: Add your code here


Set gc(1) = New OpcHelper
Set gc(2) = New OpcHelper
var1 = gc(1).Read("ICONICS.Simulator.1\SimulatePLC.Sine")
var2 = gc(2).Read("ICONICS.Simulator.1\SimulatePLC.Randaom")


Shell "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe -S (local)\sqlexpress -d test -Q ""insert into t1 (v1,v2,Time_Date) values (" & var1 & ",RAND(101),getdate())"""

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

ไม่มีความคิดเห็น:

แสดงความคิดเห็น