Array Stomverbrauch

emilio20

Level-1
Beiträge
835
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ich wollte den Täglichen Stomverbrauch in einer array Variable für jeden Tag speichern.

Der Tägliche Stomverbrauch wird einmal am Tag gelöscht. Bevor er gelöscht wird wollte ich ihne für ein ganzes Monat in eier Array variable erfassen und dan visualisieren.

Ich lege eine Array mit 31 Seicherplätze an. Wie bekomme ich jetzt für tag 1 den wert in Speicherplatz 1 für Tag 2 den Wert in Speicherplatz 2 usw ?
 
Code:
FUNCTION FC_Tag : VOID
VAR_INPUT
    I_Tag:INT;
    R_Verbrauch:REAL;
END_VAR
VAR_IN_OUT
    Verbrauch:ARRAY[1..31] OF REAL;
END_VAR
    // Anweisungsteil
    Verbrauch[I_Tag] := R_Verbrauch;
END_FUNCTION

Wie wäre es damit?

Gruß
 
Einen Pointer in FUP zusammenbasteln geht sicher, ist aber ehrlich gesagt total behämmert.

Was gefällt dir nicht an dem zur Verfügung gestellten Code?

Du kannst den FC_Tag aus deinem FUP Programm aufrufen, musst ihn nur mit Werten versorgen.


Vielleicht habe ich ja auch was falsch verstanden.
 
FC als Bibliothek gezippt

Hi Emilio20

ist dein Problem noch aktuell ?
Habe da mal einen FC vorbereitet und in eine Bibliothek gezippt.
Weiß nicht wie gut deine Programmierkenntnisse sind, aber schau dir das erst mal an. Dann melde dich ob du damit klar kommst... :cool:

Gruß
Toki
 

Anhänge

  • Emilio20.zip
    21,4 KB · Aufrufe: 41
Hallo dein Beispiel ist gut, aber ich möchte eigentlich nur wissen wie ich in FUP eine Wert in eine Vortlaufende Array speuchere. So wie es in AWl mit dem Pointer gemacht wird

Ich habe z.b30 Array Variablen und möchte einen Wert in in Array 1 dann in Array 2 usw. Speichern. Gibt es dafür einen vertigen FUP Baustein der nach dem Ablegen in Array1 die 'Adresse auf Array 2 ändert?

so wie das

L #Datenanfang
T #akt_dw

anf: NOP 0 //schleifenanfang

L #akt_dw
SLD 3
LAR1
...
...
T DBD [AR1,P#0.0]

L #akt_dw
L 4
+D //nächstes dw
T #akt_dw
L #Datenende
>D
SPB ende //Schleifenende erreicht

SPA anf //zum Schleifenanfang
ende: nop 0
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich hab jetzt aus der Uhrzeit den Monat herausgefildert z.b( Dezember =12). Array steht auf Speicherort 60 und geht bis 108

Berechnet habe ich jetzt Monat(12)*4=48 + 56 = 104 (SP_ORT)

Wie bekomme ich jetzt in FUP die Variable SP_ORT in
DB103.DBD SP_ORT ??
somit sollte es heisen DB103.DBD104
 
Zuletzt bearbeitet:
Hallo dein Beispiel ist gut, aber ich möchte eigentlich nur wissen wie ich in FUP eine Wert in eine Vortlaufende Array speuchere. So wie es in AWl mit dem Pointer gemacht wird
In FUP und KOP gibt es keine indirekte Adressierung. Pointer können höchstens an aufgerufene FB/FC/SFB/SFC übergeben werden.

Ich habe z.b30 Array Variablen und möchte einen Wert in in Array 1 dann in Array 2 usw. Speichern. Gibt es dafür einen vertigen FUP Baustein der nach dem Ablegen in Array1 die 'Adresse auf Array 2 ändert?
Falls es einen fertigen Baustein geben sollte, dann ist der garantiert nicht in FUP geschrieben. Man könnte ihn aber in FUP aufrufen.
Auch den Baustein von Dotzi in #2 kann man in FUP aufrufen, da muß nur noch der Schreibindex I_Tag extern verwaltet werden.

Wenn das Array nicht groß ist, dann kann in FUP ein variabler Index als Pointer genutzt werden, indem man für jeden möglichen Index-Wert den zugehörigen Array-Zugriff extra ausprogrammiert. #akt_dw ist der Zähler bzw. Pointer (1...30), in welches Array-Element gespeichert werden soll. Der muß noch bei jedem Speicherimpuls vor oder nach dem Einspeichern erhöht werden (auf das nächste Arrayelement gestellt werden).
Beispiel: das Array ist im DB2 die Variable: Verbrauch ARRAY[1..30] OF REAL
Code:
// #TagVerbrauch in Verbrauch[#akt_dw] einspeichern
                +---+                       +--------+
                | & |                       |  MOVE  |
#SpeicherImpuls-|   |-+---------------------|EN   OUT|-#WR_Index
                +---+ |                     |        |
                      |             #akt_dw-|IN   ENO|-
                      |                     +--------+
                      |                     +--------+
                      |                     |  MOVE  |
                      +--------------------O|EN   OUT|-#WR_Index
                                            |        |
                                          0-|IN   ENO|-
                                            +--------+
                +--------+
                | CMP==I |
      #WR_Index-|IN1     |                  +--------+
                |        |                  |  MOVE  |
              1-|IN2     |------------------|EN   OUT|-"DB2".Verbrauch[1]
                +--------+                  |        |
                              #TagVerbrauch-|IN   ENO|-
                                            +--------+
                +--------+
                | CMP==I |
      #WR_Index-|IN1     |                  +--------+
                |        |                  |  MOVE  |
              2-|IN2     |------------------|EN   OUT|-"DB2".Verbrauch[2]
                +--------+                  |        |
                              #TagVerbrauch-|IN   ENO|-
                                            +--------+

                     ...      //noch CMP+MOVE für 3 bis 29 einfügen

                +--------+
                | CMP==I |
      #WR_Index-|IN1     |                  +--------+
                |        |                  |  MOVE  |
             30-|IN2     |------------------|EN   OUT|-"DB2".Verbrauch[30]
                +--------+                  |        |
                              #TagVerbrauch-|IN   ENO|-
                                            +--------+


Dein AWL-Beispiel macht irgendwie keinen Sinn (wieso eine Schleife, wenn Du nur 1 Wert einspeichern willst?).
Falls Du das Array als FIFO nutzen wolltest, wo der neue TagVerbrauch am Anfang eingespeichert wird und die vorherigen Werte 1 Platz nach hinten rücken,
das geht in FUP so:
Code:
// #TagVerbrauch in Verbrauch[1] einspeichern, 
// vorher Verbrauch[1..29] nach Verbrauch[2..30] umspeichern
                +---+                       +--------+
                | & |                       |  MOVE  |
#SpeicherImpuls-|   |-+---------------------|EN   OUT|-"DB2".Verbrauch[30]
                +---+ |                     |        |
                      | "DB2".Verbrauch[29]-|IN   ENO|-
                      |                     +--------+
                      |                     +--------+
                      |                     |  MOVE  |
                      +---------------------|EN   OUT|-"DB2".Verbrauch[29]
                      |                     |        |
                      | "DB2".Verbrauch[28]-|IN   ENO|-
                      |                     +--------+
                      |
                     ...        //noch Verbrauch[2] bis Verbrauch[27] einfügen
                      |
                      |                     +--------+
                      |                     |  MOVE  |
                      +---------------------|EN   OUT|-"DB2".Verbrauch[2]
                      |                     |        |
                      |  "DB2".Verbrauch[1]-|IN   ENO|-
                      |                     +--------+
                      |                     +--------+
                      |                     |  MOVE  |
                      +---------------------|EN   OUT|-"DB2".Verbrauch[1]
                                            |        |
                              #TagVerbrauch-|IN   ENO|-
                                            +--------+

Harald
 
Wie bekomme ich jetzt in FUP die Variable SP_ORT in
DB103.DBD SP_ORT ??
somit sollte es heisen DB103.DBD104
Mit einem MOVE?

Ich hab jetzt aus der Uhrzeit den Monat herausgefildert z.b( Dezember =12). [...]
Berechnet habe ich jetzt Monat(12)*4=48 + 56 = 104 (SP_ORT)
Beachte, daß der Monat in einem DATE_AND_TIME in BCD-Format ist! 1..12 BCD ---> 1..9, 16, 17, 18 DEZ

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das mit dem BCD weiß ich habe je schon eine Variable wo jetzt 12 für dezember drinen steht.

Ich müsste mir jetzt nur noch die DB adresse zusammenbasteln aus DB 103 DBD + die Variable mit der zahl 104 oder 100 usw.

Ich bekomme aber das mit der adresierung nicht hin. Wi verschiebe ich die zahl 104 in DB 103.DBD (Zahl)????


wie sied das mit Move aus

-------
| Move|-??????

| |
DB_NR - | |
-------


was ist mit FC 84 ? kann man diesen verwenden?
 
Zuletzt bearbeitet:
FUP ist zwar schön, aber eigentlich ( meiner Meinung nach... ) eher nur für einfachere Anwendungen gedacht (geeignet).
Komplexere Dinge wie indirekte Adressierung sind in AWL zu Hause.
Du hast doch einige Ansätze selbst in AWL verfasst. Warum verfolgst du nicht weiter den Ansatz einen Baustein selbst zu programmieren (in AWL) und diesen dann in FUP einzubinden?
Gruß
Toki
 
indirekt-Move-Baustein

Berechnet habe ich jetzt Monat(12)*4=48 + 56 = 104 (SP_ORT)

Wie bekomme ich jetzt in FUP die Variable SP_ORT in
DB103.DBD SP_ORT ??
somit sollte es heisen DB103.DBD104
Ich müsste mir jetzt nur noch die DB adresse zusammenbasteln aus DB 103 DBD + die Variable mit der zahl 104 oder 100 usw.

Ich bekomme aber das mit der adresierung nicht hin. Wi verschiebe ich die zahl 104 in DB 103.DBD (Zahl)????
Ah klar, Du willst einen Wert in den DB103 schreiben, die Ziel-Adresse im DB wird variabel berechnet (Variable SP_ORT).
Wie schon gesagt, in FUP gibt es keine indirekte Adressierung. In FUP kann man nicht in variable Adressen schreiben.
Du kannst Dir aber einen indirekt-Move-Baustein (FC) mit ein paar Zeilen AWL schreiben und den dann in FUP aufrufen:
Code:
FUNCTION "iMOVE_R" : VOID
TITLE =REAL-Wert in angegebene Adresse [DestDB].DBD[Offset] schreiben
AUTHOR : PN_DP
VERSION : 0.1

VAR_INPUT
  DestDB : BLOCK_DB ;	
  Offset : INT ;	
  Value : REAL ;	
END_VAR
VAR_TEMP
  Address : DWORD ;	
END_VAR
BEGIN
NETWORK
TITLE =

      L     #Offset; 
      SLD   3; 
      T     #Address; 

      L     #Value; 
      AUF   #DestDB; 
      T     DBD [#Address]; 

END_FUNCTION

Der iMOVE_R-Baustein wird in FUP z.B. so aufgerufen:
Code:
            +-----------+
            | "iMOVE_R" |
        ...-|EN         |
            |           |
    "DB103"-|DestDB     |
            |           |
    #SP_ORT-|Offset     |
            |           |
 #Verbrauch-|Value   ENO|-
            +-----------+

Harald
 
Zurück
Oben