Prioritätsproblem FIFO

romanz

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
In meinem Programm benutze ich einen Fallregister, in dem Befehle für Dosierbandwaage geschrieben und von einem Kommunikationsbaustein gelesen werden. Es gibt die Befehle mit der höheren Priorität (zBsp. "STOPP"), d.h. die müssen so schnell wie möglich gelesen werden bzw. auf der ersten Stelle geschrieben und dann zu erst gelesen werden. Aber ich will keinen Befehl überschreiben, sondern einfach einmal hoch schieben und dann Befehl auf der ersten Stelle rein schreiben.
Ich weiß nicht genau wie ich das machen soll ? Kann mir jemand ein Tipp geben ?
Hier ist Teil von dem Programm (in SCL):

Register_schreiben:
Schreibzeiger1:=Schreibzeiger;
IF Fuellstand = Registerlaenge - 1
THEN Voll := TRUE;
ELSE
Akt_Fuellstand:=Fuellstand;

IF Eingang.Befehl = Stopp THEN
Schreibzeiger := 0;
Register[Schreibzeiger].Befehl := Eingang.Befehl;

Fuellstand := Fuellstand + 1;
IF Schreibzeiger = Registerlaenge
THEN Schreibzeiger := 0;
ELSE Schreibzeiger := Schreibzeiger + 1;
END_IF;
Leer := False;

ELSE
Register[Schreibzeiger].Befehl := Eingang.Befehl;
Fuellstand := Fuellstand + 1;
IF Schreibzeiger = Registerlaenge
THEN Schreibzeiger := 0;
ELSE Schreibzeiger := Schreibzeiger + 1;
END_IF;
Leer := False;
END_IF;
END_IF;
END_IF;
 
Hallo,
mir fehlen da noch so einige Zeilen in deinem Konstrukt ...
Ich würde da wie folgt vorgehen :
Du machst dir zunächst einen Eingangs-Parameter "Daten_Uebernehmen".
Wenn der kommt, dann übernimmst du die Eingangs-Daten in dein FiFo. Für dieses Übernehmen mußt du dir auch noch eine Flanke bauen, die verhindert, dass für einen Impuls in einer Sekunde gleich mehrere Dutzend (vielleicht so Hundert) datensätze in dein FiFo geschrieben werden.
Den Flankenmerker (STAT-Variable kannst du auch dafür benutzen um deinem aufrufenden Programm zu "sagen", dass die Daten abgelegt worden sind.

Also etwa so :
Code:
IF neue_Daten and not RM_neue_Daten_OK then
   // hier das FiFo von Ende-1 bis Anfang Schrittweite -1 einen nach hinten aufrücken
   // hier die Daten in dein FiFo an Platz 1 schreiben
end_if ;
RM_neue_Daten_OK := neue_Daten ;

Bau das erstmal so ein und dann schauen wir mal weiter ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Prinzipiell müsstest du ja nur dein Fallregister nach Prioritäten sortieren...

Wenn du bei jedem Eintrag einen Prioritätswert ergänzt (1 sehr hoch, 99 sehr niedrig) kannst du zyklisch prüfen ob die Priorität in Eintrag 1 größer ist als die in 2. Wenn ja tauscht du die Einträge aus, wenn nicht alles ok.
Dann vergleichst du 2 mit 3 usw.
 
Hallo Larry,
Eingangs-Parameter "Daten_Uebernehmen" brauche ich nicht , wiel ich in FB vor FIFO das berücksichtigt habe.
Ich habe folgendes Programmiert:
- Fuellstand zeigt wieviel Befehlen ich schon in FIFO habe

Könnte das funktionieren?

[Register_schreiben:
IF Fuellstand = Registerlaenge - 1
THEN Voll := TRUE;
ELSE
IF Eingang.Befehl = Stopp THEN
Register[Schreibzeiger].Befehl := Register[Fuellstand].Befehl;
Register[Fuellstand].Befehl := Eingang.Befehl;
Fuellstand := Fuellstand + 1;
IF Schreibzeiger = Registerlaenge
THEN Schreibzeiger := 0;
ELSE Schreibzeiger := Schreibzeiger + 1;
END_IF;
Leer := False;

ELSE
Register[Schreibzeiger].Befehl := Eingang.Befehl;
Fuellstand := Fuellstand + 1;
IF Schreibzeiger = Registerlaenge
THEN Schreibzeiger := 0;
ELSE Schreibzeiger := Schreibzeiger + 1;
END_IF;
Leer := False;
END_IF;
END_IF;]
 
Könnte das funktionieren?

Das kann ich dir nicht sagen.
Was sagen denn deine Versuche dazu ?
Du solltest auf jeden Fall (das hatte ich ja schon geschrieben) berücksichtigen, dass du für die Funktion "Daten einlagern" eine Flankensteuerung programmieren mußt. Wenn du das extern (außerhalb des FB's) machst ist das auch OK - allerdings nur bei bedingter Bearbeitung des Bausteins möglich. Wird dein Baustein bedingt bearbeitet, so meldet er dir keinen Status.
Meiner Vorstellung einer Aufgaben-Kapselung würde das so nicht entsprechen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

Sie haben recht, mit Aufgaben-Kapselung ist besser.
Das was ich geschrieben habe, scheint zu funktionieren. Ich muss nur einpaar
Testreihen durchführen, dann wird sich ergeben, ob das Programm falsch oder nicht.

Gruß
Roman
 
Zurück
Oben