Step 7 Step7 SCL ANY auf Eingangs-Bytes

SebastianWK

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi@all,

ich weiß, dass "ANY" ein öfters diskutiertes Thema ist, ich habe aber leider noch keine Antwort für meine Anwendung gefunden:

Im Prinzip möchte ich mit dem FB2000 (SCL) mehrere Eingangsbytes (EB200-EB250) auslesen, welche über Profinet von einem Feldgerät beschrieben werden und diese Daten in den DB2000 (Array) schreiben.

Dazu nutze ich 2x ANY und einen SFC20 und habe diesen wie unten "beschalten".

Meine Annahme ist, dass beim "Zeigen" auf die EB's relativ egal ist, was bei "DBNumber" steht, da es ja nur auf die Eingangsadresse ankommen sollte, sobald ich bei "pAny.MemoryArea" 16#81 nutze und somit nur auf die Eingangsadressen schaue.
Ist das richtig??

Was mich wundert: Mit PLCSIM (EB manuell beschrieben) funktioniert es tadellos, aber sobald ich das gleiche Prg auf die CPU schiebe (keine Fehler) wird nichts in den DB2000 geschrieben, obwohl die Daten in den EB's liegen.

Info: CPU-416-2 DP mit CP443-1 Adv, alle Firmware auf dem neusten Stand
Software: Step7 Prof. 2010 V5.5 / SP4 / HF11

hier ein kurzer Programmausschnitt (als txt etwas mehr):
("EB_Tele_lenght" ist als Input (INT) deklariert und wird von außen mit 50 beschrieben)

//ANY pointer IN
pAny.S7Code := 16#10;
pAny.DataType := 16#02;
pAny.Length := EB_Tele_lenght;
pAny.DBNumber := 0; // not used for EB !
pAny.MemoryArea := 16#81; //16#81 -> EB, 16#84 -> DB
pAny.ByteAddressMSB := 0;
pAny.ByteAddressLSB := w#16#12C0; //1624; //EB_addr;

//ANY pointer OUT
pAnyO.S7Code := 16#10;
pAnyO.DataType := 16#02;
pAnyO.Length := EB_Tele_lenght;
pAnyO.DBNumber := 2000; // write in DB2000
pAnyO.MemoryArea := 16#84; //16#81 -> EB, 16#84 -> DB
pAnyO.ByteAddressMSB := 0;
pAnyO.ByteAddressLSB := 8;

// push data from EB'S to DB2000 (Array)
push := BLKMOV(SRCBLK := pEB // IN: ANY
,DSTBLK := pDB // OUT: ANY
); // INT

ein etwas größerer Ausschnitt:
txt.gif
test_PRG.txt (2,1 KB)
 

Anhänge

  • test_PRG.txt
    2,1 KB · Aufrufe: 31
Zuviel Werbung?
-> Hier kostenlos registrieren
Für EB200... muß pAny.ByteAddressLSB = W#16#640 sein (1600 = 200 * 8 = P#200.0 / P#E200.0 = DW#16#81000640)

pAnyO.ByteAddressLSB := 8; ---> adressiert DBB1 (DB2000.DBX1.0 BYTE <EB_Tele_lenght>) - ist das richtig?

Liegt Dein EB200...EB250 im Prozessabbild der Eingänge? (Kannst Du die Werte EB200 ... EB250 in einer Variablentabelle sehen oder mußt Du PEB200 ... PEB250 lesen?)
Falls nicht im Prozessabbild: Wie ist die Konsistenz des Eingangsbereichs deklariert? Eventuell mußt Du ein oder mehrere SFC14-Aufrufe verwenden.

Harald
 
Danke für die Antwort.

pAny.ByteAddressLSB := w#16#12C0; -> das stammte versehentlich aus einem anderen Versuch, um auf EB203 zuzugreifen habe ich w#16#658 da stehen. Aber danke für den Hinweis.

pAnyO.ByteAddressLSB := 8; -> das ist richtig, ich auf DB2000 schreiben, beginnend bei Byte 1, nicht bei 0

Kann es an der Länge liegen? Ich wollte eigentlich mit "EB_Tele_lenght" 50 Byte rüber schieben ... ( ;) bin noch dabei mich an Siemens zu "gewöhnen")

Warum funktioniert es aber in PLCSIM?

Wegen dem PA schau ich morgen nochmal, komme jetzt nicht mehr an die CPU ran. Danke aber schon mal!
 
Zusatz ...

Wie bestimmt schon bemerkt wurde, bin ich noch nicht so Siemens bewand.

Mein Gerät schreibt mir über ProfiNet die Daten auf EB200-250. Wenn ich unter "Hardware" das Gerät anwähle -> unten rechts-klick auf die EB, dann kann ich unter "Beobachten/Steuern" die aktuellen Werte in den EB sehen (werden auch ständig aktualisiert). Ich werde also nicht den SFC14 benötigen?!

ich hatte vorhin noch folgendes ausprobiert: den SFC20 in einem KOP-Netzwerk aufgerufen und wie folgt beschalten ... das funktioniert auch ohne Probleme. Also was ist an meinem SCL-Code faul?

SFC20_in_KOP.png
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest dir mal deine funktionierenden ANY-Pointer vom S7 zerlegen lassen und mit dem vergleichen was du selbst zusammenbaust. Also FC schreiben der ANY als IN erwaret und:

Code:
      L P#ANY_IN
      LAR1  
      L     B [AR1,P#1.0]
      L     B [AR1,P#2.0]
      L     W [AR1,P#2.0]   
      L     W [AR1,P#4.0]
      L     B [AR1,P#6.0]
      L     B [AR1,P#7.0]
      L     W [AR1,P#8.0]

Und im PLC-SIM beobachten. Ich würde mal versuchen den Datenbaustein in HEX anzugeben, also statt 2000 -> 16#W#7DO

Edit: Müsste doch egal sein wie das angegeben wird... Oder besser gesagt ich bin nicht sicher :D Vergleich halt mal

Was bringt den dein SFC20 in SCL für einen RET_VAL
 
Zuletzt bearbeitet:
Wird der von SCL erzeugte Code auch ausgeführt? Eventuell vergessen, den FB aufzurufen? Oder ist der Instanz-DB nicht vorhanden oder zu kurz? Leuchtet SF, gibt es Diagnosepuffereinträge?

Harald
 
Vielen Dank für die Antworten. Problem lag scheinbar an meinem Projektaufbau.

Der FB2000 wurde aufgerufen, allerdings heißen die Instanz-DB DB2001, DB2002, ... soweit alles ok.

Ich hatte aber vorher schon einen DB2000 angelegt (nicht als Instanz, sondern eigenständig), welchen ich für "Puffer Daten" nutze. Damit scheint die CPU (Nicht PLCSIM) ein Problem zu haben. Habe den DB2000 in DB2020 umbenannt. Nun geht alles.
 
Zurück
Oben