-> Hier kostenlos registrieren
Hallo Community,
Zunaechst, ich arbeite mit e!cockpit, also Codesys 3.5.
ich habe folgendes Anliegen/Problem.
Ich mache eine Abfrage eines Smartmeters und bekomme als Antwort ein ASCII Array [irgendwas mit 150 aufwaerts] of Byte zurueck.
Zur Visualisierung uebersetze ich das Array in einen zusammenhaengenden Text wie folgt:
Dabei kommt dann etwas nach dem Schema raus.
Wenn ich jetzt die einzelnen Leistungen der Phasen haben will, kann ich mit dem "Find-Befehl" diese aus dem Ergebnis raussuchen.
Soweit so gut.
Wenn ich jetzt jedoch eine Abfrage ueber einen laengeren Zeitraum machen will, dann wird das ASCII Array laenger und die Ausgabe von time bis energyOut wiederholt sich n-fach. Da klappt das nicht mehr so schoen mit dem "Find", weil wenn er z.B. das erste "time" gefunden hat, nicht die folgenden ausgelesen werden koennen.
Jetzt koennte ich mit dem "Right-Befehl" natuerlich immer nach dem "energyOut" abschneiden und dann wirder neu suchen.
Was ich aber eleganter faende, waere das direkt in dem FB zu machen. Dabei wuerde ich die Daten gerne in einem Array speichern, was eine laenge von 7 hat (fuer time, energy, power,...).
Ich hab mir sowas vorgestellt wie:
Dabei soll der ArrayCounter immer nach einer Nicht-Zahlenfolge hochgesetzt werden.
Leider funktioniert das mit dem IF nicht so, da man nur BOOL's oder STRING's verwenden kann und ich nicht (wenn man das wieder in STRING's umwandelt) fuer die Zahlen 0-9 jeweils ein IF oder ELSIF machen will. Ein "Case-Befehl" ist auch nicht optimal (es muessen INT sein), da man die ASCII-Byte in STRING's konvertieren muss und Buchstaben dann ebenfalls "0" ergeben.
WÃaee fuer Ansaetze oder Tipp's zur Loesung sehr dankbar.
Und Tschuldigung fuer den kleinen Abendroman
MfG
kors
Zunaechst, ich arbeite mit e!cockpit, also Codesys 3.5.
ich habe folgendes Anliegen/Problem.
Ich mache eine Abfrage eines Smartmeters und bekomme als Antwort ein ASCII Array [irgendwas mit 150 aufwaerts] of Byte zurueck.
Zur Visualisierung uebersetze ich das Array in einen zusammenhaengenden Text wie folgt:
Code:
FUNCTION_BLOCK Buffer_Uebersetzen
VAR_INPUT
Buffer: ARRAY [0..3000] OF BYTE;
ByteCount: UDINT;
END_VAR
VAR_OUTPUT
sText: STRING(255);
END_VAR
VAR
i: INT;
sBuffer: STRING;
ByteCount_INT: INT;
END_VAR
Code:
ByteCount_INT := UDINT_TO_INT(ByteCount);
sText := '';
FOR i := 0 TO ByteCount_INT DO
sBuffer := WagoSysString.ASCIIByte_To_String(b:= Buffer[i]); // Wandelt den ASCII-Byte-Array zu einzelnen Strings um
sText := CONCAT(String_1:=sText , String_2:=sBuffer ); // Setzt die einzelnen Strings zu einem String zusammen (Concat-Befehl)
END_FOR
Dabei kommt dann etwas nach dem Schema raus.
Code:
{"status":"ok","result":[{"time":1524146846301,"energy":2787704584452000,"power":-22614000,"power1":-7422000,"power2":-8088600,"power3":-7103400,"energyOut":553326052714800}]}
Soweit so gut.
Wenn ich jetzt jedoch eine Abfrage ueber einen laengeren Zeitraum machen will, dann wird das ASCII Array laenger und die Ausgabe von time bis energyOut wiederholt sich n-fach. Da klappt das nicht mehr so schoen mit dem "Find", weil wenn er z.B. das erste "time" gefunden hat, nicht die folgenden ausgelesen werden koennen.
Jetzt koennte ich mit dem "Right-Befehl" natuerlich immer nach dem "energyOut" abschneiden und dann wirder neu suchen.
Was ich aber eleganter faende, waere das direkt in dem FB zu machen. Dabei wuerde ich die Daten gerne in einem Array speichern, was eine laenge von 7 hat (fuer time, energy, power,...).
Ich hab mir sowas vorgestellt wie:
Code:
VAR
Buffer: ARRAY [0..3000] OF BYTE;
DatenArray: ARRAY [0..6] OF INT;
ArrayCounter: INT;
END_VAR
Code:
FOR i := 0 TO ByteCount_INT DO
IF Buffer[i] := eineZahl THEN
DatenArray[ArrayCounter] := DatenArray[ArrayCounter] * 10 + Buffer[i];
ELSE ArrayCounter = ArrayCounter +1;
END_IF
END_FOR
Leider funktioniert das mit dem IF nicht so, da man nur BOOL's oder STRING's verwenden kann und ich nicht (wenn man das wieder in STRING's umwandelt) fuer die Zahlen 0-9 jeweils ein IF oder ELSIF machen will. Ein "Case-Befehl" ist auch nicht optimal (es muessen INT sein), da man die ASCII-Byte in STRING's konvertieren muss und Buchstaben dann ebenfalls "0" ergeben.
WÃaee fuer Ansaetze oder Tipp's zur Loesung sehr dankbar.
Und Tschuldigung fuer den kleinen Abendroman
MfG
kors
Zuletzt bearbeitet: