İçeriğe geç

Server-Side Script Engine

Server-side script’ler inSCADA sunucusunda çalışır ve ins global objesi üzerinden platformun tüm yeteneklerine erişir. Bu sayfa engine, sandbox, zamanlama ve yaşam döngüsünü özetler; alt API’lerin detayı ayrı sayfalardadır.

JDK21 sürümünde script motoru GraalJS (GraalVM JavaScript) ile değiştirildi. Mevcut JDK11 script’lerinin kırılmadan çalışabilmesi için Nashorn compatibility mode aktif edildi (js.nashorn-compat: true). Pratik sonuç:

  • JDK11’de yazılmış script’leriniz (yalnızca var, function, ES5) değişiklik yapmadan çalışır.
  • İsterseniz modern JS kullanabilirsiniz: let / const, arrow fonksiyonları, template literal, destructuring, class, spread / rest operatörleri, async / await.
  • İki stili aynı script içinde karıştırmak güvenlidir.
ÖzellikDurum
var, function, ES5 standardı
let, const
Arrow fonksiyon (=>)
Template literal (backtick)
Destructuring
class / extends
Spread / rest (...)
async / await
eval(...)✗ (sandbox kapalı)
with (...)✗ (sandbox kapalı)

Script’lerin güvenliği Java host access üzerinden kontrol edilir. Script içinden yalnızca @HostAccess.Export ile işaretli Java metodları çağrılabilir — ins.* bu metodların script’e açılmış halidir.

YasakNeden
Thread oluşturmaScript’ler paylaşımlı thread havuzunda çalışır
Doğrudan dosya sistemi erişimiYalnızca ins.readFile() / ins.writeToFile() üzerinden
Native code (JNI / JNA)
Environment variable erişimi
Polyglot (diğer diller)
eval, with

exec, shutdown, restart gibi sistem komutları yalnızca ins.* üzerinden ve proje log’una düşerek çalışır.

LimitDefaultConfig anahtarı
Statement sayısı100 000ins.script.maxStatementCount
Yürütme süresi60 saniyeins.script.execution-timeout

Limiti aşan script iptal edilir ve ScriptException ile sonlanır; hata log’a düşer, platform etkilenmez.

Script context’ine otomatik enjekte edilen objeler:

GlobalTürAçıklama
insInscadaApiPlatformun tüm alt API’lerinin birleşimi (aşağıda liste)
userCurrentUserBindingAktif kullanıcı bilgisi — id, name, roles, permissions, activeSpace, remoteAddress, spaces, menus
Custom bindingsopsiyonelScript tanımı içinde bindings alanında verilen ek objeler

Nashorn’un meta global’leri (quit, exit, print, load, loadWithNewGlobal, $ARG, $ENV, $EXEC, $OPTIONS, $OUT, $ERR, $EXIT) güvenlik için no-op yapılmıştır — çağırıldıklarında hiçbir şey yapmazlar.

Bağımsız otomasyon görevleri Development → Scripts menüsünden tanımlanır.

TipParametrelerAçıklama
PeriodicPeriod (ms), Offset (ms)Sabit aralıkla tekrar
DailySaat:DakikaHer gün belirli bir saatte
OnceGecikme (ms)Tek seferlik çalıştırma
NoneOtomatik tetikleme yok, ins.executeScript() / REST ile manuel
AlanAçıklama
NameBenzersiz script adı
CodeJavaScript kaynak kodu
Schedule TypePeriodic / Daily / Once / None
Period / TimeZamanlama parametresi
LogÇalıştırma log’unu kaydet
CompileDerleme cache aktif (önerilen: açık)
Bindingsİsteğe bağlı ek context bağlamaları
{
"id": 159,
"name": "Chart_ActiveReactivePower",
"projectId": 153,
"type": "None",
"log": false,
"compile": true,
"owner": "inscada",
"code": "function main() { /* ... */ } main();"
}
  1. Derleme — Kod SHA-256 ile hash’lenir, Caffeine cache’e yazılır (default 2000 entry, 60 dk idle TTL). Aynı kod tekrar çalıştığında yeniden derlenmez.
  2. YürütmeinSCADA-script-executor-* daemon thread havuzunda çalışır (core = CPU sayısı, max = 8 × CPU, kuyruk = 2048).
  3. Sonuç — Return değeri GraalVM Value’den Java objesine açılır — Map<String, Object> / List / primitive olarak döner.
  4. Hata / Timeout — Timeout aşılırsa Future.cancel(true) ile iptal edilir; hata proje log’una ScriptException olarak düşer.

Aynı amaç için hem ES5 hem modern JS ile yazılmış örnekler — ikisi de geçerlidir:

// ES5 stil (JDK11 script'leriyle uyumlu)
function main() {
var active = ins.getVariableValue("ActivePower_kW");
var reactive = ins.getVariableValue("ReactivePower_kVAr");
var s = Math.sqrt(active.value * active.value + reactive.value * reactive.value);
ins.setVariableValue("ApparentPower_kVA", { value: s });
ins.writeLog("INFO", "PowerCalc", "S = " + s.toFixed(2) + " kVA");
}
main();
// Modern JS stil (JDK21'de isteğe bağlı)
function main() {
const active = ins.getVariableValue("ActivePower_kW");
const reactive = ins.getVariableValue("ReactivePower_kVAr");
const s = Math.sqrt(active.value ** 2 + reactive.value ** 2);
ins.setVariableValue("ApparentPower_kVA", { value: s });
ins.writeLog("INFO", "PowerCalc", `S = ${s.toFixed(2)} kVA`);
}
main();
ModülKısa
Variable APIDeğişken okuma/yazma, stats
Connection APIBağlantı / device / frame
Alarm APIAlarm durumları, fired alarm geçmişi
Trend APITrend tag yönetimi
Datasource APISQL, InfluxQL
Data Transfer APIDosya tabanlı veri aktarımı
Notification APIMail, SMS, web notification
Script APIScript zamanlama, global object
Report APIClassic + Jasper rapor
Project APIProje bilgisi, lokasyon
Log APIAudit log
System APIShutdown, restart, exec
User APIKullanıcı listesi
I/O Utils APIREST, ping, file, JSON
Utils APIuuid, tarih, bit, format
Language APIloc
Keyword APIMeta veri
Console APIconsoleLog