Eingangsbereich in FB einlesen

pretender2009

Level-1
Beiträge
68
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle USER im Forum,

ich möchte einen Eingangsbereich von 5 Byte komplett in einem Zug in einen FB einlesen.
Die Aufsplittung möchte ich dann im FB machen wollen.

Hintergrund ist die Vermeidung von einer "großen" Anzahl von "Eingangsbeinchen" am FB.
Hat jemend von Euch evtl. eine Idee dazu (Code)?

Vielen Dank im Voraus für die Hilfe.

pretender2009
 
direkt geht das nicht.
entweder anyzeiger übergeben oder die startadresse übergeben.

z.b.
Code:
l #start
sld 3
lar1
l eb[ar1,#p0.0]
t mb 0
l eb[ar1,#p1.0]
t mb 1
usw
 
Oder SO

Anbei ein weiterer lösungsvorschlag.

SFC20 zum Kopieren vom Eingangsbereich in einen UDT eines InstanzDB.

Der udt muss die gleiche länge des Eingangsbereich haben !!

Anschließend kann man sehr bequem auf die Daten zugreifen.

Hoffe es Hilft !?
 

Anhänge

  • EB laden.JPG
    EB laden.JPG
    155 KB · Aufrufe: 68
Hallo,

der Lösungsvorschlag mit dem UDT und SFC20 interessiert mich.
Was muss darin geädert werden, wenn ich PEW einlesen will?

pretender2009
 
Zuletzt bearbeitet:
dp_read.AWL.txt

stimmt. auf das pew hatte ich nicht geachtet.

hatte mir da mal selbst was für geschrieben
 

Anhänge

  • dp_read.AWL.txt
    2 KB · Aufrufe: 182
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls irgendwann wer Interesse dran haben sollte - ich habe deinen wunderbaren FC noch mit einem eigenen Wunsch / einer Lösung von Harald ( http://www.sps-forum.de/simatic/77941-sfc14-laddr-mit-pew-beschalten.html#post543566 ) modifiziert.

Für PEB-Adresse:

Code:
      L     P##PEB_Adr                  //Adresse des FC-IN-Parameters IN_PEW (Typ POINTER)
      LAR1  
      L     D [AR1,P#2.0]               //Speicherbereich + Adresse aus dem POINTER
      LAR1                                   //AKKU1-L in Word-Variable

... Damit kann man bei der PEB Adresse direkt "PEBxyz" oder auch "PEWxyz" verschalten und bekommt's damit in die Querverweise.

(Hoffe damit hab ich - Anfänger - nix kaputtgespielt. Auf den ersten Blick läuft's jut)
 
Man könnte das auch so machen.
Code:
FUNCTION PERIN : VOID


TITLE = 'Kopiere Peripherie in DB'
//
// Der Baustein nimmt die Erste Adresse eines PERIPHERIEWORTES und kopiert dieses und alle folgenden
// der Reihe nach auf den Zielbereich der an RECORD angehängt ist. Die Menge wird vom Pointer an RECORD festgelegt
// Die Hardwareadressen müssen alle aneinanderliegen.
VERSION : '1.0'
AUTHOR  : VoR
NAME    : name
FAMILY  : family


VAR_INPUT
  PER_IN : INT; // erste Pripherieadresse länge wird durch Anypointer an RECORD bestimmt
END_VAR


VAR_IN_OUT
  RECORD : ANY;
END_VAR


VAR_TEMP
laufvariable : INT;
  zwischenany : ANY;
    Recording AT zwischenany : STRUCT
        SyntaxID : BYTE;
        Datentyp : BYTE;
        Laenge : INT;
        db_Nummer : WORD;
        BytePointer : DWORD;
        END_STRUCT;
END_VAR
    
    zwischenany := RECORD;
    
    FOR laufvariable := 0 TO (Recording.Laenge - 1) BY 1 DO
      WORD_TO_BLOCK_DB(Recording.db_Nummer).DB[(DWORD_TO_INT(SHR(IN := SHL(IN := Recording.BytePointer, N := 8), N := 11)) + laufvariable)]
       := EB[(PER_IN + laufvariable)];
    END_FOR;


END_FUNCTION

Am Any kann man z.B. einen UDT anlegen der die Länge vorgibt. Das ganze Konstrukt kann natürlich auch Teil eines FBs sein. Ich würde es aber als einzelne Funktion belassen und im gewünschten FB/FC aufrufen. Das funktioniert halt für den Peripheriebereich. Dafür muss halt eine Schlaufe abgearbeitet werden was vermutlich mehr Zeit kostet als es mit einem SFC20 würde.

Ich hab den aber nicht gemacht das ich den Eingangsbereich in der Referenz habe. Ich wollte speziell darauf verzichten dass ich z.B. einem Eingangswort ein Symbol geben muss. Im Anbetracht von TIA z.B.
Das heisst es wird nur die erste Byteadresse in Integer angegeben.

mfG René
 
Zuletzt bearbeitet:
Auf jeden Fall kann man gut AWL lernen, wenn man sich mal einen Tag lang hinsetzt und so einen Quellcode Zeile für Zeile versucht selbst durch zu kommentieren.

Angenommen ich möchte aus Volkers "dp_read" + meiner Modifikation (was als FC sehr gut funktioniert) jetzt einen Multiinstanzfähigen FB machen ...

1. Wieso macht der FB aus den dezimalen INT Werten an den Eingängen intern hexadezimale?
2. reicht es AR1 und AR2 im FB anfangs zu retten, am Ende zurück zu retten?
3. Wenn ich den Code 1:1 in einen FB bastle haut's mir die CPU raus (Zykluszeitüberschreitung, Hinweis: evtl. Endlosschleife) - was passiert im FB alles anders als im FC?

(Zweck: ich möchte zusätzlich zu normalen DBs auch direkt Instanz-DBs beschreiben)
 
Zurück
Oben