ag_recv in SCL (besser gefragt wie gibt man in SCL einen Datenbereich korrekt an)?

tomi_wunder

Level-1
Beiträge
35
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi!
ich hab mal wieder so'ne ganz dolle Frage:
Mit dem ag_recv will ich die empfangenen Daten aus meinem Ethernet CP343-1 abholen. Das mach' ich ungefähr so:
Code:
    ag_recv( ID         :=  1,
             LADDR      :=  w#16#100,
             RECV       :=  net_buffer.data_in_buffer,
             NDR        :=  res_ndr,
             ERROR      :=  res_error,
             STATUS     :=  res_status,
             LEN        :=  net_buffer.data_in_len );
data_in_buffer ist ein 256-Elementiges Byte-Array im DB net_buffer.
Wenn ich das Ganze jetzt laufen lass, dann krieg ich folgendes (wahnsinnig aufbauendes) Resultat:
Code:
  res_ndr = 0
  res_error = 1
  res_status = 8184(hex)
Laut Handbuch heißt das soviel wie:
* Unzulässiger Datentyp für den Parameter RECV angegeben
* Systemfehler

Noch anzumerken sei, daß ich auch schon (für den RECV-Param) versucht hab, einen kompletten DB oder ein char-Array anzugeben, was allerdings alles mit dem selben Fehler endet!
Ich hab grad die Vermutung, - bitte wiedersprecht mir, sollte ich falsch liegen - daß ersteres von beidem zutrifft, weil man in AWL den ag_recv ja so aufruft:
Code:
CALL AG_RECV
  ID := MW 40
  LADDR := W#16#0100
  RECV := P#M 0.0 BYTE 100,    //hier gibt man ja die länge das datenbereichs mit an!!!
  NDR := DB 110.DBX 0.6
  ERROR := DB 110.DBX 0.7
  STATUS := DB 110.DBW 2
  LEN := DB 110.DBW 4
Kann man das in SCL auch irgenwie, oder lieg ich mit meiner Vermutung komplett daneben, oder...?

Hat jemand mal einen kurzen Code-Auszug, oder sieht direkt meinen Fehler?
Würd mir sehr weiterhelfen!
MfG
tomi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Absolut - symbolisch !

Oh Wunder,

der wesentliche Unterschied ist nicht AWL oder SCL,
sondern die Art der Adressierung. An den AG_RECV
muss ein Bereichszeiger übergeben werden. Das hast
du mit P#M 0.0 BYTE 100 im ersten Beispiel gemacht.

In SCL hast du aber einen symbolisch adressierten
Puffer (net_buffer.data_in_buffer) angegeben. S7
bildet diesen symbolischen Zeiger aber nicht in allen
Fällen richtig.

Gib in SCL auch mal den abs. Zeiger aus dem AWL-
Beispiel an, dann sieht es vermutlich erst mal besser
aus.

Gruß U.
 
hi,

abgesehen davon das SCL chrott ist weil es einen riesen Overhead produziert und die Übersetzung auch viel CPU Zeit "frisst"
musst du deinem Empfangspuffer einen Bereich angeben der dem SCL Programm bekannt und gültig ist.

also als Beispiel, der Aufruf wird in einem FB eingebettet:

dann entweder als InOut Variable

VAR_IN_OUT
Interfacedat : RCV_Buffer;
END_VAR

wobei die Variable InterfaceDat einem Pointer entsprechen muss der auf einen Bereich zeigt der im Byte Format geschreiben ist.

oder als Variable des Instanz DBs:

hier habe ich das ganze Beispiel aufgeführt weil ich es auch mal so geschrieben habe.

VAR
ndr : BOOL := FALSE;
error : BOOL := FALSE;
status : WORD := W#16#0;
length : INT := 0;
RCV_Buffer : ARRAY [0..1000] OF BYTE;
END_VAR


AG_RECV(ID := _IO_InterfaceConfig.Connection_Id,
LADDR := _IO_InterfaceConfig.Laddr,
RECV := RCV_Buffer,
NDR := ndr,
ERROR := error,
STATUS := status,
LEN := length);


mfg

Stefan
 
Problem gelöst

Hi!
Erstmal vielen herzlichen Dank allen, die mit ihren Hinweisen tatkräftige Unterstützung geleistet haben!

abgesehen davon das SCL chrott ist weil es einen riesen Overhead produziert und die Übersetzung auch viel CPU Zeit "frisst"
musst du deinem Empfangspuffer einen Bereich angeben der dem SCL Programm bekannt und gültig ist.
Da kann ich dir vollstens beipflichten, nur manchmal is es halt der etwas bequemere Weg!

Das genannte Problem begründet sich nicht nicht in der Parameterübergabe an AG_RECV, sondern darin, daß AG_RECV nicht mit der gegebenen Hardware funktioniert und deshalb Fehlermeldungen herausgibt, die nicht verlässlich sind.
Für weitere Informationen zum Thema ältere CP's und AG_LRECV siehe
http://www.sps-forum.de/showthread.php?t=9732&page=2


Mit freundlichem Gruß
Thomas Wunder
 
Zurück
Oben