Pointer zu DWord, symbolische Parametrierung

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Hallo,

anbei zwei Bilder.

Ich habe einen Pointer zu einem DWord "gemoved" und das Dword nun an einen FC übergeben.
Dem DB ist eine SQL_Quelle beigefügt...würde gerne mit dem akku1 weiterarbeiten und dafür ist der Pointer ja um 2 byte zu groß.

Ich möchte mir gerne den Move Befehl im OB sparen. Könnte ich das im FC noch umwandeln ?
 

Anhänge

  • 1.JPG
    1.JPG
    26,4 KB · Aufrufe: 56
  • 2.JPG
    2.JPG
    27,2 KB · Aufrufe: 51
Hi,

warum machst Du nicht einfach einen Pointer aus dem Start. :confused:
Was soll das werden?

Gruss Daniel
 
Ich möchte mir gerne den Move Befehl im OB sparen. Könnte ich das im FC noch umwandeln ?
Na sicher. Du kannst auch ein WORD (oder bis 32767 besser lesbar: INT) für die Adresse im DB übergeben und im FC einen Pointer draus machen.
Für bessere Lesbarkeit bietet es sich in Deiner Aufgabe an, statt registerindirekter Adressierung die speicherindirekte Adressierung zu benutzen.
Allerdings finde ich solche Datenzugriffe Scheixxe, weil sie nicht in den Referenzdaten auftauchen!
Wenigstens bist Du darauf gekommen, die DB-Nummer als BLOCK_DB zu übergeben, da erscheint wenigstens der DB-Zugriff in den Referenzdaten.

FC1
Code:
// IN  : Start_DB : Block_DB
//     : Start_Adresse : Int
// TEMP: Start_OffsetPtr : DWord

// aus #Start_Adresse (INT) einen Adresspointer (P#) machen :
      L     #Start_Adresse          // ( 2 )
      SLD   3                       // ( 2 -> P#2.0 )
      T     #Start_OffsetPtr        // in LD für speicherindirekte Adressierung

// L [Start_DB].DBW[Start_Adresse] :
      AUF   #Start_DB               // ( DB7001 )
      L     DBW [#Start_OffsetPtr]  // ( DB7001.DBW2 )
Aufruf
Code:
      CALL  FC     1
       Start_DB     :=DB7001
       Start_Adresse:=2
      NOP   0
Tip: Gewöhne Dir nicht so hohe DB-Nummern an (DB7001), meistens mußt Du mit DB1 ... DB255 auskommen.

An Deiner Fragestellung verwirrt allerdings einiges:
- symbolische Parametrierung
- SCL-Quelle - was für eine SCL-Quelle?
- würde gerne mit dem akku1 weiterarbeiten
- mit Parameter Start als POINTER wird die SCL-Quelle nicht mehr richtig ausgeführt
Was hat das mit Deinem Wunsch zu tun, eine Adresse nicht als POINTER zu übergeben? :confused:
Was verlangt denn die SCL-Quelle, der Du anscheinend von außen einen variablen Wert übergeben willst?

Harald
 
Jetzt kommen wir der Sache doch schon näher. :)

Zeig doch mal den Code von dem Baustein.

Gruss Daniel


Könnte ich morgen erst nach reichen.

Das SCL file ist in dem DB7001 eingebettet. Der DB benötigt 6 Eingänge und 3 Ausgänge, alle entweder Byte oder Word.
Die erste Adresse der DP ist P#2.0. Die schiebe ich in den Akku und addiere 2 oder 3 dazu usw., dass eben alle Eingänge und Ausgänge ihre richtige Adresse haben. Nach jeder Addition wird das entsprechende EB, EW, oder AB geladen.

Ich hoffe ich habe nicht noch mehr Verwirrung gestiftet. :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na sicher. Du kannst auch ein WORD (oder bis 32767 besser lesbar: INT) für die Adresse im DB übergeben und im FC einen Pointer draus machen.
Für bessere Lesbarkeit bietet es sich in Deiner Aufgabe an, statt registerindirekter Adressierung die speicherindirekte Adressierung zu benutzen.
Allerdings finde ich solche Datenzugriffe Scheixxe, weil sie nicht in den Referenzdaten auftauchen!
Wenigstens bist Du darauf gekommen, die DB-Nummer als BLOCK_DB zu übergeben, da erscheint wenigstens der DB-Zugriff in den Referenzdaten.

FC1
Code:
// IN  : Start_DB : Block_DB
//     : Start_Adresse : Int
// TEMP: Start_OffsetPtr : DWord

// aus #Start_Adresse (INT) einen Adresspointer (P#) machen :
      L     #Start_Adresse          // ( 2 )
      SLD   3                       // ( 2 -> P#2.0 )
      T     #Start_OffsetPtr        // in LD für speicherindirekte Adressierung

// L [Start_DB].DBW[Start_Adresse] :
      AUF   #Start_DB               // ( DB7001 )
      L     DBW [#Start_OffsetPtr]  // ( DB7001.DBW2 )
Aufruf
Code:
      CALL  FC     1
       Start_DB     :=DB7001
       Start_Adresse:=2
      NOP   0
Tip: Gewöhne Dir nicht so hohe DB-Nummern an (DB7001), meistens mußt Du mit DB1 ... DB255 auskommen.

An Deiner Fragestellung verwirrt allerdings einiges:
- symbolische Parametrierung
- SCL-Quelle - was für eine SCL-Quelle?
- würde gerne mit dem akku1 weiterarbeiten
- mit Parameter Start als POINTER wird die SCL-Quelle nicht mehr richtig ausgeführt
Was hat das mit Deinem Wunsch zu tun, eine Adresse nicht als POINTER zu übergeben? :confused:
Was verlangt denn die SCL-Quelle, der Du anscheinend von außen einen variablen Wert übergeben willst?

Harald


Huch, hast ja grad auch geantwortet. :)
Merci PN/DP.

Habe es dalbi gerade bestmöglich erklärt. Kann mich leider manchmal nicht so präzise ausdrücken. :rolleyes:

werde es morgen (erst) testen können und dann feedback geben.
 
FC1
Code:
// IN  : Start_DB : Block_DB
//     : Start_Adresse : Int
// TEMP: Start_OffsetPtr : DWord

// aus #Start_Adresse (INT) einen Adresspointer (P#) machen :
      L     #Start_Adresse          // ( 2 )
      SLD   3                       // ( 2 -> P#2.0 )
      T     #Start_OffsetPtr        // in LD für speicherindirekte Adressierung

Harald[/QUOTE]
Danke.
Das funktioniert wie es soll. :). hast mich ja also doch verstanden. :p  
Noch eine Frage, rein interessehalber:
mit SLD 3 wird ja ( 2 -> P#2.0 ) Integer zu Pointer gemacht. wenn ich dieses SLD 3 ( Schiebe links Doppelwort) auskommentiere und dafür gleich einen Pointer als Start_Adresse lade, funktioniert mein SCL file nicht mehr.:?:

[CODE]
// IN  : Start_DB : Block_DB
//     : Start_Adresse : Pointer
// TEMP: Start_OffsetPtr : DWord

// aus #Start_Adresse (INT) einen Adresspointer (P#) machen :
      L     P##Start_Adresse          // ( 2 )
//      SLD   3                       // ( 2 -> P#2.0 )
      T     #Start_OffsetPtr        // in LD für speicherindirekte Adressierung
 
Hi,

warum ist das wohl so. Weil ein Pointer die Adresse enthält und nicht den Wert. Außerdem hat er eine Länge von 6 Bytes. Wie viel Bytes hat Start_OffsetPtr? Geht das mit dem L und T überhaupt? ;)

Gruss Daniel
 
Hi,

warum ist das wohl so. Weil ein Pointer die Adresse enthält und nicht den Wert. Außerdem hat er eine Länge von 6 Bytes. Wie viel Bytes hat Start_OffsetPtr? Geht das mit dem L und T überhaupt? ;)

Gruss Daniel

Das mit dem Pointer war mir nicht ganz klar. :sm25:
Ja ok, das DWord hat nur 4b...hätte ja sein können dass es die 2 byte irgendwie automatisch wegschneidet^^. aber gut, ich ziehe die frage zurück.
;)

Edit:
naja, es funkioniert ja jetzt. Aber hier hast du sie nachträglich.

Aus dem SCL:

Code:
FUNCTION_BLOCK FB7000
VAR_INPUT
 Status1: BYTE;
 Status2: BYTE;
 Status3: BYTE;
 Value1 : WORD;
 Value2 : WORD;
 Value3 : WORD;
END_VAR

VAR_OUTPUT
 Control1: BYTE;
 Control2: BYTE;
 Control3: BYTE;
END_VAR
 
Hi,

Danke, jetzt hab ich es glaube auch verstanden. :)
Sind die Werte in Deinem DB genau so angelegt wie die Parameter des Bausteins? z.b. Als Struct somit könntest Du direkt an deinen Start die Struktur hängen z.b. "DB_XY".FB7000_1 und es wäre symbolisch.

Oder ist Start von irgendwas anderem abhängig? Sprich ändert sich der Wert im Programm.

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Danke, jetzt hab ich es glaube auch verstanden. :)
Sind die Werte in Deinem DB genau so angelegt wie die Parameter des Bausteins? z.b. Als Struct somit könntest Du direkt an deinen Start die Struktur hängen z.b. "DB_XY".FB7000_1 und es wäre symbolisch.

Oder ist Start von irgendwas anderem abhängig? Sprich ändert sich der Wert im Programm.

Gruss Daniel

Jup, die sind genau so angelegt.
Ah ok, das hört sich interessant an. Ich bin mal froh dass es so läuft wie es soll, aber danke trotzdem.
Mit Start soll eigentlich nur das SCL file gestartet werden.
 
Sind die Werte in Deinem DB genau so angelegt wie die Parameter des Bausteins? z.b. Als Struct somit könntest Du direkt an deinen Start die Struktur hängen z.b. "DB_XY".FB7000_1 und es wäre symbolisch.
Hallo Dalbi,

das mit der Struktur klingt interessant. Hab's gleich mal ausprobiert. Leider meckert er über den Strukturparameter "X1 ist keine Komponente von DB_SCHROTT". Was mache ich hier falsch?

Gruß Thomas
 

Anhänge

  • Struktur.JPG
    Struktur.JPG
    100,1 KB · Aufrufe: 9
Zurück
Oben