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

Ergebnis 1 bis 8 von 8

Thema: TwinCat 2.11 Einzelne Bits in Variablen (Array) ansprechen

  1. #1
    Registriert seit
    13.05.2008
    Beiträge
    316
    Danke
    43
    Erhielt 23 Danke für 15 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,


    ich habe folgendes Problem:

    Ich möchte eine Funktion schreiben, die als Eingangsparameter

    VAR_INPUT
    DigitArray : ARRAY[0..63] OF BOOL;
    END_VAR

    erhält und als Rückgabewert

    FUNCTION iba_Digitalsignale : ARRAY [0..3] OF UINT

    ausgibt.

    In der Funktion soll
    Bit 0 des "Array of Bool" dem Bit 0 des Rückgabewerts zugewiesen werden
    Bit 1 des "Array of Bool" dem Bit 1 des Rückgabewerts zugewiesen werden
    ...
    Bit 63 des "Array of Bool" dem Bit 63 des Rückgabewerts zugewiesen werden

    Wenn ich eine Bitweise Zuweisung programmiere bekommen ich den Fehler

    "Unzulässiger Datentyp 'ARRAY[0..3] OF UINT' für direkten Bitzugriff. "

    Ich darf also nicht die einzelnen Bits adressieren. Wie geht man bei soetwas vor?

    Vielen Dank im voraus!
    Zitieren Zitieren TwinCat 2.11 Einzelne Bits in Variablen (Array) ansprechen  

  2. #2
    Avatar von Beren
    Beren ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.05.2008
    Beiträge
    316
    Danke
    43
    Erhielt 23 Danke für 15 Beiträge

    Standard

    Okay, ich glaub ich habs. So in der Richtung müsste es klappen (Code am Pad getippt). Ich probier das morgen mal aus.


    Code:
    DigBit:=0;
    For word:=0 To 3
       For bit:=0 To 15
          iba_Digitalsignale[word].bit:=DigitArray[digBit];
          digBit:=digBit+1;
       Next bit
    Next word

  3. #3
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    http://www.sps-forum.de/beckhoff-cod...tml#post111150

    In wie fern die "Util.lib" für TwinCAT 2.11 zur Verfügung steht, entzieht sich meiner Kenntnis.
    If you open your Mind too much, your Brain will fall out.

  4. #4
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Zitat Zitat von Beren Beitrag anzeigen
    Okay, ich glaub ich habs. So in der Richtung müsste es klappen (Code am Pad getippt). Ich probier das morgen mal aus.


    Code:
    DigBit:=0;
    For word:=0 To 3
       For bit:=0 To 15
          iba_Digitalsignale[word].bit:=DigitArray[digBit];
          digBit:=digBit+1;
       Next bit
    Next word
    Das wird nicht funktionieren. Der Bit-Index muss eine Konstante sein.

    In der TcSystem.Lib gibt es die Funktion CSETBIT32 mit der du Arbeiten könntest.

    z.B.
    Code:
    FOR word := 0 TO 3 DO
      FOR bit := 0 TO 15 DO
        iba_Digitalsignale[word] := DWORD_TO_UINT(CSETBIT32( UINT_TO_DWORD(iba_Digitalsignale[word]), bit, DigitArray[digBit]));
        digBit := digBit +1;
      END_FOR
    END_FOR
    Man könnte sich auch selber was basteln

    Code:
    FOR word := 0 TO 3 DO
      iba_Digitalsignale[word] := 0;
      FOR bit := 0 TO 15 DO
        iba_Digitalsignale[word] :=SHL(UINT_TO_WORD(iba_Digitalesignale[word], 1); 
    
        IF DigitArray[digBit] THEN
          iba_Digitalsignale[word] := iba_Digitalsignale[word] + 1;
        END_IF
    
        digBit := digBit +1;
      END_FOR
    END_FOR
    Ohne Gewähr
    Geändert von MasterOhh (04.06.2014 um 20:07 Uhr)

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

    Beren (04.06.2014)

  6. #5
    Avatar von Beren
    Beren ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.05.2008
    Beiträge
    316
    Danke
    43
    Erhielt 23 Danke für 15 Beiträge

    Standard

    Der Hinweis mit dem SHL war gut. Ich probiers mal so:

    Code:
    FUNCTION iba_64BoolTo4Uint : ARRAY[0..3] OF UINT
    VAR_INPUT
        DigitArray : ARRAY[0..63] OF BOOL;
    END_VAR
    VAR
        signalCount: INT;
        wordCount: INT;
        bitCount: INT;
    END_VAR
    
    
    signalCount:=0;
    FOR wordCount:=0 TO 3 DO
    	FOR bitCount:=0 TO 15 DO
    		IF DigitArray[signalCount] THEN
    			iba_64BoolTo4Uint[wordCount].0:=TRUE;
    		ELSE
    			iba_64BoolTo4Uint[wordCount].0:=FALSE;
    		END_IF;
    		iba_64BoolTo4Uint[wordCount]:=SHL(UINT_TO_WORD(iba_64BoolTo4Uint[wordCount]),1);
    		signalCount:=signalCount+1;
    	END_FOR;
    END_FOR;
    Geändert von Beren (04.06.2014 um 20:49 Uhr)

  7. #6
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    756
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Dann stehen in den einzelnen UINTS des Funktionsergebnisses die Bits aber in der umgekehrten Reihenfolge, also BOOL[0] in BITS[0].15, BOOL[15] in BITS[0].0 usw.
    Also besser Bit 15 schreiben und rechts schieben. Dabei allerdings erst schieben, dann schreiben, sonst verschwindet das erste Bit der bitCount-Schleife im Datenorkus.
    Code:
    FUNCTION iba_64BoolTo4Uint : ARRAY[0..3] OF UINT
    VAR_INPUT
        DigitArray : ARRAY[0..63] OF BOOL;
    END_VAR
    VAR
        signalCount: INT;
        wordCount: INT;
        bitCount: INT;
    END_VAR
    
    
    signalCount:=0;
    FOR wordCount:=0 TO 3 DO
        FOR bitCount:=0 TO 15 DO
            iba_64BoolTo4Uint[wordCount]:=SHR(UINT_TO_WORD(iba_64BoolTo4Uint[wordCount]),1);
            IF DigitArray[signalCount] THEN
                iba_64BoolTo4Uint[wordCount].15:=TRUE;
            ELSE
                iba_64BoolTo4Uint[wordCount].15:=FALSE;
            END_IF;
    (* 
    oder einfacher
    iba_64BoolTo4Uint[wordCount].15:=DigitArray[signalCount];
    *)
           signalCount:=signalCount+1;
         END_FOR;
    END_FOR;
    Geändert von StructuredTrash (05.06.2014 um 07:45 Uhr) Grund: Codefehler wegen Kaffeemangel

  8. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    Beren (05.06.2014)

  9. #7
    Avatar von Beren
    Beren ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.05.2008
    Beiträge
    316
    Danke
    43
    Erhielt 23 Danke für 15 Beiträge

    Standard

    Danke, aber auch noch nicht ganz korrekt. Hatte heute Inbetriebnahme und hab die Funktion getestet. ROR mit Bit Operator .0 war die Lösung. Kann die Endfassung nachher nochmal posten.

  10. #8
    Avatar von Beren
    Beren ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.05.2008
    Beiträge
    316
    Danke
    43
    Erhielt 23 Danke für 15 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Nabend!

    Hier der für mich funktionierende Code. Vielen Dank nochmal an alle!

    Code:
    FUNCTION iba_256BoolTo16Uint : ARRAY[0..15] OF UINT
    VAR_INPUT
                    DigitalSignal : ARRAY[0..255] OF BOOL;
    END_VAR
    VAR
                    signalCount:INT;
                    wordCount:INT;
                    bitCount:INT;
    END_VAR
     
    signalCount:=0;
    FOR wordCount:=0 TO 15 DO
                    FOR bitCount:=0 TO 15 DO
                                   iba_256BoolTo16Uint[wordCount].15:=DigitalSignal[signalCount];                              
                                   iba_256BoolTo16Uint[wordCount]:=ROL(UINT_TO_WORD(iba_256BoolTo16Uint[wordCount]),1);
                                   signalCount:=signalCount+1;
                    END_FOR;
    END_FOR;
     
    (* Wenn Bitreihenfolge in iba nicht passt, ROR und Bitoperator 0 !!! *)
    Geändert von Beren (05.06.2014 um 21:50 Uhr)

Ähnliche Themen

  1. TIA einzelne Bits aus Block_DB ansprechen
    Von fk- princess im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 03.12.2013, 09:26
  2. Einzelne Bit in einer vordeklarierten Bytevariable ansprechen
    Von apfelring im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 04.02.2013, 08:19
  3. LinNoDave und einzelne Bits
    Von Lazarus™ im Forum Hochsprachen - OPC
    Antworten: 4
    Letzter Beitrag: 19.01.2009, 13:46
  4. 2D-Array in Step7 mit Variablen ansprechen
    Von jank-automation im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.08.2008, 08:32
  5. Einzelne Bits ausmaskieren
    Von zwerg77 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 03.12.2007, 07:14

Lesezeichen

Berechtigungen

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