[bcn-pm] Problemilla con arrays

Josep M. Mendoza josep at mendoza-ginesta.net
Mon Feb 14 10:00:02 PST 2005


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

y llevo como un rato buscando y probando y no hay manera de averiguar que 
puñetas es, el resto de las rutinas me funcionan bien y tengo otros módulos 
en los que empleo el mismo sistema para pasar arrays y no me da ningun error.

Si alguien me puede echar un cable,se lo agradeceré...

Saludos,

-- 
Josep M. Mendoza
http://mendoza-ginesta.net



More information about the Barcelona-pm mailing list