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.