TIA Variablen aus DB laden und in einen DB ablegen

Magni

Level-2
Beiträge
313
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
ich habe es vor vielen Jahre mal gemacht, aber ich bekomme es nicht mehr gebacken.

Ich möchte aus mehreren DBs (nacheinanderfolgend) ein Datenword auslesen und in einem ZentralenDB nacheinander ablegen.
Noch einmal zur Verdeutlichung: Ich möchte aus den DB 100 bis 300 das Datenword 38 auslesen um es dann im DB400 im DBW 0 bis 200 abzulegen.

Hat da jemand eine Idee?
Danke
 
Ich möchte aus den DB 100 bis 300 das Datenword 38 auslesen um es dann im DB400 im DBW 0 bis 200 abzulegen.
Code:
VAR
    i : INT;
END_VAR


FOR i := 100 TO 300 BY 1 DO
    DB400.DBW[i-100] := DB[i].DBW38
END_FOR;

Oder:
Code:
FOR i := 0 TO 200 BY 1 DO
    DB400.DBW[i] := DB[i+100].DBW38
END_FOR;

Ungeprüft, nur mal so schnell runtergetippt.
Zu empfehlen wäre natürlich noch eine symbolische Adressierung anstatt DB400 / DBW..
 
Zuletzt bearbeitet:
Eine Möglichkeit wäre die Zuweisung für jeden DB einzeln zu schreiben

Code:
DB400.DBW0 := DB100.DBW38;
DB400.DBW2 := DB101.DBW38;
DB400.DBW4 := DB102.DBW38;
usw.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
VAR
    i : INT;
END_VAR


FOR i := 100 TO 300 BY 1 DO
    DB400.DBW[i-100] := DB[i].DBW38
END_FOR;

Oder:
Code:
FOR i := 0 TO 200 BY 1 DO
    DB400.DBW[i] := DB[i+100].DBW38
END_FOR;

Ungeprüft, nur mal so schnell runtergetippt.
Zu empfehlen wäre natürlich noch eine symbolische Adressierung anstatt DB400 / DBW..
Delta, das wird wohl leider nicht funktionieren :p Aber der TE sollte sich mal die Funktionen Poke und Peek anschauen - damit geht sowas.
Aber noch besser packst du die Daten von DB101 bis 300 als Array in deinen DB100 und strukturierst dein Programm einmal neu und zeitgemäß ;)
 
Ich muss leider nicht zeitgemäße Bausteine verwenden und versuche mir wenigestens die Arbeit etwas zu erleichtern.
 
Code:
FOR i := 0 TO 200 BY 1 DO

    temp := Peek(AREA := 16#84,
                 DBNUMBER := 100+ i
                 BYTEOFFSET := 38 * 2);
    
    Poke(AREA := 16#84,
         DBNUMBER := 400,
         BYTEOFFSET := i*2,
         VALUE := temp);
END_FOR;

Das indizierte Adressieren von DB[x] geht halt leider nicht so einfach. Deshalb der Umweg über Peek und Poke
 
Mit Poke_BLK könnte ich den DB dann auch auf Ausgänge geben? (Profinetanbindung)

zB. POKE_BLK(area_src:=16#84,
dbNumber_src:=8,
byteOffset_src:=0,
area_dest:=16#82,
dbNumber_dest:=0,
byteOffset_dest:=300,
count:=162);

Aber da brauche ich doch dann Perepherieausgänge? Oder?
 
nein, der Zusatz _BLK steht nur für Block - also wenn man ganze Bereiche lesen oder schreiben möchte. Wenn du auf der Peripherie lesen oder schreiben möchtest, dann musst du den Parameter AREA ändern: 16#81 = Inputs;16#82 = Outputs; 16#83 = Merker; 16#84 = DB;16#1 = Peripherieeingang.
Steht aber alles in der Hilfe zum Baustein ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Peripherie-Ausgänge brauchst du nur, wenn deine Ausgänge nicht im Prozessabbild sind. Im TIA sind alle Ein- und Ausgänge standardmäßig im Prozessabbild und werden durch den OB1 aktualisiert. Nur wenn du eigene Teilprozessabbilder definiert hast, dann musst du ggf. auf die Peripherie-E/As schreiben/lesen.
 
Bietet sich da nicht AWL an? So mit LAR1, AUF DB, L dbw [ar1,#p0.0] , + AR1 P#2.0 ,Loop und so ?
Klar stirbt, aber wenn sowieso schon alle alt ist....
 
Bietet sich da nicht AWL an? So mit LAR1, AUF DB, L dbw [ar1,#p0.0] , + AR1 P#2.0 ,Loop und so ?
Klar stirbt, aber wenn sowieso schon alle alt ist....
egal was man tut - AWL bietet sich nie an :ROFLMAO:;)
Klar geht das auch - ich denke aber die Lösung mit der For-Schleife ist zumindest heutzutage eingänglicher und wer weis wie lange man noch Zugriff auf die Adressregister hat. Mit dem nächsten TIA/Firmware-Update kann das ja auch irgendwann mal Geschichte sein, und der vorstellte Code läuft auch in einer 1200er.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, 1200er wäre ein/DER Grund.
Aber jetzt alte Mimiken neu in "neuer" Sprache um jeden Preis...
Wenn man es irgendwann neu macht auf DT würde man ja auch Poke wieder entsorgen.
Jetzt würde ich das rein nach persönlichem Geschmack entscheiden.
Ich wäre da bei AWL. Ist aber Gewohnheit....
 
Ich habe jetzt Peek und Poke schon mehrfach eingesetzt... wieder was gelernt. Allerdings habe ich es immer noch nicht hinbekommen, die Db auszulesen.
 
Zuletzt bearbeitet:
Zurück
Oben