Home » Sayfa Düzenleyici » Scada Sayfa Nesnelerine Script ile Erişim
Scada Sayfa Nesnelerine Script ile Erişim
Posted by Salih on Oca 23, 2015 in Sayfa Düzenleyici, Script Writer | 13 comments
Scada nesne Scada nesne script erişimi script
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.
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“TextBox_0”)
ObjectOfActiveScreen(i).Text = “Fultek”
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.
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”
Dim TextBox_0 as Object = ObjectOfActiveScreen(i)
Aynı script’de TextBox.BackColor özelliği için TextBox_0.BackColor = Color.Lime yazabiliriz.
Salih 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
İ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.
evet sorun eski versiyondaymış. güncelleme yapamamışım şimdi çalıştı.
Bu ö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″)
Nesnelerin ö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″)
Dim B as new TextBox
B.Text = “Salih”
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.
Bir ç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”)
ObjectOfActiveScreen(i).BackgroundImage = System.Drawing.Image.FromFile(“G:\grafik\icon\PNG_1\Clock.png”)
Bu şekilde script her çalıştığında resim yolunu değiştirirsek animasyonlar oluşturabiliriz.
Dat 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”)
C.Text = “Buton”
c.Location = New System.Drawing.Point(5, 5)
B.Text = “Süpermiş”
B.Location = New System.Drawing.Point(15, 15)
Yukarı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.
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.
Private Sub Button_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
RWTagValue.Value(“Tag_1”) += 1
Script 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
Tasarı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.
ObjectOfActiveScreen(i).Location = New System.Drawing.Point(5, 5)
ObjectOfActiveScreen(i).Text = Tag_1
ObjectOfActiveScreen(i).BackColor = System.Drawing.Color.Red
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.
Bu ö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.
dim i as integer = ObjectNameOfActiveScreen.IndexOf(“TextBox_3”)
Dim t as TextBox = ObjectOfActiveScreen(i)
AddHandler t.KeyDown, AddressOf TextBox_3_KeyDown
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
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.
WinTr Scada Yenilikler - SCADA | Plc | Scada Sistemleri | SCADA SOFTWARE - […] – Scada sayfalarında bulunan nesnelere script ile erişim sağlandı. Bu özellik hakkında daha fazla bilgi için yardım sitemizi ziyaret…