Merhabalar,
Visual Basic 6.0 ile yazdığınız projeleri ActiveX olarak hazırlarsanız bir çok SCADA programında, hatta Power Point ve Excel içerisinde bile kullanabiliyorsunuz.
Şu an yine WinCC üzerinde çalışacak bir ActiveX geliştiriyorum. Beklenmedik şeyler çıksa da bir şekilde problemler aşılabiliyor. WinCC nin PLC ler ile haberleşme yeteneği var ama VB script desteği çok kötü. ActiveX ile bu sorun daha kolay aşılıyor.
WinCC için ActiveX yazarken dikkat edilmesi gereken şeyler:
- Dokümanda belirtildiği gibi, ActiveX nesnesinin özelliklerine (property) VB Script üzerinden ulaşamıyorsunuz. Ulaşmaya çalıştığınızda WinCC hata verip kapanıyor. Bu problemi aşmak için, WinCC içerisinde internal Tag tanımlayıp, ActiveX in özellikleri ile eşleştirme yapmak gerekiyor.
- Yukarıdaki yöntemi uygulayınca bir problem daha çıkıyor. WinCC Tag leri ile ActiveX propety leri eşleştirildiğinde bu eşleştirme tek yönlü çalışıyor. Yani WinCC den ActiveX e bilgi gönderebiliyorsunuz, ama ActiveX ten WinCC ye bilgi göndermek mümkün olmuyor.
- İlla ki ActiveX den WinCC ye bir kod / sayı göndereceğim derseniz, event kullanmanız gerekiyor. Ama WinCC nin bu konuda bir yetersizliği daha var. Event içerisinde gönderdiğiniz parametreleri dikkate almıyor. Bu nedenle, yukarıda CeyhanII nin verdiği linkte anlattığım yöntemi kullanmak işe yarıyor. Sayıları bu şekilde winCC ye bildirmek mümkün. Eğer string ifade iletmem gerekseydi kesinlikle ActiveX ile bir text dosyaya yazar, winCC de script ile o dosyayı sürekli okurdum.
- WinCC de ActiveX property ile bir Tag ilişkilendirildiğinde, WinCC bu Tag değerini sürekli ActiveX e yazıyor. Eğer ActiveX i yazarken bir özelliğin 'Property Let' bölümüne kod yazarsanız bu kod sürekli tetikleniyor. Tetiklenmemesi için, yeni gelen property bilgisinde değişiklik varsa kodu tetikleyecek bir değişiklik yapmanız lazım.
- ActiveX i WinCC üzerinde bir ekrana koyduysanız (screen), ActiveX sadece ekran görüntülenmekteyken çalışıyor. Başka bir ekrana geçiş yaptığınızda sizin ActiveX ler hafızadan siliniyor, tamamen yok ediliyor. Aynı ekrana geri döndüğünüzde sıfırdan yeniden yaratılıyorlar. Bu nedenle, eğer arka planda sürekli çalışması gereken işlemleriniz varsa bu ActiveX leri (Hepsini) Template içerisine yerleştirin. Görünmesini istemediğinizde Visibility değerini false yapın.
- Son bir bilgi daha; eğer ActiveX içerisinde bir Method (fonksiyon yazarsanız) içerisine 'Optional' parametre koymayın. yoksa projeyi derleyemiyorsunuz. Bu dediğim, VB6.0 ile yazılan ActiveX leri .Net uygulamalarından çağırmak için de geçerli. Optional parametre kullanmayın.
- Bu gün başıma gelen ilginç bir problem: SAX Comm ActiveX kullanarak veri toplayan bir ActiveX yazdım. Sistemdeki Com port sayısı 16 nın üzerinde olduğu için MsComm kullanamıyorum. Crack çözüm var ama kabul edilmiyor. Neyse, SAX Comm, onun etrafında SAX Comm u kullanan bir ActiveX daha var. WinCC üzerine bir tane koyduk problemsiz çalıştı. Sonra bir tane daha koyduk, ilk başta problemsiz gibiydi ama sonra fark ettik ki, her iki nesnenin farklı Comm portlardan okuduğu bilgiler aynı. Önce com port sürücülerinden şüphelendik onda problem yok. Sonra VB üzerinde iki farklı EXE üzerinden çağırdık problem yok. Tam WinCC ye çamur atmak üzereydik ki, bir de yazdığımız ActiveX i aynı VB formu üzerinde birden fazla kopya ile çalıştırmayı deneyelim dedik. Farklı Com portlardan aynı verileri almaya başladı.
ActiveX i 'single threaded' de yapsam, 'Apartment Threaded' de yapsam sonuç değişmedi.
WinCC üzerinde aynı ActiveX den 4 tane kullanmam gerekiyordu. Çözüm olarak aynı ActiveX i 4 farklı isimle derledim, VB üzerinde çalıştı önümüzdeki hafta WinCC ile deneyeceğim.
Bu da aklınızda olsun, eğer ActiveX üzerinde com port dan bilgi okuycak nesneleriniz varsa ve birden fazla ActiveX kullanacaksanız, önce gelen verilerin doğru yerden geldiğine emin olun.
Başka bir problem de çıkmadı, ActiveX kullanmak VBScript kullanmaktan daha verimli. Örneğin, ActiveX ile bir veritabanı bağlantısını açıp sürekli aynı bağlantı üzerinden SQL cümlesi çalıştırmanız mümkün. Ama VBScript ile her seferinde aynı veritabanı bağlantısını yeniden açmanız gerekiyor. Bu da performans kaybına neden oluyor.
- Hah, bir problem daha, yazdığım ActiveX üzerinde MSChart kullanmayı denedim, ActiveX im apartment threaded olarak ayarlıydı. MSChart 'Ben multithread uygulamalarda çalışamam' deyip hata verdi. Ben de 'yürü' deyip kullanmaktan vazgeçtim, grafiği normal picture box üzerinde çizdirdim. WinCC ile ilgili bir hata değil ama MSChart ile grafik de göstereyim derseniz çok mümkün değil gibi görünüyor.