Script ile Database’den veri alma
Scada Database’e kayıtlı değerlerden belli tarih aralığındaki farkı bulmak için hazırladığımız script aşağıdadır.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Imports System.Data.SqlClient
Imports System.Globalization
Namespace WinTr
Public Class MainClass
Public StartDate As DateTime
Public EndDate As DateTime
Public Difference As Int32
Public Sub Load
Dim SQL_cn As New SqlConnection()
SQL_cn.ConnectionString = “Server=(local)\WinTr;uid=sa;pwd=WinTr@2013;database=ProjectDbName”
SQL_cn.Open()
Dim SQL_Ins As String
SQL_Ins = “SELECT Max(Tag_1) – Min(Tag_1) FROM Table1 WHERE [DateTime] >= ‘”
SQL_Ins &= StartDate.ToString(“G”, CultureInfo.CreateSpecificCulture(“en-US”)) & “‘ And [DateTime] <= ‘”
SQL_Ins &= EndDate.ToString(“G”, CultureInfo.CreateSpecificCulture(“en-US”)) & “‘”
Dim SQL_cmdnon As SqlCommand = New SqlCommand(SQL_Ins, SQL_cn)
Dim Value As String
Value=SQL_cmdnon.ExecuteScalar.tostring
if isnumeric(Value) Then
Difference = Value
Else
Difference = 0
End If
SQL_cn.Close()
End Sub
End Class
End Namespace
Not: Bu scripti kopyalayıp WinTr Script editör’e kopyaladığınızda tırnak işaretleri değişebilir. Ayrıca satırlara da dikkat etmelisiniz. Script’de database ismi “ProjectDbName” sizin projenizin database ismi olmalıdır. SQL şifresi “WinTr@2013″ yeni versiyonlar içindir. Eski versiyonlarda şifre “12341234” olmalıdır.
Bu script’de üç adet tag kullanılmıştır. StartDate : Başlangıç tarihi, EndDate : Bitiş tarihi, Difference : hesaplanan fark.
Eğer birden çok değerin farkı bulunacak ise iki yöntem ile yapılabilir.
1.Yöntem:
Her fark için yeni sorgu göndermektir. Script’de SQL_Ins değişkenine yazılan SQL sorgusu ExcuteScalar komutu ile çalıştırılmıştır. Yeni sorguyu aşağıdaki satırların arasına eklemeliyiz.
End If
SQL_cn.Close()
Yukarıdaki script’de bu iki satırı bulup arasına aşağıdaki kodu ekleyerek yeni bir sorgu yapabiliriz. Bu şekilde başka sorgularımız da varsa hepsini alt alta eklemeliyiz.
SQL_Ins = “SELECT Max(Tag_2) – Min(Tag_2) FROM Table1 WHERE [DateTime] >= ‘”
SQL_Ins &= StartDate.ToString(“G”, CultureInfo.CreateSpecificCulture(“en-US”)) & “‘ And [DateTime] <= ‘”
SQL_Ins &= EndDate.ToString(“G”, CultureInfo.CreateSpecificCulture(“en-US”)) & “‘”
SQL_cmdnon = New SqlCommand(SQL_Ins, SQL_cn)
Value=SQL_cmdnon.ExecuteScalar.tostring
if isnumeric(Value) Then
Difference_2 = Value
Else
Difference_2 = 0
End If
Was this answer helpful?
LikeDislikeFarkını bulacağımız Tag sayısı fazla olduğunda Reader yöntemi uygun olacaktır. Zira her sorgu bilgisayar performansını etkileyecek ve gecikmeye sebep olacaktır. Reader yönteminde ise aynı anda tüm değerler okunacaktır. Her iki yöntem içinde kullanılacak script asenkron olarak seçilmelidir. Bu script çalışırken scada’nın normal işlemlerine devam etmesi için bu gereklidir.
2.Yöntem:
Reader yönteminde değerlerini almak istediğimiz tüm taglar tek seferde SQL’e sorgu olarak gönderilir. Sonuç’da aynı şekilde topluca alınır.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Imports System.Data.SqlClient
Imports System.Globalization
Namespace WinTr
Public Class MainClass
Public StartDate As DateTime
Public EndDate As DateTime
Public Tag_1_Diff As Int32
Public Tag_2_Diff As Int32
Public Tag_3_Diff As Int32
Public Sub Load
Dim SQL_cn As New SqlConnection()
SQL_cn.ConnectionString = “Server=(local)\WinTr;uid=sa;pwd=WinTr@2013;database=ProjectDbName”
SQL_cn.Open()
Dim SQL_Ins As String
SQL_Ins = “SELECT Max(Tag_1) – Min(Tag_1),Max(Tag_2) – Min(Tag_2),Max(Tag_3) – Min(Tag_3) FROM Table1 WHERE [DateTime] >= ‘”
SQL_Ins &= StartDate.ToString(“G”, CultureInfo.CreateSpecificCulture(“en-US”)) & “‘ And [DateTime] <= '" SQL_Ins &= EndDate.ToString("G", CultureInfo.CreateSpecificCulture("en-US")) & "'" Dim SQL_cmdnon As SqlCommand = New SqlCommand(SQL_Ins, SQL_cn) Dim reader As SqlDataReader = SQL_cmdnon.ExecuteReader() If reader.HasRows Then reader.Read() if isnumeric(reader(0)) Then Tag_1_Diff = reader(0) Else Tag_1_Diff = 0 if isnumeric(reader(1)) Then Tag_2_Diff = reader(1) Else Tag_2_Diff = 0 if isnumeric(reader(2)) Then Tag_3_Diff = reader(2) Else Tag_3_Diff = 0 End If reader.Close() SQL_cn.Close() End Sub End Class End Namespace Örnek Projeyi Buradan İndirebilirsiniz.
Was this answer helpful?
LikeDislikeReader örneğimize bir ilave yapmak istiyorum. Reader aslında bir tabloyu sonuç olarak getirir. Fark hesaplama sorgumuzun sonucu tek satırdan ibaret olacağı için yukarıdaki örnek script yeterlidir. Eğer sonucu bir den çok satır olan bir sorgu sormuş olsaydık, tüm satırları okumamız gerekebilirdi. Böyle bir durumda reader ile döngü oluşturmalıyız.
Do While reader.Read()
if isnumeric(reader(0)) Then Tag_1_Diff = reader(0) Else Tag_1_Diff = 0
if isnumeric(reader(1)) Then Tag_2_Diff = reader(1) Else Tag_2_Diff = 0
if isnumeric(reader(2)) Then Tag_3_Diff = reader(2) Else Tag_3_Diff = 0
Loop
Döngü tüm satırlar okunduktan sonra bitecektir. Daha önce bitirmek için Exit While deyimi kullanılır.
Was this answer helpful?
LikeDislikeTüm örneklerimizin SQL sorguları daha basit olması için Max – Min şeklinde yapılmıştır. Bu sorgu iki tarih arasındaki en küçük ve en büyük değerin farkını oalır. Oysa istenen ilk değer ile son değerin farkıdır. Sürekli artan değerlerde Max – Min metodu kullanılabilir, ama her zaman geçerli değildir. Bu gibi durumlarda aşağıdaki sorguyu kullanabilirsiniz.
(SELECT TOP 1 Tag_1 FROM Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= 'EndDate' ORDER BY Tag_1 DESC) - (SELECT TOP 1 Tag_1 FROM Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= 'EndDate' ),(SELECT TOP 1 Tag_2 FROM Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= 'EndDate' ORDER BY Tag_2 DESC) - (SELECT TOP 1 Tag_2 FROM Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= 'EndDate' ),(SELECT TOP 1 Tag_3 FROM Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= 'EndDate' ORDER BY Tag_3 DESC) - (SELECT TOP 1 Tag_3 FROM Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= 'EndDate' )