FlexPro
HistoryBase
Engineering
Training
Downloads
FlexPro-Support
Wissen
Community
Über Uns
Referenzen
Jobs
Allgemeiner Kontakt
Händlerverzeichnis
FlexPro-Support
DE
EN
FR
Placeholder
Produkte und Lösungen
Support und Downloads
Unternehmen
Magazin
Kontakt
Sprache
MyWeisang

Account Einstellungen

Topic

Datensatz mit FPScript nach Vorgabe erstellen

Startseite ' Community ' FPScript ' Datensatz mit FPScript nach Vorgabe erstellen

Anzeigen von 2-Stellen - 1 bis 2 (von insgesamt 2)
  • Autor
    Beiträge
  • #33671
    Thomas Balven
    Teilnehmer

    Ich würde gerne mit einem Skript einen Datensatz mit Hilfe der Kalenderzeit erzeugen lassen. Ich lese einen Datensatz mit dem Namen ‘Datum’ ein und ziehe mir mit einer Formel (‘Startdatum):

    Dim Startdatum
    Startdatum = Datum.X[0, 0]

    und einer Formel (‘Enddatum’)

    Dim Enddatum
    Enddatum = Datum.X[-1]
    

    die relevanten Start-und Enddaten in der Form hh:mm:ss heraus. Im Anschluss würde ich gerne einen neuen Datensatz in folgender Form erzeugen:

    Kalenderzeit            Y-Wert
    01.12.2022 00:00:00     1
    01.12.2022 00:00:01     0
    01.12.2022 08:00:00     1
    01.12.2022 08:00:01     0
    01.12.2022 16:00:00     1
    01.12.2022 16:00:01     0
    02.12.2022 00:00:00     1
    02.12.2022 00:00:01     0
    02.12.2022 08:00:00     1
    02.12.2022 08:00:01     0
    02.12.2022 16:00:00     1
    02.12.2022 16:00:01     0

    Der neue Datensatz soll immer bei ‘Startdatum’ 00:00 Uhr beginnen und mir eine 1 als Wert zurückgeben. 1 Sekunde später soll der Wert 0 sein. Im Anschluss soll im 8 Stunden-Takt das gleiche geschehen bis ‘Enddatum’ erreicht ist.

    Kann man das im FPScript lösen?

    Vielen Dank für die Hilfe.

    #33672
    Bernhard Kantz
    Teilnehmer

    Mit der Funktion Date() wird durch ‘Nullsetzen’ der Zeit das Datum aus einer Kalenderzeit bestimmt, liefert also genau den Startzeitpunkt des gewünschten Datensatzes. Mit der gewünschten Schrittweite von 8 h kann mit der Series()-Funktion die 1er-Zeitpunkte als Datenreihe berechnet werden:

    Dim zeit_ein = Series(Date(datum_start), datum_end, 8 h)

    Zu beachten ist allerdings, das die Datenreihe in der Länge so berechnet wird, dass der letzte Wert den geringsten Abstand zum gewünschten Endpunkt hat; er kann also auch über diesem liegen. Wenn die ein Problem sein sollte, muss man von der Datenreihe alle bis aufs letzte Element weiterverwenden:

    If zeit_ein[-1] > datum_end Then
    	zeit_ein = zeit_ein[0, -2]
    End
    

    Man lege sich dann Datenreihen für die x- und y-Komponente des gewünschten Resultats an:

    Dim M = NumberOfRows(zeit_ein)
    Dim x = CalendarTime ? # 2 * M
    Dim y = ? # 2 * M
    

    Durch Adressieren der geraden und ungeraden Elemente können die Ein- und Aus-Zeitpunkte in jeweils einer Zuweisung gesetzt werden:

    Dim i_ein = (M, 0L, 2L)
    Dim i_aus = i_ein + 1L
    
    x[i_ein] = zeit_ein
    y[i_ein] = 1
    
    x[i_aus] = zeit_ein + 1 s
    y[i_aus] = 0
    
    Signal(y, x)
    

    Generell sollte man stets versuchen, auf eine Schleife über Datenreihen zu verzichten. Dabei leisten wie hier gezeigt die Indizierung mittels Datenreihen gute Dienste. Diese Indexdatenreihen können etwa auch mit den Funktionen der Ereignisisolation erzeugt werden.

Anzeigen von 2-Stellen - 1 bis 2 (von insgesamt 2)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.