-> Hier kostenlos registrieren
Ringpuffer FIFO ! (INT;BOOL)
Anhang anzeigen FIFO.zip
Hab' eure Ratschläge mit einbezogen
..das ganze Programm ist nur eine Übung in AWL .Wie könnte ich diese FIFO so programmieren dass als input nicht nur INT sondern auch jeweils BOOL , DINT oder REAL speichert ? ANY als INPUT ist mir schon klar aber OUTPUT ?... den kann man nicht variabel definieren , oder ?
Soll ich es als WORD (DWORD) nehmen den OUTPUT und über eine angehhängte FC mit MOVE "übersetzen" ?
PS: FIFO funktioniert soweit ich es getestet habe ; FIFO-grösse kann man mit der ARRAY grösse ändern !
(ÄNDERUNG: THEMA/THREAD umbenannt)
Code:
FUNCTION_BLOCK "RINGPUFFER"TITLE =
VERSION : 0.1
VAR_INPUT
INIT : BOOL ; //Initialisieren
EIN : BOOL ; //Schreibsignal
AUS : BOOL ; //Lesesignal
INPUT : INT ; //WOHER SCHREIBEN ?
END_VAR
VAR_OUTPUT
OUTPUT : WORD ; //WOHIN LESEN ?
END_VAR
VAR
Sindex : INT ; //Schreibindex
Lindex : INT ; //Leseindex
EINflanke : BOOL ; //Schreibsignal Flanke
AUSflanke : BOOL ; //Lesesignal Flanke
INITflanke : BOOL ; //Nullensignal Flanke
LFM : BOOL ; //Leseflanke Merker
SFM : BOOL ; //Schreibflanke Merker
Besetzt : BOOL ; //1=Lesen möglich
Platz : ARRAY [1 .. 5 ] OF INT ;
END_VAR
VAR_TEMP
tempAR1 : DWORD ; //AR1retten
END_VAR
BEGIN
NETWORK
TITLE =
//EINGABE
U #INIT;
FP #INITflanke;
SPB INIT; //INITIALISIEREN
U #AUS;
FP #AUSflanke;
= #LFM;
SPB AUSL; //LESEN
U #EIN;
FP #EINflanke;
= #SFM;
SPB EINS; //SCHREIBEN
BE ;
NETWORK
TITLE =
//INITIALISIERN
INIT: L 0;
T #Lindex;
T #Sindex;
TAR1 #tempAR1;
LAR1 ;
L P##Platz;
+AR1 ;
TAR2 ;
+AR1 ;
L 0;
T DIW [AR1,P#0.0];
T #OUTPUT;
LAR1 #tempAR1; //AR retten
CLR ;
= #Besetzt;
BE ;
NETWORK
TITLE =
//LESEN
AUSL: L #Sindex;
L #Lindex;
<>I ;
SPB o0;
UN #Besetzt;
SPB o1;
o0: SLD 4;
TAR1 #tempAR1;
LAR1 ;
L P##Platz;
+AR1 ;
TAR2 ;
+AR1 ;
L DIW [AR1,P#0.0];
T #OUTPUT;
LAR1 #tempAR1;
L #Lindex;
L 1;
+I ;
L 4; //5=0->4
TAK ;
>=I ;
SPB o2;
L 0;
o2: T #Lindex;
CLR ;
= #Besetzt;
U #LFM;
U #SFM;
SPB EINS;
BE ;
o1: L 0;
T #OUTPUT;
U #LFM;
U #SFM;
SPB EINS;
BE ;
NETWORK
TITLE =
//SCHREIBEN
EINS: L #Lindex;
L #Sindex;
<>I ;
SPB oo0;
U #Besetzt;
SPB oo1;
oo0: SLD 4;
TAR1 #tempAR1;
LAR1 ;
L P##Platz;
+AR1 ;
TAR2 ;
+AR1 ;
L #INPUT;
T DIW [AR1,P#0.0];
LAR1 #tempAR1;
L #Sindex;
L 1;
+I ;
L 4; //5=0->4
TAK ;
>=I ;
SPB oo2;
L 0;
oo2: T #Sindex;
SET ;
= #Besetzt;
oo1: BE ;
END_FUNCTION_BLOCK
Anhang anzeigen FIFO.zip
Hab' eure Ratschläge mit einbezogen
..das ganze Programm ist nur eine Übung in AWL .Wie könnte ich diese FIFO so programmieren dass als input nicht nur INT sondern auch jeweils BOOL , DINT oder REAL speichert ? ANY als INPUT ist mir schon klar aber OUTPUT ?... den kann man nicht variabel definieren , oder ?
Soll ich es als WORD (DWORD) nehmen den OUTPUT und über eine angehhängte FC mit MOVE "übersetzen" ?
PS: FIFO funktioniert soweit ich es getestet habe ; FIFO-grösse kann man mit der ARRAY grösse ändern !
(ÄNDERUNG: THEMA/THREAD umbenannt)
Zuletzt bearbeitet: