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

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

Thema: Any an FC

  1. #1
    Registriert seit
    10.04.2009
    Beiträge
    12
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hallo Leidensgenossen,
    habe vor einen FC zu schreiben, mit dem die in einem String tatsächlich benutzte Anzahl von Zeichen ausgelesen werden kann. Der String steht in einem DB.
    im FC wurde ein IN-Variable vom typ Any deklariert und nun als erstes die definierte Anzahl an Maximal verwendbaren Zeichen ausgelesen. Aber genau da hakts.
    im FC:
    L ##IN_STRING (In-Variable vom Typ Any)
    Lar1

    L B[ar1,p#0.0]
    T #max_char (variable vom Typ byte)

    es wird zwar eine Zahl ausgelesen, die hat aber nicht das entfernteste mit dem zu tun, was eigentlich drin steht. Kann mir da einer weiter helfen?

    Gruß
    Andy
    Zitieren Zitieren Any an FC  

  2. #2
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    das geht anderst, du krigts von ausen den any, den musst du nun zerlegen wenn du an deinen string kommen willst, oder den string mit blockmove in die lokaldaten kopieren...

    Bsp:

    Code:
    //Any auf Quelldaten
          L     P##IN_STRING
          LAR1  
          L     W [AR1,P#4.0]  //DB-Nummer
          T DBNR
          L      D [AR1,P#6.0]  /Adressse
          LAR1
    
          L DBNR
          L 0
          ==I
          SPB noDB
          AUF DB[DBNR]
    noDB: L  B[AR1,P#0.0]
    denke das sollte gehen!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren das geht anderst....  

  3. Folgender Benutzer sagt Danke zu Jochen Kühner für den nützlichen Beitrag:

    baggerandy (24.10.2009)

  4. #3
    Registriert seit
    07.06.2006
    Ort
    Bayern
    Beiträge
    623
    Danke
    27
    Erhielt 156 Danke für 139 Beiträge

    Standard

    Servus,

    bevor du hier wild mit Pointern um dich schmeisst, solltest du dir vielleicht erst mal den Aufbau der Pointer genauer anschauen

    Du musst den Any-Pointer erstmal in seine Bestandteile zerlegen, damit du damit arbeiten kannst. Weiterhin sollte man auch das AR1 sichern und wieder zurücksichern, wenn man selber damit arbeitet.

    Probier das ganze mal so in etwa:

    Code:
    TAR1  #SaveAr1            //temporäre DWord-Variable zum sichern des AR1
    
    L     P##IN_STRING                  //load Any-Pointer 
    LAR1          
    
    L     W [AR1,P#0.0]               //Get Datatype
    T     #Datatype                    //temp WORD
    
    L     W [AR1,P#2.0]               //Get Repeatfactor
    T     #Repeatfactor               //temp WORD
    
    L     W [AR1,P#4.0]               //Get DB-Number
    T     #DbNr                          //temp WORD
    
    L     D [AR1,P#6.0]               //Get Startadress
    T     #Adress                      //temp DWord
    
    
    AUF DB[#DbNr]                   //open DB
    
    L      #Adress                 //Pointer to Startadress
    LAR1
    
    
    L      DBB [AR1,P#0.0]
    T     #max_Char
    
    
    ......
    
    
    LAR1  #SaveAr1              //Resave Adressregister
    Geändert von uncle_tom (24.10.2009 um 17:42 Uhr)

  5. Folgender Benutzer sagt Danke zu uncle_tom für den nützlichen Beitrag:

    baggerandy (24.10.2009)

  6. #4
    baggerandy ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.04.2009
    Beiträge
    12
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    danke vielmals. Das mit dem AR1 bzw im FB AR2 sichern das hab ich. Allerdings daß der übergebene Pointer zuerst in seinen Bestandteilen geladen werden muß war neu. Werde das morgen mal ausprobieren - heute fehlt mir da die Zeit - die Pointer werden nacher erst mal mit Wickie weggespült damit der Kopf wieder klar wird. Vielen dank für Eure Hilfe.

    Gruß
    Andy

  7. #5
    Registriert seit
    04.02.2007
    Beiträge
    2.544
    Danke
    167
    Erhielt 731 Danke für 528 Beiträge

    Standard

    die Pointer werden nacher erst mal mit Wickie weggespült damit der Kopf wieder klar wird
    Was willst Du wegspülen, du hast die genaue Funktion des Pointers noch nicht richtig verstanden.
    Die Jungs vorher haben Dir zwar schön die Lösung geschrieben, aber nicht beschrieben warum man das macht.
    In ganz kurzen Worten:
    Mit dem Any-Pointer oder Any-Zeiger (auf deutsch) wird auf den Bereich im Speicher gezeigt wo die Daten sind. Dieser Zeiger enthält also keine Daten !.
    In diesem Zeiger stehen jetzt quasi nur die Postleitzahl, Strasse und Hausnummer. Du willst aber jetzt ermitteln wieviele Stcokwerke das Haus hat, das steht da nicht drin.

    Du willst ja im String die tatsächliche Belegung ermitteln, diese steht ja im String im zweiten byte. Also musst Du wissen wo dieses Byte im Speicher steht, und dies ermittelst Du mit Hilfe des Any-Pointers. Dieser enthält jatzt die Info, ob der String in z.B. einem DB steht und an welcher Stelle der String anfängt (Startadresse) .
    „Wenn du ein Problem hast, versuche es zu lösen. Kannst du es nicht lösen, dann mache kein Problem daraus.“
    Siddhartha Gautama

  8. #6
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.476
    Danke
    1.140
    Erhielt 1.238 Danke für 971 Beiträge

    Standard

    [QUOTE=uncle_tom;223875Weiterhin sollte man auch das AR1 sichern und wieder zurücksichern, wenn man selber damit arbeitet.
    [/QUOTE]

    Du bist wirklich vorbildlich!
    Also Save und Restore von AR1 findet man ganz selten in Programmen. Auch wenn es eigentlich sinnvoll ist.

    Gruß
    Dieter

  9. #7
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Also ich hab dies mittlerweile auch in allen Standart Bausteinen. Wenn man erst mal Fehler gesucht hat weil man dies vergessen hat...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  10. #8
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von Blockmove Beitrag anzeigen
    Du bist wirklich vorbildlich!
    Also Save und Restore von AR1 findet man ganz selten in Programmen. Auch wenn es eigentlich sinnvoll ist.
    Ja, ich habe mittlerweile auch an allen Hosen zusätzlich zu Gürtel noch Hosenträger - man weiß ja nie.

    Wozu soll das Sichern des AR1 gut sein?

    Bei der Verwendung von fremden Bausteinen z.B. aus der Siemens Bibliothek kann ich mir nie sicher sein dass diese irgendwelche Register unangetastet lassen. D.h. ich muss als Aufrufer dafür sorgen, dass ich vorher meine temporären Daten in Sicherheit bringe, bevor ich eine andere Funktion aufrufe. Ich gehe ja auch nicht davon aus, dass der Akku und das Statusregister nach einem Aufruf den gleichen Inhalt haben.
    Geändert von Thomas_v2.1 (25.10.2009 um 00:04 Uhr) Grund: Plural

  11. #9
    Registriert seit
    12.04.2007
    Beiträge
    140
    Danke
    5
    Erhielt 24 Danke für 22 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    ... z.B. aus der Siemens Bibliothek kann ich mir nie sicher sein dass diese irgendwelche Register unangetastet lassen...



    zeig mir einen baustein der siemens lib der deine register durcheinander brigt...


    nichts desto trotz ist das ar1 sichern sicherlich nicht verkehrt!
    schließlich schnallst du dich im auto auch an, obwohl du und alle anderen das fahren in einer fahrschule gelernt haben.

  12. #10
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von misconduct Beitrag anzeigen

    zeig mir einen baustein der siemens lib der deine register durcheinander brigt...
    Zeig Du mir einen der das nicht macht!
    Zitat Zitat von misconduct Beitrag anzeigen
    nichts desto trotz ist das ar1 sichern sicherlich nicht verkehrt!
    schließlich schnallst du dich im auto auch an, obwohl du und alle anderen das fahren in einer fahrschule gelernt haben.
    Absolut.
    Du kannst ja auch an jedem Bausteinanfang alle Temporären Daten auf Null setzen.

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Bei der Verwendung von fremden Bausteinen z.B. aus der Siemens Bibliothek kann ich mir nie sicher sein dass diese irgendwelche Register unangetastet lassen. D.h. ich muss als Aufrufer dafür sorgen, dass ich vorher meine temporären Daten in Sicherheit bringe, bevor ich eine andere Funktion aufrufe. Ich gehe ja auch nicht davon aus, dass der Akku und das Statusregister nach einem Aufruf den gleichen Inhalt haben.

    Endlich mal einer der es auf den Punkt bringt.

    Wenn ich in meiner FC / FB das Adressregister für meine Zwecke ändere dann ist es halt so. Der nächste Baustein restauriert ja beim Aufruf wieder sein aktuelles Adressregister.
    Anders, wie Thomas auch schreibt, wenn ich zwischendurch auf andere Bausteine oder zusammengesetzte Datentypen zugreife.
    Beispiel:
    Ich übergebe einer FC einen Zeiger, aus diesem Zeiger soll der DB gelesen werden:
    Code:
    L P##Daten // Any Zeiger
    LAR1
    L W [AR1, P#4.0] // DB-Nummer lesen
    T #DB_Nr
    So, jetzt habe ich die DB Nummer und will wissen ob es den Datenbaustein überhaupt gibt und nutze dafür den DB-Test-Baustein von Siemens und rufe den Baustein aus meiner FC aus auf.
    Da ich nicht weiß was in diesem Baustein passiert sichere ich mir vor dem Aufruf das AR1, weil ich es später wieder brauche.
    Nach dem Testen schreibe ich das AR1 wieder zurück. Alternativ könnte ich jetzt auch noch mal den Zeiger laden, was aber mehr Code bedeutet und eher verwirrender wird.
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

Lesezeichen

Berechtigungen

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