Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: mit einem Zeiger auf ein komplettes ARRAY zeigen???

  1. #1
    Registriert seit
    13.08.2012
    Beiträge
    112
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hallo...

    ich muss an einer Funktion verschiedene Zieladressen unterschiedlicher Länge umschalten können.

    ich dachte mir, einen Zeiger, die je nach Bedingung dann auf ein entsprechendendes Arrays zeigt, die in einem DB hinterlegt sind. dann folgt der Funktionsaufruf und im Ziel steht dann nicht der Datenbereich wo es hin soll, sondern nur ein zeiger

    Kamm man überhaupt auf ein Array zeigen, incl der Array-Länge.

    wie man auf ein byte, wird oder Dword zeigt, ist mir syntaktisch klar, aber auf ein komplettes Array, das versteh und weiss ich nicht...

    danke
    Zitieren Zitieren mit einem Zeiger auf ein komplettes ARRAY zeigen???  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Das würde mit einem Any gehen oder mit zwei Variablen eine für das Ziel und eine für die Länge.
    Sieh dir mal dazu im Foren-FAQ die entsprechenden Beiträge an.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    fk- princess ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.08.2012
    Beiträge
    112
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    den ANY-zeiger habe ich mir als temp-variable erzeugt. und diese variable steht nun auch an der zielangabe der Funktion.

    der für mich nun noch unklare teil ist die verknüpfung des ANY-zeigers mit dem Array´s im Datenbaustein...

    ich schau mich mal im FAQ-Bereich mit um
    dank dir

  4. #4
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Du musst halt für den ANY-Zeiger die (Start-)Adresse des Array-Elements im DB vorher berechnen/deklarieren.

    Hinweis:Zugriffe auf Array-Elemente lassen sich sehr elegant mit SCL lösen.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  5. #5
    fk- princess ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.08.2012
    Beiträge
    112
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    hab eine sehr gute beschreibung im FAQ bereich gefunden und es hat, was das thema angeht, nun richtig "klick" gemacht. die funktion fordert aber am ausgang einen pointer, und akzeptiert den any-zeiger nicht

    und der anyzeiger war nun die elegante lösung variable ziele an dem ausgang zu ermöglichen. bei der funktion handelt es sich um den FC6

    die nachrichten sollen aufgeteilt werden...

  6. #6
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Dann solltest Du anders herangehen. Der FC6 sollte in einen festen Bereich schreiben. Meinetwegen einen Empfangsbaustein.
    Wenn der NDR dann auf TRUE geht, kannst Du die Daten (vermutlich ein String) aufteilen und woanders hinschreiben.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  7. #7
    fk- princess ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.08.2012
    Beiträge
    112
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    mmh ich meine das anders. kurze nachrichten sollen in einen anderen breich gespeichert werden, wie lange nachrichten. entweder in einen bereich der 12byte gross ist, oder in einen der 24 byte gross ist.

    die grösser der ankommenden nachricht kann ich im vorfeld schon herausbekommen. entsprechend möchte ich an den ausgang von fc6 nur einen zeiger der entsprechend der kommenden nachricht auf den einen bereich zeigt, oder in auf einen anderen.

    das hauptproblem ist immer noch, das bei einem neuen empfang einer nachricht der datenbereich am fc6 nicht wieder von vorn beschrieben wird, sondern dort wieder anfängt, wo die letzte nachricht aufgehört hat.
    die nachrichtenlängen sind wie oben beschrieben fest.
    ich muss das so realisieren, das die nachrichten so empfangen werden, das der zeilenumbruch (ende nachricht) immer am ende steht

  8. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Ich glaube, das geht einfach nicht.
    Du solltest einen festen Empfangsbereich vorsehen.
    Du kennst die Endposition des letzen empfangenen Datenpaketes.
    Du kennst die Länge der zu empfangenden Nachricht.
    Wenn die Nachricht das Ende des Empfangsfaches übersteigt, wird der Rest vorn beginnend in das Fach eingetragen.
    Mit diesen Infos mußt du dir den empfangenen String selbst zusammenbauen und ihn anschließend mit einem Blockmove an die Stelle kopieren, an der du sie haben willst.

    Zugegeben, das ist recht aufwändig, aber ich mußte das auch schon einmal machen für eine Ethernetkommunikation, dort gabs eine feste Endekennung, mit der konnte man das Ende des empfangenen Strings finden, da die Länge unbekannt war. Es ist zumindest machbar, empfehlen würde ich dafür SCL.
    Geändert von Ralle (21.09.2012 um 13:20 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  9. #9
    fk- princess ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.08.2012
    Beiträge
    112
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    das thema lässt mir keine ruhe... ich habe mir in einem extra funktionsbaustein nach dem vorbild der siemenshilfe: 870 75 70 einen ANY-pointer geschaffen, der es mir nun erlaubt variable längen, bzw wiederholungen anzugeben,, je nachdem, welche nachrichten empfangen werden ( 24byte oder 12byte).

    ABER:

    nach der ermittlung, welche nachrichtenlänge als nächstes empfangen werden soll, wird die länge in der Int-variable für den anypointer mit dem wert gefüllt. dann erfolgt der Funktionsbaustein aufgerufen, der den anypointer enthält, wie auch den FC6 aufruf.

    laut variablentabelle sehe ich jedoch, das die neue, kurze, nachricht nicht empfangen wird. das NDR signal kommt noch nicht. der Empfangsbaustein scheint immernoch eine 24byte nachricht zu erwarten. sende ich nochmals eine kurze nachricht, kommt es zur bereichsüberschreitung, da nun 24byte gesendet wirden, die jedoch noch nicht im empfangsspeicher stehen, der aber nur 12 byte gross ist.

    gebe ich nun wieder als empfangslänge 24byte an, stehen die beiden kurzen nachrichten im puffer der langen nachricht, und dann kommt auch wie gehabt das NDR signal.

    ich weiss einfach nicht, was ich beim umschalten vergessen habe, anzugeben, damit die kurzen nachrichten sauber empfangen werden.
    anbei am ende noch ein sps code, wie ich das mit dem pointer gelöst heba und wie er mit dem FC6 verbunden ist

    TAR2
    UD DW#16#FFFFFF
    LAR1 P##RECV_BUF
    +AR1
    // Adresse des Zeigers in das Adressregister laden

    L B [AR1,P#0.0]
    T LB 0
    L B [AR1,P#1.0]
    T LB 1
    L B [AR1,P#2.0]
    T LB 2
    L B [AR1,P#3.0]
    L #PASS_FAIL // hier steht entweder 24 oder 12, jenachdem welche nachricht als nächstes kommt
    T LB 3
    L W [AR1,P#4.0]
    T LW 4

    L W [AR1,P#6.0]
    T LW 6
    L W [AR1,P#8.0]
    T LW 8 // empfangspuffer start ist hier der selbe. einmal soll er mit 24byte gefüllt werden, oder mit 12byte


    CALL "Empfangsbaustein"
    ID :=#ID
    LADDR :=#LADDR
    RECV :=#VAR_BUF
    NDR :=#RCV_NDR
    ERROR :=#RCV_ERR
    STATUS:=#RCV_STAT
    LEN :=#RCV_LEN

    Puffer ist mit 40 byte gross genug

    edit: auch den status habe ich mal angesehen. bei empfang der langen nachricht kommt auch immer ein wechsel zwischen 8181(busy) und 8180(ready for new). wechselt nun die nachricht auf eine kurze, so bleibt der empfänger in 8180(ready for new) die kurze nachricht wird also einfach nicht übertragen... irgendwas scheint noch zu fehlen
    Geändert von fk- princess (25.09.2012 um 10:08 Uhr)

  10. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von fk- princess Beitrag anzeigen
    das thema lässt mir keine ruhe... ich habe mir in einem extra funktionsbaustein nach dem vorbild der siemenshilfe: 870 75 70 einen ANY-pointer geschaffen, der es mir nun erlaubt variable längen, bzw wiederholungen anzugeben,, je nachdem, welche nachrichten empfangen werden ( 24byte oder 12byte).

    ABER:

    nach der ermittlung, welche nachrichtenlänge als nächstes empfangen werden soll, wird die länge in der Int-variable für den anypointer mit dem wert gefüllt. dann erfolgt der Funktionsbaustein aufgerufen, der den anypointer enthält, wie auch den FC6 aufruf.

    laut variablentabelle sehe ich jedoch, das die neue, kurze, nachricht nicht empfangen wird. das NDR signal kommt noch nicht. der Empfangsbaustein scheint immernoch eine 24byte nachricht zu erwarten. sende ich nochmals eine kurze nachricht, kommt es zur bereichsüberschreitung, da nun 24byte gesendet wirden, die jedoch noch nicht im empfangsspeicher stehen, der aber nur 12 byte gross ist.

    gebe ich nun wieder als empfangslänge 24byte an, stehen die beiden kurzen nachrichten im puffer der langen nachricht, und dann kommt auch wie gehabt das NDR signal.

    ich weiss einfach nicht, was ich beim umschalten vergessen habe, anzugeben, damit die kurzen nachrichten sauber empfangen werden.
    anbei am ende noch ein sps code, wie ich das mit dem pointer gelöst heba und wie er mit dem FC6 verbunden ist

    TAR2
    UD DW#16#FFFFFF
    LAR1 P##RECV_BUF
    +AR1
    // Adresse des Zeigers in das Adressregister laden

    L B [AR1,P#0.0]
    T LB 0
    L B [AR1,P#1.0]
    T LB 1
    L B [AR1,P#2.0]
    T LB 2
    L B [AR1,P#3.0]
    L #PASS_FAIL // hier steht entweder 24 oder 12, jenachdem welche nachricht als nächstes kommt
    T LB 3
    L W [AR1,P#4.0]
    T LW 4

    L W [AR1,P#6.0]
    T LW 6
    L W [AR1,P#8.0]
    T LW 8 // empfangspuffer start ist hier der selbe. einmal soll er mit 24byte gefüllt werden, oder mit 12byte


    CALL "Empfangsbaustein"
    ID :=#ID
    LADDR :=#LADDR
    RECV :=#VAR_BUF
    NDR :=#RCV_NDR
    ERROR :=#RCV_ERR
    STATUS:=#RCV_STAT
    LEN :=#RCV_LEN

    Puffer ist mit 40 byte gross genug

    edit: auch den status habe ich mal angesehen. bei empfang der langen nachricht kommt auch immer ein wechsel zwischen 8181(busy) und 8180(ready for new). wechselt nun die nachricht auf eine kurze, so bleibt der empfänger in 8180(ready for new) die kurze nachricht wird also einfach nicht übertragen... irgendwas scheint noch zu fehlen
    Versteh ich da etwas falsch? (rote Markierungen)
    Wer übermittelt dir die kommende Länge?

    Ich hab dir einen anderen Lösungsweg genannt, was ist damit?
    Ich bin mit nicht sicher, wann genau einen neue Bufferlänge übernommen wird, vielleicht ist die nach dem Erstaufruf der Bausteine fix????
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 19.07.2012, 16:51
  2. Any-Zeiger auf Daten in einem Instanz-DB basteln
    Von Potz Blitz im Forum Programmierstrategien
    Antworten: 2
    Letzter Beitrag: 22.02.2012, 22:10
  3. Antworten: 6
    Letzter Beitrag: 30.09.2011, 13:35
  4. Probleme mit einem Array
    Von Hitschkock im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 30.03.2009, 11:42
  5. Möglichkeit ein komplettes PRG zu schützen??
    Von Olafius im Forum Simatic
    Antworten: 44
    Letzter Beitrag: 14.11.2007, 11:20

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •