Step 7 SCL Pointer

Sickone4

Level-2
Beiträge
68
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

ich muss mal wieder mit dem ANY Pointer Thema kommen. Im Forum gibts dazu ja einige Beiträge, auch auf der Siemens Seite finde ich einiges dazu, jedoch komme ich bei dem kleinen Aufruf eines SFC 14 und 15 total ins Schwitzen, sodass ich euch um Hilfe bitten muss.

Die Aufgabe die ich habe ist es, 32 Byte vom DP-Slave ab Adresse 256 zu lesen bzw zu schreiben.
In AWL geht das ja relativ einfach mit P#DB900.DBX0.0 Byte 32.

In der Siemens Hilfe steht bei der Pointer Deklaraiton jedoch ein bisschen mehr als nur dieser eine Aufruf, sprich der Pointer wird zusammengebaut.
http://support.automation.siemens.c...&viewreg=WW&nodeid0=10805400&objaction=csview

Aber warum brauche ich das alles?
SynthaxId, DataType, Count, DB_Nr, Byte_Pointer

Kann man das in SCL nicht einfacher machen?

Prinzipiell könnte ich meinen Baustein auch in AWL Programmieren, jedoch ist die Auswerteanwendung die zwischen dem lesen/schreiben steht in SCl wesentlcih einfacher, wg schleifen und so.

Vielleicht kann mir ja jemand ein wneig helfen.

Gruß
Sven
 
Hallo,
ja ... in SCL kannst du dir das viiiiiel einfacher machen ... :)
Du deklarierst dir in deinem Baustein einen Datenbereich (z.B. ein Array oder eine Struktur) der dem entspricht (von der Größe her), das du zuweisen möchtest.
Anschließend deklarierst du dir eine Variable vom Typ ANY und weisst der den zuvor deklarierten Datenbereich zu. Nun hast du den ANY mit den benötigten Informationen gefüllt und kannst den z.B. an den SFC14 weitergeben.
Code:
// in der Deklaration z.B.
myDaten : Array [1..32] of Byte ;

myANY : Any ;

// und im Codeteil dann :
myAny := myDaten ;
// nun einfach den myAny benutzen wie gewohnt ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
super! Vielen Dank das hat wunderbar geholfen.

ich hab nun noch eine kleine Frage:

ich habe mir aus dem AWL Baustein eine deklaration kopiert:
"Sendedaten".Sende_Daten[0]:= "Daten".Senden.PersName[1]

Beides DBs, welche entsprechend Felder beinhalten. Die Liste geht links bis 9 rechts bis 10.
Es handelt sich um einen String, den ich Byteweise kopieren muss, da ich ihn erst im Ziel als String deklarieren kann.

übernimmt SCL nicht automatisch die symbolischen namen?
und wie könnte ich meine schleife schreiben, um mir 10 zeile deklaration zu erleichtern?

strName := 10; // INT
I,K INT

FOR I:=1 TO strName DO
"Sendedaten".Sende_Daten[K] := "Daten".Senden.PersName
END_FOR;

der Compiler sagt mir ständig, dass es das Symbol nicht gibt. Auch eine Änderung in:

Db900.dbb[k] funktioniert nicht. was mache ich denn da falsch?
 
doch ... das sollte (mit geringen Änderungen) so gehen :
Code:
FOR I:=1 TO strName [COLOR=#B22222][B]by 1 [/B][/COLOR]DO
        "Sendedaten".Sende_Daten[K] := "Daten".Senden.PersName[I]  [COLOR=#B22222][B];[/B][/COLOR]
    END_FOR;
ich habe so etwas aber bislang noch nie mit komplexen Variablen (also z.B. Strings) versucht ...

Gruß
Larry
 
Hallo Larry,

ich merke dass du hier die Ahnung hast. :)

Kannst du mir nur ein Tipp geben wie das gemacht wird, ich denke es handelt sich um das selbe Problem wie vom Sven.

Also
Code:
INOUT
  INOUT_ACT : ANY;
END_INOUT;

STAT
  ACT : UDT101;
END_STAT;

TEMP_VAR
  POINT_ACT: STRUCT
        SYNTAX_ID       : BYTE;
        BEREICHSTYP     : BYTE;
        ANZAHLWERTE     : WORD;
        DBNR            : WORD;
        STARTADRESSE    : WORD;
  END_STRUCT;

  iTEMP : INT;
  ANY_01: ANY;
END_TEMP_VAR;

BEGIN
    L     P##INOUT_OVEN_PARAMETER
      LAR1  
      L     B [AR1,P#0.0]               // Syntax-ID aus dem Any-Pointer auslesen
      T     #POINT_ACT.SyntaxID
      L     B [AR1,P#1.0]               // Bereichstyp auslesen (B#16#2 = Byte;  B#16#3 = Int; B#16#4 = Word;  B#16#7 = DInt; B#16#8 = DWord)
      T     #POINT_ACT.Bereichstyp
      L     W [AR1,P#2.0]               // Anzahl der zu übertragenden Werte (Byte/Word)
      T     #POINT_ACT.AnzahlWerte
      L     W [AR1,P#4.0]               // DB-Nummer auslesen
      T     #POINT_ACT.DBNR
      L     D [AR1,P#6.0]               // Pointer Startadresse auslesen
      T     #POINT_ACT.STARTADRESSE

      L     P##ANY_01
      LAR1  
      L     ##POINT_ACT.SyntaxID
      T     B [AR1,P#0.0]               // Syntax-ID in den Any-Pointer schreiben
      L     #POINT_ACT.Bereichstyp
      T     B [AR1,P#1.0]               // Bereichstyp schreiben (B#16#2 = Byte; B#16#4 = Word)
      L     #POINT_ACT.AnzahlWerte
      T     W [AR1,P#2.0]               // Anzahl der zu übertragenden Werte (Byte/Word)
      L     ##POINT_ACT.DBNR
      T     W [AR1,P#4.0]               // DB-Nummer schreiben
      L     #POINT_ACT.STARTADRESSE
      T     D [AR1,P#6.0]               // Pointer Startadresse schreiben
     
 CALL  "BLKMOV"
       SRCBLK :=#ANY_01
       RET_VAL:=#iTEMP
       DSTBLK :=#ACT

.....
// Nun kommt die Code Abarbeitung.

// Am Schluss werden die Daten über den SFC20 wieder an den Eingang kopiert.
      CALL  "BLKMOV"
       SRCBLK :=#ACT
       RET_VAL:=#iTEMP
       DSTBLK :=#ANY_01

Der oben beschriebene Code ist auf AWL geschrieben, aber da ich leichter IF, CASES, FOR usw Anweisungen in SCL schreiben kann würde ich den Quellcode in SCL schreiben statt in AWL.

In AWL funktioniert der CODE.

Ich verstehe nicht wie ich es in SCL umwandeln kann den CODE.

Kann mir da jemand helfen?! Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sieh dir das mal an: #5
So sieht eine AT-Ansicht auf Any aus. Damit kannst du dann die Daten deines Any entsprechend einrichten und den Blockmove versorgen.

PS: In deinem Fall sollte in SCL aber eigentlich einfach

Code:
  ACT := INOUT_ACT;

dein code...

  INOUT_ACT := ACT;

reichen, wenn ACT und INOUT_ACT vom gleichen Typ (UDT101) sind.

Warum arbeitest du nicht gleich mit INOUT_Act, wird doch bereits durchgereicht?
 
Zuletzt bearbeitet:
Dank dir Ralle,

ja das wäre die schönste Möglichkeit, aber da macht mir Siemens ein Strich durch die Rechnung.
Ich kriege Problem, wenn ich die Variablen weiterdurchreiche an andere FC's etc. in dem Baustein.

MIt der INOUT_ACT werde ich mal versuchen, dass es so leicht ist kann ich schwer glauben... ;)
 
Zurück
Oben