Step 7 Bit's umwandeln in Fehlernummern

frankuc45

Level-2
Beiträge
35
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich stehe gerade auf dem Schlauch. Ich habe in einem DB ca. 500 Boolsche Variablen angelegt. Jetzt möchte je nach dem welches Bit auf 1 ist eine Nummer ausgeben.
Von den 500 Bits kann immer nur ein Bit auf 1 sein.

z.B.
Bit 0.0 = 1 somit soll die Dez. Zahl 1 ausgeben werden
Bit 0.1 = 1 somit soll die Dez. Zahl 2 ausgeben werden
Bit 0.7 = 1 somit soll die Dez. Zahl 8 ausgeben werden
Bit 1.0 = 1 Zahl 9

usw.

Wie kann ich das einfach programmieren ?

Vielen Dank für Eure Hilfe

Gruß Frankuc45
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin frankuc45,

unabhängig von der Steuerung sollte doch immer eine Schleife möglich sein.
Wenn die Schleife auf ein TRUE trifft, Schleifennummer ==> Bitnummer und Schleife verlassen.

Bei absoluter Programmierung muss halt die Adresse inkrementiert werden (z.B. bei S7 +P#0.1)
Bei symbolischer Programmierung würde ich ein array[1..500] of bool anlegen...

VG

MFreiberger
 
Hallo MFreiberger,

danke für die Schnelle Antwort. Leider bin ich nicht so der AWL experte

Wie könnte den so eine Schleife aussehen

Danke für ein Codebeispiel

Gruß Frankuc45
 
Da gab es schon mal ne Lösung hier im Siemens Bereich.
Mir fällt leider gerade der genau Titel nicht ein, aber da wurde im Prinzip selber Lösungsansatz gesucht und auch als Lösung gepostet.

Meinte war irgendetwas mit Fehlernummer ....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Boxy meint vermutlich dieses Thema von vorigem Monat: https://www.sps-forum.de/simatic/90921-bitadresse-einem-db-mit-ganzzahl-berechnen-2.html#post683186

Deine Aufgabenstellung beruht auf "die Nummer des niedrigsten gesetzten Bits ermitteln". Das kann man z.B. so machen:
- mit einer Schleife i = 0..1199 suchen ob myBitfeld gesetzt ist und bei Fund die Suche abbrechen ---> i+1 ist dann Deine Ganzzahl
- oder Wordweise/DWordweise durchsuchen und mit ENCO die Nummer des niedrigsten gesetzten Bits des (D)Words ermitteln
- weitere Algorithmen

Da wird das Thema gemischt vorwärts und rückwärts durchgekaut - folge da den Beiträgen die sich auf das Problem vom User bmwled beziehen. Etwas später findest Du Programmlösungen in SCL und AWL

Harald
 
Hi,

ich würde mir ein FC schreiben an dem du 32 Bit jeweils als DINT übergibst und dann und jede Stelle auswertest indem eine Maske nimmst und alle für die jeweilige Abfrage nicht revelanten Bits ausblendest. Dann fragst du das aufgebnis auf gröser L#1 ab und gibst deine gewünschte Zahl aus und beendest den Baustein an der Stelle. Bei 500 Bools wären das ca. 16 mal den FC aufrufen, das liegt noch im verkraftbaren Bereich und bedarf keiner Schleife und ist dahingehend auch einfach erweiterbar. Du musst natürlich noch eine Art Zahloffset anbinden, z.B. erfolgt der erste Aufruf mit dem Offset 0 und du gibst die Zahlen ka. 0..100 aus, beim zweiten dann Offset 200 wären dann Zahlen 200-300. (Man könnte auch einfach den Wert des DINTs ausgeben und diesen um den Offset erhöhen).

Mfg Clyde
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen,

vielen Dank für die Beiträge.
Habe jetzt aus den anderen Foren und Beiträgen mal das zusammen gebaut was für mich passt.
Ist zwar eher schlecht programmiert und noch nicht perfekt.
Aber für den ersten Test tut das so.
Ich durchsuche den DB mit 1600 Fehler Bits und gebe dann die int Zahl aus mit dem höchsten Bit (MW20)
Code:
//Fehler in separaten bausein kopieren      CALL  "BLKMOV"
       SRCBLK :=P#DB2.DBX 180.0 BYTE 200
       RET_VAL:=MW100
       DSTBLK :=P#DB222.DBX0.0 BYTE 200


      CALL  "BLKMOV"
       SRCBLK :=P#DB2.DBX 180.0 BYTE 200
       RET_VAL:=MW100
       DSTBLK :=#Fehler




//alb 6.3.2018
//Das Array im FB2 geht von byte 180 bis byte 380
//200 byte ergibt 1600 bit die durchsucht werden müssen


//variabelen auf anfangswert setzen
      L     0
      T     MW    20


      L     1
      T     #n                          //(TEMP: Int)
      T     #i                          //Durchlaufzähler wie oft die Scheilfe schon durch ist




MFOR: L     #i
      L     1600
      <=I   
      SPBN  MWHI                        //Wenn die Schleife 1600 mal durch ist ans ende des Bausteins springen




      L     #i
      +     -1                          //Durchlaufzähler mit Index 1 beginnt
      L     P##Fehler                   //Adresse des Aktualparameters IN:ErrBitFeld[] 
      +D    
      LAR1                              //Adresse IN:ErrBitFeld[i]


//FehlerBit gesetzt?
      AUF   DB   222
      U      [AR1,P#0.0]
      SPBN  EFOR                        //wenn nein dann Springe


      L     #i                          // Durchlaufzähler in MW schreiben
      T     MW    20


EFOR: L     #i                          //Wenn das bit nicht sitzt wird hierer gesprungen ansonsten komme ich hier auch vorbei
      +     1                           //Durchlaufzähler um eins erhöhen
      T     #i
      SPA   MFOR                        //zurück zum nächsten Scheilfen durchlauf
MWHI: NOP   0

Gruß Frankuc45
 
Zurück
Oben