Moin
verwende den o.g Baustein um eine Abfrage zu machen.
Abfrage läuft und auch die Seriennummern stimmen.
An der Wago habe ich vier Klemmen, wobei bei drei Klemmen ein EVG anhängt.
Bei Klemme 2 und 3 werden die Nummern richtig ausgegeben.
Nur bei der ersten Klemme werden die Snummern auf [9,0] und [9.1] ausgegeben, also doppelt.
Zur Erklärung beigefügte Bilder und Code.
Vielleicht sieht jemand auf den ersten Blick, warum er bei der ersten Klemme diese doppelte Ausgabe macht.
Vielen Dank für Eure Hilfe und schon einmal ein schönes Wochenende..
____
VAR
oFbDaliMacroCommands : FbDaliMacroCommands;
Speicher_Antwortbyte: BYTE;
oMacro: BYTE := 5; (*Macro 5 = Abfragen der Seriennummer*)
parameterMakro: ARRAY [0..6] OF BYTE; (*Tabelle 3*)
beendetMakro: BOOL;
welcheKlemme: BYTE; (*hier Klemme 1*)
eingang: BOOL := TRUE; (*Wenn true, wird der Aufruf des Makros an die Busklemme übertragen. Nach Übertragung wird der Eingang vom Funktionsbaustein zurückgesetzt*)
Rueckgabe: BOOL; (*true Baustein bereit,false nicht bereit z.B. laufende Operation*)
antwortbyte: BYTE;
RueckmeldungvomMakro: ARRAY [0..66] OF BYTE;
Serien_Nummer: ARRAY [0..63,0..3] OF STRING; (*eindimensional für eine Klemme // Serien_Nummer: ARRAY [0..63,0..4] OF STRING; bei meheren Klemmen // zweite Dimension je nach Klemmen*)
Schleife: INT;
Zwischenspeicher: STRING;
Addressenzaehler: BYTE;
Durchlaufkontrolle: BOOL;
Ausgabearray: ARRAY [0..63,0..3] OF STRING; (*Ausgabe nur eindimensional da hier im Test nur eine Klemme abgefragt wird*) (* bei mehreren Klemmen Ausgabearray: ARRAY [0..63,0..63] OF STRING; *)
readyzaehler: INT;
stop: BOOL;
END_VAR
----
IF oFbDaliMacroCommands.xReady THEN
eingang := TRUE; (* neues Starten der Abfrage *)
END_IF;
parameterMakro[0] := Addressenzaehler;
oFbDaliMacroCommands( (*Funktionsbaustein für Makro*)
bMacro:= oMacro, (*Makronummer*)
abParameter:= parameterMakro, (*Parameter der Makros aus Tabelle*)
xStop:= beendetMakro, (*positive Flanke beendet*)
bModule_753_647:= welcheKlemme, (*Klemme*)
xSend:= eingang , (*wenn gesetzt an Busklemme Übertragung, danach wird Eingang zurückgesetzt*)
xReady=> Rueckgabe, (*True = Bereit, false = nicht bereit*)
bFeedback=> antwortbyte , (*Antwort siehe Tabelle*)
abValues=> RueckmeldungvomMakro); (*Rückmeldung*)
IF oFbDaliMacroCommands.xReady THEN (*wenn Baustein bereit dann*)
readyzaehler := readyzaehler+1;
IF NOT Durchlaufkontrolle THEN (* nur einmal durchlaufen *)
Serien_Nummer[welcheKlemme,Addressenzaehler]:='';
FOR Schleife := 2 TO 9 BY 1 DO (*Auslesen und zusammensetzen der 8 Bytes zur Seriennummer*)(*abValues[0] = Makronummer // [1] = anzahl gelesener Bytes [2] = Seriennummer Byte 8 .... [9] = Seriennummer Byte 1*)
Zwischenspeicher := BYTE_TO_STRH(RueckmeldungvomMakro[Schleife]); (*Speichern der Rückmeldung des Makros*)(*umwandeln des Array Rückmeldung - Byte- in String*)
Serien_Nummer[Addressenzaehler,welcheKlemme] := CONCAT (Serien_Nummer[Addressenzaehler,welcheKlemme] , Zwischenspeicher); (*zusammensetzen der einzelnen Bytes der Rückmeldung zur kompletten Seriennummer*)
END_FOR;
IF Serien_Nummer[Addressenzaehler,welcheKlemme] <>'0000000000000000' THEN (*Abfrage wenn die Seriennummer nicht leer ist, dann......*)
Ausgabearray[ Addressenzaehler,welcheKlemme ] :=Serien_Nummer[Addressenzaehler,welcheKlemme]; (*Array der Ausgabe füllen mit Seriennummer *)(*werden durch Addressenzaehler nacheinander aufgezählt*)
ELSE
Ausgabearray[ Addressenzaehler,welcheKlemme ] := 'nix ist'; (*wenn Seriennummer leer ist, bleibt so auch das Ausgabe Array leer*)
END_IF;
Addressenzaehler := Addressenzaehler + 1; (*Abfragen aller klemmen // hier schon die Möglichkeit alle Klemmen abzufragen*)
IF Addressenzaehler >63 THEN Addressenzaehler := 0; welcheKlemme := welcheKlemme +1; (* schon einmal komplett durch? dann wieder alles auf NULL *)
IF welcheKlemme > 3 THEN
welcheKlemme := 0;
stop := TRUE;
END_IF;
Durchlaufkontrolle := TRUE; (*wenn einmal schon durch *)
END_IF;
END_IF;
ELSE (*starten des nächsten durchlaufes*)
Durchlaufkontrolle := FALSE; (* freigabe für nächsten Durchlauf *)
END_IF;
verwende den o.g Baustein um eine Abfrage zu machen.
Abfrage läuft und auch die Seriennummern stimmen.
An der Wago habe ich vier Klemmen, wobei bei drei Klemmen ein EVG anhängt.
Bei Klemme 2 und 3 werden die Nummern richtig ausgegeben.
Nur bei der ersten Klemme werden die Snummern auf [9,0] und [9.1] ausgegeben, also doppelt.
Zur Erklärung beigefügte Bilder und Code.
Vielleicht sieht jemand auf den ersten Blick, warum er bei der ersten Klemme diese doppelte Ausgabe macht.
Vielen Dank für Eure Hilfe und schon einmal ein schönes Wochenende..
____
VAR
oFbDaliMacroCommands : FbDaliMacroCommands;
Speicher_Antwortbyte: BYTE;
oMacro: BYTE := 5; (*Macro 5 = Abfragen der Seriennummer*)
parameterMakro: ARRAY [0..6] OF BYTE; (*Tabelle 3*)
beendetMakro: BOOL;
welcheKlemme: BYTE; (*hier Klemme 1*)
eingang: BOOL := TRUE; (*Wenn true, wird der Aufruf des Makros an die Busklemme übertragen. Nach Übertragung wird der Eingang vom Funktionsbaustein zurückgesetzt*)
Rueckgabe: BOOL; (*true Baustein bereit,false nicht bereit z.B. laufende Operation*)
antwortbyte: BYTE;
RueckmeldungvomMakro: ARRAY [0..66] OF BYTE;
Serien_Nummer: ARRAY [0..63,0..3] OF STRING; (*eindimensional für eine Klemme // Serien_Nummer: ARRAY [0..63,0..4] OF STRING; bei meheren Klemmen // zweite Dimension je nach Klemmen*)
Schleife: INT;
Zwischenspeicher: STRING;
Addressenzaehler: BYTE;
Durchlaufkontrolle: BOOL;
Ausgabearray: ARRAY [0..63,0..3] OF STRING; (*Ausgabe nur eindimensional da hier im Test nur eine Klemme abgefragt wird*) (* bei mehreren Klemmen Ausgabearray: ARRAY [0..63,0..63] OF STRING; *)
readyzaehler: INT;
stop: BOOL;
END_VAR
----
IF oFbDaliMacroCommands.xReady THEN
eingang := TRUE; (* neues Starten der Abfrage *)
END_IF;
parameterMakro[0] := Addressenzaehler;
oFbDaliMacroCommands( (*Funktionsbaustein für Makro*)
bMacro:= oMacro, (*Makronummer*)
abParameter:= parameterMakro, (*Parameter der Makros aus Tabelle*)
xStop:= beendetMakro, (*positive Flanke beendet*)
bModule_753_647:= welcheKlemme, (*Klemme*)
xSend:= eingang , (*wenn gesetzt an Busklemme Übertragung, danach wird Eingang zurückgesetzt*)
xReady=> Rueckgabe, (*True = Bereit, false = nicht bereit*)
bFeedback=> antwortbyte , (*Antwort siehe Tabelle*)
abValues=> RueckmeldungvomMakro); (*Rückmeldung*)
IF oFbDaliMacroCommands.xReady THEN (*wenn Baustein bereit dann*)
readyzaehler := readyzaehler+1;
IF NOT Durchlaufkontrolle THEN (* nur einmal durchlaufen *)
Serien_Nummer[welcheKlemme,Addressenzaehler]:='';
FOR Schleife := 2 TO 9 BY 1 DO (*Auslesen und zusammensetzen der 8 Bytes zur Seriennummer*)(*abValues[0] = Makronummer // [1] = anzahl gelesener Bytes [2] = Seriennummer Byte 8 .... [9] = Seriennummer Byte 1*)
Zwischenspeicher := BYTE_TO_STRH(RueckmeldungvomMakro[Schleife]); (*Speichern der Rückmeldung des Makros*)(*umwandeln des Array Rückmeldung - Byte- in String*)
Serien_Nummer[Addressenzaehler,welcheKlemme] := CONCAT (Serien_Nummer[Addressenzaehler,welcheKlemme] , Zwischenspeicher); (*zusammensetzen der einzelnen Bytes der Rückmeldung zur kompletten Seriennummer*)
END_FOR;
IF Serien_Nummer[Addressenzaehler,welcheKlemme] <>'0000000000000000' THEN (*Abfrage wenn die Seriennummer nicht leer ist, dann......*)
Ausgabearray[ Addressenzaehler,welcheKlemme ] :=Serien_Nummer[Addressenzaehler,welcheKlemme]; (*Array der Ausgabe füllen mit Seriennummer *)(*werden durch Addressenzaehler nacheinander aufgezählt*)
ELSE
Ausgabearray[ Addressenzaehler,welcheKlemme ] := 'nix ist'; (*wenn Seriennummer leer ist, bleibt so auch das Ausgabe Array leer*)
END_IF;
Addressenzaehler := Addressenzaehler + 1; (*Abfragen aller klemmen // hier schon die Möglichkeit alle Klemmen abzufragen*)
IF Addressenzaehler >63 THEN Addressenzaehler := 0; welcheKlemme := welcheKlemme +1; (* schon einmal komplett durch? dann wieder alles auf NULL *)
IF welcheKlemme > 3 THEN
welcheKlemme := 0;
stop := TRUE;
END_IF;
Durchlaufkontrolle := TRUE; (*wenn einmal schon durch *)
END_IF;
END_IF;
ELSE (*starten des nächsten durchlaufes*)
Durchlaufkontrolle := FALSE; (* freigabe für nächsten Durchlauf *)
END_IF;