Flankenmerker von Struktur erzeugen

NeuSim

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich habe eine Struktur und möchte alle Bits in der Struktur auf einen Flankewechsel prüfen. Die Auswertung soll in einem FC erfolgen.
Ich habe mir das so gedacht:
In einem FB habe ich eine Struktur angelegt die abgefragt werde soll. Zusätzlich habe ich die gleiche Struktur für die Flanken und die Impulse.

Struct: IN_Flanke
Struct: FP_Flanke
Struct: Imp_Flanke

Die Strukturen sollen einem FC übergeben und ausgewertet werden.
Der FC soll von der Struktur "IN_Flanke" die positiven Flankenwechsel auswerten und die Flankenimpuls in der Strutur "Imp_Flanke" ausgeben.
Der FC soll flexibel sein, so dass die Grösse der übergebenen Struktur keine Rolle spielt.

Ich denke im FC muss zuerst die Grösse der Struktur ermittelt werden und dann in einer Schlaufe wortweise auf Flankenwechsel geprüft werden.

Nun habe ich leider keine Erfahrung mit Pointern und indirekter Adressierung.
Hat jemand eine Idee wir der FC aussehen könnte?

Gruss
NeuSim
 
Deine Strukturen sind Word, DWord?

Für steigende Flanken ...
Code:
L    #IN_Flanke      //zu prüfende Bits
L    #FP_Flanke      //Stand der zu prüfenden Bits aus letztem Zyklus
XOW bzw. XOD         //geänderte Bits ermitteln
L    #IN_Flanke      //zu prüfende Bits
UW bzw. UD           //unveränderte Bits ausblenden
T    #Imp_Flanke     //Impuls der geänderten Bits ausgeben
L    #IN_Flanke      //neuen Zustand der Bits puffern
T    #FP_Flanke

Das ganze in ne Schleife packen ...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Für fallende Flanken ...
Code:
L    #IN_Flanke      //zu prüfende Bits
L    #FN_Flanke      //Stand der zu prüfenden Bits aus letztem Zyklus
XOW bzw. XOD         //geänderte Bits ermitteln
L    #FN_Flanke      //zu prüfende Bits
UW bzw. UD           //unveränderte Bits ausblenden
T    #Imp_Flanke     //Impuls der geänderten Bits ausgeben
L    #IN_Flanke      //neuen Zustand der Bits puffern
T    #FN_Flanke
 
Hallo, hier meine Variante:
Code:
// steigende Flanken WORD ( DWORD ): Bits jetzt 1 und vorher 0
L    #IN_Flanke    // Bits jetzt
L    #FP_Flanke    // Bits vorher
INVI               // ( INVD )
UW                 // ( UD )
T    #Imp_Flanke   // 1-Impuls bei Flanken Pos
L    #IN_Flanke    // Bits jetzt // hier geht auch: POP oder TAK
T    #FP_Flanke    // als Bits vorher merken

// fallende Flanken WORD ( DWORD ): Bits jetzt 0 und vorher 1
L    #IN_Flanke    // Bits jetzt
INVI               // ( INVD )
L    #FN_Flanke    // Bits vorher
UW                 // ( UD )
T    #Imp_Flanke   // 1-Impuls bei Flanken Neg
L    #IN_Flanke    // Bits jetzt
T    #FN_Flanke    // als Bits vorher merken
siehe auch FAQ: Flankenauswertung in Step7

Der FC soll flexibel sein, so dass die Grösse der übergebenen Struktur keine Rolle spielt.

Ich denke im FC muss zuerst die Grösse der Struktur ermittelt werden und dann in einer Schlaufe wortweise auf Flankenwechsel geprüft werden.

Nun habe ich leider keine Erfahrung mit Pointern und indirekter Adressierung.
Das würde ich nicht machen, sondern ARRAY OF DWORD benutzen und den FC für jeden ARRAY-Member extra aufrufen.
Oder hast Du hunderte Bits auszuwerten? Mit 3 Aufrufen eines DWORD-FC hast Du 96 Bits ausgewertet.

Gruß
Harald
 
Hallo

Erstmal danke für die Antworten. Aber wie im Beitrag geschrieben handelt es sich um Strukturen unterschiedlicher Grösse. Darum möchte ich einen allgemeinen FB/FC schreiben um die Flanken abzufragen.

Beispiel der Sruktur
FlkSig struct
Sig01 Bool
Sig02 Bool
Sig03 Bool
etc.
End struct

Die Struktur soll an den FB/FC zur Flankenauswertung übergeben werden.
Im FB/FC soll die Länge der Struktur ermittelt werden. Dann soll in einer Schlaufe für die ganze Struktur die Flankenauswertung gemacht werden.


Gruss
NeuSim
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du ein variables Datenfeld übergeben möchtest, so ginge das mit dem ANY-Pointer. Wie der funktioniert kannst du in der FAQ vom Forum nachlesen. Allerdings, wenn du einen Flankenwechsel auf jedes einzelne Element feststellen willst, so brauchst du auch für jedes einzelne Element deiner Struktur einen Hilfsspeicher, der den letzten Zustand speichert. Das sehe ich als etwas problematisch an bei einer variablen Strukturgröße.

Vielleicht solltest du dein Vorhaben noch einmal überdenken.
 
Allerdings, wenn du einen Flankenwechsel auf jedes einzelne Element feststellen willst, so brauchst du auch für jedes einzelne Element deiner Struktur einen Hilfsspeicher, der den letzten Zustand speichert.
Absolut, deshalb sollte der Hilfsspeicher dann ein Teil der Struktur sein.
Und wie Lupo ja schon sagt, über einen Any-Zeiger kann man das ja alles aufdröseln.

Darum möchte ich einen allgemeinen FB/FC schreiben um die Flanken abzufragen.
Hast du denn schon damit angefangen?
Zeig mal was du schon hast, oder wartest du auf die fertige Lösung?
 
Für fertige Lösungen schreiben wir aber ne Rechnung. :ROFLMAO:ROFLMAO:ROFLMAO::s11:

Code:
// steigende Flanken WORD ( DWORD ): Bits jetzt 1 und vorher 0
L    #IN_Flanke    // Bits jetzt
L    #FP_Flanke    // Bits vorher
INVI               // ( INVD )
UW                 // ( UD )
T    #Imp_Flanke   // 1-Impuls bei Flanken Pos
L    #IN_Flanke    // Bits jetzt // hier geht auch: POP oder TAK
T    #FP_Flanke    // als Bits vorher merken
 
// fallende Flanken WORD ( DWORD ): Bits jetzt 0 und vorher 1
L    #IN_Flanke    // Bits jetzt
INVI               // ( INVD )
L    #FN_Flanke    // Bits vorher
UW                 // ( UD )
T    #Imp_Flanke   // 1-Impuls bei Flanken Neg
L    #IN_Flanke    // Bits jetzt
T    #FN_Flanke    // als Bits vorher merken

Auch cool :cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist ja auch ganz einfach 1:1 von Bitverknüpfung in Wortverknüpfung übersetzt ... ;) :cool:
Code:
// steigende Flanke: Bit jetzt 1 und vorher 0
U    #Bit_jetzt
UN   #Bit_vorher
=    #Flanke_Pos
U    #Bit_jetzt
=    #Bit_vorher

// fallende Flanke: Bit jetzt 0 und vorher 1
UN   #Bit_jetzt
U    #Bit_vorher
=    #Flanke_Neg
U    #Bit_jetzt
=    #Bit_vorher


@NeuSim

Der FC soll flexibel sein, so dass die Grösse der übergebenen Struktur keine Rolle spielt.

Die Struktur soll an den FB/FC zur Flankenauswertung übergeben werden.
Im FB/FC soll die Länge der Struktur ermittelt werden. Dann soll in einer Schlaufe für die ganze Struktur die Flankenauswertung gemacht werden.

Wie ein übergebener Datenbereich strukturiert ist kann mit S7 zur Laufzeit nicht ermittelt werden, erst recht nicht bei wechselnden
Strukturen. Einzige Möglichkeit: Der Datenbereich ist ein Array eines einfachen Datentyps und wird per Any-Pointer übergeben,
dann kann die Länge des Arrays ermittelt werden.
Schau dir das mal an FAQ: Any-Zeiger für Datentypen

Wie die Länge des übergebenen Arrays aus dem Any-Pointer ermittelt wird hatten wir hier im Forum kürzlich ein Programmbeispiel.
Siehe Forums-Suche

Gruß
Harald
 
Tach,
ich habe mir auch mal so einen FC geschrieben:

3x IN-Parameter als Any:
- Daten_Aktuell
- Daten_Altwert
- Daten_pFlanke

Im FC zerlegst du dann die Anyzeiger, prüfst Längen etc. und packst das ganze in eine Schleife ala #4. Ich habe in meinem FC zwei Schleifen programmiert: Die erste über alle Doppelworte, die zweite über die restlichen Bytes, falls vorhanden. Spart Zykluszeit.

Programmieren musst Du aber selbst. Berichte doch mal über deine Lösungsansätze!

Gruß
flinn
 
Zurück
Oben