TIA Bitzugriff bei word Variable bei TIA + S7-300 unter SCL

fjv

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich suche den Bitzugriff bei einer S7-300 mit TIA V15 auf eine WORD variable

Auf S7-1200 geht es ja zum Beispiel so:

IF #var.%x10 THEN
...
END_IF;

wie geht es mit S7-300?

so etwas finde ich es "etwas" unelegant:

IF (#var AND 16#400) = 16#400 THEN
...
END_IF;

geht es auch so wie "früher" mit Step7 V5x?

danke :)
 
so etwas finde ich es "etwas" unelegant:

IF (#var AND 16#400) = 16#400 THEN
...
END_IF;
Der uralte Standard-Algorithmus, der auf jeder SPS und jedem Prozessor funktioniert, wäre:
Code:
IF (#var AND 16#400) <> 0 THEN
...
END_IF;
Vermutlich macht der "eleganter" aussehende Slice-Zugriff #var.%x10 intern auch nichts anderes.

Man könnte auch mit viel Schreibarbeit für die Deklaration das WORD mit einem BOOL-STRUCT oder BOOL-Array per AT überlagern (müsste dazu ggf. das WORD nach TEMP umkopieren) und könnte dann ähnlich wie beim SLICE-Zugriff auf die einzelnen Bits zugreifen.


geht es auch so wie "früher" mit Step7 V5x?
Bestimmt geht das auch. Wie ging es denn früher bei Step7 V5.x?

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn man nur 1 oder wenige Bits aus einem WORD lesen will, da gibt es auch eine fertige Function "LGF_BitTest" aus der Bibliothek mit generellen Funktionen (LGF) von Siemens, die auch für S7-300 funktionieren müsste. Wenn man auf viele bis alle Bits in einem WORD zugreifen will, dann ist eine Überlagerung mit einem BOOL-Struct/Array effizienter, und da geht der Zugriff lesen und auch schreiben.

Code:
FUNCTION "LGF_BitTest" : Bool
TITLE = LGF_BitTest
AUTHOR : SiemSSS
FAMILY : LGF
NAME : BitTest
   VAR_INPUT
      value : DWord;
      bitNo : Int;
   END_VAR

   VAR CONSTANT
      BINARY_ZERO : DWord := 16#0000;
      TRUE_BOOL_BIT : DWord := 16#0001;
      MAX_NO_OF_BITS : Int := 32;
   END_VAR


BEGIN
    REGION BLOCK INFO HEADER
      //===============================================================================
      // SIEMENS AG / (c)Copyright 2019
      //-------------------------------------------------------------------------------
      // Title:            LGF_BitTest
      // Comment/Function: Test bit in DWord if it is 1 or 0 respectively
      //                   returning TRUE or FALSE
      //                   can be used for Word and Byte as well, by convert
      //                   the passed paramter and the result using for e.g. Dword_to_Byte
      // Library/Family:   LGF (Library General Functions)
      // Author:           Siemens Digital Industry
      // Tested with:      CPU1212C DC/DC/DC FW:V4.2
      // Engineering:      TIA Portal V15.1
      // Restrictions:     ENO not in use, set to true, no error handling
      //-------------------------------------------------------------------------------
      // Change log table:
      // Version  | Date       | Expert in charge         | Changes applied
      // 01.00.00 | 06.06.2015 | Siemens Industry Support | first release
      // 03.00.00 | 23.04.2020 | Siemens Industry Support | Set version to V3.0.0
      //                         harmonize the version of the whole library
      // 03.00.00 | 28.10.2021 | PN/DP                    | Version for S7-300/400
      //===============================================================================
    END_REGION
    
    REGION Logic
      // test the bit in tag
      // shift one true bit into the selected position
      // compare with input value with "AND" logic and check if different to zero
      // result is true if bit is true, otherwise it is false
      #LGF_BitTest := (#BINARY_ZERO <> (#value AND SHL(IN := #TRUE_BOOL_BIT, N := (#bitNo MOD #MAX_NO_OF_BITS))));
      
      // no error handling needed
      ENO := TRUE;
    END_REGION
    
END_FUNCTION

Harald
 
Wenn man nur 1 oder wenige Bits aus einem WORD lesen will, da gibt es auch eine fertige Function "LGF_BitTest" aus der Bibliothek mit generellen Funktionen (LGF) von Siemens, die auch für S7-300 funktionieren müsste. Wenn man auf viele bis alle Bits in einem WORD zugreifen will, dann ist eine Überlagerung mit einem BOOL-Struct/Array effizienter, und da geht der Zugriff lesen und auch schreiben.
die ist ja für S7 1200 und 1500 genau da bräuchte man es nicht, weil es im TIA eine gebaute Möglichkeit gibt.

Hier ging es ja um eine S7-300. Ich habe mir jetzt eine eigene Funktion geschrieben, die es für eine S7-300 unter TIA macht.
 
die ist ja für S7 1200 und 1500 (...)
Hier ging es ja um eine S7-300. Ich habe mir jetzt eine eigene Funktion geschrieben, die es für eine S7-300 unter TIA macht.
Den Programmcode in meinem Beitrag hast Du wohl nicht gelesen? Da hättest Du sehen können, daß das die von mir bereits für S7-300/400 angepasste Version ist ...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
siehe hier die Geschichte der Portierung der LGF_BitLogic-Funktionen für S7-300/400/ET200S:
In der Bibliothek LGF ab V5.0.0 ab TIA V15.1 gibt es die Bausteine LGF_BitSet, LGF_BitReset, LGF_BitTest
(ich weiß jetzt gerade nicht, ob die auch für S7-300/400/ET200S verwendbar ist)
Direkt für S7-300/S7-400/ET200S verwendbar ist die LGF nicht. Weil aber die SCL-Quellen in der Lib vorliegen und im wesentlichen die Wordverknüpfung Grundfunktionen (wie in #06 beschrieben) verwendet wurden (und SHL() zum Schieben der Bitmaske), kann man sie leicht portieren. (Siemens hat da offensichtlich keine Lust zu.)

Im Anhang eine SCL-Quelle der "Bit logic operations" aus der Library of General Functions (LGF) V5.0.0 für S7-300/S7-400/ET200S :
LGF_BitSet
LGF_BitSetTo
LGF_BitReset
LGF_BitToggle
LGF_BitTest
LGF_BitCount

⚠️ Habe ich nicht getestet, nicht optimiert. Nur soweit Müll entfernt und angepasst, daß sie in TIA V15.1 fehlerfrei importiert/übersetzt wird.
siehe auch die daran anschließenden Beiträge über Details und das von Siemens in der LGF V5.0.0 eingebaute Fehlverhalten bei Bitnummern > 31

Hier ging es ja um eine S7-300. Ich habe mir jetzt eine eigene Funktion geschrieben, die es für eine S7-300 unter TIA macht.
Wie sieht eigentlich Deine eigene Funktion aus?

Harald
 
Zurück
Oben