Ich tue mir mit den Begriffen etwas schwer, da ich mir das gerade erst erarbeitet hab, aber so wie es auscchaut nutze ich ja auch die Post Methode.
Allerdings verwende ich immer die gleiche AWP Variable (Variablen Datei) für alles (Ich hoffe das ding heißt wirklich so), weil es ja mit mehreren sehr langsam wird. Vor allem wenn es 126 Werte sind, die auf dieser einen Seite eingestellt werden können.
Auf der Webseite
Code:
var StringT = 'x' + ',' + Bereich + ',' + Nr + ',' + Wert_neu + ';'
$.post("Write/Heizung_Werte.htm",'"DB_WWW".Heizung.Empfang_Werte.get_strT=' + (StringT),function(result){});
alert(unescape('Werte an SPS %FCebertragen!'));
Variablen Datei
<!-- AWP_In_Variable Name='"DB_WWW".Heizung.Empfang_Werte.get_strT'-->:="DB_WWW".Heizung.Empfang_Werte.get_strT:
In SPS
Code:
Strg_TO_Chars(Strg := "DB_WWW".Heizung.Empfang_Werte.get_strT,
pChars := 0,
Cnt => "DB_WWW".Heizung.Empfang_Werte.Count_char,
Chars := "DB_WWW".Heizung.Empfang_Werte.Array_getT);
IF "DB_WWW".Heizung.Empfang_Werte.Array_getT[0] = 'x' THEN
//Eingangsstring löschen
"DB_WWW".Heizung.Empfang_Werte.get_strT := '0';
// Diese Werte sind eigentlich im DB fix eingetragen - könnte man sich hier ersparen
"DB_WWW".Heizung.Empfang_Werte.Suchstring := ',';
"DB_WWW".Heizung.Empfang_Werte.Endstring := ';';
"DB_WWW".Heizung.Empfang_Werte.Pos := 2;
"DB_WWW".Heizung.Empfang_Werte.Mode := (16#0000_0010);
"DB_WWW".Heizung.Empfang_Werte.Ret_Val := SPLIT(Mode := "DB_WWW".Heizung.Empfang_Werte.Mode,
RecSeparator := "DB_WWW".Heizung.Empfang_Werte.Suchstring,
EndSeparator := "DB_WWW".Heizung.Empfang_Werte.Endstring,
SrcArray := "DB_WWW".Heizung.Empfang_Werte.Array_getT,
Count => "DB_WWW".Heizung.Empfang_Werte.Count_str,
DstStruct := "DB_WWW".Heizung.Empfang_Werte.Array_getStr,
Position := "DB_WWW".Heizung.Empfang_Werte.Pos);
IF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '0' THEN
"DB_WWW".Heizung.Nr := STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[1]);
"DB_WWW".Heizung.Hand_ein["DB_WWW".Heizung.Nr] := 1;
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '1' THEN
"DB_Heizung".Arrays.P_W[STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[1])] := STRING_TO_REAL("DB_WWW".Heizung.Empfang_Werte.Array_getStr[2]);
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '2' THEN
"DB_Heizung_Prio".Empfang.Hk := STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[1]);
"DB_Heizung_Prio".Empfang.Prio_neu := STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[2]);
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '3' THEN
"DB_Heizung".Arrays.LFZ_PT[STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[1])] := (ULINT_TO_TIME(STRING_TO_ULINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[2])) * 60000);
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '4' THEN
"DB_Heizung".Arrays.OT_Vorgabe[STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[1])] := STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[2]);
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '5' THEN
"DB_Heizung_OT_max".Zykluszeit := STRING_TO_UINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[2]) * 60;
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '6' THEN
"DB_WWW".Heizung.Nr := STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[1]);
"DB_WWW".Heizung.Aktiv_PV_ein["DB_WWW".Heizung.Nr] := 1;
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '7' THEN
"DB_WWW".Heizung.Nr := STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[1]);
"DB_WWW".Heizung.Aktiv_Kalender_ein["DB_WWW".Heizung.Nr] := 1;
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '8' THEN
"DB_WWW".Heizung.Nr := STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[1]);
"DB_WWW".Heizung.Aktiv_Dauer_ein["DB_WWW".Heizung.Nr] := 1;
ELSIF "DB_WWW".Heizung.Empfang_Werte.Array_getStr[0] = '9' THEN // kommt von WWW Wartung!!
"DB_I_max".max_Strom := STRING_TO_USINT("DB_WWW".Heizung.Empfang_Werte.Array_getStr[2]);
END_IF;
END_IF;
Die Werte die nur 0/1 übertragen werden dann noch rückgesetzt, das sie nur als Trigger verwendet werden.
Aber ich werde jetzt trotzdem vorsichtshalber für alle Werte in der SPS eine Plausibilitätsprüfung einbauen. Das ist sowieso kein Fehler.
Ich hab jetzt versucht OB31 mit einer Rate von einer Sekunde für den concat Befehl zu verwenden, aber das hat nix gebracht, so wie es ausschaut.
War das oben mit
"Task mit höchster Priorität laufen zu lassen.." gemeint? (Sorry mein erstes und einziges Haus Hobby Projekt)
Da hier immer der erste Wert fehlt, und der ja auch aus der Kommunikation mit dem Smartmeter (Modbus TCP - Subnet RTU) stammt, werde ich das noch mit anderen Werten die nicht schon beim Einlesen Fehlerhaft sein könnten, versuchen.
Habs ja bei Bitmustern im String die direkt aus der SPS kommen auch schon gesehen.
Das mit dem Temp Variablen werd ich noch versuchen sobald ich gefunden habe wie man das schreibt
. Ganz schön viel zum lesen für das Zeugs.