1. Schritte mit HS485

Hallo ata,

einpaar Scripte findest Du hier.

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.

Viel Spass damit.

Also zu punkt 2:

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).

Hallo Rainer,

habe jetzt das 1. Modul soweit, das es mit dem Schalten funktioniert, aber der Datenempfang haut noch nicht hin.

Im Log kommt folgendes:

16.07.2008 22:02:19.02 | DEBUG | ExecuteThread ID: 204 | Executing Script: HS485_Datenempfang.ips.php ~ Sender: Variable: HS485_Daten, Trigger: OnUpdate
16.07.2008 22:02:19.02 | CUSTOM | HS485_Datenempfang | HS485_Daten: FD FF FF FF FF 18 00 00 20 E0 06 4B 00 00 08 97 76
16.07.2008 22:02:19.02 | DEBUG | ExecuteThread ID: 204 | Execution Result: <br />
<b>Notice</b>: Uninitialized string offset: 17 in <b>C:\Programme\IP-SYMCON\scripts\HS485_Datenempfang.ips.php</b> on line <b>183</b><br />

16.07.2008 22:02:19.02 | DEBUG | ExecuteThread ID: 204 | Executed, Ret: 1, Successful:True

Im Script steht an der Stelle:

  $val += ord($str[$p+$i]);

was in der Funktion steckt:

function String2Value($str, $p, $c) // String, Position, Anzahl Characters
{
$val = 0;
for ($i=0; $i<$c; $i++)
{
  $val <<= 8;
  $val += ord($str[$p+$i]);
}
return $val; // Rückgabe: Zahl
}

Irgendeine Idee?

Gruß
Jens

Hallo Jens,

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.

Gruß
HJH

Hallo HJH,

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.

// Daten aus empfangenem String extrahieren, Zuweisung der einzelnen Bytes
$Startzeichen    = String2Value($daten,0,1);
$KontrollByte    = String2Value($daten,5,1);
$Moduladresse    = String2Value($daten,6,4);
$Moduladresse1   = 8416; //HS485_127IO_1
$Moduladresse2   = 8280; //HS485_127IO_2
$Framelaenge     = String2Value($daten,10,1);
$Frame4          = 4;
$Frame5          = 5;
$Frame6          = 6;
$Datenframe1     = String2Value($daten,11,1);
$KeyEvent        = 75;
$Datenframe2     = String2Value($daten,12,1);
$Datenframe3     = String2Value($daten,13,1);
$Datenframe4     = String2Value($daten,14,1);
$Datenframe5     = String2Value($daten,15,1);
$Datenframe6     = String2Value($daten,16,1);
$Datenframe7     = String2Value($daten,17,1);

Verwendet wird im Script $Datenframe1 + 2 … da habe ich nix angepaßt, obs daran liegt kann ich nicht beurteilen. :frowning:

Jens

Hallo Jens,

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 :wink: (als Kommentar kennzeichnen). Kommentare werden nicht ausgeführt.

Gruß
HJH

Guten Morgen,

danke für den Hinweis, jetzt kommt zumindest keine Fehlermeldung mehr :wink:
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
  

Die if Bedingung wird doch niemals erfüllt …

Gruß
Jens

Hallo Jens,

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.

Jens

Hi Jens,

hier mal die Aufschlüsselung.

6.07.2008 22:02:19.02 | CUSTOM | HS485_Datenempfang | HS485_Daten: FD.FF FF FF FF.18.00 00 20 E0.06.4B.00.00.08.97 76

Startzeichen.Broadcast(4Byte).Kontrollzeichen.Moduladresse(4Byte).Framelänge.Key-Event.Taste.Aktor.Event.Checksumme(2Byte)

Ruf mal an.

Rainer, du bist mein Held ! :smiley:

Danke für deine Geduld :wink:

Hallo Jens,

danke für die Blumen :slight_smile:

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 :wink: Habe mir das auch müssam erarbeitet.

Meinen Beschreibungsfehler habe ich abgeändert.

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 :slight_smile:
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? :wink:

Gruß
Jens

Hallo Jens,

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 :slight_smile:

Das schliessen wir(ich) defenitiv aus :smiley:
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 :confused:

@RWN: Was hat denn so euer Treffen ergeben … neue Erkenntnisse?

Einige. Allerdings noch keine zu einem gemeinsammen Weg

Ich bin mal ganz erhlich. HJH hat hier gefehlt.

Ansonsten frag mal EHB :slight_smile:

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? :confused:

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? :smiley: :wink:

Jens

Hallo Jens,

ich denke mal, um das was ihr hier(wir) alles vorhabt mit HS485, bedarf es eines Profis.

Zumal meine Aktoren einwandfrei funktionieren.

Um es kurz zu machen, man sollte sich mal kurz schliessen.

Ich will nicht auf Nidda rumreiten, da war alles da, bis auf den Profi der hätte eventuell alles klären können.

Also Geduld Jens. Rom ist auch nicht an einem Tag erbaut worden.

Zeig deine Scripte im Zusammenhang, dann kommt auch mehr.

Hallo Jens,

  • 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?

Jens

Hallo Jens,

Um so mehr würde mich ein funktionierendes Script bzw. eine Möglichkeit interessieren, alle Ausgänge auf einmal abzufragen.

Das war aber jetzt mehr als Witz gemeint, oder :rolleyes:

Schieb mal was rein, es schauen viele Köpfe drüber.

Es gibt hier nix fertisches uf hessisch.:mad: