Python betikleri
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,forvewhile(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ı (
importile 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,contextlibve 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 (propertydışı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
defile tanımlanır; başka Python kodundanimport 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, yoksadef main(), ikisi de yoksa kodun tamamı gövdedir (en üst düzeyreturnserbesttir ve dönüş değeridir).
123- PY — Python rozeti; tür: Modül.
- def / class — boş iskelet ekler.
- 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
| Durum | Sonuç |
|---|---|
| Real / LReal tag okumak | float: 50 değeri 50.0 gelir; 1 ile 1.0 farklı türlerdir. |
| DateTime tag okumak | ISO biçiminde str (tag.datetime ile datetime alınır). |
| Olmayan tag | KeyError (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 izni | PermissionError (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.sleepve 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,pyodbcvepathlibyerleşik değildir; kullanmadan önceimportyazın. AlınmazsaNameErrorolur 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.mkstempyoktur. 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,MenuToolBarConfigve 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.