Scada Sayfa Nesnelerine Script ile Erişim
23.1.2015 ver 5.2.6 ile birlikte Scada sayfalarında bulunan nesnele script ile erişim sağlandı. Bu özellik ile nesnelerin tüm özellikleri değiştirilebilir. Nesnelerin renk, yazı, boyut, konum, görünür yapma ve diğer tüm özelliklerine erişebilirsiniz. Hatta sayfada bulunmayan bir nesneyi ekleyebilirsiniz. Bu özellik bir çok farklı şekilde kullanılabilir. Bir kaç farklı kullanımı için örnekler hazırladım, sayfanın devamında bu örnekleri bulabilirsiniz.
Not: Bu nesneleri kullanırken dikkat etmeniz gereken bir kaç husus vardır.
1. Script editör bu nesnelere erişemez. Zira script yazdığınız anda Runtime çalışmıyor ve nesneler henüz mevcut değil. Bu nedenle script editörde bulunan “Run” butonu çalışmayacaktır. Fakat “Test” butonu ile test edebilirsiniz. Bu test bazı hataları göstermeyebilir. Gerçek test runtime çalışırken yapılabilir. Örneğin: Combobox nesnelerinde bulunan SelectedIndex özelliği TextBox’larda yoktur. Script içersinde bu özelliği TextBox için kullanmışsanız test sonucu hata vermeyecektir. Fakat Runtime çalışırken hata verecektir.
2. Bu nesnelerin kullanıldığı scriptler nesne özelliklerini sadece okuyor ise Asenkron olabilir. Ama nesneye değer yazıyor ise Senkron olmak zorundadır.
3. Scriptleri belli sayfalar için hazırlamalı ve bu script sadece o sayfadan çalıştırılmalıdır. Örneğin aynı anda iki sayfanız açık, ve birinde bulunan buton’a tıklayınca çalışan bir script diğer sayfadaki nesneye erişemez. Control Panelinde belli durumlarda çalıştırılan bazı scriptler var. Zaman bazlı, runtime açıldığında ve diğer durumlarda çalışan scriptler. Bu scriptler Ana scada ekranında çalışırlar. Schedule’de böyledir. Ana scada ekranı runtime ilk açıldığında açılan ekrandır. Bu sayfadan başka sayfalara geçiş yaptığınızda ana sayfa yeni açılan sayfada devam eder. Fakat yeni pencerede aç komutu ile açılan sayfalar Ana sayfa değildir.
4. Runtime ilk açılışında ve sayfa ilk açıldığında çalışacak scriptlerde bu nesneler kullanılmamalıdır. Zira bu zamanlarda henüz sayfa üzerinde hiç bir nesne yoktur.
5. Script ile nesne özelliklerinde yaptığınız değişiklikler sayfa değiştirildiğinde veya tekrar açıldığında kaybolacaktır.
İlk olarak bu nesnelere script ile nasıl erişeceğimizi TextBox ile görelim. Yeni bir sayfa oluşturup, Bir TextBox ve bir Buton ekleyelim. Ve aşağıdaki scipt’i yazalım.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public ObjectOfActiveScreen As System.Collections.ArrayList
Public ObjectNameOfActiveScreen As System.Collections.ArrayList
Public Sub Load
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“TextBox_0”)
if i > -1 Then
ObjectOfActiveScreen(i).Text = “Fultek”
End If
End Sub
End Class
End Namespace
Sayfada bulunan tüm nesnelere erişmek için iki adet ArrayList kullanmamız gerekir.
1. ObjectNameOfActiveScreen tüm nesnelerin adlarının bulunduğu bir dizidir.
2. ObjectOfActiveScreen tüm nesnelerin bulunduğu dizidir.
Scriptin ilk satırında: dim i as integer = ObjectNameOfActiveScreen.IndexOf(“TextBox_0”)
indexof komutu ile TextBox_0 isimli nesnenin sıra numarasını öğreniyoruz. Eğer nesne yoksa i -1 olacaktır.
Takip eden satırda i > -1 ifadesi ile nesnenin bulunduğunu test ediyoruz. Yapmak istediğimiz işlem TextBox.Text özelliği ile Textbox da görünen değeri değiştirmektir.
if i > -1 Then
ObjectOfActiveScreen(i).Text = “Fultek”
End If
TextBox_0.Text yerine ObjectOfActiveScreen(i).Text yazdık. Zira nesne bir array’in içersinde. Dilersek aşağıdaki gibi kullanabiliriz.
Dim TextBox_0 as TextBox = ObjectOfActiveScreen(i)
TextBox_0.Text = “Fultek”
veya
Dim TextBox_0 as Object = ObjectOfActiveScreen(i)
TextBox_0.Text = “Fultek”
Aynı script’de TextBox.BackColor özelliği için TextBox_0.BackColor = Color.Lime yazabiliriz.
Was this answer helpful?
LikeDislikeSalih bey, yukarıdaki kodu kopyala yapıştır yaptım. önce tırnak işaretlerinden uyardı, onu düzelttim. sonrada ObjectNameOfActiveScreen ve ObjectOfActiveScreen taglarını bulamadığını söyleyen 2 hata veriyor
Was this answer helpful?
LikeDislikeİki sorun olabilir.
1. Bu özellik yeni versiyonda var. Eski versiyon kullanıyor olabilirsiniz. Kod yazım alanının sağ bölümünde Tag listesinde ObjectNameOfActiveScreen ismini görüyorsanız yeni versiyon kullanıyorsunuz demektir.
2. Yazının en başında scriptin tamamını paylaştım, sonraki yazılarda sadece Load Sub’ın içindeki kodu paylaştım. Load Sub’ın üstünde tag tanımlamaları aşağıdaki gibi yapılmalıdır. Veya ilk paylaştığım koda bakıp aynısını yapmalısınız.
Public ObjectOfActiveScreen As System.Collections.ArrayList
Public ObjectNameOfActiveScreen As System.Collections.ArrayList
Was this answer helpful?
LikeDislikeevet sorun eski versiyondaymış. güncelleme yapamamışım şimdi çalıştı.
Was this answer helpful?
LikeDislikeBu örnek’de ise ComboBox item listesini temizleyip tekrar yapalım. Artık script’in tamamını paylaşmıyorum, Sadece kod kısmı yeterli olacaktır.
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“TextBox_0″)
if i > -1 Then
ObjectOfActiveScreen(i).Clear()
ObjectOfActiveScreen(i).Items.Add(“Fultek”)
ObjectOfActiveScreen(i).Items.Add(“WinTr”)
End If
Was this answer helpful?
LikeDislikeNesnelerin özellikleri hakkında daha fazla bilgi edinmek için Visual basic veya C# forumlarından faydalanabilirsiniz. Microsoft’un muhteşem sitesini ziyaret edebilirsiniz. https://msdn.microsoft.com/en-us/library/System.Windows.Forms(v=vs.90).aspx
Scada sayfasına yeni nesne ekleme işlemini açıklayalım. Bu nesneleri sayfaya değil başka bir nesne içerisine ekleyebilirsiniz. Bu nesneler GroupBox veya TabControl olmalıdır. Scada sayfasına bir GroupBox ekleyelip, aşağıdaki kodu kullanabiliriz.
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“GroupBox_0″)
if i > -1 Then
Dim B as new TextBox
B.Text = “Salih”
ObjectOfActiveScreen(i).Controls.Add(B)
End If
Bu groupbox içersindeki nesneleri temizlemek için ObjectOfActiveScreen(i).Controls.Clear komutunu kullanabilirsiniz.
TabControl nesnesine eklemek için TabControl yerine TabPage nesnesine erişilmelidir. dim i as integer = ObjectNameOfActiveScreen.IndexOf(“TabPage_0″) Veya TabPage’in Parent nesnesi olan TabControl’e erişilip item metodu ile de eklenebilir.
Was this answer helpful?
LikeDislikeBir çok müşterimiz scada sayfalarında animasyon oluşturmak istiyor. Animasyon vakit alan bir işlem. Çizgi film mantığı ile yapılıyor. Birden çok resim peş peşe gösteriliyor. Sitemizde Animasyon olarak arattığınızda farklı yazılar görebilirsiniz. Bu bölümde Picture box nesnesine erişip resimi değiştirmeyi açıklayalım.
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“PictureBox_0”)
if i > -1 Then
ObjectOfActiveScreen(i).BackgroundImage = System.Drawing.Image.FromFile(“G:\grafik\icon\PNG_1\Clock.png”)
End If
Bu şekilde script her çalıştığında resim yolunu değiştirirsek animasyonlar oluşturabiliriz.
Was this answer helpful?
LikeDislikeDat Net ile neredeyse her nesne içerisine nesne eklenebilir. Örneğin bir buton içerisine bir başka buton veya başka bir nesne onun içersine’de başka nesne ekleyebilirsiniz.
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“Button_0”)
if i > -1 Then
Dim C as new Button
C.Text = “Buton”
c.Location = New System.Drawing.Point(5, 5)
Dim B as new TextBox
B.Text = “Süpermiş”
B.Controls.Add(C)
B.Location = New System.Drawing.Point(15, 15)
ObjectOfActiveScreen(i).Controls.Add(B)
End If
Was this answer helpful?
LikeDislikeYukarıdaki örneğin biraz genişletelim. Bu örnekte scada ekranında bulunan Button_0 nesnesi içerisine yeni bir buton ekliyoruz. Yeni eklenen butona tıklandığında Tag_1 değerini artırıyoruz. Bu işlemler aslında bir çok yeniliği gösteriyor. İlk olarak Button_0 tıklandığında yeni buton oluşturuluyor ve yazdığım script çalışması bitiyor. Bu script çalışmadığı halde, her hangi bir zamanda eklenen butona basıldığında Tag_1 değeri hem okunup hemde yazılabiliyor. Bu işlem yeni eklenen RWTagValue fonksiyonu ile yapılmaktadır. Bu fonksiyonu hem okuma hem de yazma için kullanabiliriz.
Örnek:
RWTagValue.Value(“Tag_1”) = 1234
Tag_2 = RWTagValue.Value(“Tag_1”)
Script içersinde bu fonksiyonu kullanmak için sayfa üst bölümünde “Public RWTagValue As Object” şeklinde tanıtılmalıdır.
Diğer bir özellik ise “Handle” işlemlerinin script içerisinde kullanımı olmuştur.
AddHandler C.MouseDown, AddressOf Button_MouseClick
Bu komut ile C nesnesinin MouseDown özelliğinde çalışacak Event yazılmıştır. C nesnesi üzerinde Mouse tıklandığında Button_MouseClick fonksiyonu çalışacaktır.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public RWTagValue As Object
Public ObjectOfActiveScreen As System.Collections.ArrayList
Public ObjectNameOfActiveScreen As System.Collections.ArrayList
Public Sub Load
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“Button_0”)
if i > -1 Then
Dim C as new Button
C.Text = “Buton”
C.Location = New System.Drawing.Point(5, 5)
AddHandler C.MouseDown, AddressOf Button_MouseClick
ObjectOfActiveScreen(i).Controls.Add(C)
End If
End Sub
Private Sub Button_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
RWTagValue.Value(“Tag_1”) += 1
End Sub
End Class
End Namespace
Was this answer helpful?
LikeDislikeScript ile nesnelere ulaşmak güzel bir aşama olmuş. Ancak benim hayalim, tasarım aşamasında iken oluşturduğumuz nesnelerin konumunu, yapısal özelliklerini ve taglarla olan ilişkilerini düzenleyebilmek. Biliyorum ki bu özellik diğer SCADA programlarında da yok. Ama bizim bir ayrıcalığımız olsa çok iyi olur bence
Was this answer helpful?
LikeDislikeTasarım aşamasında oluşturduğunuz nesnelerin yapısal özelliklerine script ile erişebilirsiniz. Tag’lar ile olan ilişkisine erişemezsiniz. Fakat script ile şekillendireceğiniz nesneleri Tag’lar ile ilişkilendirmenize gerek yok. Bu ilişki script içersinde yapılabilir.
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“TextBox_0″)
if i > -1 Then
ObjectOfActiveScreen(i).Location = New System.Drawing.Point(5, 5)
ObjectOfActiveScreen(i).Text = Tag_1
ObjectOfActiveScreen(i).BackColor = System.Drawing.Color.Red
End If
Yukarıda ki örnekte TextBox_0 nesnesinin yapısal özelliklerine erişilmiş ve Tag değerine göre yazı değiştirilmiştir.
Anlatmak istediğiniz başka bir şey olabilir, daha fazla açıklama yaparmısınız.
Was this answer helpful?
LikeDislikeBu örnekler ile bir kaç konuyu açıklamaya çalıştım. Bu örnekler haricinde bir çok şey yapılabilir. Galiba siz textbox değeri değiştirildiğinde Scada Tag’ının değerini değiştirmek istiyorsunuz. Aşağıdaki kod bu iş için kullanılabilir. Bu örnekte Textbox Keydown event’ı kullanılmıştır. Bunun gibi diğer tüm eventlar kullanılabilir. Scada ekranındaki TextBox_3’e her hangi bir tag ilişkilendirilmemiştir. Bu script ile TextBox_3 üzerinde her tuşa basıldığında KeyDown sub’ı çalışır. Eğer basılan tuş Enter ise Textbox değeri Tag’a aktarılır.
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace WinTr
Public Class MainClass
Public RWTagValue As Object
Public ObjectOfActiveScreen As System.Collections.ArrayList
Public ObjectNameOfActiveScreen As System.Collections.ArrayList
Public Sub Load
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“TextBox_3”)
if i > -1 Then
Dim t as TextBox = ObjectOfActiveScreen(i)
AddHandler t.KeyDown, AddressOf TextBox_3_KeyDown
End If
End Sub
Private Sub TextBox_3_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.Enter Then RWTagValue.Value(“Tag_1”) = sender.Text
End Sub
End Class
End Namespace
Not: Bu script bir defa çalışması yeterlidir. Bir kez çalıştığında interrupt olarak KeyDown event’ı bağlanır ve sayfa kapatılana kadar bağlı kalır. Bu script sayfa ilk açıldığında bir defa çalışması yeterlidir. Sayfa ilk açılışında çalışan script eski versiyonlarda Nesneler ekran üzerinde oluşmadan çalışıyordu. Yeni eklenen bu özellikten dolayı, çalışma zamanı sayfa nesneleri oluşturulduktan sonra olacak şekilde düzeltildi. Bu düzeltme 25.1.2015 18:00:00 da yapıldı. Eğer programı daha önce indirdiyseniz tekrar indirmeli, eski versiyonu uninstall edip yeni versiyonu kurmalısınız.
Was this answer helpful?
LikeDislikeC# kullanıcıları bu yazıyı mutlaka okumalı: https://www.wintr.com.tr/2015/01/c-ile-nesne-erisimi/
Was this answer helpful?
LikeDislike