Baustein Aktivierung

Energie85

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

ich möchte an einem Bausein einen Parameter hinzufügen mit dem ich in einer Instanz Bausteine aktivieren kann.
An diesem neuen Parameter würde die Angabe in etwa so aussehen. Bsp. Parameter = 123589 (DINT)
Damit würden die Bausteine 1,2,3,5,8 und 9 aktiviert. Die aktivierung würde über den EN Eingang erfolgen. Der Sinn dieser Geschichte ist das
die Bausteine nur dann aufgerufen werden wenn der Programmierer es möchte. Habt ihr vielleicht eine Idee wie ich das realisieren kann????
 
- nimm ein Bitfeld mit 9 (oder 10 oder mehr) Bits (WORD oder ARRAY OF BOOL)
- rücksetze alle Bits
- dividiere die Eingangszahl in einer Schleife fortwährend durch 10 bis das Ergebnis 0 ist
- nimm den jeweiligen Divisionsrest und setze das Bit mit diesem Index (0 bis 9) z.B. per indirekte Adressierung

Rufe Deine Bausteine nur auf, wenn das zugehörige Bit im Bitfeld TRUE ist.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diesen Teil der Erklärung habe ich nicht so richtig verstanden. Könntest du mir da ein kleines beispiel sagen.

- nimm den jeweiligen Divisionsrest und setze das Bit mit diesem Index (0 bis 9) z.B. per indirekte Adressierung

Gibt es da keine Möglichkeit den Eingangswert zu zerlegen (z.B. 12458 jede Zahl einzeln vergleichen) bei übereinstimmung soll der Baustein aktiviert werden.
 
Das fortlaufende Dividieren durch 10 ist das Zerlegen der Zahl in einzelne Ziffern. Die abgespaltene Ziffer steckt im Divisionsrest. Statt der effizienten indirekten Adressierung kannst Du natürlich auch jede einzelne Ziffer aufwendig auf 0, 1, 2, 3 ... 9 vergleichen. Oder einen Sprungverteiler SPL benutzen. Ich meine es gibt auch fertige Bausteine um das Bit .x in einem Word zu setzen, doch für mich würde es wahrscheinlich länger dauern diesen Baustein zu finden als die paar Zeilen Code zu programmieren. Das indirekte Setzen eines Bits in einem Bitfeld sieht etwa so aus:
Code:
L #DintWert
L 10
MOD
LAR1 P##tempBitfeld
+AR1
SET
S [AR1, P#0.0]
oder Bit .0 ... .9 in einem Word setzen
Code:
L #DintWert
L 10
MOD
L 1
SLW
L #WordMitBits
OW
T #WordMitBits
(ich hoffe, das ist so einigermassen korrekt)

Harald

PS: programmieren mit einem Tablet macht überhaupt keinen Spaß
 
Ich hatte es so verstanden dass jede Zahl einem Programm zugeordnet ist.

Ok nach nochmaligem Lesen: ordne doch jedem Programm ein Bit zu und aktiviere die Bits im Datenwort.

peter(R)

Nachtrag: Ja wenn mans genau liest hast Du recht
 
Zuletzt bearbeitet:
Hier mal der Grundalgorithmus der Ziffernanalyse komplett ausprogrammiert, in einer Variante mit einem Bit-Array (ein Bit-Array läßt sich für bedingte Bausteinaufrufe leichter auswerten als ein Bitfeld in einem Word).
Code:
FUNCTION "Digits2Field" : VOID
TITLE =vorgegebene Bits in einem Bitfeld setzen
//Bsp: In_dPrgMask=123589 setzt die Bits 1, 2, 3, 5, 8 und 9
AUTHOR : PN_DP
VERSION : 0.1

VAR_INPUT
  In_dPrgMask : DINT ;	
END_VAR
VAR_IN_OUT
  IO_wBitWord : WORD ;	
END_VAR
VAR_TEMP
  temp_dPrgMask : DINT ;	
  temp_xBitfield : ARRAY  [0 .. 15 ] OF BOOL ;	
END_VAR
BEGIN
NETWORK
TITLE =Zahl in Ziffern zerlegen und entsprechende Bits setzen

//temporäres Bitfeld[0..15] initialisieren --> alle 16 Bits auf 0 rücksetzen
//das temporäre Bitfeld muß auf einer Adresse Lx.0 beginnen!
      LAR1  P##temp_xBitfield;          //Anfangsadresse Bitfeld[]
      L     0; 
      T     W [AR1,P#0.0];              //alle 16 Bits des Bitfeldes

//Schleife initialisieren: mit In-Parameter beginnen
      L     #In_dPrgMask;               //In-Parameter Programm-Maske

//Schleife zur Abspaltung und Analyse der enthaltenen Ziffern
LOOP: T     #temp_dPrgMask;             //in Hilfsvariable merken
      L     10; 
      MOD   ;                           //--> abgespaltene Einer-Ziffer 0..9
      LAR1  P##temp_xBitfield;          //Anfangsadresse Bitfeld[]
      +AR1  ;                           //+ Ziffer (Index in Bitfeld)
//                                      //= Adresse des Bits im Bitfeld
      SET   ; 
      S      [AR1,P#0.0];               //dieses Bit im Bitfeld setzen

//    abgespaltene Ziffer aus der Hilfsvariable löschen
      L     #temp_dPrgMask;             //PrgMask von vor der Abspaltung
      L     10; 
      /D    ;                           //--> PrgMask ohne die abgespaltene Ziffer
      U     <>0;                        //weitere Ziffern?
      SPB   LOOP;                       //ja --> wiederholen, Akku1 mitnehmen

//Fertig! nun kann das Bitfeld ausgewertet oder irgendwohin kopiert werden
      LAR1  P##temp_xBitfield;          //Anfangsadresse Bitfeld[]
      L     W [AR1,P#0.0];              //alle 16 Bits des Bitfeldes
      TAW   ;                           //Bits in Word-gerechte Anordnung bringen
      T     #IO_wBitWord;               //auf Ausgangsword kopieren

NETWORK
TITLE =Zusammenfassung für Beobachten

      L     #In_dPrgMask; 
      L     #IO_wBitWord; 
      O     #temp_xBitfield[0]; 
      O     #temp_xBitfield[1]; 
      O     #temp_xBitfield[2]; 
      O     #temp_xBitfield[3]; 
      O     #temp_xBitfield[4]; 
      O     #temp_xBitfield[5]; 
      O     #temp_xBitfield[6]; 
      O     #temp_xBitfield[7]; 
      O     #temp_xBitfield[8]; 
      O     #temp_xBitfield[9]; 
      CLR   ;                           //(Dummy-Verknüpfung abschließen)

END_FUNCTION

Harald
 
Problem gelöst!
Wäre es aber nicht einfacher die Fragestellung zu ändern?
Also für jeden "Baustein" ein Aktivierungsbit gleich mitzuübergeben?
Weil "12359" ist bei 9 zu Ende weil z.B. Baustein 12 nicht mehr interpretiert werden kann.
Und das Ganze ohne Auswertealgorythmus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weil "12359" ist bei 9 zu Ende weil z.B. Baustein 12 nicht mehr interpretiert werden kann.
Kann schon, wenn man "MOD 10" und "/ 10" durch 100 ersetzt und dann vlt. auch besser ein DWORD als Eingang nimmt. Und das natürlich auch bei der Übergabe beachtet, also in dem Beispiel 102030509.

Aber persönlich würde ich auch das bitweise Auswählen vorziehen. Kommt halt ein bißchen auf die gewünschten Grenzen an: 5 aus 100 gegen 32 aus 32 bei der DWORD-Variante. Beim WORD spricht aber eigentlich alles für die Bits: 16 aus 16 gegen 5 aus 10.
 
Ich schätze mal es war dem Fragesteller wichtig, seinen Freigabe-Code in einer für ihn leicht lesbaren/erzeugbaren Art an den Baustein zu geben. Und wenn nur max 9 verschiedene Bausteine freizuschalten sind, dann ist DINT für seinen Zweck wohl am besten geeignet. Bei mehr als 10 Bausteinen würde ich dann eher auf STRING ausweichen, statt Hex- oder Dezimalzahlen aus gesetzten Bits auszurechnen.

Harald
 
Hallo zusammen,

ich möchte an einem Bausein einen Parameter hinzufügen mit dem ich in einer Instanz Bausteine aktivieren kann.
An diesem neuen Parameter würde die Angabe in etwa so aussehen. Bsp. Parameter = 123589 (DINT)
Damit würden die Bausteine 1,2,3,5,8 und 9 aktiviert. Die aktivierung würde über den EN Eingang erfolgen. Der Sinn dieser Geschichte ist das
die Bausteine nur dann aufgerufen werden wenn der Programmierer es möchte. Habt ihr vielleicht eine Idee wie ich das realisieren kann????

Kannst Du mir auch noch verraten wen du damit verwirren willst ?:p
 
Zurück
Oben