[bcn-pm] Problemilla con arrays
"Juan J. Merelo Guervós"
jmerelo at geneura.ugr.es
Mon Feb 14 11:48:22 PST 2005
Josep M. Mendoza wrote:
>Hola,
>
>Es la primera vez que hago una consulta a la lista, aunque llevo bastante
>tiempo observando, espero que mi consulta no sea muy banal...
>
>Resulta que tengo una subrutina en un módulo tal que así:
>
>-- code --
>sub writeMultipleRegisters(){
> my ($self, $Address, $Length, @data) = @_;
> my $wordCount = $Length;
> my $byteCount = ($Length * 2);
> carp ("Length of data array error") unless (@data == $byteCount);
> my $transactionID = chr(0).chr(0);
> my $protocolID = chr(0).chr(0);
> my $dataLength = $self->toChars( (7 + $byteCount) );
> my $unitID = chr(0);
> my $requestCode = chr(16);
> my $requestAddress = $self->toChars($Address);
> my $requestLength = $self->toChars($Length);
> my $requestBytes = chr($byteCount);
>
> my ($count, $values);
> for ($count = 0; $count < @data; $count++){
> $values = $values.$self->toChars($data[$count]);
> }
>
> # Send request
> $socket->send($transactionID.$protocolID.$dataLength.$unitID.$requestCode.
>$requestAddress.$requestLength.$requestBytes.$values);
>
> # Read response
> my $responseCode = ord($requestCode);
> my (@response, $byte);
> while (sysread($socket, $byte, 1) == 1) {
> push (@response, ord($byte));
> $responseCode = $response[7] if exists $response[7];
> last if ($responseCode != ord($requestCode));
> last if (@response == 12);
> }
> return 0, $response[8] if ($responseCode != ord($requestCode));
> return 1;
>}
>-- code --
>
>y resulta que funciona, pero al llamarla desde un script tal que así:
>
>-- code --
>#!/usr/bin/perl
>
>use Net::ModbusRTU;
>use strict;
>
>my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
>
>my $serverConnection = new Net::ModbusRTU ('172.26.0.130') or die "Connection
>error.";
>
>$serverConnection->debug(0);
>
>my ($result) = $serverConnection->writeMultipleRegisters(120, 3, $hour, $min,
>$sec);
>
>($result) && (print "done.\n") || (print "error\n");
>
>$serverConnection->close();
>
>undef $serverConnection;
>-- code --
>
>resulta que me da el error siguiente:
>
>jmendoza at odin:~/Desenvolupament/Net-ModbusRTU$ ./write-time
>Length of data array error at ./write-time line 12
>
>
>
Por qué pasas $Length y @data y compruebas si son iguales? No sería
mejor que pasaras sólo @data y usaras $length = @data o $bytecount = @data?
De todas formas, me da la impresión de que aquí consideras que se parte
por byte lo que sea originalmente; igual está partido por carácter UTF8.
Mira de todas formas cuánto vale $Length, cuánto vale $bytecount, y
cuántos elementos tiene @data.
JJ
More information about the Barcelona-pm
mailing list