Perl-Ecke

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail

 

Allgemeines

Hinweise und Tips zum Einsatz der ActiveX FishFa30.DLL (vbFish30Setup.EXE) / FishFa40AX.DLL (vbFish40Setup.EXE) unter Perl auf Win32 Rechnern.

FishFa30.DLL eignet sich für den Einsatz mit dem Intelligent Interface (an COM) und dem Universal Interface (an LPT). FishFa30AX.DLL eignet sich für den Einsatz mit den Interfaces der ROBO-Serie (USB, COM, RF-Datalink) und dem Intelligent Interface (an COM). Das vorliegende Handbuch FishFa30PL.PDF beschreibt den Einsatz mit FishFa30.DLL, es kann genauso für den Einsatz mit FishFa40AX.DLL herangezogen werden.

Installation Perl und FishFa30

Die Installation ist erfolgt mehrstufig :

  1. Perl-System
    Wenn nicht schon vorhanden : Kostenloser Download von
    www.activestate.com/ActivePerl. Hier wurde mit der MSI Binär-Distribution für Win32 "Active Perl 5.6.1 build 635" gearbeitet. Diese Distribution stellt auch das erforderliche OLE-Package zur Verfügung. Die Perl-Installation erfolgt sehr einfach über den MSI-Installer, der auf dem System vorhanden sein muß.
  2. FishFa30.DLL
    Sollte mit dem Installprogramm vbfish30setup.exe installiert werden. Das Installprogramm erlaubt wahlweise die Installation eines Treiber, der zum Betrieb des älteren (parallelen) Universal-Interfaces erforderlich ist. Außerdem wird ein "Interface Panel" (ein Tool zum Test der an das Interface angeschlossenen Modelle) installiert. Das beiliegende VB6-Handbuch kann ebenfalls gewinnbringend genutzt werden, da die FishFace.Methoden gleich sind (man muß sich nur die $, @, -> ; dazu denken) .
  3. FishFa30PL.PDF
    Handbuch mit einer Befehlsreferenz und umfangreichen Tips & Tricks in Perl.
  4. Entwicklungsumgebung
    Im einfachsten Fall Editieren mit NotePad (Editor) und Testen im MS-DOS-Fenster.
    Alternativ ein Editor mit Syntax-Highlighting und Kommando zum Ausführen des Programms z.B. Uli Meybohms (
    www.meybohm.de) Proton.

Literatur zu Perl

Hier ein paar sehr subjektive Hinweise und Anmerkungen :

O'Reilly : Einführung in Perl für Win32 Systeme (ISBN 3-89721-106-8, scheint nicht mehr lieferbar zu sein, 
ISBN der amerikanischen Ausgabe : 1-56592-324-3).
Enthält ein kurzes Kapitel "OLE-Automatisierung".

O'Reilly : Perl in a Nutshell (ISBN 3-89721-338-9) Referenz und Kurzeinführung.
Ebenfalls mit einem Kapitel OLE-Automatisierung.

O'Reilly : Programmieren mit Perl (Larry Wall et. al. ISBN 3-89721-144-0)
Das Buch über Perl und seine Philosophie.

Addison-Wesley : Nitty Gritty Perl (ISBN 3-8273-18886-6) Für erfahrene Programmierer, die einen kurzen Überblick gewinnen möchten. Zudem das (mit Abstand preiswerteste Buch). Kein OLE-Automatisierungs Kapitel.

Wenns nur um OLE-Automatisierung geht und man Perl einigermaßen sicher kann und den Beispielen der Dokumentation traut, geht’s auch ohne.

Anmerkungen zu FishFace

Bei Einsatz von FishFa30.DLL ist der folgendes use erforderlich :

use Win32::OLE;

FishFa30.DLL muß ordnungsgemäß installiert sein (geschieht automatisch beim Setup).

Die Objekterstellung erfolgt über :

$ft = Win32::OLE->new("FishFa30.FishFace", 'Quit');

Alternative kann auch mit use OLE; gearbeitet werden (im Handbuch wird mit use Win32::OLE gearbeitet) :

use OLE;

$ft = CreateObject OLE "FishFa30.FishFace" || die "CreateObject: $!;

Der Rest ist dann wie oben. Gelegentlich wird aber mehr Wert auf {} und "" in der Schreibweise gelegt.

Perl-FishFace Beispiele

WechselBlinker mit FishFa30.DLL

Die Lampen an M1 und M2 schalten abwechselnd jeweils für 555 ms ein. Endlos, Abbruch über ESC-Taste.

use Win32::OLE;
$ft = Win32::OLE->("FishFa30.FishFace", 'Quit');
print "--- WechselBlinker.PL gestartet ---\npress ESC to HALT\n";

$ft->OpenInterface("COM2");
until($ft->Finish) {
  $ft->SetMotor(2, 0);
  $ft->SetMotor(1, 1);
  $ft->Pause(555);
  $ft->SetMotor(1, 0);
  $ft->SetMotor(2, 1);
  $ft->Pause(555);
}
$ft->CloseInterface();

print "--- FINIS ---\n";
  • use Win32::OLE
  • Anlegen des Objects ft
  • Herstellen der Verbindung zum Interface, hier eigenen Wert einstellen (COM1 - COM9, LPT, LPT1 - LPT3)
  • eine Lampe an (Aus => 0, Ein => 1), die andere aus, 555 ms warten und umgekehrt.
  • und das in einer until-Schleife, die durch die ESC-Taste abgebrochen werden kann
  • Schließen der Verbindung zum Interface

Blinker mit FishFa40AX.DLL

#!perl -w
# --- *.PL : Blinkende Lampe an M1 ---
use OLE;
$ft = CreateObject OLE "FishFa40AX.FishFace" || die "CreateObject: $!";
$ft->OpenInterfaceUSB(0,0);
$mGelbeLampe = 1;
while (not $ft->Finish()) {
$ft->SetMotor($mGelbeLampe, 1);
$ft->Pause(400);
$ft->SetMotor($mGelbeLampe, 0);
$ft->Pause(200);
}
$ft->CloseInterface();

Simultane Ansteuerung einer vorgegebenen Position

Motor an M3 (mit Endtaster an E5 und Impulstaster an E6) und an M4 (mit E7 und E8)
Motor an M4 fährt 25 Impulse mit halber Geschwindigkeit (8) nach links und der Motor an M3 mit voller Geschwindigkeit(15) 40 Impulse nach rechts. Details sind im erwähnten Manual beschrieben.

use Win::OLE;

%Dir  = (Aus  => 0, Ein  => 1, Links   => 1, Rechts => 2);
%Wait = (Ende => 0, Time => 1, NotHalt => 2, ESC    => 3);  

$ft = Win32::OLE->( "FishFa30.FishFace", 'Quit');

print "--- Position.PL gestartet ---\npress ESC to HALT\n";

$ft->OpenInterface("COM2");

print "Motor an M4 faehrt 25 links, halbe Geschw. ", 
       "und Motor an M3, 40 rechts, voll\n";
$ft->SetMotor(3, $Dir{Rechts}, 15, 40);
$ft->SetMotor(4, $Dir{Links}, 8, 25);

do {
  print $ft->GetCounter(6), " - ", $ft->GetCounter(8), "\n";
} while($ft->WaitForMotors(100, 3, 4) eq $Wait{Time});

print $ft->GetCounter(6), " - ", $ft->GetCounter(8), "\n";

$ft->CloseInterface();

print "--- FINIS ---\n";
  • use Win32::OLE
  • Hash als symbolische Konstanten für für Drehrichtung und Warten
  • Anlegen der Objekts ft
  • Herstellen der Verbindung zum Interface (s.o.)
  • Starten der Motoren
  • Warten auf Beendigung des Auftrages. Hier wird in Intervallen von 100 ms auf Ende abgefragt, die Motoren schalten sich bei Erreichen der vorgegebenen Postion selbsttätig ab.
  • In der do-Schleife wird die aktuell erreiche Position auf der Konsole ausgegeben. Nach Schleifen-Ende die Endposition
  • Schließen der Verbindung zum Interface.

Turm von Hanoi

Auf der Seite Turm von Hanoi gibt es dann noch ein vollständiges, etwas größeres Perl-Programm.

Die Alternative : Win32::API

Das von Aldo Calpini auf CPAN angebotene Module Win32::API (akt. Jan 04 : Win32-API-0.41) ermöglicht den direkten Zugriff auf Windows.DLLs. Damit ist die Erstellung eines Perl-Moduls auf direkt Basis von umFish30.DLL möglich (Siehe auch die entsprechende Python-Lösung). Strickmuster :

package ftC::FiFa.pm

use Win32::API

$Version = new Win32::API('umFish30', 'Version', ....

Wenn denn jemand das probiert, würde ich es gerne hier veröffentlichen.

Stand : 07.07.2005