Skriptfunktion i Energiportal, IMC, CCS och liknande

Claystermiljön har en inbyggd skriptmotor som kan användas för att skapa mer avancerade funktioner i en del sammanhang. Det är ett programmeringsspråk för att göra beräkningar med längre formler och/eller i flera steg. Exempel är AQ, KPI:er och lastpunkter.

Hur får man indata till script?

Indata till skriptet beror på var det används. T ex i en AQ kan man använda de namn på ingångarna som man deklarerat. Man har tillgång till aktuell tid då skriptet körs, ”Now”.

Exempel:

Utdata från skript

Resultatet av den sista tilldelning som görs blir skriptets utdata. T ex skriptet:

x := 4;
y := x*2;

Utdata blir 8

Saker som är lätt att göra fel på då man skriver sin funktion

Att tilldela ett värde: T ex

x := 3;

Bara ’=’ används för jämförelse, ’:=’ används för tilldelning.

Exempel villkorssats:

if(a > 3) (y := 2; z :0 3;);
if(a>3) then x := 2 else x:=1;
if(a>3) x := 2 else x:=1;

Tilldela en text:

namn := ’pelle’;

eller

namn := ”pelle”;

är samma sak.

Tilldela en array/vektor:

siffror := [1, 2, 3, 4];

Omvandla en text till en siffra

Om man har en textsträng och vill tolka talet som står där:

goal:=System.Int32.Parse(text);

Öka med ett: Man kan öka ett tal med ett genom:

++x;

Detta fungerar dock inte för ett element i en vektor, alltså

++v[3]; // Fungerar INTE

fungerar INTE, skriv istället

v[3] := v[3]+1;

Dela en text

Dela en text i delar med något särskilt skiljetecken kan man göra så här:

delim := ["|"];
tmp := text.Split(delim, System.StringSplitOptions.RemoveEmptyEntries);

(Denna lite krångliga konstruktion beror på att vi inte kan deklarera en enskild bokstav.)

Loggning

För felsökning eller annat, skriv till händelselogg. Man kan skriva till systemets händelselogg (syns i t ex CMT) så här:

Message := "Samples: " + IndexSamples.ToString();
Clayster.Library.EventLog.Log.Information(Message, Clayster.Library.EventLog.EventLevel.Medium, "KPI","Scriptinfo");

Städa bort dessa utskrifter då de inte behövs längre, för att inte belasta loggfunktionen i onödan!

Tips och tricks

Om man är osäker på om en egenskap finns, eller om en text verkligen innehåller en siffra, kan man använda try-catch. Då kan skriptet så att säga prova en operation, och om det misslyckas hanteras det utan att skriptet kraschar. T ex:

try
(
    goal:=System.Int32.Parse(text);
)
catch
(
    goal := 0;
)
finally
if(goal > 0) then
...

(Här försöker vi tolka "text" som siffra. Om det misslyckas sätts "goal" till 0, och skriptet fortsätter.)