# Logo Schaltzeit von HEX in Dezimal in Node Red umwandeln



## emilio20 (11 Dezember 2021)

Hallo ich benötige mal eure Hilfe.

Ich versuche verzweifelt die Schaltzeit von einer Wochenschaltuhr einer Logo in Node Red richtig darzustellen. Z.b Soll 05:00 Uhr von der Logo in Node Red als 500 angezeigt werden.
Die Schaltzeit wird von der Logo in HEX bereitgestellt. In Node Red wird diese als dezimal Zahl angezeigt jedoch nicht richtig.
Beispiel: Logo Uhrzeit 05:00 Uhr in Node Red erhalte ich 1280.
Ich habe in einem anderen Forum einen Beitrag gefunden wo es um dasselbe Problem ging Link .
Hier wurde mit dieser Formel das Problem gelöst Formel . Dies habe ich in Node Red übernommen. Jedoch erhalte ich falsche Werte. Auf der Webseite funktioniert die Formel aber.

Kennt jemand eine Lösung wie ich die Schaltzeit der Logo in Node Red richtig angezeigt bekomme und wie ich eine Schaltzeit wieder im richtigen Format an die Logo übergeben kann?


----------



## PN/DP (11 Dezember 2021)

Ich vermute mal, das ist in Wirklichkeit BCD. Kann Node Red BCD anzeigen oder in Dezimal wandeln? 

Harald


----------



## Heinileini (11 Dezember 2021)

emilio20 schrieb:


> Die Schaltzeit wird von der Logo in HEX bereitgestellt. In Node Red wird diese als dezimal Zahl angezeigt jedoch nicht richtig.
> Beispiel: Logo Uhrzeit 05:00 Uhr in Node Red erhalte ich 1280.


1280 ist die dezimale Darstellung der hexadezimalen Zahl 500.
Anscheinend ist die Zahl in der LOGO doch nicht hexadezimal ("BCD") und die Umwandlung völlig überflüssig.
Es bleibt aber vermutlich/wahrscheinlich das Problem, dass die Uhrzeit mit ihren 60 s/min und 60 min/h keine Dezimalzahlen im  üblichen Sinne sind.
Wie sieht die Zahl denn aus, wenn die Uhrzeit 4:59 übergeben wird? 459?
Was passiert, wenn Du 460 von NodeRed an die LOGO übergibst? Zeigt sie dies als 5:00 an?


----------



## Thomas_v2.1 (11 Dezember 2021)

Ich würde das in einen String konvertieren, andernfalls hast du bei einer Zeit von 00:03 Uhr den Wert 3, fänd ich etwas unschön.

Mit Umwandlung in Strings und wieder zurück wäre das aber z.B. so möglich:
Ergebnis = parseInt(X.toString(16), 10);


----------



## emilio20 (11 Dezember 2021)

Die Zahl kommt von der Logo als Hex. Das selbe Problem gibt es auch über den Logo Web Editor LEW wie im Beitrag hier .

In Node Red verwende ich die Node node-red-contrib-s7 mit dieser lese ich DB1,WORD101 aus der Logo aus. Das Modul wandelt den HEX Wert in Dezimal um.
Wenn ich in der Logo 4:59 eingebe erhalte ich 1113. Das wurde genau wie in der Umrechnung 459 ergeben.

Es gibt mit dem S7 Modul keine Möglichkeit den HEX Wert direkt auszulesen. Der Dezimal wert müsste wieder in HEX umgewandelt werden damit ich die 459 erhalten. Hier ist genau das Problem


----------



## emilio20 (11 Dezember 2021)

Thomas_v2.1 schrieb:


> Ich würde das in einen String konvertieren, andernfalls hast du bei einer Zeit von 00:03 Uhr den Wert 3, fänd ich etwas unschön.
> 
> Mit Umwandlung in Strings und wieder zurück wäre das aber z.B. so möglich:
> Ergebnis = parseInt(X.toString(16), 10);


Hallo Thomas, super funktioniert. Das wäre das Lesen aus der Logo. Wie funktioniert jetzt die umwandlung beim schreiben in die Logo


```
msg.payload = parseInt((msg.payload).toString(16), 10);

return msg;
```


Gut wäre jetzt noch wenn ich die Stunden in eine Variable übergebe und die Minuten in eine weitere Variable schreiben. Dann könnte ich diese begrenzen


----------



## Garf (11 Dezember 2021)

Vielleicht hilft dir der Thread weiter.









						Converting hex to decimal
					

the whole  datarange is  20;0A;Cresta;ID=2C01;TEMP=00e8;HUM=63;BAT=OK;  with change is it reformed to:  20;05;Cresta;ID;2C01;TEMP;00f2;HUM;65;BAT;OK;  with function  data split  i got the information needed  temp: "00f3"  hum: "65"  and then ??   Ho do i get decimal data from (wx)sensors  it is...




					discourse.nodered.org


----------



## Thomas_v2.1 (11 Dezember 2021)

Das Ganze rückwärts, also so in der Art:
parseInt(X.toString(10), 16);


----------



## Thomas_v2.1 (11 Dezember 2021)

Du musst nur bedenken, dass es schwer ist bei diesem einen Wert Fehleingaben abzufangen, 0 bis 59 sind gültig, 60 bis 99 nicht, ab 100 wieder usw.


----------



## emilio20 (11 Dezember 2021)

Thomas_v2.1 schrieb:


> Du musst nur bedenken, dass es schwer ist bei diesem einen Wert Fehleingaben abzufangen, 0 bis 59 sind gültig, 60 bis 99 nicht, ab 100 wieder usw.


Ja deswegen wäre es ja gut, wenn beim Lesen die Stunden und die Minuten in eine Variable geschrieben werden. Dann könnte ich für Stunden 0-23 begrenzen und für Minuten 0-60. Das Ganze dann wieder rückwärtig die Logo.

Wäre super wenn du mir da noch kurz hälfen könntest.


----------



## Thomas_v2.1 (11 Dezember 2021)

Ich würde mal sehen ob es bei Nodered ein fertiges Element für die Eingabe von Uhrzeiten gibt, in Javascript existieren auch einige "Timepicker", und daraufhin die Konvertierungsfunktion auslegen. Die Umrechnung ist nämlich schneller und einfacher erledigt, als so ein GUI-Element.

Zum Testen solcher Funktionen kannst du übrigens einfacher den Javascript Interpreter auf der Kommandozeile verwenden, als das immer in NodeRed auszuprobieren (imho). Also eine Textdatei wie test.js erstellen in der du deine Testfunktionen eingibst, und dann node test.js aufrufen. Mit console.log("Hallo"); kannst du dann Informationen ausgeben lassen.


----------



## emilio20 (12 Dezember 2021)

Hallo Thomas,
ich habe ein Zeitschaltfunktion "ui_scheduler" gefunden die ich später veröffentliche. Jedoch benötige ich nochmal deine Hilfe. Ich lese aus der Logo für die Wochentage ein Byte aus das vom S7 Modul in eine INT umgewandelt wird. Diese zerlege ich in einen Array damit ich die einzelnen Bits erhalte
Das funktioniert auch soweit mit folgenden code



```
function Wochentag(X) {
    /* Wochentag von int in Array schreiben */
    var days = [];
    for (var i = 0; i < 7; i++)
      days[i] = (X >> i) & 1;
      return days
}
```

Mein Problem ist jetzt wie kann ich das ganze wieder zurückwandeln also den Array mit der richtigen reinefolge in einen int  ?

Ich habe hierfür folgenden code


```
a = msg.payload
b = a.reduce((res, x) => res << 1 | x)
msg.payload = b;
return msg;
```

Ich erhalte aber z.B Wenn SO und MO 1 ist die Nummer 96 alstelle einer 3


----------



## Thomas_v2.1 (12 Dezember 2021)

Kann man sicher kürzer schreiben, aber wenn man das Prinzip deiner anderen Funktion fortsetzt, dann sollte es so funktionieren:


```
function WochentagArrToInt(days) {
    /* Wochentag von Array nach int schreiben */
    var x = 0;
    for (var i = 0; i < 7; i++) {
      if (days[i]) {
        x = x | (1 << i);
      }
    }
    return x;
}
```


----------



## emilio20 (12 Dezember 2021)

Hallo @Thomas_v2.1  vilen Dank 

hier mal die fertige Lösung mit der es möglich ist Werte einer Zeitschaltuhr von einer Logo in Node Red zu lesen, diese über ui-time-scheduler zu bearbeiten und wieder zurück in die Logo zu schreiben.

Node Red wird nur als Bedienoberfläche genutzt nicht als Steueurng



Im Anhang die Node Red JSON


----------



## emilio20 (13 Dezember 2021)

Hallo hier eine verbesserte Version mit der es möglich ist alle 3 Nocken eines Logo Wochenschaltuhr über Node Red oder der Logo zu ändern.
In Node Red muss node-red-contrib und  ui-time-scheduler installiert werden. In der Logo muss die Parameter-VM-Zuordung eingestellt werden


----------



## Thomas_v2.1 (13 Dezember 2021)

Macht der time-scheduler nicht eigentlich selber eine Zeitschaltuhr? D.h. du nutzt den nur als Parametrieroberfläche?


----------



## emilio20 (14 Dezember 2021)

Ja genau ich nutze Node Red als Parametrieroberfläche. Time-scheduler konnte einen Netzwerk Eingang schalten aber dann kann man auch die gesamte Logik in Nod Red Programmieren und die Logo nur als E/A Baugruppe nutzen.
Das wollte ich aber nicht, die Logik soll in der Logo bleiben somit funktioniert das Ganze auch ohne Nod Red.

Die Bedienung ist von beide Seiten möglich. Ändere ich einen Wert an der Logo ändert sich der Wert auch in Node Red und umgekert.


----------

