[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