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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 12 von 12

Thema: Bitsummenprüfung

  1. #11
    Registriert seit
    18.09.2004
    Ort
    Münsterland/NRW
    Beiträge
    4.728
    Danke
    729
    Erhielt 1.161 Danke für 972 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Flinn Beitrag anzeigen
    ...
    Aber !!?!!?
    Wird nicht das AR1 automatisch vom Betriebssystem gerettet? So dass nach Unterbrechung von einem Interrupt-OB und Wiederkehr in das zykl. Programm das AR1 automatisch wiederhergestellt wird? Was meint Ihr?
    ...
    Das sagt Siemens dazu. Das Thema hatten wir aber schon ein paar Mal hier
    Konfigurationshinweise:
    Bei der Programmierung einiger Operationen werden Register- oder Akkuinhalte durch STEP 7 verändert. Insbesondere bei Programmierung mit absoluter Adressierung muss dieser Sachverhalt berücksichtigt werden. Nachfolgend sind einige der Operationen aufgeführt, durch die Inhalte von Register/Akku verändert werden:
    • Die Verwendung der folgenden höheren Sprachkonstrukte kann dazu führen, dass die Inhalte von DB-Register und Adressregister AR1 verändert werden:
    • vollqualifizierter DB-Zugriff (z.B. DB20.DBW10) als Aktualparameter für FC's
    • FB- und Multiinstanz-CALL
    • Strukturkomponente eines Formalparameters als Operand innerhalb eines FC's oder FB's
    • Strukturkomponente eines Formalparameters als Aktualparameter für FC oder FB
    • Beim FB-, FC-, Multiinstanz-CALL dürfen VKE oder AKKU1 und AKKU2 nicht als zusätzliche (implizite) Parameter verwendet werden.
    • Das DI-Register und das Adressregister AR2 wird systemseitig für den FB- und Multiinstanz-CALL verwendet und dürfen deshalb innerhalb von FB's nicht verändert werden (siehe hierzu auch Beitrags-ID 22531225).
    • Das Adressregister AR1 wird von einem Teil der ladbaren Standardbausteine verwendet.
    • Der Befehl "L P#Parametername" lädt innerhalb eines FBs den Adressoffset des angegebenen Parameters, relativ zum Adressregister AR2. Um in multiinstanzfähigen FB's den absoluten Offset im Instanzdatenbaustein zu ermitteln, muss zu diesem Wert noch der bereichsinterne Zeiger (nur Adresse) des AR2-Registers addiert werden.
    Wenn Sie die oben genannten Programmiermöglichkeiten und gleichzeitig die genannten Register/Akkus nutzen, müssen Sie selbst für eine Wiederherstellung der Inhalte der verwendeten Register/Akkus Sorge tragen, da es sonst zu einem Fehlverhalten kommt. Einzelheiten hierzu sind im Topic "Vermeiden von Fehlern beim Aufrufen von Bausteinen" in der Hilfe zu STEP 7 nachzulesen.

  2. Folgender Benutzer sagt Danke zu marlob für den nützlichen Beitrag:

    Flinn (07.05.2008)

  3. #12
    Registriert seit
    17.11.2008
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    FUNCTION FC 1172 : INT
    TITLE =Bitsumme im Datenbereich ermitteln
    //
    //================================================================================
    // B I T S U M M E
    //================================================================================
    //
    VERSION : 0.1

    VAR_INPUT
    Datenbereich : ANY ; //Datenbereich in dem die Bits gezählt werden sollen (Byte,Word,DWord)
    END_VAR
    VAR_OUTPUT
    Falscher_DT : BOOL ; //Falscher Datentyp am Any-Pointer
    END_VAR
    VAR_IN_OUT
    Schleifenzaehler : INT ; //Hilfswort für die Loop-Funktion
    END_VAR
    VAR_TEMP
    WordVal : WORD ; //Hilfs-Variabel Word
    DWordVaL : DWORD ; //Hilfs-Variabel DWord
    Anzahl_Schleifen : INT ; //Anzahl der Schleifen
    DB_Nr : WORD ; //Datenbaustein-Nummer
    _Byte : BOOL ; //Datentype Byte angewählt
    _Word : BOOL ; //Datentype Word angewählt
    _DWord : BOOL ; //Datentype DWord angewählt
    END_VAR
    BEGIN
    NETWORK
    TITLE =Adresspointer für die Quelle laden
    L P##Datenbereich; // Lade die Anfangsadresse des ANY-Pointers in AR1
    LAR1 ;
    L B [AR1,P#1.0]; //=============================
    L 2; // Abfrage Datentype: Byte
    ==I ; //
    = #_Byte; //=============================
    L B [AR1,P#1.0]; //=============================
    L 4; // Abfrage Datentype: Word
    ==I ; //
    = #_Word; //=============================
    L B [AR1,P#1.0]; //=============================
    L 6; // Abfrage Datentype: DWord
    ==I ; //
    = #_DWord; //=============================
    L W [AR1,P#2.0]; //=============================
    T #Anzahl_Schleifen; // Anzahl Schleifen
    L W [AR1,P#4.0]; //=============================
    T #DB_Nr; //
    L 0; // Datenbaustein aufrufen, falls
    ==I ; // vorhanden
    SPB N201; //
    AUF DB [#DB_Nr]; //=============================
    N201: CLR ;
    NETWORK
    TITLE =Abfrage Falscher Datentyp
    UN #_Byte;
    UN #_Word;
    UN #_DWord;
    = #Falscher_DT;
    NETWORK
    TITLE =Bitsumme ermitteln
    //================================================================================
    // BYTE-Bereich
    //================================================================================
    //
    UN #_Byte;
    SPB WORD;
    L D [AR1,P#6.0];
    LAR1 ; // Adresspointer einstellen
    L 0; // Setze RET_VAL auf 0
    T #RET_VAL; // RET_VAL
    LpBy: L 1; //=============================
    L #Schleifenzaehler; // Schleifenzähler um 1 erhöhen
    +I ; //
    T #Schleifenzaehler; //=============================
    L B [AR1,P#0.0]; // Lade Eingangs-Wort
    T #WordVal; // Temporäre Variabel
    A201: L 0; // Wenn 0 wird Bearbeitung abgebrochen
    L #WordVal; //
    ==I ; //
    SPB A202; //
    SRW 1; // Abfrage um 1 weiter schieben
    T #WordVal; //
    SPZ A201; //
    L #RET_VAL; //=============================
    L 1; // RET_VAL erhöhen
    +I ; //
    T #RET_VAL; //=============================
    SPA A201;
    A202: NOP 0;
    +AR1 P#1.0; // Pointer um ein Byte erhöhen
    L #Anzahl_Schleifen; //==============================
    L #Schleifenzaehler; // Loop, wenn Anzahl der Bits
    >I ; // noch nicht erreicht ist
    SPB LpBy; //==============================
    NETWORK
    TITLE =Schleifenzähler rücksetzen
    U( ;
    L #Schleifenzaehler;
    L #Anzahl_Schleifen;
    >=I ;
    ) ;
    SPBNB _001;
    L 0;
    T #Schleifenzaehler;
    _001: NOP 0;
    NETWORK
    TITLE =Bitsumme ermitteln
    //================================================================================
    // WORD-Bereich
    //================================================================================
    //
    WORD: UN #_Word;
    SPB DWOR;
    L D [AR1,P#6.0];
    LAR1 ; // Adresspointer einstellen
    L 0; // Setze RET_VAL auf 0
    T #RET_VAL; // RET_VAL
    LpWo: L 1; //=============================
    L #Schleifenzaehler; // Schleifenzähler um 1 erhöhen
    +I ; //
    T #Schleifenzaehler; //=============================
    L W [AR1,P#0.0]; // Lade Eingangs-Wort
    T #WordVal; // Temporäre Variabel
    A401: L 0; // Wenn 0 wird Bearbeitung abgebrochen
    L #WordVal; //
    ==I ; //
    SPB A402; //
    SRW 1; // Abfrage um 1 weiter schieben
    T #WordVal; //
    SPZ A401; //
    L #RET_VAL; //=============================
    L 1; // RET_VAL erhöhen
    +I ; //
    T #RET_VAL; //=============================
    SPA A401;
    A402: NOP 0;
    +AR1 P#2.0; // Pointer um 1 Wort erhöhen
    L #Anzahl_Schleifen; //==============================
    L #Schleifenzaehler; // Loop, wenn Anzahl der Bits
    >I ; // noch nicht erreicht ist
    SPB LpWo; //==============================
    NETWORK
    TITLE =Schleifenzähler rücksetzen
    U( ;
    L #Schleifenzaehler;
    L #Anzahl_Schleifen;
    >=I ;
    ) ;
    SPBNB _002;
    L 0;
    T #Schleifenzaehler;
    _002: NOP 0;
    NETWORK
    TITLE =Bitsumme ermitteln
    //================================================================================
    // DWORD-Bereich
    //================================================================================
    //
    DWOR: UN #_DWord;
    SPB Ende;
    L D [AR1,P#6.0];
    LAR1 ; // Adresspointer einstellen
    L 0; // Setze RET_VAL auf 0
    T #RET_VAL; // RET_VAL
    LpDW: L 1; //=============================
    L #Schleifenzaehler; // Schleifenzähler um 1 erhöhen
    +I ; //
    T #Schleifenzaehler; //=============================
    L D [AR1,P#0.0]; // Lade Eingangs-Wort
    T #DWordVaL; // Temporäre Variabel
    A601: L L#0; // Wenn 0 wird Bearbeitung abgebrochen
    L #DWordVaL; //
    ==D ; //
    SPB A602; //
    SRD 1; // Abfrage um 1 weiter schieben
    T #DWordVaL; //
    SPZ A601; //
    L #RET_VAL; //=============================
    L 1; // RET_VAL erhöhen
    +I ; //
    T #RET_VAL; //=============================
    SPA A601;
    A602: NOP 0;
    +AR1 P#4.0; // Pointer um 1 D-Wort erhöhen
    L #Anzahl_Schleifen; //==============================
    L #Schleifenzaehler; // Loop, wenn Anzahl der Bits
    >I ; // noch nicht erreicht ist
    SPB LpDW; //==============================
    NETWORK
    TITLE =Schleifenzähler rücksetzen
    U( ;
    L #Schleifenzaehler;
    L #Anzahl_Schleifen;
    >=I ;
    ) ;
    SPBNB _003;
    L 0;
    T #Schleifenzaehler;
    _003: NOP 0;
    NETWORK
    TITLE =Setze BIE-Bit
    Ende: SET ;
    SAVE ;
    END_FUNCTION
    Zitieren Zitieren Bitsumme im Datenbereich (Byte,Word,DWord)  

Lesezeichen

Berechtigungen

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