forumumuzda hep Visual Basic örnekleri paylaşıyoruz. Oysa WinTr ile C# kodları da hiç bir kısıtlama olmadan yazılabilir. Paylaşımlarımızda mümkün olan en geniş kitleye erişmek istiyoruz. C# kullanıcıları Google’a Vb to C# yazdıklarında kod çevirici siteler bulabilir. Örneklerimizi bu siteler aracılığı ile çevirip kullanabilirler.

C#’ın tip bağımlılığı kod yazarken ciddi oranda bize engel olur. Bazen bu bağımlılık keşke Visual Basic öğrenseydim dedirtir. Bir çok kullanıcı C#’ın yeteneklerinin daha geniş olduğunu düşünür. Bu büyük ölçüde C#’ın daha zor oluşundan kaynaklanır. Benim düşüncem ise kesinlikle Visual Basic’ten yanadır. Performans olarak C# %20 daha hızlı gözükse de, bir çok kodu daha uzun yazmamız gerekeceğinden dolayı VB daha yüksek performansta çalışır.

WinTr ver 5.2.6 ile eklenen scada nesnelerine script ile erişim imkanını 3 ile anlatalım. Vb kullanıcıları için aşağıdaki kodu kullanmıştık.

dim i as integer = ObjectNameOfActiveScreen.IndexOf(“CheckBox_0”)

if i > -1 Then

Dim c as CheckBox = ObjectOfActiveScreen(i)

AddHandler c.MouseDown, AddressOf CheckBox_0_MouseClick

Else

Msgbox(“CheckBox_0 bu sayfada yok!”)

End If

C# içinde neredeyse aynı olan aşağıdaki kodu kullanabiliriz.

int i = ObjectNameOfActiveScreen.IndexOf(“CheckBox_0”);

if (i > -1) {

CheckBox c = (CheckBox)ObjectOfActiveScreen[i];

c.MouseDown += CheckBox_0_MouseClick;

}else {

MessageBox.Show(“CheckBox_0 bu sayfa da yok!”);

}

 

Gördüğünüz gibi iki kod bir birinin aynısıdır. Forumda bazı konularda paylaşılan script’lerde tip oluşturulmadan kullanılmıştır. Örneğin bu ifadede textbox nesnesi text değeri direkt olarak erişilmiştir.

ObjectOfActiveScreen[i].Text = “Fultek”

Oysa c#’da bu erişim mümkün olmaz. Zira ObjectOfActiveScreen tipi object olup bu tip içersinde text özelliği yoktur. Bunun yerine aşağıdaki kodu kullanmalıyız.

TextBox t = (TextBox)ObjectOfActiveScreen[i];

t.Text = “Fultek”;

Görüldüğü gibi ObjectOfActiveScreen nesnesinden Textbox tipinde t isimli bir nesne oluşturup, bu nesnenin Text özelliğini kullanabiliriz.

Benzer şekilde integer sayıları signed integer olan sayılar ve tipleri tamamen aynı olmayan diğer sayılar ile kullanmak istediğimizde tip dönüşümü yapmalıyız. Örnek:

int a;

uint b;

a = (int)b

b sayısını integer olarak a sayısına atıyoruz.

WinTr’ye yeni eklenen ve tüm tag değerlerini okuyup yazmamızı sağlayan RWTagValue fonksiyonu C# kullanımı ise tam bir çile haline geldi. Bence C# kullanıcıları bu fonksiyon yerine Tag’lara direkt erişim yapsalar daha iyi olur. Zira bu fonksiyon ile bir tag’ın değerini okumak veya yazmak bir çok kodun çalışmasına sonucu oluyor. Eğer Tag değeri sadece okunacak ise TagNameTable ve TagValueTable isimli diziler kullanılabilir.

C# ile Tag erişimi:

1) Okuma ve yazma olarak Tag’a en hızlı erişim Tag’ın direkt kullanımı ile olur. MainClass’ın altında

public UInt16 Tag_1;

ifadesi ile tag oluşturulur ve script içersinde Tag_1 = 5 şeklinde direkt kullanılabilir.

2) Sadece okuma yapılacaksa ve çok sayıda tag yazmak istemiyorsanız Tag dizileri kullanılabilir. Yine aynı tanıtım alanında diziler tanıtılır.

public String[] TagNameTable;

public String[] TagValueTable;

Load sub veya oluşturacağınız diğer sub’larda aşağıdaki gibi tag değerlerine erişebilirsiniz.

int i = Array.IndexOf(TagNameTable,”Tag_1″);

if (i > -1) {

Int32 a = Convert.ToInt32(TagValueTable[i]);

}

 

3) RWTagValue fonksiyonu ile tag değerlerine erişim. VB kullanıyor olsaydık kolaylıkla erişebilirdik.

RWTagValue.Value(“Tag_1”) = 61 yazmak için, Dim a as integer = RWTagValue.Value(“Tag_1”) ise okumak için.

C#’da ise bu fonksiyonu kullanmak için script içersine ayrı fonksiyon yazmak zorunda kaldık. Okumak ve yazmak için aşağıdaki fonksiyonları oluşturmalıyız.

using System;

using System.IO;

using System.Windows.Forms;

using Microsoft.CSharp;

namespace WinTr

{

class MainClass

{

public object RWTagValue;

public void Load()

{

SetVal(“Tag_1″,”1223”);

MessageBox.Show((String)ReadVal(“Tag_1”));

}

public bool SetVal(string tag_name, string val)

{

System.Reflection.MethodInfo method = RWTagValue.GetType().GetMethod(“set_Value”);

object[] pr = {tag_name,val};

method.Invoke(RWTagValue, pr);

return true;

}

public object ReadVal(string tag_name)

{

System.Reflection.MethodInfo method = RWTagValue.GetType().GetMethod(“get_Value”);

object[] pr = {tag_name};

return method.Invoke(RWTagValue, pr);

}

}

}

 

Daha sonra bu fonksiyonları kullanarak okuma ve yazma yapabiliriz. Ana program içerisinde bu fonksiyonlar aşağıdaki şekilde kullanılabilir.

Okumak için : string sonuc = (string)ReadVal(“Tag_2”);

Yazmak için : SetVal(“Tag_2” , “5”);

Ana fonksiyonda kullanımı kolay olsa da okuma ve yazma fonksiyonunda epey bir işlem gereklidir. Bu nedenle bu fonksiyonu kullanmanız tavsiye edilmez. Fakat bazı durumlarda bu fonksiyonları kullanmak zorunda kalabilirsiniz. Örneğin Scada sayfasında bulunan bir nesne için handle oluşturup bu handle çağrıldığında tag’a değer yazmak veya okumak istiyorsanız bu fonksiyonları kullanmak zorundasınız. Diğer bir zorunluluk ise script içerisinde Timer kullanırsanız olur.