VBScript betikleri
VBS betiğinin yapısı (Modül ve Aksiyon), desteklenen dil özellikleri, tag ve sayfa nesnelerine erişim ve gerçek VBScript'ten bilinen farklar.
Dilin kapsamı
VBS betikleri, ürünün kendi VBScript motorunda çalışır; Windows Script Host gerekmez. Motor, gerçek Windows VBScript motoruyla yan yana sınanmıştır (işleçler, dönüşümler, dizgi, tarih, biçimleme, diziler, hata davranışı, döngüler, prosedürler, sınıflar). Bilerek bırakılan farklar bu konunun sonundadır.
Desteklenen yapılar
| Grup | Yapılar |
|---|---|
| Bildirim | Dim, ReDim (Preserve dahil), Erase, Const, Option Explicit, Public / Private |
| Koşul | If … Then … ElseIf … Else … End If, Select Case (Case 1, 2, Case Else) |
| Döngü | For … Next (Step), For Each, Do … Loop (While / Until), While … Wend, Exit For / Exit Do |
| Prosedür | Sub, Function, Call, ByVal / ByRef, Exit Sub / Exit Function |
| Nesne | Set, Nothing, Is, With, Class (Property Get / Let / Set, Class_Initialize) |
| Hata | On Error Resume Next, On Error GoTo 0, Err nesnesi (Number, Description, Source, Clear, Raise) |
| Yazım | Satır devamı (_), : ile aynı satıra birden çok deyim, ' ve Rem yorumları, &h onaltılık sayılar, #tarih# sabitleri |
Yerleşik işlevler
Başvuru panelindeki İşlevler sekmesi tam listeyi verir. Gruplar:
- Dönüşüm:
CStr,CInt,CLng,CDbl,CBool,CDate,Round,Hex - Matematik:
Abs,Sqr,Sin,Log,Rnd; işleçler\,Mod,^ - Metin:
Len,Left,Mid,InStr,Replace,Split,Join,UCase,Trim,Chr,FormatNumber - Tarih ve saat:
Now,Timer,Year,Hour,Weekday,DateAdd,DateDiff,DateSerial - Sınama:
IsEmpty,IsNull,IsNumeric,IsArray,TypeName,VarType - Dizi:
Array,UBound,LBound,Filter - Etkileşim:
MsgBox,InputBox(ortada, temaya uygun pencere),RGB,CreateObject
Sabitler: vbCrLf, vbTab, vbYes / vbNo, vbYesNo, vbQuestion gibi MsgBox sabitleri ve vbRed gibi hazır renkler.
CreateObject ile üretilebilen nesneler
| ProgID | Ne için | İzin |
|---|---|---|
Scripting.Dictionary | Anahtar → değer listesi | Gerekmez |
System.Collections.ArrayList | Büyüyebilen liste | Gerekmez |
VBScript.RegExp | Düzenli ifade (Pattern, Test, Execute, Replace) | Gerekmez |
ADODB.Connection, ADODB.Recordset, ADODB.Command | ODBC ile veritabanı sorgusu | Veritabanına bağlanma |
WScript.Shell | Program başlatma (Run) | Program çalıştırma |
Scripting.FileSystemObject | Dosya ve klasör işlemleri | Dosyalara erişme |
WScript.Network | Bilgisayar ve Windows kullanıcı adı | Gerekmez |
Başka bir ProgID verilirse çalışma sırasında hata oluşur; Studio da derlemede uyarır.
Betik türleri
Modül
Prosedürleri (Sub, Function) barındırır. Bütün VBS modüllerinin prosedürleri ve modül düzeyindeki değişken / sabit bildirimleri ortak bir ad alanındadır: bir modülde tanımlı prosedür başka bir modülden adıyla çağrılır. Bu yüzden iki modülde aynı prosedür adı kullanılamaz (Studio hata verir). Aynı modülde ikinci tanım sessizce geçerli olur (Studio uyarır).
Olayda ya da görevde prosedür seçilmezse modülle aynı adlı prosedür çalışır; farklısı çalıştırılacaksa Prosedür listesinden seçilir. İşlev dışındaki satırlar proje açılırken bir kez çalışır.
' T-101 şerbet tankı seviye denetimi (Tanıtım_Tesisi)
Const ALT_SINIR = 40
Const UST_SINIR = 88
Function Seviye_Durumu(seviye)
If seviye < ALT_SINIR Then
Seviye_Durumu = "DÜŞÜK"
ElseIf seviye > UST_SINIR Then
Seviye_Durumu = "YÜKSEK"
Else
Seviye_Durumu = "NORMAL"
End If
End Function
Sub Tank_Seviye_Denetimi()
Dim seviye, durum
seviye = SmartTags("T101_Seviye")
durum = Seviye_Durumu(seviye)
If durum = "NORMAL" Then
SmartTags("T101_Uyari") = 0
Else
SmartTags("T101_Uyari") = 1
End If
End Sub
Aksiyon
Her çağrıda baştan çalışan koddur. Kodda Function Action() (ya da Sub Action) varsa o çalışır; yoksa kodun tamamı gövde sayılır ve Exit Sub ile bitirilebilir. Aksiyonda prosedür seçilmez. Aksiyondaki yardımcı Function'lar yalnızca o aksiyonun içinde görünür.
Option Explicit
Function Action()
If SmartTags("Tank1_Seviye") >= 80 Then
SmartTags("Tank1_Durum") = "Yüksek"
Else
SmartTags("Tank1_Durum") = "Normal"
End If
Action = 0
End Function
Olaya yazılan VBS kodu
VBS kodu çalıştır işlevinde kod doğrudan olaya yazılır (aksiyon gövdesi gibi çalışır). Burada Item (olayın nesnesi; sayfa olayında sayfa), ScreenItems, Layers, DataSet ve Parent (olayın sayfası) hazırdır.
' Tıklanan nesnenin rengini değiştirir
Item.BackColor = RGB(255, 0, 0)
Tag değerlerinin VBS'te görünümü
- Bool tag VBS'e "ikili" değer olarak gelir:
= 1,= True,If x Then,Not x,And/Orhepsi çalışır.CInt1 ya da 0,CStr"1"ya da"0",TypeNameBooleanverir. YazarkenTrue,1ve sıfırdan farklı her sayı 1 olarak yazılır. - Nesnelerin mantıksal özellikleri (
Visible,Enabled,FontBold…) tag değildir; gerçekBoolean(True/False) döndürür. - Sayı ve tarihi metne çevirme Live bilgisayarının Windows bölgesel ayarını izler: ondalık ayraç virgülse
CStr(1.5)"1,5",CDbl("1,5")1.5olur. Sabit biçim gerekiyorsaDay,Month,Year,Hour… ile parçaları birleştirin. - Kalite:
HMIRuntime.Tags("Ad").QualityCodedeğeri 192 iyi, 84 tag sınırının dışında, 8 bağlantı yok demektir. - Olmayan tag ya da yazılamayan değer betiği durdurmaz. Projede olmayan tag okunursa değer
Emptydöner,LastErrordolar ve olay günlüğüneTag bulunamadı (okuma): Aduyarısı düşer; yazma için deTag bulunamadı (yazma): Adyazılır. Tag'in türüne çevrilemeyen değer (ör. sayı tag'ine metin) de aynı biçimde günlüğe yazılır, tag değişmez. Bu durumları yakalamak içinTag.LastError(0 = hata yok) veTag.QualityCodedeğerlerine bakın. - Tag adlarında büyük / küçük harf farkı aranmaz.
Hata yakalama
Yalnızca On Error Resume Next ve On Error GoTo 0 desteklenir. Hata kontrolü Err.Number ile yapılır.
Sub Hata_Yakalama()
Dim sonuc
On Error Resume Next
sonuc = SmartTags("Toplam_Miktar") / SmartTags("Parti_Adedi") ' adet 0 ise hata 11
If Err.Number <> 0 Then
SmartTags("Hata_Metni") = "Hata " & Err.Number & ": " & Err.Description
sonuc = 0
Err.Clear
Else
SmartTags("Hata_Metni") = ""
End If
On Error GoTo 0
SmartTags("Parti_Ortalama") = sonuc
End Sub
Yakalanmayan hata betiği durdurur ve olay günlüğüne Modül / Prosedür, satır N: ileti (hata numarası) biçiminde yazılır. Program çalışmaya devam eder.
Veritabanı, dosya ve program
Bu nesneler Betik İzinleri'ne bağlıdır. Veritabanı bağlantısı durumsuzdur: her komut kendi bağlantısını açıp kapatır; işlem (transaction), geçici #tablo ve kayıt kümesi üzerinden güncelleme (AddNew, Update, Delete) yoktur. Kayıt ekleme ve değiştirme conn.Execute "INSERT …" ile yapılır. WScript.Shell.Run programı başlatır ama bitmesini beklemez. Ayrıntı: Veritabanı erişimi.
Gerçek VBScript'ten bilinen farklar
| Konu | FabyaVision |
|---|---|
Execute, ExecuteGlobal, Eval, GetObject, GetRef | Yok. Kullanılırsa 'Eval' bu sürümde desteklenmiyor gibi bir hata ile durur. |
On Error GoTo etiket, Resume | Yok; söz dizimi hatası verir. |
| Sayı alt türleri | Yok. Sayılar tek türde tutulur; TypeName değere göre ad verir (5 için Integer, 1.5 için Double). CSng 7 anlamlı basamağa yuvarlar ama Single türü oluşmaz. |
Class_Terminate | Çağrılmaz (nesnenin ne zaman bırakıldığı bilinemez). |
| Türkçe harfli adlar | Değişken ve prosedür adlarında ş, ğ, ı gibi harfler kabul edilir (gerçek VBScript yalnızca ASCII harf kabul eder). |
ByRef | Kopyala ve geri yaz biçiminde çalışır. |
| Adı Dim'siz kullanılan değişkenler | Modül düzeyinde geçen ad her prosedürde geneldir. Option Explicit kullanırsanız tanımsız ad Değişken tanımlı değil hatası verir. |
Sınırlar ve dikkat edilecekler
- Bir çağrı en çok 30 saniye hesap yapabilir; yalnızca kodun kendi çalıştığı süre sayılır (tag yazma, veritabanı,
MsgBoxbeklemesi sayılmaz). VBS'te bekleme işlevi yoktur; zaman farkını denetleyenDo Whiledöngüsü kodun kendi süresi sayılır ve kesilir. Uzun beklemeler için döngüsel görev kullanın. HMIRuntime.Alarms,AlarmLogs,DataLogs,LoggingveMenuToolBarConfigbu sürümde yoktur.- Aynı görev ya da olay satırı için önceki çağrı sürerken gelen çağrı atlanır.
- Betik, tarayıcıdan ya da TV'den izleme kipinde çalışmaz.