4 Ağustos 2026 Salı

Siemens Unified RT Hmi Faceplate Oluşturmak

https://ujk-ujk.blogspot.com/2026/08/siemens-unified-rt-hmi-faceplate.html
İçindekiler +

 Selam, bu uzun bir yazı olacak, Unified RT panellerde Faceplate tasarımını görürken bir yandan da bir PLC otomasyonunda fiziksel giriş ve çıkışların nasıl ekrandan manual kontrol edileceğini göreceğiz. 

Daha önce Wincc Comfort HMI ile faceplate tasarımı üzerine bir yazım olmuştu. Bu seferinde Unified HMI üzerinde yapacağız. Benzer olmasını beklerken , birçok farklılık olduğunu gördüm ve bunları sizinle paylaşmak istedim. Ayrıca uzun zamandır yazmak istediğim PLC otomasyon sistemlerinde giriş ve çıkışların manual kontrol edilmesi konusunu da bu yazıyla alakalı olarak içine katmak iyi olacak.

Ben gıda proses otomasyonu işleri yapıyorum ve gıda işleme sistemlerinde akışın durmadan devam etmesi için bir çok durumlarda sisteme manual müdahaleler gerekir. Örneğin bir seviye swici arızalandıysa ve operatör tankta ürün olduğunu biliyorsa manual olarak swici varmış gibi gösterebilmelidir. Swicin değişimi ancak tanktaki ürünün bitmesi sonrasında yapılabileceği için ve ürün kaybı olmaması için benzer manual müdahaleler zorunludur. 



TiaPortal'da S7-1200 CPU ve Wincc Unified HMI içeren bir proje

Başlamak için bir S7-1200 PLC ve bir Unified panel olan yeni bir proje oluşturalım. Ben 1212 serisi bir CPU ve MTP1000 unified comfort panel kullandım.



Bir network bağlantısı da ekledim. Ben otomasyon projesine başladığımda ilk işim bir IO listesi hazırlamak oluyor. Bu amaçla bir deneme liste oluşturalım. CPU ünitemiz üzerinde dijital giriş ve çıkışlar var. Analog giriş ve çıkış örnekleri için de bir 4-20 mA analog giriş-çıkış kombi modül ekleyelim.


Fiziksel alt yapı tamam. IO listesini ben excel dosyası (ya da Open Office Calc dosyası) olarak hazırlıyorum. Bu örnek için de şu dosyayı oluşturdum.


Bu tabloda ilk sütun (A sütunu) PLC modülü üzerindeki fiziksel bağlantı noktasının üzerindeki yazı oluyor. İkinci sütunda ise programımda ve ekranlarımda kullandığım IO nesnesi değişken isimleri var. Üçüncü sütun gördüğünüz üzere açıklamanın yer aldığı sütun. Dördüncü sütunda ise PLC programında yapılandırılacak olan IO adres bilgileri var, donanım yapılandırmasında bu adresler verilecek. Beşinci ve altıncı sütunlar ise bilgilendirme amaçlı konulmuş. Ben otomasyon projesin başlarken önce bu listeyi hazırlar elektrik sorumlusuna veririm, şeması panosu ona ait artık, benden çıkar. 

Öncelikle bu listeye göre IO modüllerinin adreslerini donanım yapılandırmasında tanımlamak gerekiyor. CPU üzerindeki adresler zaten CPU modülünü donanıma eklediğimizde otomatik olarak bu adreslerle oluşturuluyor. Analog giriş/çıkış modülünün adreslerini de hazırladığımız listeye göre verelim.


Sıradaki içimiz modül özelliklerindeki IO tags sekmesinde fiziksel bağlantılar için verdiğimiz adresleri yazmak. Burada direk listemizden kopyalayıp grup halinde sütunları yapıştırmak mümkün.


Benzer şekilde analog giriş/çıkış modülünü de yaparsak.


IO İsimlendirmelerindeki Mantık

Bir PLC programı yazarken dışarıdan fiziksel girişlere bağladığımız değişkenleri program içerisinde kullanmak akıllıca değil. Bunun iki sebebi var. Birincisi listede program yazıldıktan sonra , ne bileyim , mesela belli bir kablo grubunu bir araya falan toplamak sahada pano montajı için daha uygun olduğunda bir tek yerde değişiklik yapıp işi bitirmek ve hakimiyeti kaybetmemek lazım. Bu benzer şekilde bir giriş ya da çıkış bozulduğunda sağlam olan boştaki birine bağlayıp programa bulaşmadan işi bitirmek için de gerekli. İkinci ve en önemli sebep ise , biz bu girişleri manual kontrol edebilmek için manual kontrol rutinlerinden geçirerek otomasyon programımızda kullanacağız. Yani operatör ekrandan bir swicten sinyal gelmediği halde geliyor olarak gösterirse otomasyon programımız o sinyal geliyormuş gibi çalışmaya devam etmelidir. Bu yüzden program içerisinde işlenmiş giriş değerleri kullanılacak, bunlar sa fiziksel bağlantı noktaları yani force edilmedikten sonra fiziksel değeri ne ise o. 

Aynı işlemin tersini çıkışları verirken yapacağız. Otomasyon programı çıkış için bir değer oluşturacak, ama biz o değeri çıkışa vermeden önce işleyeceğiz. Operatör manual olarak otomasyonun verdiğinden başka bir değer vermek zorunda kalabilir. 

Laf aramızda burada operatör deyip duruyorum da bu sıradan bir operatör değil , yaptığı müdahalelerin ne sonuçlar doğuracağını  prosese hakim olarak bilen gelişmiş bir operatör. Buna biz gelişmiş operatör diyoruz (Advanced Operator) ve şifrelerle bir üst yönetim yetkisine sahip yapıyoruz.

Analog giriş ve çıkışlarda ise manual kontrolden başka bir şey daha gerekiyor. Analog girişler PLC tarafından okunurken 4-20 mA'e karşılık 0 - 27648 arasında bir tam sayı verir bize. Ancak bizim bu değeri mesela 0-150 santigrad dereceye ya da %0-%100 seviyeye ya da 0 - 6 Bar'a çevirmemiz gerekecek yani Real bir sayı. Bu bir scaling (ölçeklendirme) işlemidir ve bunu da girişi otomasyon programında kullanmadan önce yapmamız gerekiyor. Manual değer girilmesi de tabi ki bu ölçeklendirmelere bağlı olduğundan manual kontrol ve ölçeklendirme işleri analog değerler için aynı yerde yapılmalıdır. 

Analog çıkışlarda ise otomasyondan çıkan real değeri 0 - 27648 arasında bir tam sayı değere ölçeklendirmemiz gerekir ki bunu fiziksel çıkışa yazalım ve 4-20 mA arası bir çıkış elde edelim. 

Ne çok konuştuk, neyse programımıza dönelim.



Örnek IO Listesinde Neler Var

Listemizde en üstte acil duruş butonu girişi var. Diğer girişler sadece çıkışların feedback'leri, çıkışların durumuna göre bu geri besleme bilgileri istediğimiz gibi olmazsa alarm vermek , belki de otomasyon programına bazı eylemler yaptırmak gerekebilir. Oraya bedava konmamıştır herhalde. P01 pompasının sadece ON feedback'i var, yani enerjilenince gelen FB. Mantıken P01 pompası enerjili iken bu FB gelmesi ya da tersine enerjili değilken bu FB'in gelmemesi koşulu var. Aksi olursa bir süre beklenip çıkış için alarm üretmeliyiz. V01 vanasında ise OFF feedback var yani çıkış enerjisizken FB sinyali gelmesi bekleniyor, az evvelkinin tam tersi. Demek ki vananın kapalı olduğundan emin olmak çok önemli az da olsa açık olması kabul edilmiyor. V02 vanasında ise hem ON hem de OFF feedback var. Demek ki bu vananın tamamen açık ve tamamen kapalı olduğundan emin olunmak isteniyor. V03 vanasına ise FB konmamış, bu vana da mesela ucuza gelsin diye FB konmamış olabilir. 

Analog girişlerimizde 4-20 mA analog değerler gelecek. Bir sıcaklık sensörümüz var, ki etiket değeri 4-20mA'e karşılık 0-150 derece olarak bize verilmiş. Gıda prosesinde çok kullandığımız bir sıcaklık sensörü modeli. Bir tane de seviye okuyucu var tanktaki ürün seviyesini okuyor olabilir. 20 mA gönderdiğinde tank %100 dolu olacakmış. Bu bir şamandıra sensör, basınç sensörü veya ultrasonik sensör olabilir. 

Analog çıkışlarımızda pompanın hızı ve buhar vanası açıklığını koymuşuz. Her ikisine de otomasyon programımızdan 0-100 arası değer üretiriz ve buna karşılık 4-20 mA çıkışa verilir. 



S7-1200 Dijital Giriş İşleme Programları

PLC programlarını oluşturmaya başlayalım. En kolayı dijital girişleri işleyen program. Bu yazı boyunca bir sürü PLC ve HMI programı yazacağız. En iyisi kullanacağımız fonksiyonların ve data blokların bir resmini verelim de başımıza neler gelecek ön bilgimiz olsun.


Vay vay vay, önümüzde daha çok yol var. Bunların dışında bir de HMI programları gelecek. Ancak bu alt yapıyı bir kurduktan sonra , ileriki projelerde standart bir yapı kurulmuş olacak ve bir ofis tablosundan ya da bir yardımcı Windows programından ya da yapay zekadan yaralanarak , başta oluşturduğumuz IO listesinden bu programlara 1 saat içinde geçebilirsiniz. Ben bugüne kadar en çok ofis tablo dosyaları kullandım, son zamanlardaise VueJs kullanarak hazırladığım bir single page web app (SPA)  kullanıyorum.

Şimdi biz uzun yolu tercih ederek bu kodları tek tek , satır satır oluşturacağız. Öğrenmek için mecburuz. 

Her otomasyon programımda en üstteki OB31 periyodik sistem programı bulunur. Task100ms adını verdiğim bu periyodik çalışan OB 100 milisaniyede bir tarama çalışıyor. Doğal olarak bunun içinde çağırdığım tün fonksiyonlar da 100 milisaniyede bir çalışıyor. Bu sayede o fonksiyonlar içerisinde zaman sayma ve kontrol işlerini kolayca yapabiliyorum. Bu sistem fonksiyonunu şu özelliklerle programlara ekleyelim.


Programlama dili olarak Ladder pek kullanmıyorum, genelde ihtiyaçlarıma göre Function Block Diagram (FBD) ve Structured Control Language (SCL) programlama dillerini kullanırım. T100ms programlamasında da FBD kullanacağız. 

Şimdilik T100ms fonksiyonu içi boş, bir şey yazmayacağız. Dijital girişlerle ilgili bir ihtiyacımız yok. Peki dijital girişler için bu programların hangileri kullanılacak?

IO klasörü altında tüm giriş/çıkışları işleyecek fonksiyonlarımız ve data bloklarımız toplanmış durumda. DIGIN_BITS data bloğu (DB200) işlendikten sonra otomasyon programımızda kullanacağımız dijital girişleri içeriyor ve tabii ki Bool değişkenlerden oluşuyor. IO listemizde dijital giriş olarak işlenecek sadece EMRG01 acil duruş düğmesi var. Diğer girişlerin hepsi dijital çıkışların feedback'leri. Aslında yanlış yapmışız, bir otomasyon programında acil duruş düğmesi operatörün ekrandan manual değer girebileceği bir şey olmamalı, eğer bu buton çalışmazsa sistemde sıkıntı olunca butona basılarak sistemin durdurulması engellenememesi gerekir. Neyse şimdilik örnek yapıyoruz, amaç dijital girişi nasıl işleriz görmek.

DIGIN_INTS data bloğu (DB201) bir dijital girişi işlerken bize yardımcı olacak bitleri içinde toplayacağımız tamsayı değerlerden oluşan bir data blok. İçinde her dijital giriş için bir tamsayı (Int) değer olacak. Bu tamsayı değerler HMI animasyonlarında ve manual kontrollerde gereken bitleri de içerir. 

Öncelikle IO listemizden işlenecek her dijital giriş için bu data bloklarında değişkenler oluşturalım. Burada IO listesi tablosundan kopyalayarak değişkenleri oluşturabiliriz. Dediğim gibi şimdilik sadece bir tane girişimiz var. 

DIGIN_BITS data bloğu içine şunları girelim,


Her bir dijital giriş için bir Bool değişken var ve bunlar HMI programlarında kullanılmayacak, HMI için DIGIN_INTS data bloğu içindeki tamsayı değerlerin bitleri kullanılacak.

DIGIN_INTS data bloğu içine de şunları girelim,


Her bir dijital giriş için bir tamsayı (integer) değişken olacak ve bu değişkenlere HMI programları erişebilecek. Bu 16 bit tamsayının içinde dijital girişleri işlemek ve ekran animasyonunda kullanmak için yararlanacağımız bit numaraları şöyle,

  • Bit 0 : İşlenmiş olan değer, yani DIGIN_BITS içindeki bool değişkene konacak ve otomasyon programı içinde işlenmiş olarak kullanılacak değer. Bu bit ekran animasyonunda o girişin aktif olduğunu gösterir, mesela bir seviye swici ise bu bit setli ise içi yeşil renk olur.
  • Bit 1 : Dijital girişin manual olarak kontrol edildiğini gösterir. Bu bit setlenirse o giriş manual kontrol ediliyor demektir. Ekrandan operatör isteğiyle setlenir veya resetlenir ve setli olursa giriş gösteren nesnenin etrafında ekranda sarı bir çerçeve gösterilir ki o girişin manual kontrol altında olduğu ekrana bakan tarafından bilinsin. 
  • Bit 2 : Alarm biti, bu bit setliyse o girişle ilgili bir alarm durumu söz konusudur. Dijital çıkış olursa alarm feedback hatası olabilir ama dijital giriş için sadece duruma özel olabilir. Bu bit girişi işlediğimiz programın dışından setlenir, örneğin fieldbus IO ise ve bus bağlantısında sorun olup giriş değerine erişilemiyorsa bu bit setlenerek HMI üzerinde alarm verilmesi ve görselinde kırmızı yakıp sönerek sıkıntı olduğu gösterilmesi mümkündür.
  • Bit 3 : Alarm engelleme biti (Mask deriz). Bu biti operatör setleyerek o giriş ya da çıkışın alarm vermesini engeller. HMI animasyonunda o eleman etrafında kırmızı bir çerçeve çizilerek alarmının engellendiği gösterilir.
  • Bit 4 : Manual değer biti. Bit 1 setliyken bu bitin değeri girişin manual değeri olarak otomasyon programına gönderilir. Bu bit animasyonda kullanılmıyor ama girişe manual değer vermek için kullanacağımız popup pencerede setlenir ya da resetlenir. 


Şimdi bu esaslar doğrultusunda dijital girişi işleyen fonksiyonumuz olan DIGIN_FC fonksiyonumuzu (FC 200) oluşturalım. 


DIGIN_FC Tasarımı

Bu fonksiyonun görevi fiziksel girişi alıp yukarıda verdiğimiz bitlere göre manual ya da otomatik olarak bir çıkış değeri oluşturacak. Bu fonksiyonumuzun dış ortamla olan bağlantıları şöyle.


FIZ_INP fonksiyonumuza giriş olarak fiziksel girişten gelen değeri veriyor. Bu fonksiyonu kullanırken mesela acil duruş butonu için bur girişe I40_0_0 değişkeni (%I0.0) bağlanacak.

AL_RST girişi ise eğer bu giriş için alarm verildiyse (yani alarm biti olan bit-2 setlendiyse) bu giriş setlenince fonksiyon alarm bitini sıfırlayacak. Bu girişe PLC hafızasında tanımlayacağımız bool bir değişkeni bağlarız ve HMI ekranında bir buton yardımı ile alarmların sıfırlanmasını sağlarız.

LOG_OUT çıkışı otomasyon programına gönderilecek olan işlenmiş giriş değeri. Giriş otomatikteyse yani bit-1 sıfırsa direk olarak fiziksel giriş buraya konur. Eğer giriş manualdeyse bit-4'teki değer bu çıkışa verilir. Bu çıkış DIGIN_BITS data bloğunda girişimize karşı gelen değişkene bağlanır ve otomasyon programı da onu giriş olarak kullanır.

INP_WORD girişi temsil eden 16 bitlik word değişken yani DIGIN_INTS data bloğundaki girişle aynı isimdeki tamsayı değer. Bu değer fonksiyonumuza hem giriş hem çıkış olacak. Operatörün ekrandan değiştirdiği bitlerine göre işlemler yapılıp tekrar aynı tamsayı içine konarak fonksiyondan çıkılacak. 

Bir de fonksiyon için geçici değişken olan MASK var bunu da fonksiyon içinde alarmın engellendiğini gösteren bit-3 değerinin aynısı. Çıkışları da incelerken neden dahili bu bool değişken var daha iyi anlayacağız.

Gelelim fonksiyonun içinde neler var. Bu fonksiyonu SCL program olarak yazdım.


SCL programı anlamakta sıkıntı çekecekler için bu programı Ladder diyagram olarak yazarsak şuna benzer bir şey olur,


Ben ladder diyagram dilinde program yazmayı verimli bulmuyorum, sadece basit otomasyonlarda güle eğlene iş yaparken kullanırım. Ama ciddi proses programları yazacaksam SCL kullanırım. 3-4 bin satırlık SCL kodları içeren fonksiyonlar yazdığım var. Aynı anda programın geniş bir kısmını görmek isterim, yukarıda ladder yazarken bile dikkat ederseniz kaç tane işi tek bir network içinde yaptım ki tek ekranda görünebilsin. Ama merak etmeyin böyle de çalışır. 

Neyse, programı inceleyelim. Eğer giriş otomatikte ise (bit-1 sıfırsa) fiziksel giriş çıkışa verilir. Giriş manualde ise bit-4'teki manual değer çıkışa verilir.

İkinci olarak çıkışa verilen bu değer girişimizi temsil eden word'ün bit-0'ına da konuyor ki ekranda animasyonda kullanılsın.

Son olarak da alarm reset girişi setli ise ya da alarm engelleme biti (bit-3) setli ise alarm biti resetleniyor. 

Sıra geldi hazırladığımız fonksiyonu girişlerimiz için kullanmaya. Bu amaçla daha önce programlar listesinde gösterdiğim INPUTS fonksiyonunu (FC ) kullanacağız. Tabii ki bu fonksiyon da SCL ile yazılacak. En önemli sebebi IO listesinden bu programa kodları otomatik hazırlayan harici yardımcı programlarım olması, yüzlerce satır programı tek tek yazacak değiliz, aynı şeyleri tekrarla dur olacak. Ne diyor usta yazılımcılar? Dont Repeat Yourself - Kendini Tekrarlayıp Durma, tekrarlayan benzer kodları bir şekilde kısaltmanın yolunu bul. 


INPUTS Fonksiyonu

Bu fonksiyon içerisinde tüm dijital ve analog girişlerimizi işleyen kodlar olacak. Yegane dijital girişimiz olan acil duruş butonunu işleyen kodu yazalım.


O yukarıdaki DIJITAL yazan yorum satırlarını hazırlayan program yazmışlığım bile vardı , daha önce. Ama bunu üşenmedim elle yazdım. Mesela Ladder olarak aynı işi yapan bir kod yazsak,


Şeklinde olacaktı ama dediğim gibi ben o SCL kodların çoğunu tek tek yazmıyorum IO listesinden otomatik dönüştüren kodlar yazıyorum. Burada dikkati çeken sadece AL_RST değişkeni, bu değişken PLC giriş/çıkışlarında oluşan alarmları resetlemek için tanımlanmış bir memory biti. Bu bit operatör panelinden setlendiğinde tüm alarmları silmek niyetimiz var. 

Fonksiyon çıkışı "DIGIN_BITS".EMRG01 değişkenine veriliyor ve tüm otomasyon programı acil duruş butonu girişi olarak bunu kullanacak.

Tabii ki INPUTS fonksiyonu bizim tanımladığımız bir fonksiyon ve bir sistem fonksiyonu olmadığı için kendi kendine çalışmayacak. Bir sistem fonksiyonu içinde çağrılması gerekir. Bu amaçla Task100ms sistem fonksiyonu içinde INPUTS fonksiyonumuzu çağıracağız. Gıda proses otomasyonunda 100 milisaniyede bir girişleri okumanın bir sakıncası olmuyor, programın bir çok şeyi kontrol ederken saniyede bir kere bile karar vermesi yeterli oluyor. Ancak sizin kullanacağınız programlarda çok daha seri karar vermek gerekiyorsa bu fonksiyonu daha sık çalışan bir sistem fonksiyonunda (mesela her taramada çalışan OB1 içinde çağırabilirsiniz)


Galiba hazırız. Bir çalıştırıp deneme yapalım. PLC programımızı simülasyonda çalıştıralım.


PLC girişi I40_0_0 değeri FALSE olduğu için "DIGIN_BITS".EMRG01 değeri de FALSE olarak çıkar. Ancak girişi manual olarak göstermek istersek, kontrol word değişkeninin bit-1 ve bit-4'ünü setleriz. Yani 18 değeri gireriz.


Fonksiyon çıkışı TRUE değer aldı ve 18 olarak girdiğimiz değer de 19 oldu, çünkü çıkış değeri de bit-0'a yazıldı yani değere 1 eklenmiş oldu.

Girişi force'layarak giriş varken nasıl göründüğüne bakarsak , tabii önce kontrol word'e sıfır değeri girelim ki oomatiğe dönsün.


Gördüğümüz gibi girişin force edilmiş olduğunu gösterir bir tik geldi I40_0_0 değişkeni yanına. Giriş fiziksel olarak mevcutken de manual olarak yokmuş gibi gösterebiliriz. Kontrol word'üne sadece bit-1'in olduğu 2 değerini girersek,


Gördüğümüz gibi fiziksel giriş olduğu halde otomasyona giden değer FALSE olarak gidiyor.

PLC programımız çalışıyor şimdi ekrana geçip bu giriş için animasyonları bir oluşturalım. Bütün PLC programlarını kapatın. 




Unified HMI Programı

Öncelikle bir tamsayı değerin bitlerine göre animasyonları oluşturacağız. Geçici olarak HMI dahili tanımlı bir değişkenle yapalım daha sonra PLC değişkenine bağlarız. Screens bölümünde ANA EKRAN adında bir yeni sayfa ekleyerek başlayalım. HMI Tags kısmında da tempi adında bir integer yerel değişken ekleyelim. Denemeler yapmak için Runtime settings ayarlarında General sekmesinde Encrypted transfer bölümünde Activate encrypted transfer tikini kapatalım. Güvenlik sonra, önce öğreniyoruz.


Bu tamsayı değişkenin yukarıda bahsettiğimiz bitlerini değiştirebileceğimiz checkbox'lar oluşturarak başlayalım. 


Checkbox elemanı bir tamsayı değere bağlanınca eleman sayısı arttırıldıkça o elemanın bağladığı bit, sıradaki bit oluyor. Yanına bir de IO Field elemanı ekledik ki tamsayı değeri de görelim. Şimdi simülasyonda çalıştırıp bitleri değiştirebildiğimizi bir görelim. 


Dijital giriş animasyonlarında genelde daire şeklinde bir görsel kullanırım. İlk önce işlenmiş değeri yani otomasyon programının gördüğü değeri gösterelim. Sayfamıza 8 piksel çapında, çizgisi siyah, içi beyaz renk, çizgi kalınlığı 2 piksel bir daire ekleyelim. Backgroung - color animasyonunu tempi Tag'imizin bit-0 'ı ile yeşil olacak şekilde ayarlayalım.


Process - Tag değerini tempi olarak ayarlamayı unutmayalım. Hemen denemesini yapalım. 


Harekete başladık. Sırada dijital girişimizin manuale alındığını gösteren animasyon var. Bunun için önceki dairemizin etrafında sarı renkli bir halka göstereceğiz ki operatör o girişin manuale alındığını anlasın. Önceki dairemizin altında kalacak şekilde 15 piksel çapında, hem içi hem çizgisi sarı olan (ya da çizgi kalınlığı sıfır olan) bir daireyi tam ortalayacak şekilde yerleştirelim. Animasyonunda Visibility özelliği ile Tag değerinin bit-1'ine bağlayalım. Bu sefer animasyon için Expression kullanalım.

 


Burada Expression seçerken default Visibility değerini de görünmez yapıyoruz. Dikkat edelim. Şimdi eşitliği yazmak için Expressions sekmesine geçelim. 


Yazacağımız eşitliği hatasız yapmak için 3 nokta butonuna tıklayıp açılan kod yardımcısını kullanabiliriz. AND16() metodu 16 bitlik 2 sayıyı AND işlemine tabi tutuyor, kendisini Bitwise açılır listesinde bulabiliriz. Herhangi bir Tag'i eşitliğimize eklemek için en baştaki Tag işaretini tıklayıp Tag listesinden seçebiliriz. Son olarak bu eşitliğin sonucu True olunca Visibility değeri görünür olacak şekilde işaretlemeyi unutmayalım. Bu eşitlikler bazen animasyonları daha kolay yapabiliyor, aklınızın bir köşesinde bulunsun. Hadi bunu da deneyelim.


Yavaş yavaş ortaya çıkıyor. Alarm biti işlenmiş değerin üzerinde kırmızı yanıp sönen bir daire olacak. Çerçevenin içinde kalabilmesi için bu daire 7 piksel çapında, çizgi kalınlığı sıfır olacak. Visibility animasyonu bu sefer bit-2 değerine göre olacak. Ama görünürken eğer işlenen değer (yani bit-0) sıfırsa kırmızı-beyaz, değer true ise kırmızı-yeşil yanıp sönecek.


Visibility eşitliği böyle olacak tahmin edersiniz. Yanıp sönme animasyonu için Background color animasyonunu Tag'imizin bit-0'ına bağlıyoruz.


Bit-0'a bağlanacak hata yapmayalım. Denediğimizde kırmızı-beyaz ve kımızı-yeşil yanıp sönmeleri bit-0 ve bit-2 değerlerine göre test edebiliriz. 

Sırada dijital girişimizin alarmının engellendiğini göstermek var yani bit-3 animasyonu. bu amaçla girişin etrafında kırmızı içi boş ince çizgili bir daire göstereceğiz. Çapı 15 piksel, çizgi kalınlığı 1 piksel, çizgi rengi kırmızı olan bir dairenin Visibility özelliğini bit-3 değerine bağlayıp önceki daireleri ortalayacak şekilde yerleştirelim.


Şimdi denersek bit-3'ü setleyince çerçevemiz görünür olacaktır.


Yapacağımız animasyonlar bu kadar, bit-4 gösterimine gerek yok, çünkü giriş manuale alınmadan bir anlamı yok ve manuale alındığında da zaten bit-0 bu değere eşit olacaktır. Biz girişin manualde olduğunu gösteriyoruz zaten. Ama bit-4 PLC değerleri ile oynarken manual kontrol amacıyla kullanılacak. 

Sırada bu yazının başlığında bahsedilen Faceplate oluşturmak var. 



Unified HMI Faceplate Oluşturmak

Bir tane girişi temsil eden animasyonlar yaptık. Ancak bütün bir proje düşünüldüğünde belki yüzlerce belki binlerce dijital girişimiz olabilir. Her biri için bunları kopyalasak bile dünya iş yapmamız gerekecek. Faceplate oluşturarak sadece bir yerde Tag bağlantısı girerek yeni dijital girişlerin animasyonunu yapabiliriz. 

Öncelikle elimizde sağlam kopya kalsın diye daha önce hazırladığımız grubun bir kopyasını alalım. Gruptaki elemanların tümünü seçip, sağ tıklayıp, açılan menüden Create faceplate seçelim. Faceplate düzenleme penceresi açılacaktır.


Şu anda bütün dairelerdeki animasyonlar uçtu gitti. Peki neden yaptık o kadar şeyi diye sorarsanız, önce oranın mantığını ayrıca çözelim, şimdi aynı şeyleri bir daha yapmak zor olmayacak. Adım adım gitmek lazım. Pencerenin en sağında Libraries sekmesinde yeni eklediğimiz faceplate adını değiştirerek başlayalım. 


İlk ayarlar şöyle. Faceplate özelliklerinde Background - fill pattern özelliğini transparent yapıyoruz. Genişlik ve yüksekliği 40 piksel yapıp görsellerimizi bu alanın tam ortasına koyuyoruz ki sembolümüzü grid ayarları 5 pikseldeyken yatay ya da dikey bir çizginin üstüne koyduğumuzda kolayca ortalayabilelim. 

Sırada aynı animasyonları dairelerimize tanımlamak var. Peki faceplate'imize dışarıdan bağlanacak Tag'i nasıl tanımlayacağız. 


Unified HMI Faceplate Tag Bağlantısı

Yukarıdaki sarı bilgilendirme bandını sağ üst köşesindeki çarpı işaretine basarak kapatırsak , karşımıza faceplate arabirimine ait (interface) sekmeler çıkacaktır. Sarı bandı merak etmeyin sol üst köşedeki ünlem işaretine tıklayınca tekrar görünür. Tag Interface sekmesinde Add new tıklayarak yeni bir Tag bağlantısı oluştururuz. 


Şimdi bu Tag'i kullanarak animasyonlarımızın hepsini tanımlayalım. Örneğin,


Aslında animasyonlar duruyor ama bu bir kütüphane (library) elemanı ve kütüphane elemanları projeler arasında taşınabilir. Bu yüzden mantık olarak içinde bulundukları proje Tag'lerine erişmeleri yapısı gereği olanaksızdır. Yapacağımız tüm animasyonları tempi yerine ConnectedTag değişkenine bağlamak olacak. Daha sonra sayfamızda faceplate ara birimindeki bu özelliği istediğimiz proje tag'ine bağlayabiliriz. 

İşimiz şimdilik bitti, sarı bandımızı tekrar açarak release the version linkine tıklayalım , böylece sisteme düzenlememizin bittiğini bildirelim ve HMI sayfamıza geri dönelim.


Unified HMI Sayfada Faceplate Kullanmak

Sağda Project Library başlığı altında yeni faceplate'imiz DijitalGiriş olarak görünüyor. Tutup sayfamıza çekelim ve ConnectedTag özelliğini tempi değişkenine bağlayalım.


Çalıştıralım ve tıkır tıkır çalıştığını görelim. İşler bitti sanıyorsunuz ama o kadar da kolay değil, daha çok yolumuz var.





Manual Kontrol Ekranı

Hayal edelim, dijital girişlerimizi manual değer girerek otomasyon programını kandırmamız için bir popup pencereye ihtiyacımız var. Söz konusu dijital giriş sembolünün üstüne tıklayınca bu popup açılacak ve burada bulunan butonlar yardımıyla dijital girişimizi temsil eden tamsayı değişkenin bitlerini değiştireceğiz. Yolumuz uzun, öncelikle popup ekranımızı hazırlayıp neye benzeyeceğini planlayalım. 


Bu küçük pencereyi Screens bölümünde ekleyeceğimiz POPUPS adında bir grubun içinde DIGIO_CTRL adıyla tanımlayalım. Adının bu olmasının sebebi dijital çıkışları manual kontrol etmek için de aynı popup kullanılacak.


Penceremizde neler var?

  • 260x350 piksel boyutunda, arka plan rengi 128,0,0 .
  • TagName yazan Textbox, 19 punto yazılı 25x250 piksel. Burada IO listemizin ikinci sütununda bulunan sembol adı yazacak
  • TagIO yazan TextBox, yine 19 punto yazılı 25x250 piksel. Burada da IO listemizin dördüncü sütununda yazan fiziksel bağlantı noktası kodu olacak. Bu teknik servisin proje aramadan müdahale hızını arttırdığı için burada gösteriliyor.
  • TagDesc yazan TextBox, 19 punto, 50x250 piksel. Burada IO listesi üçüncü sütunda bulunan açıklama bilgisi olacak.
  • Manuel Enerjili ve enerjisiz butonları 50x120 piksel. Bu butonlar bit-1 ve bit-4 üzerinden IO noktamızı manuel değerler ile kontrol edecek.
  • Otomatik yazan buton, 50x250 piksel. Bu buton IO noktasını otomatiğe alacak yani bit-1'i resetleyecek.
  • Maske on ve off butonları da 50x120 piksel olup alarm engelleme bitini (bit-3) set/reset yapacak.



TextList Kullanarak IO Bilgilerini Almak

Birçok IO noktamız var, ama bir tane manuel kontrol popup'ımız var. Bu popup içinde biz sadece HMI yerel Tag'lerini kullanacağız. Popup açılmadan önce bir script yardımıyla ilgili IO noktasının bilgilerini bu yerel Tag'lere alacağız. Herhangi bir butona basılınca da yerel Tag'de oluşturduğumuz bilgiyi ilgili IO Tag'ine yazıp popup'ı kapatacağız. Öncelikle yerel Tag'leri oluşturalım.


Niye DigTagVal? Çünkü analog giriş çıkışlar için de aynı TagName, TagIo ve TagDesc değişkenlerini kullanabilecekken, analoglar için Real bir değişken tanımlamamız gerekecek.

Tahmin edersiniz ama yine de açıklayalım: TagName değişkeninde sembol adı olacak yani IO listesindeki B sütunu. TagDesc IO noktası açıklaması yani IO listesindeki C sütunundaki bilgiyi içerecek. TagIo , IO bağlantı noktası kodu yani IO listesi E sütunundaki bilgi olacak. DigTagVal ise DIGIN_INTS ya da DIGOUT_INTS data bloklarından IO noktasını temsil eden tamsayı değeri alacak.

Şimdi, pencereyi açmadan önce bir script çalıştıracağız ve bu yerel Tag'lerin değerlerini vereceğiz. Hadi yapmışken popup pencereyi de bu script açsın. Scripts bölümüne IO_MODULE adında yeni bir modül ve bunun içinde DIGIO_OPEN adında bir script oluşturalım.


Bilgilerimizi bir listede toplayıp oradan çekmek amacıyla IO listemizde yer alan bilgiler içeren 3 adet liste tanımlayacağız. Text and graphic lists bölümünde TagNames, TagDescs ve TagIos adında 3 yeni liste oluşturalım. Bu listelere IO listemizden değerleri kopyalayacağız.

TagNames listesi şöyle:


tempi değişkenine ait değerleri de listeye ekledim , deneme için kullanırız. Bu değerleri IO listesi tablomuzdan kopyalayarak yapıştırabiliriz. Dikkat edilecek aynı numarada aynı IO noktası bilgileri olsun. Listeden feedback'leri almadık, onlar PLC programında kullanılacak HMI ekranında göstermeyeceğiz. 

Diğer listeler şöyle:

ve


DIGIO_OPEN script'imize ilgili IO adını parametre olarak vereceğiz. Daha sonra script bu ismi TagNames listesinde arayacak ve bulursa diğer listelerden aynı sıradaki bilgileri çekecek. Önce script parametrelerine tag_name adında bir parametre ekleyelim. 


Scipt kodumuzda şunlar var,

export function DIGIO_OPEN(tag_name) {

  Tags("TagName").Write("BULUNAMADI");
  Tags("TagDesc").Write("_YOK_");
  Tags("TagIo").Write("__YOK__");
 
  for (let i = 0; i < 200; i++) {
    if ( HMIRuntime.Resources.TextLists("@Default.TagNames").
            Item(i).Item(HMIRuntime.Language) == tag_name) {
      Tags("TagName").Write(tag_name);
      var tag_desc = "abcde";
      tag_desc = HMIRuntime.Resources.TextLists("@Default.TagDescs").
            Item(i).Item(HMIRuntime.Language);
      Tags("TagDesc").Write(tag_desc);
      Tags("TagIo").Write(HMIRuntime.Resources.TextLists("@Default.TagIos").
            Item(i).Item(HMIRuntime.Language));
      Tags("DigTagVal").Write(Tags(tag_name).Read());
    }
  }

  HMIRuntime.UI.SysFct.OpenScreenInPopup("DIGIO_POPUP", "DIGIO_CTRL", false,
        "IO KONTROL", 100, 111, false, undefined);
 
}


Öncelikle yerel Tag'lerimize aramanın başarısız olduğuna dair yazılar yazıyoruz. Eğer aranan bilgiyi listede bulamazsa popup'ta bu değerler görünecek ve bir sorun olduğunu anlayacağız. Sonra bir for döngüsü içinde sırayla TagNames listesindeki elemanın tag_name parametresi ile aynı olmasını test ediyoruz. Bilgiyi sorgularken HMIRuntime.Resources.TextLists metodu ile listeyi çekip içinde Item(i) metodu ile listedeki değeri çekiyoruz. Daha sonra bilginin o anda Runtime'da kullanılan dile ait yazısını çekmek için de Item(HMIRuntime.Language) işlemine tabi tutuyoruz. Bunu bulana kadar 2 gün boğuşmuştum. Birden fazla dil kullanılabilir olduğu için çoklu dil kullanımında bu listelerin diğer dillerdeki versiyonlarını da yazmak zorundayız. 

Eğer aradığımız IO adını TagNames listesinde bulursak , diğer listelerden de aynı sıradaki değerleri alıp yerel Tag'lerimize koyuyoruz.

Karşılaştırmanın son satırında ise parametrede ismi verilen Tag'in tamsayı değerini okuyup DigTsgVal yerel değişkenine yazıyoruz. 

Artık popup pencereyi açabiliriz. Burada kullanılan popup açma fonksiyonunu nereden buldun derseniz, ana sayfanıza bir buton koyup ona tıklanınca OpenScreenInPopup metodunu çağırın. 


Burada Popup window name parametresi pencere için sizin vereceğiniz bir isim, ama unutmayın, pencereyi kapatırken lazım olacak. Şimdi bunu script olarak nasıl yazarız görmek için , script'e çevirme butonuna basarız.


Bu kadar basit buton tıklaması ile yapabileceğimiz şeyleri script ile nasıl yaparız bu şekilde öğrenebiliriz. 

Şimdi bir deneme butonu koyup bu script'i çağıralım bakalım ne olacak? 


Butonun aktivasyonunda IO_MODULE.DIGIO_OPEN script çağrılıyor. Script parametresi öncelikle girilen yerin sağ taraftan tip olarak string seçilecek sonra tempi yazısı yazılacak. Belki script'i tanımlarken parametre tipi girilebiliyordur ama ben bu bilgiyi bulamadım. Butona tıklayınca popup doğru bilgiler ile açılıyor.


Yaşasın popup doğru bilgilerle açıldı. Artık popup'taki butonların animasyon ve aktivasyonlarına geçebiliriz.


Popup Buton Aktivasyonları

Aşağıdan yukarı doğru gidelim daha kolay olacak. MASKE OFF butonu, bu buton DigTagVal değişkeninin bit-3 değeri sıfırken yeşil olacak ve böylece alarmın engellenmemiş olduğunu gösterecek. Appearance özelliklerinde Background - color animasyonunda bunu ayarlarız.


Butonun aktivasyonunda da DigTagVal değişkeninin bit-3 değerini resetleyeceğiz ve pencereyi kapatmak için yazdığımız bir script içinde DigTagVal değerini ilgili IO Tag'ine yazacağız ve popup pencereyi kapatacağız. 


DIGIO_CLOSE script'inin içinde şunlar var,

export function DIGIO_CLOSE() {

  Tags(Tags("TagName").Read()).Write(Tags("DigTagVal").Read());

  HMIRuntime.UI.SysFct.ClosePopup("/DIGIO_POPUP");
}


Önce TagName değişkeninde saklı olan IO Tag adını alıyoruz ve o isimdeki Tag'e DigTagVal değişkeni içindeki değeri yazıyoruz. Sonra da popup pencereyi kapatıyoruz, buradaki triki nokta popup pencere adını girerken başına koymanız gereken / karakteri. Bunu bulana kadar da bayağı bir uğraşmıştım. Geliştiriciler bu şekil yapmadan bir yolunu bulamamış herhalde. Bir de ClosePopup metoduna parametre olarak verdiğimiz popup adı (DIGIO_POPUP) bizim daha önce pencereyi açarken kullandığımız OpenScreenInPopup metoduna parametre olarak girdiğimiz isimle aynı. Orada bu ismi unutmayın , lazım olacak demiştim. Aynı popup penceresinden birkaç tane değişik amaçlarla aynı anda açılması gerekirse her birine farklı isim vererek yönetebilmek amacı güdülmüş sanırsam. 

MASKE ON butonunu da siz yapın. DigTagVal değişkeni bit-3 setliyken rengi mavi olsun mesela. Tıklanınca da bit-3 setlensin. Bunu da yapıp deneme yaparsak sembolümüzün etrafında kırmızı halkanın bu butonlar ile görünmesini veya görünmemesini , yani alarmın engellenip engellenmediğini kontrol edebiliriz. 


OTOMATİK butonu ise bit-1 (yani manuele alma biti) sıfırken yeşil renk olacak ve tıklanınca yine bu biti yani bit-1'i sıfırlayacak. Aynı MASKE OFF butonu gibi ama bu sefer bit-1 ile çalışılacak.

MANUEL ENERJİLİ butonu biraz karışık, çükü hem iki bit'i değiştirecek hem de animasyonu o iki bit'e göre olacak. Tıklanmasından başlayalım,


Background color animasyonunu 2 bite birden bağlamanın en kolay yolu bir script animasyonu yapmak. 


Bu sefer animasyonda Tag değil Script seçiyoruz. Ve sağ tarafta bir script editörü açılıyor. 

export function Button_2_BackColor_Trigger(item, triggerDataSet) {
    var value;
    return value;
}


Bu script çalışacak ve bu script'ten dönen değer butona renk olarak verilecek. Script ne zaman çalışacak? Orada bir saat sembolü var, onu tıklarsanız birçok tetikleyici olaydan birini seçebilirsiniz ama bizim bunu seçmemize gerek kalmayacak. Script içinde DigTagVal değerini okuyacağız, eğer script içinde bir Tag değeri okunuyorsa o pencere açıldığında ve o Tag her değiştiğinde script tetiklenecektir. 

Şimdi script içini dolduralım,

export function Button_2_BackColor_Trigger(item, triggerDataSet) {
    if ((Tags("DigTagVal").Read() & 18) == 18) {
      return 0xffffff00;
    } else {
      return HMIRuntime.Math.RGB(255,255,255);
    }
}


Eğer DigTagVal bit-1 ve bit-4'ü setliyse (gerisi bizi ilgilendirmez) script 0xffffff00 değeri dönüyor, bu Turuncu rengin Hex olarak yazılmış değeri. İstersek renkleri HMIRuntime.Math.RGB() metoduyla da RGB değerlerini standart 0-255 aralığında girerek de belirtebiliriz. TIA portal özelliklerde genelde bu notasyonu kullanıyor dikkat ettiyseniz. Nitekim eğer iki bit birden setli değilse gidilecek olan else bloğunda biz de bu notasyonla Beyaz renk (255,255,255 tüm renkler full) geri döndük. 

MANUEL ENERJİSİZ butonu bit-1' setlerken, bit-4'ü sıfırlayacaktır. Onun renk animasyon scripti de şöyle,

export function Button_3_BackColor_Trigger(item, triggerDataSet) {
    if ((Tags("DigTagVal").Read() & 18) == 2) {
      return 0xffffff00;
    } else {
      return HMIRuntime.Math.RGB(255,255,255);
    }
}

Önce bize lazım olan 2 biti bırakıyoruz sonra bit-1 set, bit-4 reset olması durumunda yine turuncu değeri dönüyoruz. Bu şekilde script animasyonlarla daha neler yapacağız neler. 

Şimdi deneme yaparsak tempi değişkenimizin bitlerinde hakimiyeti görebiliriz. 



Unified Panel Faceplate Buton Aktivasyonu Eklemek

Sıra geldi popup açmak için kullandığımız butonun yaptığı işi faceplate'imize eklenen bir buton ile yapmaya. Bu amaçla sağda Libraries sekmesinde dijital giriş için hazırladığımız faceplate nesnesine sağ tıklayarak Edit type seçelim ve editörde düzenlemek amacıyla faceplate'i açalım. Tamamını kaplayacak şekilde 40x40 piksel bir butonu tam üzerine ekleyelim. Buton özelliklerinde Opacity değerini 0.5 yaparsak butonumuz yarı şeffaf bir hal alır ve altında kalan nesnelerimiz görünmeye başlar.


Bu butonu tasarım esnasında görünür çalışma esnasında tam şeffaf yapmak için bir animasyon kullanacağız.


WinCC Unified RT Tasarımda Görünen Çalışırken Görünmeyen Buton

Ayrı bir başlık yazdım , çünkü basit ama güzel bir animasyon. Yine Opacity özelliğini kullanacağız. Yapacağımız şey Opacity özelliği Dinamization seçeneklerinde Script seçmek ve script'ten sıfır değer dönmesini sağlamak. yani,


Peki script ne zaman çalışacak. Daha önce script animasyon yazarken script içinde okunan bir Tag değeri varsa , otomatik olarak o Tag değeri değiştiğinde ve ya değer ilk okunduğunda script çalışır demiştik. Burada ise bir Tag okuması yapılmıyor, bu durumda script'i periyodik olarak çağırmak seçeneği kalıyor elimizde. Script tetikleyicisini seçmemize yarayan ve üzerinde eski bir çalar saat resmi olan butona tıklayalım ve seçeneklerde 1 saniyelik periyodik tetiklemeyi seçelim. 


Butonumuz artık çalışma esnasında bu script sayesinde tamamen şeffaf olacaktır. İsterseniz devam etmeden önce deneme yapabiliriz. Editörde ünlem işareti tıklayıp sarı bilgi bandını görünür yapalım ve oradan Release the version seçeneğini tıklayalım. OK tıklamadan önce Update instances in the project seçeneği tiklenmiş olmasına dikkat edelim. 


Instances yani oluşumlar yani bu kütüphane elemanını kullanarak sayfalara eklediğimiz tüm nesneler yeni versiyon ile değiştirilecek. Bizim şu anda sayfada bu faceplate elemanından sadece bir tane var ama ileride yüzlerce olabilir. 

Tasarım penceresine otomatik olarak geri dönecektir, ve sayfadaki faceplate'imizin üzerine buton eklenmiş halini göreceğiz. Ama simülasyonda denersek buton görünmez olacaktır. 


FacePlate Butonu Olayı ve Yetki Kısıtlaması

Faceplate editörünü tekrar açalım. Bu butonun tıklanması ile faceplate dışında bir olayı tetikleyeceğiz ve butonun tıklanmasına bir yetki kısıtlaması getireceğiz. Çünkü her önüne gelen IO noktasının manuel kontrollerini yapamaz. Öncelikle butonun yetki kısıtlamasını yapmak için faceplate Property Interface sekmesinde Authorization adında yeni bir özellik ekleyeceğiz veri tipi de Authorization olacak. 


Butonumuzun yetkilendirmesini bu özelliğe bağlamak için Authorization özelliği dinamik olarak Property interface ve özellik olarak da az evvel tanımladığımız Authorization özelliğine bağlayalım.


Sıra geldi buton tıklanınca dışarıdan bir olayı tetiklemeye. Faceplate'imizin proje işlemlerine bağlantısını hep arabirim (interface) aracılığı ile yapıyoruz. Tıklama olayını da Event interface sekmesinde tanımlarız. Oraya da ClickEvt adında bir olay ekleyelim.


Faceplate'i sayfamızda bir yere koyarsak ve bu olaya bağlı işlemler yazarsak, olay tetiklenince o işlemler olacaktır. Peki olay ne zaman tetiklenecek? Bizim butona tıklanınca. Peki faceplate'in bundan haberi var mı? Yok. Buton tıklanınca bu faceplate olayını ateşlememiz lazım. Bunu butonun Click left mouse button olayına yazacağımız bir script ile yapacağız.


Bu kod ClickEvt isimli faceplate olayını ateşliyor (yani sistem o olayın gerçekleştiğini bildiriyor). Faceplate.RaiseEvent() metodundaki ikinci parametre olayın bir sol tıklama olayı olduğunu belirtmesi için değeri 1 olarak girilmeliymiş, bende internetin yalancısıyım. 

Buton, event ve authorization hazır deneme yapabiliriz. Faceplate'imizi release the version tıklayarak yeni haliyle yayınlayalım. 

Kullanmak için en önemli kısım yetkilendirme kısmı. Şu ana kadar projemizde kendi belirlediğimiz yetkilendirmeler yapmadık. Daha önce basit bir yetkilendirme örneği yapmıştım, onu kullanabiliriz. Oradaki yöntemi takip ederek aynı yetkilerde kullanıcılar ekleyelim.

Butonumuza AmirRight yetki seviyesinde bir kullanıcının tıklayabilmesini istiyoruz. Bunun için faceplate özelliklerinde Miscellaneous bölümünde Interface içinde Authorization özelliğinde AmirRight seçeriz. 


Butonun tıklanmasını faceplate ClickEvt olayına bağlamıştık. Bu olaya da daha önce deneme amaçlı kullandığımız butonun tıklamasına yazdığımız aynı şeyleri yazarız. 


Fonksiyon listesini önceki deneme butonundan kopyalayıp yapıştırabilirsiniz. Hadi deneyelim. Faceplate'e tıkladığımızda şifre sorma ekranı karşımıza çıkacaktır. 


Kullanıcı adını ve şifreyi belirlediğimiz gibi girersek artık butona tıklanınca popup açılacaktır. Denemler esnasında HMI RT yeniden başlatılmadığı sürece girilen kullanıcı şifresi geçerli olacağından sayfanın bir yerine LogOff fonksiyonunu çağıran bir buton ve bir yerine de şu anki kullanıcı adını yazan bir yazı koysanız iyi olur. 

Şimdilik tempi yerel değişkenimizle devam ettiğimiz için Manuel Enerjili yaptığımızda (ya da tersi) iç rengin değiştiğini göremiyoruz, çünkü o lojik PLC programında var. Şimdi faceplate nesnemizin bir kopyasını alıp onu da EMRG01 girişine bağlarsak PLC ve HMI her ikisi de simülasyonda iken PLC programının da çalışmasını test edebiliriz. 

HMI Tag'lerine DIGIN_INTS data bloğundaki EMRG01 değeriniz ekleyelim.


Sadece ConnectedTag özelliğini ve ClickEvt parametresini değiştirerek tamamen başka bit IO noktasını faceplate yardımıyla kontrol edebiliyoruz.


Sırada daha dijital çıkışlar, analog giriş ve çıkışlar var. Ama bu yazı çok uzadı , burada keselim , sonraki bölümlerde devam ederiz. Şimdilik kalın sağlıcakla..





Hiç yorum yok:

Yorum Gönder