Byte's falsch sortiert

Paule

Level-1
Beiträge
3.058
Reaktionspunkte
869
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kollegen (innen), ich habe gerade ein Blockade und bräuchte mal einen Tipp von Euch.

Ich lese Daten von einem DP-Slave.
Dieser gibt mir 4 Werte auf 20 Byte raus die folgendermaßen aufgebaute sind:
Code:
[COLOR=black][FONT=Verdana]Byte   0 -  3 = Messwert in Real + Byte   4 = Statuswert[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]Byte   5 -  8 = Messwert in Real + Byte   9 = Statuswert[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]Byte 10 - 13 = Messwert in Real + Byte 14 = Statuswert[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]Byte 15 - 19 = Messwert in Real + Byte 19 = Statuswert[/FONT][/COLOR]
Das Problem:
Der DB soll die Daten symbolisch aufnehmen.
Wenn ich ihn aber symbolisch schreibe habe ich ja logischer weise 4 Byte mehr, da mir ja nach dem Statusbyte ein Byte fehlt, bis es wieder mit der nächsten Realzahl losgeht. Dem Übergeber ist das egal er hängt alle Daten einfach hinten dran, grad wie sie kommen.
Siehe Bild 1, die Daten lese ich mit der SFC14 siehe Bild 2

Möglichkeit 1: Entweder muss ich jetzt die Daten zwischen speichern und das Statuswort rausoperieren und irgendwie hinten ansetzen, oder
Möglichkeit 2: die Daten zwischenspeichern und das fehlende Byte reinschubsen.

Möglichkeit 2 gefällt mir besser, allerdings fehlt mir dazu gerade der Ansatz.

Habt Ihr noch andere Ideen oder einen Ansatz zur Möglichkeit 2?

Danke im Voraus

PS: Wird ja verständlicherweise immer erwartet.
S7-315er , alles außer KOP, FUP, und Graph.
 

Anhänge

  • DB_Ansicht.bmp
    118,1 KB · Aufrufe: 40
  • DB_Ansicht_2.bmp
    8,3 KB · Aufrufe: 31
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst Du nicht erst alles in einen DBx reinschreiben und dann mit L und T in den entsprechenden richtigen DBy reinschreiben ?

Aber irgendwie ist mir die Lösung zu einfach zu deinem Problem :idea:
 
Kannst Du nicht erst alles in einen DBx reinschreiben und dann mit L und T in den entsprechenden richtigen DBy reinschreiben ?
Leider nicht da ich auf jeden Fall an einer Stelle keine symbolische Zuweisung hätte, entweder beim Ziel oder bei der Quelle.

@Rainer, klar das wäre eine Möglichkeit : P#DB1.DBB 5.0 Byte 4
Aber das Problem mit der symbolische Zuweisung hätte ich nun bei der BLKMOVE Adressierung ja auch, oder?
 
Grundsätzlich geht sowhl Axels als auch meine Lösung. Die Daten kommen (gepackt) in einen Zwischen-DB ohne (auch ohne sinnvolle Symbole). Dann transferierst du die Daten in den DB mit Symbole. Und im restlichen Programm verwendest du nur noch diesen.
Code:
// Frei nach Axel, x ist dabei der gackte und y der strukturierte DB
L DBx.DBD0
T DBy.DBD0
L DBx.DBB4
T DBy.DBB4

L DBx.DBD5
T DBy.DBD6
L DBx.DBB9
T DBy.DBB10

L DBx.DBD10
T DBy.DBD12
L DBx.DBB14
T DBy.DBB16

L DBx.DBD15
T DBy.DBD18
L DBx.DBB19
T DBy.DBB22

Den gepackten DB wirst Du allerdings nicht symbolisch hinbekommen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Grundsätzlich geht sowhl Axels als auch meine Lösung. Die Daten kommen (gepackt) in einen Zwischen-DB ohne (auch ohne sinnvolle Symbole). Dann transferierst du die Daten in den DB mit Symbole. Und im restlichen Programm verwendest du nur noch diesen.

Den gepackten DB wirst Du allerdings nicht symbolisch hinbekommen.
Ja, ich glaube mit dem "nur für das einlesen verwendeten DB" als gepackter Übergabe DB wäre die einfachste Lösung.

Ich war gerade an der Überlegung den ersten DB als Any einzulesen die Endadresse zu ermitteln und dann über 3 Schleifen die Bytes in die Länge ziehen.
Sprich beim ersten Durchgang die letzten 15 Byte um 1 Byte nach hinten verschieben, Schleife 2 wiederum die letzten 10 Byte um 1 Byte zurück u.s.w.
Dann würde in den "leeren Bytes" aber auch noch Werte stehen, wäre zwar egal aber auch nicht schön.

Der Programmieraufwand wäre da wahrscheinlich doch zu hoch.
Manchmal muss die Lösung halt doch einfacher aber dafür nicht ganz so schön sein. ;)
Danke Euch. :cool:
 
Und wenn Du zum Zwischenspeichern vor dem Transfer in den Ziel-DB einen Merkerbereich nimmst?
Da bist Du doch freier bei der Symbolisierung.
Mit der Aussage dass ich bei der symbolischen Zuordnung bei Merkern ein bisschen freier bin, hast Du Recht, bringt mir allerdings nichts da ich ja dann bei der SFC14 auch den Merkerbereich über Pointer angeben müsste:
Code:
P#M100.0 Byte 20
Und wenn es geht vermeide ich das.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Code:
FUNCTION_BLOCK FB10

VAR_INPUT
  LADDR : WORD;
  MESS : POINTER;
  _MESS AT MESS : STRUCT
    DBNr : WORD;
    Adr : DWORD;
  END_STRUCT;    
END_VAR

VAR
  _Daten : ARRAY [0..19] OF BYTE;
END_VAR

VAR_TEMP
  RetVal : INT;
  Adr : INT;
  i, iB, iW : INT;
END_VAR

BEGIN
  
  // Daten lesen
  RetVal := DPRD_DAT(LADDR := LADDR ,RECORD := _Daten);

  // Anfangsdresse von Pointer ermitteln
  Adr := DWORD_TO_INT(SHR(IN:=SHL(IN:=_MESS.Adr,N:=8),N:=11));
  
  iB := 0;
  
  // Schleife zum verteilen der Daten
  FOR iW := 0 TO 3 DO
    FOR i := 0 TO 4 DO
      WORD_TO_BLOCK_DB(_MESS.DBNr).DB[Adr+iW*6+i] := _Daten[iB];
      iB := iB + 1;
    END_FOR;   
  END_FOR;
  
END_FUNCTION_BLOCK

Gruss Daniel
 
Hallo Daniel,

was soll ich sagen?

>>> Genial <<< :TOOL:
it's just perfect :cool:

Viel kürzer als ich den AWL - Code vor Augen hatte.
Und "Symbolisch"

Tausend Dank :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Daniel,

was soll ich sagen?

>>> Genial <<< :TOOL:
it's just perfect :cool:

Viel kürzer als ich den AWL - Code vor Augen hatte.
Und "Symbolisch"

Tausend Dank :D

Hallo Paule,
ich habe manchmal das Gefühl mancher Programmierspezialist verwendet viel Energie dafür sein Programm für möglichst viele "nicht so geniale " Nutzer unlesbar bzw. unverständlich zu machen.
 
Hallo Paule,
ich habe manchmal das Gefühl mancher Programmierspezialist verwendet viel Energie dafür sein Programm für möglichst viele "nicht so geniale " Nutzer unlesbar bzw. unverständlich zu machen.
... und ich habe immer mehr den Eindruck, dass jeder der den S7Manager aufmachen kann, Programmierer sich nennt und auch jedes Programm verstehen will und jeder andere Programmierer so programmieren muss, dass ohne Nachdenken oder gar lesen und lernen alles klar sein muss.

Wo bitte ist das Problem? Bei dieser Funktion muss kein Instandhalter oder Inbetriebnehmer etwas prüfen oder Fehlersuchen. Also kann das doch als Blackbox betrachtet werden.

Warum ist es so schwer zu verstehen, dass eben nicht jeder der Step7 fehlerfrei schreiben kann, Programmierer ist?


bike


P.S: jabba du hattest in deinem Threat so recht !
 
Wie Symbolisch? Paule erklär das mal bitte.
Wie Dalbi schon sagte. Alles was geschrieben wird ist Symbolisch.
Wenn ich jetzt Dalbi's Baustein nehme gebe ich nur noch die Adresse des DP-Slave und den ersten Messwert in meiner Struct an.
Der ganze obrige Code entfällt. :D
Hallo Paule,
ich habe manchmal das Gefühl mancher Programmierspezialist verwendet viel Energie dafür sein Programm für möglichst viele "nicht so geniale " Nutzer unlesbar bzw. unverständlich zu machen.
Blödsinn Rudi, lass die Steuerung doch machen was sie kann.
Du reibst doch Deine Wäsche auch nicht an der Waschmaschinentrommel nur weil Du nicht weißt was da genau programmiert wurde, sondern schaltest einfach ein.

Ich will es sogar einfacher machen. Wenn alles durchgängig symbolisch Programmiert wurde, kann jeder einfügen und schieben wie er lustig ist.
Das einzige was er wissen muss, ist zum Schluss Konsistenzprüfung mit anschließendem Bausteinvergleich. Und das sollte ja noch machbar sein.

Wenn nicht, dann bitte Finger weg!
Wo bitte ist das Problem? Bei dieser Funktion muss kein Instandhalter oder Inbetriebnehmer etwas prüfen oder Fehlersuchen. Also kann das doch als Blackbox betrachtet werden.
*ACK* Absolut!
 
Zurück
Oben