#!/opt/bin/perl -U use IO::Socket; $WAAGE_IP="172.30.11.216"; $WAAGE_PORT=1025; $WAAGE_TYP="TCP_RHEWA"; open_socket($WAAGE_IP,$WAAGE_PORT); #------------------------------------------------------- # Open TCP-Waage-Socket #------------------------------------------------------- sub open_socket { my($host,$port)=@_; # Warte bis zu 5 Sekunden, dann Abbruchmeldung. alarm (0); local $SIG{ALRM} = sub { msk_message("Verbindung zu Waage $host, Port $port ist nicht moeglich!",2); }; alarm (9); # Waagetcp wird am Ende des Programmes wieder geschlossen $waagetcp = new IO::Socket::INET->new( PeerAddr => $host, PeerPort => $port, Proto => 'tcp', Reuse => 1) || msk_message ("Konnte Verbindung zur WAAGE $host, Port $port nicht aufbauen",2); alarm (0); } sub hole_gewicht { if ($WAAGE_TYP =~ "^TCP_RHEWA") { $gewicht = ""; $testgewi = ""; $gewi=""; $a=1; $msg="\r"; $msgin=""; # Warte bis zu 15 Sekunden, dann Abbruchmeldung. alarm (0); local $SIG{ALRM} = sub { msk_message("Waage $WAAGE_TYP ist ausgefallen bzw. antwortet nicht.",2); }; alarm (15); # Jetzt Waage abfragen $waagetcp->send($msg); # Wichtig! recv funktioniert nicht, da der Datensatz in Teilen zusammengesetzt wird, und dabei bereits Teile übermittelt werden # Als Beispiel: beim Test mit recv() kam zum Bsp. nur der ATX, der rest blieb stehen # Als Beispiel: beim Test mit recv() nach einem sleep 1 nach dem send kam der Datensatz an # Der read muss den abschliessenden noch beinhalten. in der Doku steht 79 Zeichen. tatsächlich sind es 83. $waagetcp->read($msgin,83); ($erstes,$lfdnr,$datum,$uhrzeit,$W,$B,$stueck,$GE,$brutto,$tara,$netto,@rest)=split(/;/,$msgin); alarm (0); #print ("$msgin"); $gewicht=(substr($netto,1,6))*1; #$gewicht = (substr($msgin,4,3) . "." . substr($msgin,8,2)) * 1; $msgin=""; return ($a,$gewicht); } # Ende TCP_RHEWA } $ausgelesen=hole_gewicht(); print ("Gewicht: $ausgelesen\n");