Wie Registervariable und Seriellen Port in Modulen korrekt verwenden?

Hi Nallchan,

ich bin gerade auch an einer seriellen Kommunikation (im ersten Schritt ohne PHP-Modul sondern klassisch ;-)), Senderichtung funktioniert auch gut, beim Empfang habe ich aber das Problem keine Steuerzeichen sondern nur - wie bei Deinem letzten Beitrag - eine Checksumme.

Hast Du denn für den Fall „Ankommende serielle Daten auf Checksumme prüfen“ einen Ansatz oder gar eine Lösung?

Ciao
herbertf

Wie man eine Checksumme berechnet, suche ich mir auch immer zusammen :smiley:
Hier kann man mal eben gegenprüfen welche Variante bei dem Protokoll überhaupt zum Einsatz kommt, entsprechend muss du die dann berechnen.

On-line CRC calculation and free library

Hier mal ein Beispiel das ich irgendwo mal genutzt hatte für die 1 Byte Variante:

$Frame="\x31\xAB\x48\x09\xF3\xDB\xFB"; // letzes Zeichen ist die Checksumme
$checksum = ord($Frame[strlen($Frame) - 1]);
$calcchecksum=0;
//Checksum bilden
for ($x = 0; $x < (strlen($Frame)-1); $x++)
{
	$calcchecksum += ord($Frame[$x]);
}
//Auf Byte begrenzen
$calcchecksum = $calcchecksum & 0xff;
echo 'Checksumme erhalten:'.$checksum.' Hex:' .bin2hex(chr($checksum)).PHP_EOL;
echo 'Checksumme errechnet:'.$calcchecksum.' Hex:' .bin2hex(chr($calcchecksum)).PHP_EOL;
//Checksum OK?
if ($checksum <> $calcchecksum)
	echo 'Falsche Checksumme';
else 
	echo 'Richtige Checksumme'; 

Und hier PHP: crc32 - Manual gibt es auch noch diverse Beispiele.

Michael

Hi,

ich bin jetzt also wesentlich weiter - es funken alle wesentlichen Funktionen. Sind nur noch 2 Baustellen übrig.

Baustelle2: PHP-Modul - da habt ihr noch ein paar Tage bis ich mit Fragen nerve ;-)))

Baustelle1: Ich würde gern ein RAW-Image über die serielle Schnittstelle laden. Wie kann ich denn den HEX-Strom am besten in ein Image für IPS wandeln?

Ciao
Herbertf

Einfach über base64_decode und dann per IPS_SetMediaContent rein in das Medienobjekt. Am besten noch IPS_SetMediaCached — IP-Symcon :: Automatisierungssoftware setzen, damit die SSD geschont wird.

paresy

Hi,

ich bin nun an der Modulentwicklung, ist ja mächtig gewaltig ;-)))

Irritiert bin ich momentan am Punkt „Daten empfangen“ - auch bei meinem „Original“ verzichte ich auf einen Splitter (es kommt eh immer was anderes :-()) - nun wird hier aber im anderen Thread davon berichtet, die Registervariablen werden „umgebaut“- auch finde ich im SDK gar keinen Befehl zum Anlegen einer Registervariablen.
Hat jemand einen Tipp für mich?

Ciao
herbertf

RegisterVariable sind nicht für den Datenempfang in Modulen geeignet.
Schau dir in der SDK-Doku den Abschnitt Datenfluss an.
Michael

Hi Nallchan,

Empfang sieht gut aus ;-)))

Jetzt interessiert mich gerade, wie kann ich denn die COM über das Modul neu starten? Mit dem gleichen Ergebnis wie:

        IPS_SetProperty($COMID,"Open",true);          
        IPS_ApplyChanges($COMID);   

Ist total hilfreich, wenn sich die Schenittstelle mal verschluckt …

Ciao
herbertf

Ja mach doch

und wie ermittle ich elegant die COMID im Modul?

    /**
     * Liefert den Parent der Instanz.
     * 
     * @return int|bool InstanzID des Parent, false wenn kein Parent vorhanden.
     */
    protected function GetParent()
    {
        $instance = IPS_GetInstance($this->InstanceID);
        return ($instance['ConnectionID'] > 0) ? $instance['ConnectionID'] : false;
    }

Michael

Hi,

vielen Dank !!!

Ich habe jetzt bestimmt schon 15 Stunden mich durch die diversen Anleitungen zur Objektorientierten Programmierung gequält und versucht mein Problem zu lösen - scheinbar habe ich ein Brett vorm Kopf.

Wenn ich mit $this->Eigenschaft=„kompliziert“ aus "irgendwelchen Funktionen meiner Klasse einen Wert zuweise funktioniert dies.

Wenn ich aber innerhalb der „IPS-Funktion (innerhalb der gleichen Klasse) ReceiveData($JSONString)“ auch $this->Eigenschaft=„Müll“ tue, wird scheinbar eine andere Eigenschaft gesetzt. Nach meinem Laienhaftenverständnis, wahrscheinlich das Problem, dass ReceiveData($JSONString) von IPS anders aufgerufen wird und somit $this ein anderes ist?

Wir kann ich denn innerhalb von ReceiveData($JSONString) eine Eigenschaft/Variable ändern aus der ich aus dem Rest der Klasse (der IPS-Instanz) zugreifen kann?

Mit einer richtigen IPS-Variable (12345) könnte ich mir natürlich helfen, ich benötige den Wert aber eigentlich nur zur Laufzeit.

Ich geh jetzt Frustlaufen ;-))

Ciao
herbertf

Was du brauchst sind die Buffer. ($this->SetBuffer und GetBuffer).
Auch wenn es jetzt eine PHP-Klasse ist, so bleibt es doch eine Scriptsprache. Das PHP-Objekt welches IPS aus deiner Klasse erzeugt ist nicht persistent und wird nach dem Ausführen der jeweiligen Aktion zerstört und der PHP-Interpreter beendet.

Michael

You made my day! :D:D

Ich hatte gestern abend schon die Idee mit den Buffer, hatte sie aber wieder verworfen :banghead::banghead:

Hi,

ich komme gut voran :smiley: - habe aber nochmal zwei Fragen (und wollte kein neues Thema erstellen):

  1. Wenn ich im Formular eine Checkbox anlege:
{ "type": "CheckBox", "name": "dername", "caption": "Beschreibung im Formular" },
  • wie komme ich denn an diese Variable/Eigenschaft heran?
  1. Wahrscheinlich etwas schwieriger ? :banghead: ??? Im Status kann ich ja nur die Zustände der Instanz abbilden. Ich würde aber gern einen Text, analog einem LOG aktualisieren lassen? Geht dies überhaupt? Ist das eine blöde Frage oder ein Featurewunsch :smiley: ?

… muss jetzt Essen für Sonntag kochen :p:D

Ciao

Herbertf

Zu 1:
ReadPropertyBoolean — IP-Symcon :: Automatisierungssoftware
Aber vorher im Create auch erzeugen mit
RegisterPropertyBoolean — IP-Symcon :: Automatisierungssoftware

Zu 2:
Ich verstehe die Frage nicht :slight_smile:
Konfigurationsfehler kannst du über die Code ab 200 und aufwärts selbst definieren oder was meinst du?
Michael

Ich würde halt gern im Fenster(Formular) Rückmeldungen (z.B. von Funktionen ausgeben z.B. Bei einer Ablaufsteuerung: Jetzt in Schritt1 … Jetzt in Schritt2 …) - hat mit Stati der Instanz nix zu tun.

Dafür gibt es SendDebug — IP-Symcon :: Automatisierungssoftware
Michael