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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: ANY-Pointer Indirekt Adressieren

  1. #11
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... und wie gedenkst du nun weiterzumachen ... ?

  2. #12
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Gute Frage Larry, da ich mich mit ANY - Poniter überhaupt nicht auskenne und schon froh bin das der Code zum durchreichen des ANY's von IN zu TEMP so funktioniert hat, dachte ich das Ihr noch eine Lösung habt.

    Dein Vorschlag hörte sich ja gut an nur hab ich keine Ahnung wie man dies umsetzt.

  3. #13
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Naja ... so wie beschrieben :
    du bildest dir einen "eigenen" Speicherbereich in den du via BlockMove (SFC20) die eigentlichen Empfangsdaten hineinkopierst, der aber auch schon von vorn herein Platz für deine Zusatzinfo (hier jetzt am Ende) hätte. Auf diesen Speicherbereich in siener erweiterten Form bildest du dir wieder einen eigenen ANY den du dann weitergibst.
    An welcher Stelle hast du ein Verständnisproblem ?

    Gruß
    Larry

  4. #14
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich hätte ja auch noch eine andere Idee wie man es machen könnte, aber eben nur Theoretisch:

    Wenn ich an den IN des Bausteins meinen DB anschreibe z.B P#DB100.dbx0.0 BYTE 100 wird er ja momentan im Baustein auf die TEMP Variable (tmp_Any_SendData) geschrieben, so dass ich ihn an den AG_SEND übergeben kann.

    Somit steht in der TEMP Variable (tmp_Any_SendData) irgendwo ja schon die DB Nummer drin.
    Wenn ich diese DB Nummer mir nehmen könnte und éine Variable (ka. welcher Datentyp man nimmt) erzeuge, mit dem inhalt z.B DBNummerDBW.0.0 währe mir weitergeholfen.
    So könnte ich einen Wert in die Variable reinschreiben und diese wird dem DB übergeben.

    Oder ist das alles einfach zu kompliziert für ein Anfänger.



    .KOP_AWL_FUP - [FB680 -- _FB_AG_SEND_AG_RECV_ -- CP343-1 COM_Projekt1_SIMATIC 30-000004.jpg
    KOP_AWL_FUP - [FB680 -- _FB_AG_SEND_AG_RECV_ -- CP343-1 COM_Projekt1_SIMATIC 30-000005.jpg
    KOP_AWL_FUP - [OB1 -- _CYCL_EXC_ -- CP343-1 COM_Projekt1_SIMATIC 300(1)_CPU 315-000003.png
    Geändert von Petri.f (25.09.2013 um 12:48 Uhr)

  5. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Wenn Du Dir das ANY-Format in der Step7-Hilfe oder hier in der Forum-FAQ anschaust, dann wirst Du sehen, daß Dein Vorhaben relativ leicht realisierbar ist - doch wie ich schon schrieb: das ist höchst unsaubere Programmierung, welche später wahrscheinlich nur noch von Profis nachvollziehbar ist.

    Da Du immer auf den Anfang des per ANY übergebenen Speicherbereichs zugreifen willst, braucht eigentlich nur die Längenangabe in dem ANY geändert werden und schon hat man einen ANY-Pointer auf z.B. das erste Word in dem Speicherbereich. Oder man lädt die Adressangabe aus dem ANY in das DB-Register und AR1 und kann so indirekt auf das erste Word zugreifen (L W [AR1, P#0.0]).

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #16
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Naja unsauber is es doch nur dann wenn es nicht funktioniert. Der Baustein sollte so aufgebaut sein das er einfach zu bedienen ist und eben alles abdeckt was ich zur S7 - S7 Komunikation mit CP343 brauche.

    Wie würdes du den so ein Baustein aufbauen.

    Danke

  7. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    "Unsauber" ist das Programm schon dann, wenn die Variablenzugriffe nicht mehr in den Referenzdaten auftauchen (und auch nicht per Quelle rekonstruierbar sind) und man als (Fremd-)Programmierer dadurch fast keine Chance mehr hat, das Programm zu verstehen und zu warten.

    Übrigens wirst auch Du früher oder später vergessen haben wie der so programmierte Programmteil funktioniert. Bei Deinen momentanen Programmierkenntnissen rechne ich damit eher früher. Also bitte: laß es sein.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #18
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Gut dann wäre dieser Code in meinem Baustein auch schon unsauber, da man den Variablenzugriff nicht mehr in den Referenzdaten nachvollziehen kann?

    Code:
    //AR2 Adressregister sichern
          TAR2  #tmp_DW_AR2_Save
    
    //*** SendData kopieren *************************
    //Pointer auf IN_OUT-Parameter SendData erstellen
          LAR1  P##SendData                 // relative Adresse #SendData in dieser Instanz (DI)
          TAR2                              // Offset dieser Multiinstanz (DB)
          +AR1                              // AR1: absolute Adresse #SendData im IDB (DI)
    
    //Pointer auf TEMP-Variable tmp_Any_SendData erstellen
          LAR2  P##tmp_Any_SendData         // AR2: Adresse des TEMP-ANY
    
    //ANY IN_OUT.SendData nach TEMP.tmp_Any_SendData kopieren
          L     D [AR1,P#0.0]               // (S7-ID + Datentyp + Wiederholfaktor)
          T     D [AR2,P#0.0]
          L     W [AR1,P#4.0]               // (DB_Nr)
          T     W [AR2,P#4.0]
          L     D [AR1,P#6.0]               // (Bereichsadresse)
          T     D [AR2,P#6.0]
    
    
    
    //*** RecvData kopieren *************************
    //Pointer auf IN_OUT-Parameter RecvData erstellen
          LAR1  P##RecvData                 // relative Adresse #RecvData in dieser Instanz (DI)
          L     #tmp_DW_AR2_Save            // Offset dieser Multiinstanz (DB)
          +AR1                              // AR1: absolute Adresse #RecvData im IDB (DI)
    
    //Pointer auf TEMP-Variable tmp_Any_RecvData erstellen
          LAR2  P##tmp_Any_RecvData         // AR2: Adresse des TEMP-ANY
    
    //ANY IN_OUT.RecvData nach TEMP.tmp_Any_RecvData kopieren
    //ALTERNATIVE Codevariante für besser verstehbar
          L     DID [AR1,P#0.0]             // (S7-ID + Datentyp + Wiederholfaktor)
          T     LD [AR2,P#0.0]
          L     DIW [AR1,P#4.0]             // (DB_Nr)
          T     LW [AR2,P#4.0]
          L     DID [AR1,P#6.0]             // (Bereichsadresse)
          T     LD [AR2,P#6.0]
    
    //*** Ende Parameter vorbereiten ********************
    //VOR Zugriffen auf Instanzobjekte das AR2 unbedingt wiederherstellen!
          LAR2  #tmp_DW_AR2_Save            //AR2 Adressregister wiederherstellen
    Aber irgendwie muss ich den ANY - Pointer an den IN des Baustein schalten. Oder hast du da eine saubere Lösung.

  9. #19
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Beispiel:

    Du hast einen Speicherbereich DB100.DBB0..DBB99
    Den übergibst Du als P#DB100.DBX0.0 BYTE 100 an Deinen FB an IN_OUT.SendData
    Dies erscheint in den Referenzdaten (deshalb ist mein Kopiercode INOUT->TEMP in #18 auch nicht unsauber)

    In dem Speicherbereich hast Du ein Lebensbit DB100.DBX0.7 und ein Counterbyte DB100.DBB1
    Im FB ermittelst Du aus dem ANY von IN_OUT.SendData die Adresse des Lebensbits (IN_OUT.SendData + P#0.7) und des Counterbytes (IN_OUT.SendData + P#1.0) und beschreibst diese indirekt.
    Diese Zugriffe erscheinen nicht in den Referenzdaten, noch nicht einmal unqualifiziert als DBX0.7 oder DBB1
    --> "nirgends werden DB100.DBX0.7 und DB100.DBB1 beschrieben und doch ändern sie sich!"

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren Unsauber  

  10. #20
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ok super jetzt hab ich es verstanden. Gibt es aber eine andere Lösung. Oder wie würdest du es umsetzen.

    Das Problem was ich hab ist das der AG_SEND und AG_RECV den CPU Ausfall nicht erkennen nur wenn die CP343 ausfällt oder eben bei Kabelbruch.
    Auserdem ist die Überwachung per Watchdog sicherer.

    Wie programmiere ich sonst einen Baustein der SEND u. RECV beinhaltet sowie eine Verbindungsüberwachung.
    Den wir haben eine Haupt S7-300 mit 2x CP343 und 20x S7-300 mit 1x CP343-Lean und benötigen hierfür einen Baustein.
    Daher dachte ich mir ich schreibe einmal einen Baustein pro Verbindungsaufbau und rufe diesen 20X auf.

Ähnliche Themen

  1. String indirekt adressieren
    Von The Dude im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 22.06.2011, 12:21
  2. Pointer indirekt zu adressieren
    Von Erich04 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 26.05.2011, 07:54
  3. Antworten: 12
    Letzter Beitrag: 20.11.2009, 13:06
  4. DB-Pointer indirekt Adressieren
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 19.03.2004, 16:59
  5. ANY-Pointer indirekt adressieren
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.02.2004, 15:41

Lesezeichen

Berechtigungen

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