Pointer und Co

mkd

Level-2
Beiträge
197
Reaktionspunkte
30
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Ich habe mich heute daran gewagt doch einmal mit Pointern zu arbeiten.

Folgender Ansatz: Ich möchte an meinem Baustein Eine Startadresse angeben z.B. M50.0 zusätzlich möchte ich die Länge des Auswertebereiches (Bytes) als Int angeben.
Der Baustein soll mir nun nach seinem Aufruf die Anzahl der Bits mit Status "1" ausgeben.

Irgendwie verzweifel ich da gerade:confused: seit ein paar Stunden :ROFLMAO:


Hier der Code:

Code:
//Initialisieren

      L     0
      T     #outy                       //Ausgangs Int
      T     #schleifenindex_2           //Schleifenindex Bit

      L     #start                      //Startbyte laden
      T     #schleifenindex_1           //in Schleifenindex Byte Schleife 

//Startbyte + Länge
      L     #start
      L     #anzahl_bytes
      +I    
      T     #bytes

      L     #bytes
      INC   1
      T     #bytes




//Hauptschleife  (nxt1)
nxt1: NOP   0

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


//Bit-Schleife
nxt2: NOP   0

      L     #schleifenindex_1           //Byte 0...schleifenindex_1
      SLD   3
      LAR1                              // im ar1 steht p#0.0
      L     #schleifenindex_2           //Schleifenindex 
      +AR1                              // der Schleifenindex wird zum ar1 hinzuaddiert. im ar1 steht jetzt p#0.x
//Auswertung Bit
      U     E [AR1,P#0.0]               // fragt ex.x ab
      SPBN  ddd

      L     #outy
      INC   1
      T     #outy


ddd:  NOP   0
      L     #schleifenindex_2           // Schleifenindex hochzählen
      INC   1
      T     #schleifenindex_2


//Bit-Schleife verlassen ?

      L     #schleifenindex_2
      L     8
      >=I   
      SPB   out2

      LOOP  nxt2

out2: NOP   0

      L     0
      T     #schleifenindex_2

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

      L     #schleifenindex_1           // Schleifenindex hochzählen
      INC   1
      T     #schleifenindex_1

//Byte-Schleife verlassen ?
      L     #schleifenindex_1           //Byteanzahl erreicht ?
      L     #bytes                      //#bytes
      >=I   
      SPB   out1



      LOOP  nxt1

out1: NOP   0
Sieht noch wild aus, ich weiß.

Mit der Zeile:

Code:
//Auswertung Bit
      U     E [AR1,P#0.0]               // fragt ex.x ab
frage ich ja jetzt die Eingangsbits ab. Ich gebe jetzt von aussen am Baustein ein Int als Startbyte und ein Int als Länge an.

Kann mir bitte jeman auf die Sprünge helfen wie ich Als Startadresse z.B. M0.0 + Länge in Bytes angeben kann?

Danke
mkd
 
Zuletzt bearbeitet:
Danke Ralle, das hat mir sehr weiter geholfen!

Dann werde ich mir morgen weiter den Kopf zerbrechen.

mkd
 
Hier ist mal ein kurzes Programmbeispiel mit einem ANY-Pointer als IN-Parameter an einer Funktion:

Code:
ORGANIZATION_BLOCK OB 1
TITLE =Hauptprogramm
//16
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : BITS
VERSION : 1.0
 
VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =Bits zählen
 
      CALL FC   100 (
           STARTADRESSE             := P#M 200.0 BYTE 6,
           ANZAHL_BITS              := MW   220);
      NOP   0; 
 
NETWORK
TITLE =Bits zählen
 
      CALL FC   100 (
           STARTADRESSE             := P#DB200.DBX0.0 BYTE 6,
           ANZAHL_BITS              := MW   222);
      NOP   0; 
 
END_ORGANIZATION_BLOCK

Code:
FUNCTION FC 100 : VOID
TITLE =Bits (TRUE) zählen
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : BITS
VERSION : 1.0
 
VAR_INPUT
  STARTADRESSE : ANY ; 
END_VAR
VAR_OUTPUT
  ANZAHL_BITS : INT ; 
END_VAR
VAR_TEMP
  DB_REGISTER : WORD ; 
  AR1_REGISTER : DWORD ; 
  ANZAHL_BYTES : WORD ; 
  DB_NUMMER : WORD ; 
  BEREICHSZEIGER : DWORD ; 
  SCHLEIFE : INT ; 
  ZAEHLER_BITS : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
 
      L     DBNO; // DB-Register
      T     #DB_REGISTER; 
 
      TAR1  #AR1_REGISTER; // AR1-Register
 
NETWORK
TITLE =Startadresse (ANY)
 
      L     P##STARTADRESSE; // Startadresse (ANY)
      LAR1  ; 
 
      L     W [AR1,P#2.0]; // Anzahl Bytes
      T     #ANZAHL_BYTES; 
 
      L     W [AR1,P#4.0]; // DB-Nummer
      T     #DB_NUMMER; 
 
      L     D [AR1,P#6.0]; // Bereichszeiger
      T     #BEREICHSZEIGER; 
 
NETWORK
TITLE =Bits (TRUE) zählen
 
      AUF   DB [#DB_NUMMER]; // DB-Nummer
 
      L     #BEREICHSZEIGER; // Bereichszeiger
      LAR1  ; 
 
      L     0; 
      T     #ZAEHLER_BITS; // Zähler Bits
 
      L     #ANZAHL_BYTES; // Anzahl Bytes
      L     8; 
      *I    ; 
M01:  T     #SCHLEIFE; // Schleife
 
      U      [AR1,P#0.0]; // Bits (TRUE)
      SPBN  M02; 
 
      L     #ZAEHLER_BITS; // Zähler Bits
      L     1; 
      +I    ; 
      T     #ZAEHLER_BITS; // Zähler Bits
 
M02:  L     P#0.1; // Bereichszeiger
      +AR1  ; 
 
      L     #SCHLEIFE; // Schleife
      LOOP  M01; 
 
      L     #ZAEHLER_BITS; // Zähler Bits
      T     #ANZAHL_BITS; // Anzahl Bits
 
NETWORK
TITLE =Register wiederherstellen
 
      AUF   DB [#DB_REGISTER]; // DB-Register
 
      LAR1  #AR1_REGISTER; // AR1-Register
 
END_FUNCTION

Gruß Kai
 

Anhänge

  • OB1.pdf
    6 KB · Aufrufe: 14
  • FC100.pdf
    7,2 KB · Aufrufe: 21
  • DB200.pdf
    4,9 KB · Aufrufe: 14
  • VAT.jpg
    VAT.jpg
    283,6 KB · Aufrufe: 25
  • Bits.zip
    32,4 KB · Aufrufe: 13
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kai,

einen riesen Dank!
Mit deinem Beispiel und der Siemens Hilfe (Suchbegriff: "Indirekte Adressierung") bin ich jetzt dahinter gestiegen.
Bis jetzt bin ich immer ohne dieses Werkzeug ausgekommen.
Dieses mal nicht. Ergebnis sollte ein Baustein sein, der die Anzahl der High oder Low Bits eines freien Bereiches ermittelt und eine Neu Meldung für ein neues High oder Low Bit ausgibt.
Als zwischenspeicher nutze ich einen DB den ich per IN am Baustein angebe.

Alles läuft, nach viel Kopfzerbrechen, rund und ich verstehe sogar was ich gemacht habe :cool:

Gruß
Daniel
 
Zurück
Oben