adressierung DB über Pointer

TonyMono

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo......

CPU: 315-2DP

ich habe einen FB, in den SFC14/15 aufgerufen wird. Die eingelesenen Daten (oder die zu schreibenden Daten) werden in einen DB abgespeichert (z.B. #Memory.InData). Dies ist ein Struct im DB. Die größe ist z.Zt. 32 Bytes (konstant). Dieser Bereich soll auf 64 Bytes erweitert werden (kein Problem). Die Größe des gelesenen Datenfeldes soll nun variabel (zwischen 32 und 64 Byte) gestaltet werden. Die größe soll außerhalb des FB (z.B. im OB1) vorgegeben werden. Diese größe soll dann in einer Variablen im DB hinterlegt werden. Wird jetzt im FB der SFC14/15 aufgerufen, so soll über ein Pointer die Speicheradresse (Anfangsadresse) und die variable Speicherlänge (steht schon in Variable; von außen vorgegeben) den SFC als Zielparameter (Quellparameter) vorgegeben werden. Problem: dynamische Veränderung der Länge der einzulesenden Daten.

ich bin für jede hilfe dankbar
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Tony,

..Die Größe des gelesenen Datenfeldes soll nun variabel (zwischen 32 und 64 Byte) gestaltet werden...
Du kannst zwar die Größe des ANY-Pointers variable gestalten, aber die SFC14/15 funktionieren nur dann, wenn die Größe des Datenfeldes mit den projektierten Blockgrößen in der HW-Konfig übereinstimmen. Siehe Onlinehilfe zu den SFCs.


Gruß, Onkel
 
hallo onkel.....

Die eingelesenen Daten werden in einen instanzen-DB abgelegt. Die Datenfeldgröße für die einzulesenden Daten ist immer 64 byte. Jetzt gebe ich durch die HW-Config vor wieviel daten ich einlesen will (z.B. 32Bytes oder 64Byte). Diese Größe ist variabel, das Datenfeld immer 64Byte groß. Beim Einlesen spielt es keine rolle, da ja durch HW-Conf die größe vorgegeben ist. Ist das Datenfeld im DB größer als die Menge der einzulesenden Daten, werden die übrigen Bereiche nicht benutzt (??).
Wie ist es dann beim schreiben?? mein Datenfeld(64Byte), es sollen aber nur 32 Byte an slave geschrieben werden. Ich muß dann im OB1 doch eine Variable belegen, in der die aktuelle größe der durch die hw-conf vorgegebene Datenmenge enthalten ist (kann ja zwischen 16, 32, 64 Byte variieren). diese Variable in den DB ablegen ??? Ich kann bei sfc14/15 mit ANY parametrieren (P#DB14.DBX366 Byte 32). die 32 gibt mir die größe der Daten an. diese größe will ich verändern können. Die größe habe ich in einer variablen drinstehen. wie kann man das realisieren ???
 
der anyzeiger ist folgendermassen aufgebaut.

Code:
//QANY: Typ: Any: Adresse 0.0
 
      L     W#16#1002                   //Typ BYTE (INT)
      T     LW     0
      L     #Blockgroesse               //Anzahl Bytes (INT)
      T     LW     2
      L     #FiFo_DB                    //Quell-DB (INT)
      T     LW     4
      L     #QAnfang_schleife           //Anfang der Quelle (INT)
      SLD   3
      OD    DW#16#84000000
      T     LD     6
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
frage

CALL "DPWR_DAT"
LADDR :=#Ident_Control_Address
RECORD :=#Head_1.OutData
RET_VAL:=#Head_1.Ret_Val_SFC15
R #Head1_exe
SPA aus1

rec1: CALL "DPRD_DAT"
LADDR :=#Ident_Control_Address
RET_VAL:=#Memory.RetVal_SFC14
RECORD :=#Memory.InData
L 0

so sehen meine Aufrufe für sfc14/15 aus. Die Bereiche #Head_1.OutData und #Memory.InData haben beide die gleiche Größe von 64 Byte. Es ist ein Slave angeschlossen, der unterschiedliche Datenmangen einlesen(Rausschreiben) kann. dies wird durch die Hardwareconf vorgegeben und ist variabel (16, 32 und 64 Bytes). Für alle diese Fälle möchte ich nur ein Datenbaustein haben (nicht mehrere mit gleicher Feldgröße 16, 32 oder 64 Byte). Dies sollte durch ein ANY möglich sein. In den ich immer Datengröße und Speicherort vorgebe. Und dies dann als Parameter für RECORD übergebe (z.B. #anyparameter). dieser hat eine speichergröße von 10 Byte. Schreibt der SFC 14 nicht jetzt die daten an die Stelle von #anyparameter (und zwar nur 10 Byte) oder schreibt der SFC14 die Daten an die Stelle, die im Anyparameter vorgegeben sind (und natürlich in der vorgegebenen Größe). es sieht dann so aus...
rec1: CALL "DPRD_DAT"
LADDR :=#Ident_Control_Address
RET_VAL:=#Memory.RetVal_SFC14
RECORD :=#anyparameter
Vorher habe ich den #anyparameter noch mit parametern beladen...
L W#16#10...
T DB12.DBW10
usw...
es gibt dann einen syntaxfehler
liegt es daran, das eine struktur in einer sgtruktur ist???
 
Hallo Tony,

verstehe ich das jetzt richtig, "anyparameter" ist im DB12 abgelegt und wird als Eingang an deinen FB übergeben, von wo aus dann die FC versorgt wird?
Das geht so nicht. Entweder du kopierst den ANY vom Eingang in die Lokaldaten und übergibst ihn von dort an die FC oder du machst es halt grundsätzlich irgendwie völlig anders. Da ich den Sinn so wie so nicht so ganz verstehe, würde ich zu letzteren tendieren ;) . Aber mach halt mal wie du es für richtig hältst.


Gruß, Onkel
 
Zuletzt bearbeitet:
Zurück
Oben