TEST-PROGRAMM, erstellt unter SUSE-LINUX 8.0
Programmiersprache: PERL
Man sieht mit diesem kleinen Test-Programm, wie einfach es ist:
Eingaenge staendig abzufragen
In Abhaengigkeit von den EINGAENGEN die AUSGAENGE zu beschalten
Hier das Test-Programm:
#!/usr/bin/perl
printf "------------------------------------------------------------\n";
printf "PERL-Programm test2.pl:\n";
printf "TEST CAN-MODUL 31.12.2003 G.FI:\n";
printf "AUSGAENGE so schalten, wie die EINGAENGE gedrueckt werden\n";
printf "\n";
printf "HINWEIS: im Background laeuf gfi_receive, das staendig\n";
printf "den Status der EINGAENGE im File EINGAENGE liefert\n";
printf "------------------------------------------------------------\n";
## so sieht File EINGAENGE z. B. aus: MODUL und STATUS der EINGAENGE
## 0x00000201:111111110000000000000000000000
## 0x00000301:111111110000000000000000000000
#################################################
#### VORSPANN #######
#################################################
open(F_CAN,"|gfi_send -t=isa") || die("FEHLER: open von gfi_send");
$oh=select(F_CAN); $|=1; select($oh);
$oh=select(STDOUT); $|=1; select($oh);
$modul=0x201; ## ADDR des E/A-Moduls
#################################################
#### ab hier wird geschaltet #######
#################################################
$addr=sprintf("0x%x",$modul);
## alle Ausgaenge OFF schalten
printf(F_CAN "$addr 4 0xff\n");
sleep(5);
while(1) { ## Endlos-Schleife
@eingang_old=@eingang;
hole_eingaenge($modul);
for($i=0;$i<8;$i++) {
if($eingang_old[$i] != $eingang[$i]) { ## nur bei Aenderung
if($eingang[$i] == 0) { schalte($addr,$i,0); }
if($eingang[$i] == 1) { schalte($addr,$i,1); }
}
}
}
#################################################
#### FUNKTIONEN ####
#################################################
sub schalte {
my $addr=shift;
my $ausgang=shift;
my $an_aus=shift;
printf "sub schalte, addr: $addr, ausgang: $ausgang, an_aus: $an_aus\n";
if($an_aus == 0) { $cmd="0x04"; }
if($an_aus == 1) { $cmd="0x03"; }
$ausgabe=1;
$ausgabe=$ausgabe << $ausgang;
printf(F_CAN "%s %s 0x%02x\n",$addr,$cmd,$ausgabe);
}
sub hole_eingaenge {
my $modul=shift;
my $such_string=sprintf("0x%08x:",$modul);
printf "hole_eingaenge(), such_string: %s\n",$such_string;
open(F_EING,"EINGAENGE") || die("FEHLER: open von EINGAENGE");
while(my $rec=<F_EING>) {
if($rec =~ /^$such_string/ ) {
for(my $i=0;$i<8;$i++) {
$eingang[$i]=substr($rec,11+$i,1);
}
last;
}
}
close(F_EING);
}
### +------------------------------------------------------------------+
### ! Georg Fischer, Amselweg 7, D-89281 Herrenstetten Germany !
### ! Dipl.-Ing. (FH) Holztechnik !
### ! Email: ==> G-F-I@t-online.de <== (best way to reach me) !
### ! Internet: http://www.fischer-altenstadt.de !
### ! Internet: http://www.holz-technologie-beratung.de !
### ! Telefon: +49-8337-8646 !
### ! Telefax: +49-8337-9118 !
### +------------------------------------------------------------------+