Script içerisinde diğer scriptde ki kodu çağırma.
Scada projemizde çok sayıda script kullanabiliriz. Ve bazen aynı fonksiyonları defalarca yazmak zorunda kalabiliriz. Böylesi bir işlemin bir çok istenmeyen sonuçları olabilir. Örneğin bir değişiklik yapacağımız durumda birden çok script’de değişiklik yapmak zorundayız. Diğer bir sorun ise scriptlerin boyları uzayacak olmasıdır. Aşağıda anlatılan konuda fonksiyonlar nesne haline getirilip diğer scriptlerden nasıl çağrılacağı anlatılmıştır. Örneğimizde tüm fonksiyonlar WinTrScadaObject_1 nesnesi içerisinde taşınmıştır. Fakat siz bu nesne yerine tamamen aynı olan WinTrScadaObject_10 nesnesinin kullanınız. Çok ileri aşamalarda WinTrScadaObject_1 nesnesi ActiveX kullanımında rol oynar.
Bir script’in diğer bir script içerindeki kodu kullanabilmesi için bu kod object türüne dönüştürülmelidir. Obje türüne dönüştürebilmemiz için bu kodu farklı bir class içerisinde yazmalıyız. Örnek olarak hazırladığımız kod aşağıdadır.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public WinTrScadaObject_1 As Object
Public Sub Load
WinTrScadaObject_1 = New CodeList
End Sub
End Class
Public Class CodeList
Public Function Code_1(ByVal Tag_1 as Uint16, Byval Tag_2 As Uint16)
Tag_1 = Tag_2 + Tag_1
Return Tag_1
End Function
Public Function Code_2(ByVal Tag_1 as Uint16, Byval Tag_2 As Uint16, ByVal Tag_3 as Uint16)
Tag_1 = Tag_2 + Tag_3 + Tag_1
Return Tag_1
End Function
End Class
End Namespace
CodList clası içerisinde iki adet fonksiyon yazdım. WinTrScadaObject_1 içerisinde her türlü şeyi barındırabilen bir nesnedir. Yukarıdaki scripti runtime ilk açıldığında bir defa çalıştırmak yeterlidir. Script yazımı esnasında run butonu ile çalıştırmakda aynı işlemi yapacaktır. Böylece WinTrScadaObject_1 nesnesi CodeList clasını taşıyacaktır. Codlist clasındaki fonksiyonlara ihtiyacınız olduğunda aşağıdaki script örneğinde olduğu gibi kullanabilirsiniz.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public WinTrScadaObject_1 As Object
Public Tag_1,Tag_2 As UInt16
Public Tag_3 As UInt16
Public Sub Load
MsgBox(Tag_1)
Tag_1 = WinTrScadaObject_1.Code_1(Tag_1,Tag_2)
MsgBox(Tag_1)
Tag_1 = WinTrScadaObject_1.Code_2(Tag_1,Tag_2,Tag_3)
MsgBox(Tag_1)
End Sub
End Class
End Namespace
Bu script’de görüldüğü gibi Tag_1 değeri Code_1 ve Code_2 fonksiyonları ile hesaplanıyor. Bu fonksiyonlar çağrıldığı yerde Tag_1, Tag_2 ve Tag_3 değerleri fonksiyonlara gönderilip sonucu return komutu ile alıp Tag_1 değeri olarak yazıyoruz.
Şimdi kodu biraz geliştirelim. Zira fonksiyona her seferinde Tag değerlerini göndermek mümkün olmayabilir. Fonksiyon tag değerlerini kendisi bulması gerekebilir. Bu amaçla hazırladığımız ve sadece bir kere çalışıp WinTrScadaObject_1 içersinde taşıyacağımız kod aşağıdadır.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public WinTrScadaObject_1 As Object
Public Sub Load
WinTrScadaObject_1 = New CodeList
End Sub
End Class
Public Class CodeList
Public Function Code_1(ByVal RWTagValue As Object)
Dim Value as Uint16 = Val(RWTagValue.Value(“Tag_2”)) + Val(RWTagValue.Value(“Tag_1”))
Return Value
End Function
Public Function Code_2(ByVal RWTagValue As Object)
Dim Value as Uint16 = Val(RWTagValue.Value(“Tag_2”)) + Val(RWTagValue.Value(“Tag_3”)) + Val(RWTagValue.Value(“Tag_1”))
Return Value
End Function
End Class
End Namespace
İlk örneğimizden temel farkı Tag değerlerini tek tek fonksiyona göndermek yerine bize tüm tag değerlerini verebilecek “RWTagValue” fonksiyonunu kullanmış olmamızdır. Bu kodu çağırmak için hazırladığımız örnek aşağıdadır.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public RWTagValue As Object
Public WinTrScadaObject_1 As Object
Public Tag_1 As Uint16
Public Sub Load
MsgBox(Tag_1)
Tag_1 = WinTrScadaObject_1.Code_1(RWTagValue)
MsgBox(Tag_1)
End Sub
End Class
End Namespace
Şimdiye kadar paylaştığımız tüm kodlarda fonksiyonlar tek bir değer veriyordu. Şimdi ise birden çok Tag değerini değiştirebilen bir fonksiyon yazalım. Aşağıdaki kod’da hesaplanan tag değerleri ArrayList içerisine yazılıp return komutu ile bu ArrayList çağıran bloğa gönderilir.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public WinTrScadaObject_1 As Object
Public Sub Load
WinTrScadaObject_1 = New CodeList
End Sub
End Class
Public Class CodeList
Public Function Code_1(ByVal RWTagValue As Object)
Dim Val1 as Uint16 = Val(RWTagValue.Value(“Tag_2”)) + Val(RWTagValue.Value(“Tag_1”))
Dim Val2 as Uint16 = Val(RWTagValue.Value(“Tag_3”)) + Val(RWTagValue.Value(“Tag_1”))
Dim Val3 as Uint16 = Val(RWTagValue.Value(“Tag_2”)) + Val(RWTagValue.Value(“Tag_3”))
Dim Arr as new System.Collections.ArrayList
Arr.Add(Val1)
Arr.Add(Val2)
Arr.Add(Val3)
Return Arr
End Function
End Class
End Namespace
Görüldüğü gibi bir çok Tag değeri Arr.Add komutu ile geri döndürülecek nesneye ekleniyor. Bu nesneyi bu fonksiyonları çağırdığımız blok’da Tag değerlerine eşitlemeliyiz . Aşağıda örnek kodu görebilirsiniz.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public RWTagValue As Object
Public WinTrScadaObject_1 As Object
Public Tag_1 As Uint16
Public Sub Load
MsgBox(Tag_1)
Dim Arr As New System.Collections.ArrayList
Arr = WinTrScadaObject_1.Code_1(RWTagValue)
Tag_1 = Arr(0)
RWTagValue.Value(“Tag_2”) = Arr(1)
RWTagValue.Value(“Tag_3”) = Arr(2)
MsgBox(Tag_1)
End Sub
End Class
End Namespace
Fonksiyonun çağrılması ile oluşturulan Arr nesnesi 0 nolu indeksi Tag_1 değeridir. 1 nolu indeksi ise Tag_2 değeridir. Örnek olması için Tag_1 direkt olarak yazılmıştır. Tag_2 ise RWTagValue fonksiyonu kullanılarak yeni değer aktarılmıştır.
C# kullanan benzer kodlar yazabilir. Fakat C# tip bağımlılığından dolayı yapmaları gereken farklı işlemler olacaktır. Fonksiyonlar direkt olarak oluşturulabilir. Ancak bu fonksiyonların çağrıldığı yerlerde MethodInfo ile fonksiyon bulunduktan sonra çalıştırılmalıdır. Daha fazla bilgi için aşağıdaki linke tıklayınız.
http://www.wintr.com.tr/2015/01/c-ile-nesne-erisimi/