LPT1 Port steuern

Hallo zusammen,

bin neu in der Welt von IP Symcon und hab da eine brennende Frage.

Am Rechner ist eine Relaiskarte von pollin.de ueber den LPT1 angeschlossen, gerne wuerde ich die Karte ueber IP Symcon nutzen, doch leider weiss ich ned wie ich den Script schreibe.

Gerne wuerde ich die 8 Relais einzeln, zeitgesteuert ein und ausschalten.
Kann mir da einer behilflich sein.

Ich danke im Voraus

MfG Mario

Danke fuer den Link

  • Inpout32.dll wurde in den Systemordner kopiert
  • extension_dir = "C:\IP-Symcon\ext
  • extension = SetParPort.dll
    in den Ordner erstellt.

Doch leider verstehe ich es noch ned mit dem php. Bin Neuling. Kann mir da einer behilflich sein

Die Relaiskarte kann ich ueber den Webbrowser ansprechen und steuern.

folgen Code wird verwendet:

# URL des Perlscripts
my $script_url = "http://xxx.xxx.xxx:80/cgi-bin/relais/relais.pl";

# URL des HTML-Verzeichnis (ohne Schraegstrich am Ende)
my $noncgi_dir = ".";

# Portadresse (LTP1 => 0x378 / LTP2 => 0x278)
my $port = 0x378;

# Schalter/Tasten-Modus (0 = Schaltermodus, 1 = Tastenmodus)
my $mode = "0";

# Automatische Aktualisierung (0 = aus, 1 oder groesser = Refresh-Intervall in Sekunden)
my $refresh = "15";

# Name der Seite
my $page_name = "Relaiskarten-Steuerung" ;

# Name des Statusfeldes
my $status_name = "Status der Relais";

# Statusfeld anzeigen (0 = Anzeige aus, 1 = Anzeige ein)
my $status_view = "1";

# Namen der Schalter
my @switch_name = ("Schalter 1","Schalter 2","Schalter 3","Schalter 4","Schalter 5","Schalter 6","Schalter 7","Schalter 8");

# Schalter anzeigen (0 = Anzeige aus, 1 = Anzeige ein)
my @switch_view = ("1","1","1","1","1","1","1","1");

# Name des Feldes zum Schalten aller Relais
my $all_name = "Alle Relais";

# Feld "Alle Relais" anzeigen (0 = Anzeige aus, 1 = Anzeige ein)
my $all_view = "1";

# Name des Eingangsfeldes
my $input_name = "Status der Eingnge";

# Eingangsfeld anzeigen (0 = Anzeige aus, 1 = Anzeige ein)
my $input_view = "0";

# Namen der LEDs (n/a = ohne Funktion nicht aendern)
my @led_name = ("n/a","n/a","n/a","Pin 15","Pin 13","Pin 12","Pin 10","Pin 11");

# LEDs anzeigen (n/a = ohne Funktion nicht aendern, 0 = Anzeige aus, 1 = Anzeige ein)
my @led_view = ("n/a","n/a","n/a","1","1","1","1","1");

##############################################################################

use strict;

use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);

use Win32::API;                                                         # load API module to interface DLL's 
my $GetPortVal = new Win32::API("inpout32", "Inp32", ['I'], 'I');       # import Inp32 from DLL 
my $SetPortVal = new Win32::API("inpout32", "Out32", ['I','I'], 'I');   # import Out32 from DLL

my @status;

$port = $port + 2;
readPort();
$status[5] = "0";   # Bidirektional aus
writePort();
$port = $port - 2;

if($mode > 0) { setLow(); }
readPort();

if($cgi->param()) {
   checkForm();
   writePort();
   if($mode > 0) {
      sleep($mode);
      setLow();
      readPort();
   }
}

printHeader();
if ($status_view > 0) { printStatus(); }
if ($all_view > 0) { printAll(); }
if ($input_view > 0) {
   $port = $port + 1;
   readPort();
   printInput();
}
printRefresh();
printFooter();

##############################################################################

# Port auslesen und Bitstatus setzen
sub readPort {
   my $wert = $GetPortVal->Call($port) & 255;
   for(my $i = 7; $i >= 0; $i--) {
      $status[$i] = int($wert / (2 ** ($i)));
      $wert = $wert % (2 ** ($i));
   }
}

# Formulardaten auswerten und neuen Bitstatus setzen
sub checkForm {
   my $a = $cgi->param("A");
   if($a eq "Einschalten") {
      for(my $i = 0; $i <= 7; $i++) {
         $status[$i] = 1;
      }
   }
   elsif($a eq "Ausschalten") {
      for(my $i = 0; $i <= 7; $i++) {
         $status[$i] = 0;
      }
   }
   for(my $i = 0; $i <= 7; $i++) {
      my $s = $cgi->param("S$i");
      if($s ne "") {
         my $r = $cgi->param("R$i");
         if($r == 0) {
            $status[$i] = 1;
         }
         elsif($r == 1) {
            $status[$i] = 0;
         }
      }
   }
}

# Bitstatus auf Port schreiben
sub writePort {
   my $wert = 0;
   for(my $i = 0; $i <= 7; $i++) {
      $wert += $status[$i] * (2 ** ($i));
   }
   my $return = $SetPortVal->Call($port,$wert);
}

# Bytestatus 0 auf Port schreiben
sub setLow {
   my $wert = 0;
   my $return = $SetPortVal->Call($port,$wert);
}

# Ausgabe im Browser
sub printHeader {
   print "Content-type: text/html

";
   print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
";
   print "<html>
";
   print "<head>
";
   if($refresh > 0) { print "<meta http-equiv=\"refresh\" content=\"$refresh; URL=$script_url\">
"; }
   print "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-1\">
";
   print "<link rel=\"stylesheet\" type=\"text/css\" href=\"$noncgi_dir/format.css\">
";
   print "<title>$page_name</title>
";
   print "</head>
";
   print "<body>
";
   print "<p><big>$page_name</big></p>
";
   print "<form name=\"Relais\" action=\"$script_url\" method=\"post\">
";
}

sub printFooter {
   print "</form>
";
   print "<p><small>Relais-Steuerung<br>&copy\; 2009-2010 ANOuBIS </small></p>
";
   print "</body>
";
   print "</html>
";
}

sub printStatus {
   print "<fieldset><legend>$status_name</legend>
";
   print "<table><tr>
";
   for(my $i = 0; $i <= 7; $i++) {
      if($switch_view[$i] > 0) {
         if($status[$i] == 1) {
            print "<td>
";
            if($mode == 0) { print "<img src=\"$noncgi_dir/led_ein.gif\" alt=\"\"><br>
"; }
            print "<input type=\"hidden\" name=\"R$i\" value=\"1\">
";
            if($switch_name[$i] eq "") {
               $switch_name[$i] = "Schalter " . ($i + 1);
            }
            print "<input type=\"submit\" name=\"S$i\" value=\"$switch_name[$i]\">
";
            print "</td>
";
         }
         elsif($status[$i] == 0) {
            print "<td>
";
            if($mode == 0) { print "<img src=\"$noncgi_dir/led_aus.gif\" alt=\"\"><br>
"; }
            print "<input type=\"hidden\" name=\"R$i\" value=\"0\">
";
            if($switch_name[$i] eq "") {
               $switch_name[$i] = "Schalter " . ($i + 1);
            }
            print "<input type=\"submit\" name=\"S$i\" value=\"$switch_name[$i]\">
";
            print "</td>
";
         }
      }
   }
   print "</tr></table>
";
   print "</fieldset>
";
   print "<p></p>
";
}

sub printAll {
   print "<fieldset><legend>$all_name</legend>
";
   print "<table><tr>
";
   print "<td>
";
   print "<input type=\"submit\" name=\"A\" value=\"Einschalten\">
";
   print "</td>
";
   if($mode == 0) {
      print "<td>
";
      print "<input type=\"submit\" name=\"A\" value=\"Ausschalten\">
";
      print "</td>
";
   }
   print "</tr></table>
";
   print "</fieldset>
";
   print "<p></p>
";
}

sub printInput {
   print "<fieldset><legend>$input_name</legend>
";
   print "<table><tr>
";
   for(my $i = 3; $i <= 7; $i++) {
      if($led_view[$i] > 0) {
         if($status[$i] == 1) {
            print "<td>
";
            if($i < 7) { print "<img src=\"$noncgi_dir/led_aus.gif\" alt=\"\"><br>
"; }
            else { print "<img src=\"$noncgi_dir/led_ein.gif\" alt=\"\"><br>
"; }
            print "<small>$led_name[$i]</small>
";
            print "</td>
";
         }
         elsif($status[$i] == 0) {
            print "<td>
";
            if($i < 7) { print "<img src=\"$noncgi_dir/led_ein.gif\" alt=\"\"><br>
"; }
            else { print "<img src=\"$noncgi_dir/led_aus.gif\" alt=\"\"><br>
"; }
            print "<small>$led_name[$i]</small>
";
            print "</td>
";
         }
      }
   }
   print "</tr></table>
";
   print "</fieldset>
";
   print "<p></p>
";
}

sub printRefresh {
   print "<fieldset><legend>Anzeige</legend>
";
   print "<table><tr>
";
   print "<td>
";
   print "<input name=\"refresh\" type=\"button\" value=\"Anzeige aktualisieren\" onClick=\"javascript:location.href=\'$script_url\';\">
";
   print "</td>
";
   print "</tr></table>
";
   print "</fieldset>
";
}

Gerne wuerde ich dies in die IPS einbinden, aber klappt ned so richtig

ist die dll in IPS eingebunden. Hast du den Dienst neu gestartet.

Mit dem Beispielcode im Thread, müsste sich ja irgendetwas tun.

In IPS V2.2 werden die alten Extensions wegen der neuen PHP-Version nicht mehr funktionieren. Das habe ich bei meinen Extensions auch. Nur ist es mir leider noch nicht gelungen, eine lauffähige neue Version dieser Extensions für PHP5.3 hinzukriegen. (mit Delphi2009 und php4delphi7.2, und: Ja ich weiss, das ganze Ansi-XYZ-Gedöns habe ich schon gemacht…)

Tommi

ach so okay, hab auch die Version 2,2 und ich bring es einfach ned zum klacken, aber da bin ich wohl ned der einzige, hehe

aber danke nochmals.

Wenn du ein externes Programm mit Parameterübergabe zum Schalten des LPT-Portes hast, könntest du notfalls mit [b]DIESEM BEFEHL WAS MACHEN[/b]

Hast du diese [b]KARTE[/b]?, dann kann dir Berndj weiterhelfen.

Schaue auf seine [b]WWW[/b]-Seite.

Hast du den Pollin Webserver, dann guggst du [b]HIER[/b]

Wenn Du schon was hast, was Du über HTTP ansprechen kannst, bist Du doch fein raus. Einfach die URL aufrufen und gut ist. Also vergiss die Kopfschmerzen mit der Extension, auch wenn das schöner aussehen mag.

Tommi

Ja genau dieses Karte habe ich, dann werde ich mal das ausprobieren. Danke

Wenn Du schon was hast, was Du über HTTP ansprechen kannst, bist Du doch fein raus. Einfach die URL aufrufen und gut ist. Also vergiss die Kopfschmerzen mit der Extension, auch wenn das schöner aussehen mag

Ja ich kann die Karte ueber den http Steuern, gerne wuerde ich noch die Relais Zeitsteuern.

Hab mal die Karte kurz freigegeben, sie ist offline, kann aber geschalten werden, schaut es mal an.

Relaiskarten-Steuerung

Was meint ihr, habt ihr ne Idee

Was du über das WWW machen kannst geht auch mit IPSymcon, für die Zeitgeschichte wird ein Script nötig sein.
saerdna76, EHB und Thifi hatten ähnliche Geschichten gemacht.

Hab`da wenig Ahnung,
schätze mal du mußt die PortNr und die Netzwerkadresse mit den Post/Get Befehlen geschickt kombinieren und dann läuft das mit IPSymcon:).

Leider weiss ich ned wie ich es genau ueber IPS mache, da ich auf der Basis relativ neu bin, ich werde weiterhin probieren und hoffen das es irgendwie klappt.

Danke trotzdem.

MfG

Hallo Serapis

habe es nach mehreren Versuchen endlich geschafft, die DLL für PHP 5.3 zu compilieren…
Source und DLL im Anhang.

Nur:

  • ich verwende die DLL seit längerem nicht mehr
  • da meine Server (eeeBox) sowieso keinen parallel-Port mehr haben, hat sich das Thema erledigt (mit parallel über USB keine Chance auf diesem Weg) :frowning:
  • wie tommi schon erwähnt hat, wenn du eine andere Möglichkeit als eine DLL hast…

Kann dir also nicht garantieren, ob das Teil noch läuft (und kann es auch nicht ausprobieren).
Auf jeden Fall lädt IPS die DLL:

print_r(get_loaded_extensions(false));
print_r(get_extension_funcs("SetParPort"));

ergibt:


[39] => SetParPort

und

Array
(
[0] => parport_setdatabit
[1] => parport_setctrlbit
[2] => parport_setdata
[3] => parport_setctrl
[4] => parport_getdata
[5] => parport_getctrl
)

Doku findest du ja hier.
Update:
Bei IPS 2.2 muss die DLL nur noch ins EXT-Verzeichnis kopiert werden! Die php.ini wird von IPS beim Start neu angepasst, mit allen (konformen) DLL’s aus dem EXT-Verzeichnis.
Dann den Dienst neu starten.

Gruss
Tinu

SetParPort.zip (178 KB)

Jap, super klappt, ich kann nun die Relaiskarte mit Scripts schalten. DANKE

Hatte den Dienst nicht neu gestartet und deswegen hat es nicht funktioniert.

Kleine Frage haette ich noch.

  • Wie kann ich den Status der LPT-Porte anzeigen lassen?

Hallo Serapis

du kannst mit parport_getdata(portAdresse+1) auf das Status-Register zugreifen.

Altenativ habe ich eine neue Version eingestellt (Beitrag Oben), mit neuer Funktion parport_getstate(Adr) - macht nichts anderes…

Zum ersetzen der DLL IPS-Dienst beenden, Datei kopieren, Dienst wieder neu starten :wink:

Details zu den Ports (und Bits) findet man z.B. hier.

Gruss
Tinu

Hallo Tinu,

danke fuer deine Hilfe.

Altenativ habe ich eine neue Version eingestellt (Beitrag Oben), mit neuer Funktion parport_getstate(Adr) - macht nichts anderes…

Wo muss ich diesen Code einsetzen? In den gleichen Script?
Moechte eben gerne unter IPS sehen ob der Port geschalten ist oder ned, also true/false.

Portadresse sind D1,D2,D3 oder?

sry, ich versteh es gerade ned so ganz :slight_smile:

Also wie im angegebenen Link beschrieben, hat der parallel-Port prinzipiell 3 Adressen:

  • data port, prinzipiell Ausgänge (D0…D7)
  • control-port, Ausgänge (Auto-Linefeed/Reset/Select-Printer)
  • status-port, Eingänge (Ack/Busy/Paper-Out/Select)

Unter Port verstehe ich den entsprechenden Port.
Die Daten-Bits (D0-D7) sind auf dem data-port abgebildet.
Entsprechend kannst du mit

parport_getdata(adr)

den aktuellen Zustand der Bits D0-D7 anschauen.

so z.B.

$data = parport_getdata(0x378);
if (($data & 0x1) != 0)
{
  // dann ist Bit 0 gesetzt
}
if (($data & 0x2) != 0)
{
  // dann ist Bit 1 gesetzt
}
if (($data & 0x4) != 0)
{
  // dann ist Bit 2 gesetzt
}
// usw...

oder so ähnlich…

Gruss
Tinu

welches Delphi und php4delphi-Version hast Du verwendet?

Tommi

Hallo tommi

  • Delphi Enterprise, Version 5.0 (Build 6.18), Update Pack 1
  • PHP4Delphi 7.2

Gruss
Tinu

Danke Tinu fuer deine Hilfe, Geduld und Muehe!