FabyaVisionKullanım Kılavuzu
/

Python betikleri

5 dk okumaBetikler

Python betiğinin yapısı (Modül ve Aksiyon), desteklenen dil ve kitaplık, scada nesnesi, CPython'dan farklar ve izinler.

Dilin kapsamı

Python betikleri Live'da VBS ve C ile aynı kurallarla çalışır (düğme olayı, zamanlanmış görev, tag tetikli görev; arka planda, arayüzü kilitlemeden). Dil motoru ürüne özgü yazılmıştır: CPython kurulumu ve internet erişimi gerekmez. Motor Python 3.12'nin bir alt kümesini çalıştırır; davranışı ve hata iletileri CPython 3.12 ile karşılaştırılarak sınanmıştır.

Desteklenenler

  • Türler: sınırsız int, float, bool, str, bytes, bytearray, list, tuple, dict, set, frozenset, range, dilimler, çoklu atama ve açma (a, *b = x), zincirleme karşılaştırma, x if k else y.
  • Deyimler: if / elif / else, for ve while (else, break, continue), try / except / else / finally, raise … from, assert, with, match / case, global, nonlocal, del.
  • İşlevler: varsayılan değer, *args, **kwargs, yalnız-anahtar parametre, lambda, dekoratör, özyineleme (sınır 1000), üreteçler (yield, yield from), liste / sözlük / küme kapsamları.
  • Sınıflar: çoklu kalıtım, super(), @property, @staticmethod, @classmethod, özel yöntemler; f-dizgi ({x!r}, {x:>10.2f}, {x=}), str.format, % biçimi.
  • Standart kitaplığın hazır kısmı (import ile alınır): math, random (CPython ile aynı sayı dizisi), datetime, time, calendar, json, re, csv, statistics, collections, itertools, functools, string, textwrap, struct, base64, hashlib, decimal, fractions, enum, dataclasses, typing, io, uuid, heapq, bisect, contextlib ve diğerleri. Tam liste Başvuru panelindeki Kitaplık sekmesindedir.

Desteklenmeyenler

Aşağıdakiler kullanılırsa betik açık bir iletiyle (NotImplementedError) durur ve Studio önceden uyarır:

  • async / await / asyncio (gerekmez: tag yazma, bekleme, veritabanı ve dosya işlemleri otomatik beklenir)
  • eval, exec, compile, __import__, breakpoint, memoryview
  • karmaşık sayılar (1j), @ (matris çarpımı) işleci, metasınıflar ve tanımlayıcılar (property dışında)
  • iş parçacığı ve çok işlemli çalışma (threading, multiprocessing), ağ erişimi (socket, http, urllib.request, ssl), ctypes
  • üçüncü parti paketler (numpy, pandas, requests …): kurulamaz

CPython'dan bilinçli farklar

  • Sayı ve metin biçimi Windows bölgesel ayarından bağımsızdır: str(1.5) her zaman '1.5''tir (VBS'ten farklı).
  • Çalışma hataları Python'unkiyle aynı iletiyi taşır (str(e)); söz dizimi hataları Türkçe bildirilir.
  • Proje modülleri arasında döngüsel içe aktarma güvenilir değildir; ortak işlevleri üçüncü bir modüle taşıyın.

Betik türleri

Modül
İşlevler def ile tanımlanır; başka Python kodundan import Betik_Adı ile alınır. Modül düzeyindeki kod proje açılırken bir kez çalışır (bağımlılık sırasıyla). Olayda ya da görevde işlev seçilmezse modülle aynı adlı işlev çalışır; Prosedür / İşlev listesi modülün işlevlerini imzalarıyla sıralar.
Aksiyon
Her çağrıda baştan çalışır. Kodda def action() varsa o, yoksa def main(), ikisi de yoksa kodun tamamı gövdedir (en üst düzey return serbesttir ve dönüş değeridir).
Python modülü: araç satırında işlev listesi ile def ve class düğmeleri, altta işlev sayısı.123
Python modülü: araç satırında işlev listesi ile def ve class düğmeleri, altta işlev sayısı.
  1. PY — Python rozeti; tür: Modül.
  2. def / class — boş iskelet ekler.
  3. Durum şeridi — işlev ve sınıf sayısı.

Parametreler hücresi Python'da kilitlidir; işlev parametreleri kodda yazılır. Yeni betiğin başlangıç şablonu modülde betik adıyla aynı adlı bir işlev (def Tank_Kontrol(): pass), aksiyonda def action(): return 0 içerir.

Olaya doğrudan yazılan kod için Python kodu çalıştır işlevini kullanın: kod aksiyon gövdesi gibi çalışır, def gerekmez. Hazır adlar: Item (olayın nesnesi; sayfa olayında sayfa), ScreenItems, Layers, DataSet, Parent (olayın sayfası).

Tag değişince tetikli görevde tag'in yeni değeri işlevin ilk parametresine Python türüyle verilir (Bool → bool, tam sayı → int, Real → float, metin → str). Parametresiz yazılmış işlev de çağrılabilir.

Tag değerleri ve hatalar

DurumSonuç
Real / LReal tag okumakfloat: 50 değeri 50.0 gelir; 1 ile 1.0 farklı türlerdir.
DateTime tag okumakISO biçiminde str (tag.datetime ile datetime alınır).
Olmayan tagKeyError (scada.read("Ad", varsayılan) istisna yerine varsayılanı verir).
Sınırı aşan sayıValueError (tag'in alt / üst sınırı ya da tam sayı tipinin aralığı).
Türe uymayan değer (ör. sayı tag'ine metin)TypeError.
Kapalı betik izniPermissionError (try / except ile yakalanabilir).

Yakalanmayan hata betiği durdurur ve olay günlüğüne Modül / işlev, satır 12: ZeroDivisionError: division by zero biçiminde yazılır; program sürer.

Örnekler

Modül işlevi ve tag okuma / yazma:

# Bir tag'i okur, hesaplanan değeri başka bir tag'e yazar.
def Py_Tag_Oku_Yaz():
    seviye = scada.read("Tank1_Seviye")
    # Kalan boşluk (%) = 100 - seviye
    scada.write("Tank1_Bosluk", 100 - seviye)

Tag tetikli görev işlevi (tag'in yeni değeri parametredir):

def Py_Gorev_Islevi(yeni_deger):
    scada.write("Durum_Metni", f"Hız değişti: {yeni_deger}")
    if yeni_deger > 90:
        scada.write("Motor1_Ariza", True)

Hata yakalama:

def Py_Hata_Yakalama():
    try:
        sonuc = scada.read("Toplam_Miktar") / scada.read("Parti_Adedi")   # adet 0 ise ZeroDivisionError
        scada.write("Hata_Metni", "")
    except ZeroDivisionError as hata:
        scada.write("Hata_Metni", f"Hata: {hata}")
        sonuc = 0
    scada.write("Parti_Ortalama", sonuc)

Ortak modül ve içe aktarma. Py_Ortak_Hesap_Modulu adlı Modül betiğinde:

def olcekle(ham, alt, ust, ham_ust=27648.0):
    """Ham değeri alt ... ust aralığına çevirir."""
    return alt + (ust - alt) * ham / ham_ust

Başka bir Python betiğinde:

import Py_Ortak_Hesap_Modulu as ortak

def Py_Ortak_Kullanim():
    scada.write("Sicaklik", ortak.olcekle(scada.read("Sicaklik_Ham"), -50.0, 150.0))

Aksiyon:

def action():
    seviye = scada.read("Tank1_Seviye")
    scada.write("Tank1_Durum", "Yüksek" if seviye >= 80 else "Normal")
    return 0

Başka örnekler (wait_for, scada.db, open, json, re, dataclass) için Betik örnekleri konusuna bakın.

Sınırlar ve dikkat edilecekler

  • 30 saniye sınırı: bir çağrı en çok 30 saniye hesap yapabilir; scada.sleep ve diğer bekleme işlemleri bu süreye sayılmaz. Daha uzun döngü kesilir.
  • Üst üste çağrı atlanır: aynı tetik sürerken gelen ikinci çağrı çalıştırılmaz.
  • os, shutil, glob, tempfile, subprocess, pyodbc ve pathlib yerleşik değildir; kullanmadan önce import yazın. Alınmazsa NameError olur ve Studio tanımsız ad uyarısı verir.
  • Program başlatmada beklemek ya da çıktısını almak (scada.run(bekle=True), subprocess.PIPE, check_output, Popen.wait, os.popen) yoktur; tempfile.mkstemp yoktur. Veritabanında işlem (BEGIN / COMMIT) ve geçici tablo yoktur. Proje dosyasına ve program klasörüne yazılamaz.
  • HMIRuntime.Logging, AlarmLogs, DataLogs, Alarms, MenuToolBarConfig ve 3B sayfada nesne özelliği yazma desteklenmez.
  • Veritabanı, dosya ve program çalıştırma yalnızca sahte bir köprüyle sınanmıştır; sahada ilk denemede izin açıkken gerçek ortamda deneyin.
  • Betik, tarayıcıdan ya da TV'den izleme kipinde çalışmaz.

İlgili konular

FabyaVision 0.1.0 Kullanım Kılavuzu · 18 Ekim 2026© Fabyatek Yazılım Bilişim Teknolojileri Ltd. Şti.