SOAP Schnittstelle ansprechen (VB.Net)

Hab mittlerweile ne recht umfangreiche Testumgebung und kann bisher paresys Aussage soweit bestätigen.

Toni

Ja, ihr habt Recht. War mein Fehler; hatte mir mal zum Testen ID´s per Hand angelegt und nicht an den Wertebereich gedacht. Mein Fehler… :frowning:

Ist übrigens Klasse, die SOAP-Schnittstelle. Alles was man will/braucht, ist verfügbar - Klasse! :smiley:

Könnte bitte irgendjemand mal ein LCN-Beispiel (meinetwegen Lampe ein/aus) als Vb2005 Code posten?
Das mit dem Einbinden von Webservice-Verweisen habe ich zwar geschnallt (wobei ich mir allerdings nicht sicher bin, welche Verweise ich überhaupt brauche), mir fehlt jedoch das Verständnis was ich alles in VB codieren muss und was im IPS (oder mache ich in der eigenen VB Applikation schlichtweg alles - was 'ne jede Menge Tipparbeit bedeutet)?
My.WebServices.IIPSLCNUnitservice.SwitchMode(1) reicht jedenfalls nicht hinter einem button aus, um damit das Licht auf- oder abzudrehen.
Kann mir bitte jemand sagen was alles fehlt? :confused:

danke
lg
Chri

Du hast ganz sicher TIDHeader vergessen. Ne Fehlermeldung würde ansonsten auch helfen :wink:

paresy

stimmt, die wäre vermutlich hilfreich :wink:
sorry!

folgender Code (ein button der eine Lampe schalten soll, einfacher geht’s ja wirklich nicht):


[i]Imports System.Threading
Imports WindowsApplication1.LCN_UnitVerweis
Imports WindowsApplication1.LCN_ModulVerweis


Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim TID As New LCN_ModulVerweis.TIDHeader
        Dim SCHALTER As New IIPSLCNUnitservice

        TID.ID = 16660
        SCHALTER.SwitchMode(1)

    End Sub
End Class[/i]

erzeugt den error:

No class registered for invokable interface IIPSLCNUnit
für Zeile SCHALTER.SwitchMode(1)

Ich weiß leider nicht was damit gemeint sein könnte.
Bitte um Hilfe und Verständnis für jemanden der gerade von VB6 auf VB2005 umzusteigen versucht.
Danke!
lg
Chri

wenn du den header auch noch zuweist, sollte es klappen:

[i]SCHALTER.TIDHeaderValue = TID

paresy
[/i]

Das Leben kann so einfach sein…
Danke!!!

Ich befürchte allerdings für dich, dass das nicht die letzte Frage war…:o
by the way: meine nächste übung wäre ein slider (zum dimmen), gibt’s dazu tipps wie ich das am besten angehe ?

lg
Chri

Also das mit dem TrackBar-Control ging erstaunlich einfach (SLIDER_1.SetIntensity(TrackBar1.Value, 0)), die Verzögerung zwischen Betätigen des Sliders und Erreichen des tatsächlichen Lichtwertes ist allerdings relativ hoch. Ich vermute das ist systembedingt so.

Was ich noch suche, ist eine Möglichkeit den Helligkeitswert eines LCN-Ausgangs mit VB.net auszulesen. Ich vermute eine „GetValue“-Methode, aber die finde ich leider nicht. Welche wdsl brauche ich da und gibts vielleicht ein code-snippet dazu?

danke!
Chri

IIPSVariableManager.GetVariable

paresy

Nach wieder ein mal viel zu langer Pause bin ich auch mal wieder dazu gekommen mit mit IPS zu beschäftigen. Hatte schon vor längerem mal angefangen mit c# und SOAP zu experimentieren. Hab mir einen Mini-Wrapper geschrieben und bin dabei jetzt auf folgendes Phänomen gestoßen, evt. kann es ja irgendwer nachvollziehen.

Erster einfacher Versuch war es alle Instanzen (ID und Name) von angelegten FHTs herauszufinden.
Auf meinem „produktiven“ System wo IPS schon fleißig alles steuert klappt die Ausgabe auch wunderbar.
Wenn ich das gleiche allerdings lokal auf einer leeren Installation von IPS ausführe erhalte ich
49999 - Event Handler
32445 - RRDTool
als Ausgabe.

Hier mal das kurze Snippet (IPS.IPSKernel ist mein Mini-Wrapper)

            IPS.IPSKernel k = new IPS.IPSKernel("battlestar", 3773);
            IPS.IIPSObjectManager.TIPSObject ipsO;

            foreach (IPS.IIPSInstanceManager.TIPSInstance inst in k.InstanceManager.GetInstances(k.InstanceManager.GetInstancesByModuleID("{A89F8DFA-A439-4BF1-B7CB-43D047208DDD}")))
            {
                ipsO = k.ObjectManager.GetObject(inst.InstanceID);
                textBox1.AppendText(inst.InstanceID + " - " + ipsO.ObjectName + "
");
            }

Das ist auch so gewollt.

Wenn du GetInstances() mit einem leeren Array abfragst (was ja der Fall ist, wenn GetInstancesByModuleID() keine Instanzen findet), dann gibt es dir alle vorhandenen Instanzen zurück. Das ist so gelöst, um bei einer Abfrage aller Instanzen einen Request zu sparen. Für dich bedeutet das lokal den Rückgabewert vorher zu prüfen.

paresy

Danke für die Erklärung, jetzt ist erst mal alles klar :wink:

Hi,

ich bin momentan dabei den COM Port mit der SOAP Schnittstelle anzusprechen.

Funktioniert soweit ganz gut ich habe nur ein paar Schwierigkeiten mit den Steuerbefehlen. Ich sende via C# den Befehl N5 und Anschliessend das Steuerzeichen CR und LF. Hier mal ein kurzer Ausschnitt Code:

SerialPort.IIPSSerialPortservice comport = new SerialPort.IIPSSerialPortservice();
            comport.TIDHeaderValue = new SerialPort.TIDHeader();
            comport.TIDHeaderValue.ID = 30814;

comport.SendText("N5
");

Der Debuger vom Serial Port zeigt allerdings nur folgendes an:

26.03.2009 10:24:40.00 |          TRANSMITTED | 4E 35 0A 
26.03.2009 10:24:40.00 |             RECEIVED | 6F B5 EB 

Scheint als würde der CR Befehl gar nicht ankommen, vielleicht seh ich jedoch irgendetwas falsch. Hat jemand vielleicht eine Idee?

viele Grüße
Sirko

damit habe ich es nicht geschafft den Wert anzuzeigen, aber dafür mit „ReadVariableInteger“.
Ist das verkehrt?

Ne. Ist auch eine gute Lösung :slight_smile:

paresy

@sirko:

Das liegt daran, dass beim Verpacken der SOAP Nachrichten in XML die CRLF’s in LF’s umgewandelt werden, wie es die XML Spezifikation vorschreibt. Das ist kein Bug von IPS, sondern einfach eine Limitation/Spezifikation von SOAP/XML.

Warum nutzt du nicht einfach ein PHP Skript in IPS und verschickst den Code mit der Funktion COMPort_SendText? Das ist wesentlich performanter und über Register Variable + Cutter Module kannst du sogar bequem auf die Rückgabe reagieren.
(Ich schreibe meine Module auch meisten erstmal als Test-Demo in PHP, bevor ich dann ein Delphi Modul daraus mache)

paresy

PS: Deinen Bugreport habe ich entsprechend gelöscht.

ah okey, sorry das wusste ich nicht.
hab das schonmal am freitag mit php script als alternativ lösung eingebaut. allerdings schreib ich da meinen com befehl als string in eine variable von ips. mit soap starte ich dann nur noch ein script welches COMPort_SendText mit dem inhalt der variablen ausführt. oder ist das keine gute lösung?

das mit den rückgabewerten werd ich dann auch mal versuchen zu implementieren.

hab mal ein paar webservices eingebunden bei c#. kann es sein, dass es bei einigen fehler gibt? ist mir bei ModuleLoader und File aufgefallen… und UDPSocket war irgendwie nicht vorhanden. Hatte einige nur mal zum test reingeladen und mich gewundert aber vielleicht ist das ja absicht.

viel Grüße

Sirko

Hallo alle zusammen,

nur zur Info:

Die MessageID bei Variablenänderung hat sich geändert.
Die liegt jetzt bei 10603.

Hier alle MessageID’s

Bitte direkt im SDK nachschauen. Dann ist es immer aktuell.

Ab welcher Version hat sich das denn geändert? Die 2.4 läuft hier schon ne Weile, ohne dass meine externen Programme gemeckert haben.

Also zur 2.1 war das schon so :wink:

paresy