Announcement

Collapse
No announcement yet.

PHP->COM - Problem mit Datumsübergabe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PHP->COM - Problem mit Datumsübergabe

    Hallo zusammen,

    ich habe ein Problem mit der COM-Schnittstelle unter Windows. Zuerstmal die Eckdaten:

    Betriebssystem: Windows 2000 Version 5.00.2195
    PHP-Version: PHP 5.22
    Testumgebung: Windows-Shell

    Es geht um die Verbindung zu einer Datenbank mit hochkomprimierten Prozessdaten. Der Hersteller stellt hierzu ein SDK zur Verfügung, auf das man mittels COM zugreifen kann. Das SDK ansich scheint gut durchdacht und vollständig OO zu sein.

    Hier meine Versuche:

    Zuerst mein PHP-Code:
    PHP Code:
    1  <?php
    2  
    try{
    3      $comObjPi = new COM('PISDK.PISDK');
    4      $server $comObjPi->Servers->Item("123.123.123.123");
    5      $server->Open("123.123.123.123;UID=foo;pwd=bar");
    6  
    7      $point 
    $server->PIPoints("SINUSOID");
    8  
    9      
    echo "\n".$point->Data->SnapShot()->Value."\n";
    10     echo "\n".$point->Data->SnapShot()->TimeStamp."\n";
    11 
    12     com_load_typelib
    ('PISDK.PISDK');
    13 
    14     
    echo "\nVersuch 1:\n";
    15     try{
    16         $value $point->Data->ArcValue(new Variant(mktime(), VT_R8), rtBefore);
    17     }
    18     catch(Exception $e){
    19         print("\nException Versuch 1 ".$e->getMessage()." TraceString: ".$e->getTraceAsString());
    20     }
    21 
    22     
    echo "\nVersuch 2:\n";
    23     try{
    24         $value $point->Data->ArcValue(variant_date_from_timestamp(mktime()), rtBefore);
    25     }
    26     catch(Exception $e){
    27         print("\nException Versuch 2 ".$e->getMessage()." TraceString: ".$e->getTraceAsString());
    28     }
    29 }
    30 catch(Exception $e){
    31     print($e->getMessage()." \nTraceString: ".$e->getTraceAsString());
    32 }
    33 $server->Close();
    34 ?>
    Und nun die Ausgabe:
    Code:
    C:\php_pi>php.exe pitest.php
    
    28.789796829224
    
    1192352988
    
    Versuch 1:
    
    Exception Versuch 1 Parameter 0: Typkonflikt.
     TraceString: #0 C:\php_pi\pitest.php(16): variant->ArcValue(Object(variant), 6)
    
    #1 {main}
    Versuch 2:
    
    Exception Versuch 2 Parameter 0: Typkonflikt.
     TraceString: #0 C:\php_pi\pitest.php(24): variant->ArcValue(Object(variant), 6)
    
    #1 {main}
    C:\php_pi>
    Wie man sieht, Funktioniert die Verbindung an sich wunderbar. Zeile 9+10 geben den so genannten SnapShot aus - den letzten Wert, der über Messstellen an die Datenbank übermittelt wurde. Somit ist auch klar, dass der Verbindungsaufbau zur DLL in Zeile 3, das Holen des gewünschten Servers und Verbinden mit ihm in Zeile 4+5 sowie das Verbinden mit dem Datenpunkt in Zeile 7 jeweils erfolgreich war. Kurz zu den Datenpunkten: "Sinusoid" ist der Name - hier ein Testpunkt; Datenpunkte halten Datensätze hochkomprimiert über Jahrzehnte persistent in einer Datenbank. Jeder Datensatz enthält ein Datum (microsekundengenau) und einen zugehörigen Wert. Jeder Punkt kann von wenigen Daten pro Woche bis hin zu Millionen Daten pro Tag enthalten.

    Der Zugriff in Zeile 16 und 24 schlägt leider fehl. Hier versuche ich mir einen Wert aus dem Archiv zu holen. Da die Werte auf microsekunden-Ebene hinterlegt wurden, wurde der Zugriff etwas vereinfacht: Man übergibt ein - aus sicht des Systems - ungenaues, menschliches Datum :-) und sagt ob man den Wert dirket davor oder direkt danach haben möchte. Die Konstanten (z.B. "rtBefore") lade ich erfolgreich in Zeile 12. WIe man in er AUsgabe sieht, entspricht "rtBefore" einem Int 6.
    Das Datum stellt das erste Parameter für die Funktin "ArcValue" dar. Laut Herstellerdoku kann man so ziehmlich jeden Variant übergeben. Z. B. VT_DATE, oder als Int mit VT_R8. Die Liste umfasst locker 10 Varianttypen. Was mich nun Wundert ist dass der Versuch fehlschlägt.
    Weiterhin habe ich getestet, welchen Typ der Timestamp vom "Snapshot" trägt. Dieser wird als VT_DISPATCH zurückgegeben. Im Netz habe ich nun jedoch gelesen, dass PHP so ziehmlich jeden Rückgabewert der COM-Schnittstelle als VT_Dispatch behandelt.

    Könnte hier vielleicht mein Problem liegen? Ich bin zumindest ziehmlich ratlos.

    Der Vollständigkeit halber ein Codebeispiel in VB - der einzigen "Sprache" in der es Herstellerbeispiele gibt:
    Code:
    Imports pisdk
    Public Class Form1
    
        Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
            Dim MySdk As New PISDK.PISDK
            Dim pt As PIPoint
            Dim v As PIValues
            pt = MySdk.Servers.DefaultServer.PIPoints("sinusoid")
            v = pt.Data.PlotValues("1-Jan-07", "*", 1000)
    
            MsgBox(v.Count & " Elements")
    
        End Sub
    End Class
    Die Funktion "PlotValues" arbeitet ähnlich, man muss halt nur ein von und ein bis-Datum angegeben. "*" steht für das heutige Datum. Leider klappt diese Funktion auch nicht über PHP. Zumindest kommt der gleiche Fehler. Als VB Code läuft dieses Snipplet.

    Ich denke, das Problem liegt generell and er Übergabe des Datums. Hatte irgendjemand schon einmal Probleme mit Datumsübergaben bei anderen SDKs? Oder hat vielleicht jemand einen Tipp oder eine grobe Richtung für mich?

    Gruß BlackSavior
Working...
X