Mit dem HS485 PC-Interface hast Du die Anbindung nach IPS und auch für die Software von El* an den Rechner.
Sieh zu das du die aktuelle Firmware auf den Modulen hast. Das ganze kann autark wie auch in Kombination mit IPS laufen, je nach belieben.
Unter IPS musst Du einen Comport und eine Registervariable anlegen, mehr nicht.
Ich habe es so gelöst, dass ich die Grundfunktionalität zuerst über die beiliegende EL*- Software in die Module Programmiert habe. Also welcher AUsgang mit welchem Eingang verknüpft ist, welche Funktion da hinterlegt ist.
Über meinen Hausserver mache ich dann die ganzen Komfortfunktionen (Zeitsteuerungen, Abhängigkeiten von anderen Sensore etc.). Außerdem läuft die Visualisierung darüber.
Damit ist gewährleistet, das wenn der Server mal ausfällt, das die Grundfunktionen immer noch gehen (z.B. licht AN/AUS über die Schalter, Rolläden AUF/ZU).
die Funktion „String2Value“ bewirkt fogendes:
Sie extrahiert aus dem String $str ab der Position $p die Anzahl $c Bytes und setzt diese zu einer Integer-Zahl zusammen.
Laut Log-File hat der Datenstring 17 Zeichen und bietet somit die Positionen 0…16.
Die Fehlermeldung besagt nun, dass ein Zugriff auf die Position (offset) 17 stattgefunden hat. Diese existiert natürlich nicht.
Du solltest also den Funktionsaufruf noch einmal überprüfen.
erst einmal danke für deine Antwort. Leider stehe ich da etwas aufm Schlauch, so das ich nicht genau weiß wo ich suchen soll bzw. welcher Funktionsaufruf das Problem auslösen könnte.
Ich habe die Zuweisung aus dem Script hier ausm Forum kopiert und nur meine Moduladresse eingetragen und die Moduladresse im Script angepaßt.
zur Berechnung von $Datenframe7 wird ganz offensichtlich auf die Position 17 zugegriffen.
Du erwartest etwas zu viel von Deinem Skript :D. Es genügt nicht, dass DU weißt, dass nur die Datenframes 1 und 2 benötigt werden. Genauso wichtig ist es, dass auch Dein Skript es weiß.
Dein Skript besagt eindeutig, dass dieser Wert berechnet werden soll. Der Befehl steht drin, also wird er auch ausgeführt.
Du solltest daher alle nicht benötigten Zeilen und Aufrufe mit „//“ auskommentieren (als Kommentar kennzeichnen). Kommentare werden nicht ausgeführt.
danke für den Hinweis, jetzt kommt zumindest keine Fehlermeldung mehr
Wofür die anderen Zuweisungen sind weiß ich zwar noch nicht, aber das kommt hoffentlich noch. Habe erst mal alle bis auf 1+2 auskommentiert.
Aber nun kommt das nächste Problem …
Ich empfange die Daten bei Datenverkehr am Comport, die werden dann in $HS485_Daten geschrieben und dann greift das Script mit on_update.
Dann werden die empfangenen Daten zerlegt und zugewiesen, siehe oben …
Dann sollte hier
// Rückmeldung Schaltzustand der Aktoren
$Schaltzustand = $Startzeichen.$Moduladresse.$Frame4.$Datenframe1.$Datenframe2;
echo $Schaltzustand;
if ($Schaltzustand == $Startzeichen.$Moduladresse1.$Frame4.$HS485_127IO_A1.$Aus)
{
SetValueBoolean("HS485_Aktor1", false);
}
if ($Schaltzustand == $Startzeichen.$Moduladresse1.$Frame4.$HS485_127IO_A1.$Ein)
{
SetValueBoolean("HS485_Aktor1", true);
}
der Schaltzustand abgefragt werden.
Ich gehe doch recht in der Annahme, das die Werte die oben zugewiesen worden sind einfach aneinandergehängt werden!?
Das müßte in meinem Fall sein: 253.8416.4.208.64 (ohne Punkte), … stimmt auch so (echo $Schaltzustand).
Die if-Abfrage möchte aber als Ergebnis haben: 253.8416.4.12.0 oder .1 , das heißt das paßt nie zusammen !?
Genau da gleiche dann hier:
// Abfrage des Schaltzustandes HS485_S nach Taster/Schalterbetätigung
$SchaltzustandModul = $Startzeichen.$Moduladresse.$Frame6.$Datenframe1.$Datenframe2;
echo $SchaltzustandModul;
if ($SchaltzustandModul == $Startzeichen.$Moduladresse1.$Frame6.$KeyEvent.$HS485_127IO_A1)
{
$S1 = "\xFD\x00\x00\x20\xE0\x98\x00\x00\x00\x00\x04\x53\x0C"; //
$ZHS485_S_A1 = $S1;
$CRC16 = GetCRC16 ($ZHS485_S_A1."\x00\x00"); // Checksumme berechnen
$CRC16str = chr($CRC16>>8). chr($CRC16&0xff); // Hi-Lo-Byte der Checksumme extrahieren
$S_A1 = $ZHS485_S_A1.$CRC16str; // Checksumme an Datenframe übergeben
COMPort_SendText($ComID, $S_A1); // Datenframe über Comport senden
Ich hatte Dir ja gestern Abend gesagt, das Du ohne das Protokoll zu lesen nicht sehr weit kommst. Dann versteht man zumindest einigermaßen was er sendet.
Er sendet dir auch keinen Schaltzustand, deswegen musst Du diese abrufen.
Na ja, aber das abrufen sollte doch eigentlich hier passieren, oder nicht?
// Abfrage des Schaltzustandes HS485_S nach Taster/Schalterbetätigung
$SchaltzustandModul = $Startzeichen.$Moduladresse.$Frame6.$Datenframe1.$Datenframe2;
echo $SchaltzustandModul;
if ($SchaltzustandModul == $Startzeichen.$Moduladresse1.$Frame6.$KeyEvent.$HS485_127IO_A1)
{
$S1 = "\xFD\x00\x00\x20\xE0\x98\x00\x00\x00\x00\x04\x53\x0C"; //
$ZHS485_S_A1 = $S1;
$CRC16 = GetCRC16 ($ZHS485_S_A1."\x00\x00"); // Checksumme berechnen
$CRC16str = chr($CRC16>>8). chr($CRC16&0xff); // Hi-Lo-Byte der Checksumme extrahieren
$S_A1 = $ZHS485_S_A1.$CRC16str; // Checksumme an Datenframe übergeben
COMPort_SendText($ComID, $S_A1); // Datenframe über Comport senden
Damit die if Bedingung aber funktioniert, also das Abrufen das Schaltzustands auch klappt, muss doch die Bedingung passen … und das tut es so niemals. Ich blicke da aber auch noch nicht den Zusammenhang, so das ich daraus etwas erkennen könnte. Davon mal abgesehen ist in der Protokollbeschreibung von ELV das 127IO Modul auch noch gar nicht erwähnt.
Ich versuche schon den halben Nachmittag daran herumzubasteln, was aber eher nur ein ausprobieren ist, da mir das Verständnis für diese Dinge leider fehlt … ohne Denkanstoß komm ich da im Moment nicht weiter … vielleicht sehe ich auch nur den Wald vor lauter Bäumen nicht.
Zeigt aber auch deine Stärke, wie von mir immer wieder bemängelt, ohne Feedback tut sich nichts.
Einfach fragen wenn man etwas nicht versteht. Allerdings sollte man das(die)Scripte nicht aus dem Inhalt reissen, denn so können doch einige Profis hierzu mehr sagen wenn sie das Script sehen. Ich bin keiner Habe mir das auch müssam erarbeitet.
So, nachdem ich jetzt die Daten auf dem Bus ein wenig beobachtet habe, kann ich mittlerweile die Betätigung der Eingänge erfassen und auswerten
Allerdings habe ich hin und wieder das Problem, das die Variable nicht aktualisiert wird … ich bin mir noch nicht sicher ob das Problem daran liegt das das Modul nix sendet oder das die Daten nicht ausgewertet werden … kann das evtl. mit dieser CRC Berechnung zusammen hängen, können da noch Fehler vorkommen?
Das Modul schaltet den Ausgang nämlich definitiv ein bzw. aus … nur bekommt IPS scheinbar den Vorgang nicht mit …
Dann würde mich interessieren, wie man eine Abfrage beim Start von IPS löst … ich habe versucht die if-Abfragen alle raus zu nehmen, aber scheinbar sind das dann zu viele Abfragen in zu kurzen Abständen. Hat so ein Script schon jemand gebastelt?
Und noch eine Sache … wenn ich einen Eingang als Schalter deklariere, aber einen Taster dort anschließe, dann kann ich den zugehörigen Ausgang durch kurze Betätigung des Tasters ja tasten … wie realisiere ich dieses Tasten des Ausgangs in IPS, also nur kurzzeitiges einschalten <1sec … oder geht es dann nur mit dem Einstellen des Ausgangs per Timer im Modul? Alternative wäre den Timer direkt per Script ansprechen (geht das?) oder muss ich ein SetScriptTimer verwenden?
@RWN: Was hat denn so euer Treffen ergeben … neue Erkenntnisse?
kann das evtl. mit dieser CRC Berechnung zusammen hängen, können da noch Fehler vorkommen?
Uiiiii lass das mal den Hans-Jörg nicht lesen
Das schliessen wir(ich) defenitiv aus Nein
Das Modul schaltet den Ausgang nämlich definitiv ein bzw. aus … nur bekommt IPS scheinbar den Vorgang nicht mit …
Dann würde mich interessieren, wie man eine Abfrage beim Start von IPS löst … ich habe versucht die if-Abfragen alle raus zu nehmen, aber scheinbar sind das dann zu viele Abfragen in zu kurzen Abständen. Hat so ein Script schon jemand gebastelt?
Wärste mal in Nidda gewesen
@RWN: Was hat denn so euer Treffen ergeben … neue Erkenntnisse?
Einige. Allerdings noch keine zu einem gemeinsammen Weg
Das mit der CRC Berechnung hatte ich nur angeführt, da du irgendwo eine neue Version vorgestellt hattest … die habe ich natürlich noch nicht verwendet, sondern noch die aus dem Script hier im Forum, aber wenn es daran nicht liegt, woran könnte es dann liegen?
Ich wäre sehr gern zu dem Treffen gekommen, nur hatten wir gestern Einweihungsparty bei uns … wäre etwas blöd gewesen als Gastgeber nicht anwesend zu sein, gell?
Die CRC-Prüfung ist OK --> läuft bei mir Fehlerfrei!
Das Modul schaltet den Ausgang nämlich definitiv ein bzw. aus … nur bekommt IPS scheinbar den Vorgang nicht mit …
Tja - dazu bräuchte man mehr Info’s.
Prinzipiell kann das nur am Empfangsscript liegen.
Hast Du Logdateien, um nachzuprüfen, ob alle Frames von deinem Script auch verarbeitet werden?
Dass Frames nicht empfangen werden, habe ich bis jetzt noch nicht festgestellt. Dafür geht bei mir ab und zu mal ein Sendebefehl am HS485-Bus „verloren“.
Ok, werde das morgen mal versuchen nachzustellen und dann schauen wie die Logs aussehen … Es geht ein Sendebefehl verloren :eek:… hmpf, ok … das könnte es natürlich auch sein. Um so mehr würde mich ein funktionierendes Script bzw. eine Möglichkeit interessieren, alle Ausgänge auf einmal abzufragen.
Dann würde mich interessieren, wie man eine Abfrage beim Start von IPS löst … ich habe versucht die if-Abfragen alle raus zu nehmen, aber scheinbar sind das dann zu viele Abfragen in zu kurzen Abständen. Hat so ein Script schon jemand gebastelt?
Und noch eine Sache … wenn ich einen Eingang als Schalter deklariere, aber einen Taster dort anschließe, dann kann ich den zugehörigen Ausgang durch kurze Betätigung des Tasters ja tasten … wie realisiere ich dieses Tasten des Ausgangs in IPS, also nur kurzzeitiges einschalten <1sec … oder geht es dann nur mit dem Einstellen des Ausgangs per Timer im Modul? Alternative wäre den Timer direkt per Script ansprechen (geht das?) oder muss ich ein SetScriptTimer verwenden?