TIA Lokaldaten-Zugriff in TIA (FB)

Bobbybau91

Level-2
Beiträge
173
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
N'Abend,

in meinem Programm habe ich einen FB mit (bis jetzt) den folgenden Code:
Code:
//Einlesen der Daten via Profibus#Status.ERR_REC := DPRD_DAT(LADDR:=#LADDR, RECORD=>#DP_RD_1);


"Tag_1"  := #DP_RD_1.BYTE1;
"Tag_2"  := #DP_RD_1.BYTE2;
"Tag_3"  := #DP_RD_1.BYTE3;
"Tag_4"  := #DP_RD_1.BYTE4;
"Tag_5"  := #DP_RD_1.BYTE5;
"Tag_6"  := #DP_RD_1.BYTE6;
"Tag_7"  := #DP_RD_1.BYTE7;
"Tag_8"  := #DP_RD_1.BYTE8;
"Tag_9"  := #DP_RD_1.BYTE9;
"Tag_10" := #DP_RD_1.BYTE10;
"Tag_11" := #DP_RD_1.BYTE11;
"Tag_12" := #DP_RD_1.BYTE12;
"Tag_13" := #DP_RD_1.BYTE13;
"Tag_14" := #DP_RD_1.BYTE14;
"Tag_15" := #DP_RD_1.BYTE15;
"Tag_16" := #DP_RD_1.BYTE16;
"Tag_17" := #DP_RD_1.BYTE17;


//Empfangsdaten zuordnen
#DP_RD.SV := #DP_RD_1.BYTE1; //Statusvorgabe
#DP_RD.Temp_IW := SHR(IN := "%LD0", N := 8);

Wenn ich nun auf die Lokaldaten über %LD0 zugreifen möchte, kommt die Fehlermeldung, dass die Variable nicht definiert ist. Was mache ich falsch?



LG Bob
 
Zuletzt bearbeitet:
Was für eine CPU willst Du programmieren?
Bei einer S7-1500 muß für absolute Zugriffe auf L-Adressen der "optimierte" Zugriff ausgeschaltet sein.

Eigentlich ein guter Grund, diese vorsintflutliche Art der Programmierung ala "Schmiermerker" endlich über Bord zu werfen ...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe eine S7-1200. Ich konvertiere ein Programm von einer S7-300 auf eine S7-1200 und bei der 300 funktioniert das so, wie ich es gemacht habe (in AWL).
Den optimierten Zugriff habe ich schon deaktiviert
 
Optimierter Zugriff, deaktiviert... OK.
Code:
#DP_RD.Temp_IW := SHR(IN := "%LD0", N := 8);
Es hat sich ab ein kleiner Fehler eingeschlichen.

Du verwendest "%LD0". Das ist ein Symbol.
Du willst aber absolut addressiern, heißt - %LD0. ;)
Weg mit den Anführungszeichen.

Ein Warnung beim Übersetzen wirst du aber trotzdem bekommen.
TIA hat es als Dogma verankert solche Dinge aus-zu-buhen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Optimierter Zugriff, deaktiviert... OK.

Es hat sich ab ein kleiner Fehler eingeschlichen.

Du verwendest "%LD0". Das ist ein Symbol.
Du willst aber absolut addressiern, heißt - %LD0. ;)
Weg mit den Anführungszeichen.

Ein Warnung beim Übersetzen wirst du aber trotzdem bekommen.
TIA hat es als Dogma verankert solche Dinge aus-zu-buhen.

Ich hatte es schon mal ohne Anführungszeichen, ich hatte mich da schon dumm-und-dämlich-versucht ;)
Dann sieht es so aus:
2015-01-16_12-14-39.jpg2015-01-16_12-15-47.jpg
 
OK, sorry. Das wie ich es oben in beschreiben hab geht in FUP. (grad probiert)

In SCL scheint es gar nicht zu gehen.
Musst wohl die AT-Sicht nehmen.
 
OK, sorry. Das wie ich es oben in beschreiben hab geht in FUP. (grad probiert)

In SCL scheint es gar nicht zu gehen.
Musst wohl die AT-Sicht nehmen.

AT-Sicht? Was ist denn das?
Muss ich den Umweg über einen extra Datenbaustein gehen oder lässt sich das eleganter lösen?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit der AT-Sicht kann man Variablen überlagern.
Man deklarierte eine symbolische Variable die (wie üblich) eine Speicherplatz zugewiesen bekommt.
Danach wir eine zweite symbolische Variable deklariert der man über das AT-Attribut mitteilt dass diese am selben Speicherplatz liegt wie die erste.
Prinzipbedingt geht das natürlich auch nur wenn der Baustein nicht optimiert ist.

Beispiel:
AT-Sicht_TIA.jpg

Details dazu in der TIA-Hilfe unter: "Variablen mit AT überlagern"

Die Deklaration ist ein wenig umständlich. Zuerst bei der zweiten VAR den Datentyp "AT" wählen und dann den wirklichen Datentyp.
 
Zuletzt bearbeitet:
Die 1200 und die 1500 werden nicht mehr so Programmiert da komplett Symbolisch...

Lest euch doch kurz in das Thema ein und ihr müsst nicht mehr solche Umstände über den Lockaldatenstack mehr machen...
 
So ganz klick gemacht hat es bei mir noch nicht. Ich habe jetzt folgendes deklariert:
2015-01-16_13-10-18.jpg
Wir greife ich nun doppelwortweise auf die ersten 4 Bytes, dann auf die nächsten 4 Bytes usw. zu?
Oder muss ich mir jetzt für jedes DWORD ein eigenes Array deklarieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie du schon festgestellt hast, greift du jetzt mit DPRD_1_DWORD (Typ DINT) auf die ArrayMembers 1-4 zu.
Wenn du den Datentyp von DPRD_1_DWORD jetzt auf den TYP "Array[1..4] of DWORD" stellst, kommst du überall hin.
Mann kann sogar "STRUCT" als Datentyp nehmen und alle möglichen Datentypen mischen.

Nimm DWORD, mit DINT kann dir (Je nach Verwendung) passieren das BIT31 als Vorzeichen interpretiert wird.

ABER WARUM DEN NICHT...?
Das Array dass du uns zeigst scheint ja eine Art-Empfangspuffer für irgendeinen ProfibusSlave zu sein, oder.
Warum tauscht du nicht gleich das Array gegen einen Struct mit der entsprechenden Datenstruktur aus?
Das ist die allerbeste Variante.
 
ABER WARUM DEN NICHT...?
Das Array dass du uns zeigst scheint ja eine Art-Empfangspuffer für irgendeinen ProfibusSlave zu sein, oder.
Warum tauscht du nicht gleich das Array gegen einen Struct mit der entsprechenden Datenstruktur aus?
Das ist die allerbeste Variante.


Ja du hast recht, ich habe eben versucht das mit einem STRUCT zu machen, aber dann hat es nicht funktioniert, habe es deswegen mal mit einem Array versucht.
Aber du hast recht es funktioniert auch mit STRUCT, habe mich wohl nur vertippt.


Allerherzlichsten Dank, so funktioniert es :)
 
Zurück
Oben