Da ich aus gesundheitlichen Gründen eine kleine Pause einlegen musste, konnte ich noch kein Feedback geben. Sorry.
Ich habe heute wieder bei meinem hier beschriebenen Problemfall weiter gesucht und einiges getestet.
Nach einigen Stunden bin ich nun etwas schlauer und bin auf folgende Lösung gestoßen:
- folgende Datenpunkte wurden manuell für jeden der 3 Timer angelegt & die Eingabefelder für die Einschaltzeit, Ausschaltzeit & der Button in der Vis2 wurden mit dem zugehörigen manuell angelegten Datenpunkt verknüpft
Im DB1 meines s7 Adapters sehen die Variablen des Timers1 ECO so aus:
- in meiner Vis2 sieht die Wochenschaltuhr für den ECO-Betrieb so aus:
- Die Checkboxen für die Aktivierung/Deaktivierung der Wochentage, wurden direkt mit dem verantwortlichen bit (laut eigener VariablenTabelle in der SiemensLOGO!) verknüpft:
Für eine Wochenschaltuhr in der SiemensLOGO! stehen max. 3 Timer/Zyklen zur Auswahl, um alles übersichtlich zu gestalten habe ich für jeden der Timer ein eigenes Skript erstellt. Im Skript wird geprüft, ob der Wert aus 4 Dezimalzahlen besteht und ob der Wert der Ausschaltzeit größer ist als der Wert der Einschaltzeit. Zudem wird "dezimal" in "BCD" konvertiert, damit die SiemensLOGO! die korrekten Daten gesendet bekommt.
Hier das Skript für den Timer1:
const idEinschaltzeit = '0_userdata.0.wochenschaltuhren_logo.wochenschaltuhr1_eco.wochenschaltuhr1_einschaltzeit1';
const idAusschaltzeit = '0_userdata.0.wochenschaltuhren_logo.wochenschaltuhr1_eco.wochenschaltuhr1_ausschaltzeit1';
const idEinschaltzeitInput = '0_userdata.0.wochenschaltuhren_logo.wochenschaltuhr1_eco.wochenschaltuhr1_einschaltzeit1_input';
const idAusschaltzeitInput = '0_userdata.0.wochenschaltuhren_logo.wochenschaltuhr1_eco.wochenschaltuhr1_ausschaltzeit1_input';
const idButton = '0_userdata.0.wochenschaltuhren_logo.wochenschaltuhr1_eco.wochenschaltuhr1_button_uebernehmen1';
const idS7Einschaltzeit = 's7.1.DBs.DB1.T001_Wochenschaltuhr1_ECO_Einschaltzeit1';
const idS7Ausschaltzeit = 's7.1.DBs.DB1.T001_Wochenschaltuhr1_ECO_Ausschaltzeit1';
on({id: idButton}, function () {
const einschaltzeitValue = getState(idEinschaltzeit).val;
const ausschaltzeitValue = getState(idAusschaltzeit).val;
if (isValidTime(einschaltzeitValue) && isValidTime(ausschaltzeitValue) && ausschaltzeitIsLater(ausschaltzeitValue, einschaltzeitValue)) {
const bcdEinschaltzeit = toBCD(einschaltzeitValue);
const bcdAusschaltzeit = toBCD(ausschaltzeitValue);
setState(idEinschaltzeitInput, bcdEinschaltzeit);
setState(idAusschaltzeitInput, bcdAusschaltzeit);
setState(idS7Einschaltzeit, bcdEinschaltzeit);
setState(idS7Ausschaltzeit, bcdAusschaltzeit);
} else {
console.warn('Ungültiges Eingabeformat für Uhrzeit oder Ausschaltzeit ist nicht größer als Einschaltzeit.');
}
});
function toBCD(value) {
const hours = Math.floor(value / 100); // Stunden extrahieren
const minutes = value % 100; // Minuten extrahieren
const bcdHours = decToBCD(hours); // Stunden in BCD konvertieren
const bcdMinutes = decToBCD(minutes); // Minuten in BCD konvertieren
// Kombiniere die BCD-Werte für Stunden und Minuten
const bcdTime = (bcdHours << 8) | bcdMinutes;
return bcdTime;
}
function decToBCD(dec) {
return ((dec / 10) << 4) | (dec % 10);
}
function isValidTime(time) {
return /^\d{4}$/.test(time);
}
function ausschaltzeitIsLater(ausschaltzeit, einschaltzeit) {
return parseInt(ausschaltzeit) > parseInt(einschaltzeit);
}
Die Datenübertragung funktioniert jetzt endlich, wie sie soll.
ScreenRecord_Vis2->SiemensLOGO!
Ich bräuchte nur noch einen Tipp bzw. Hilfe, weshalb folgende Warnungen andauernd erscheinen: