Export données en perl [Résolu] - Perl - Programmation
Marsh Posté le 07-02-2014 à 11:45:06
Pour le moment, ce que vous avez écrit ne veut pas dire grand chose, alors difficile d'y répondre.
Il faudrait être plus clair quand à ce que vous voulez faire.
Et oui, Perl est un langage couramment utilisé dans la programmation perl, que ce soit du côté client (Perl et CGI; le langage PHP est à la base une intégration/adaptation de Perl à une utilisation spécifique de script côté serveur) ou client (programmes d'automatisation de requêtes et exploitation du résultat, robots...)
A+,
Marsh Posté le 07-02-2014 à 11:51:47
Ok, Pour faire simple,
J'ai un compteur energie qui possede une interface web via un mini serveur web intégré. Mon but est de rentrer dans sa base de données et d'en extraire 3 variables qdont j'ai besoin.
j'ai trouvé la fonction qui mer permet de rentrer dans la base de données avec mbtget -r3 -a 264 (adresse variable) et @IP
Quand je tape cette ligne dans ma fenetre de commande, le serveur me réponde <00264> values 19167. qui est ma consommation.
maintenant, je voudrais intégré cette requette dans un programme qui me renvoie à intervalle régulier ces valeur dans un fichier .txt ou csv.
Voilà pour faire simple et rapide ^^
merci
Marsh Posté le 07-02-2014 à 16:09:29
Le code de mbtget est en perl: http://source.perl.free.fr/spip.php?article2
Déjà, il faut le désosser pour n'en garder que ce qui vas vous être utile.
Je posterai cela tout à l'heure.
A+,
Marsh Posté le 07-02-2014 à 22:08:12
Code :
|
A toi de modifier la boucle
my $status = query_info();
until ($status) {
sleep(10);
$status = query_info();
}
# boucle infinie, a stopper avec un kill
pour avoir quelque chose qui s'arrête de manière un peu plus propre (bon, c'est pas nécessairement gênant non plus)
Par exemple avec que chose de ce type:
Code : |
et modifier disp_data pour ouvrir un fichier, y ajouter les données et fermer le fichier à chaque appel.
A+,
Marsh Posté le 10-02-2014 à 08:36:00
C'est sympa pour le coup de main;
Je regarde le code ce matin, et dès que j'ai avancé, je reviens ici ^^
Merci En tout cas
Marsh Posté le 10-02-2014 à 10:11:06
J'ai essayé de lancer le mbtget sans aucune modification, et il ne marche pas, "connexion au serveur 502 impossible", j'ai regarde à gauche et à droite, mais pas moyen de comprendre pourquoi il bug.
mon programme ne s'arretera pas avant plusieur mois (10 environ) et donc, un simple ctrl-C est plus simple à réaliser.
Je travaille le code, est dès que j'ai avancé un peu, je le copie ici.
merci
ju
Marsh Posté le 10-02-2014 à 14:34:41
> J'ai essayé de lancer le mbtget sans aucune modification, et il ne marche pas, "connexion au serveur 502 impossible", j'ai regarde à gauche et à droite, mais pas moyen de comprendre pourquoi il bug.
Celui qui est la: http://source.perl.free.fr/spip.php?article2 ?
Ben alors c'est quoi le mbtget ce que vous avez employé pour faire mbtget -r3 -a 264 (adresse variable) et @IP ?
A+,
Marsh Posté le 10-02-2014 à 14:38:22
je l'ai télécharger sur cette page;
je ne comprends pas en fait pourquoi utiliser le mbtget et modifier la boucle query_info()...
Parsque en fait, il faut utiliser la fonction mbtget dans mon script et créer un autre petit programme pour attendre le temps entre 2 mesures(300 s) dans le test ci-dessous. Enfin, je dois créer un programme qui va enregistrer al valeur extraite du serveur.
En gros, c'est ce chemin qu'il faut emprunter ^^ ??
Marsh Posté le 10-02-2014 à 14:41:48
Celui que j'ai écrit dans cette page ici?
Et vous avez mis la bonne IP a
$opt_server = 'votre.ip.en.chiffres';
A+,
Marsh Posté le 10-02-2014 à 14:45:22
oui, et il me marque une erreur :
Use of uninitialized value $server_ip in concatenation (.) or string at cessai.pl line 45
Unbale to resolve ""
#!/usr/bin/perl
use strict;
use warnings;
use Socket;
# Paramètres ModBus/TCP
my $MODBUS_PORT = 502;
# Codes fonctions
my $READ_COILS = 0x01;
my $READ_DISCRETE_INPUTS = 0x02;
my $READ_HOLDING_REGISTERS = 0x03;
my $READ_INPUT_REGISTERS = 0x04;
my $WRITE_SINGLE_COIL = 0x05;
my $WRITE_SINGLE_REGISTER = 0x06;
# Codes exceptions
my $EXP_ILLEGAL_FUNCTION = 0x01;
my $EXP_DATA_ADDRESS = 0x02;
my $EXP_DATA_VALUE = 0x03;
my $EXP_SLAVE_DEVICE_FAILURE = 0x04;
my $EXP_ACKNOWLEDGE = 0x05;
my $EXP_SLAVE_DEVICE_BUSY = 0x06;
my $EXP_MEMORY_PARITY_ERROR = 0x08;
my $EXP_GATEWAY_PATH_UNAVAILABLE = 0x0A;
my $EXP_GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND = 0x0B;
# Valeurs par défaut
my $opt_server = 'localhost';
my $opt_server_port = $MODBUS_PORT;
my $opt_timeout = 5;
my $opt_unit_id = 1;
my $opt_mb_fc = $READ_HOLDING_REGISTERS;
my $opt_mb_ad = 0;
my $opt_mb_nb = 1;
my $opt_bit_value = 0;
my $opt_word_value = 0;
$opt_mb_ad = 264;
$opt_server = 192.168.1.253;
# Résolution DNS
my $server_ip = inet_aton($opt_server);
unless ($server_ip) {
print STDERR 'unable to resolve "'.$server_ip.'"'."\n";
exit 1;
}
my $status = query_info();
until ($status) {
sleep(10); # toutes les 10s, a adapter à ses besoins
$status = query_info();
}
# boucle infinie, a stopper avec un kill
sub query_info {
# *** Gestion du dialogue reseau ***
# Ouverture de la session TCP
socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
unless (connect(SERVER, sockaddr_in($MODBUS_PORT, $server_ip))) {
print STDERR 'connexion au serveur "'.$server_ip.':'.$MODBUS_PORT.'" impossible'."\n";
return 2;
}
# Construction de la requête
my $tx_hd_tr_id = int(rand 65535);
my $tx_hd_length = 6;
my $tx_hd_pr_id = 0;
my $tx_buffer = pack("nnnCCnn", $tx_hd_tr_id, $tx_hd_pr_id , $tx_hd_length, $opt_unit_id, $opt_mb_fc, $opt_mb_ad, $opt_mb_nb);
# Emission de la requête
send(SERVER, $tx_buffer, 0);
# Attente d'une réponse
unless (can_read('SERVER', $opt_timeout)) {
close SERVER;
print STDERR 'receive timeout'."\n";
return 1;
}
# Réception de l'entête
my ($rx_frame, $rx_buffer);
recv(SERVER, $rx_buffer, 7, 0);
$rx_frame = $rx_buffer;
# Décodage de l'entête
my ($rx_hd_tr_id, $rx_hd_pr_id, $rx_hd_length, $rx_hd_unit_id) = unpack "nnnC", $rx_buffer;
# Vérifie la cohérence de l'entête
unless (($rx_hd_tr_id == $tx_hd_tr_id) &&
($rx_hd_pr_id == 0) &&
($rx_hd_length < 256) &&
($rx_hd_unit_id == 1)) {
close SERVER;
print STDERR 'error in receive frame'."\n";
return 1;
}
# Réception du corps du message
recv(SERVER, $rx_buffer, $rx_hd_length-1, 0);
$rx_frame .= $rx_buffer;
close SERVER;
# Décodage du corps du message
my ($rx_bd_fc, $rx_body) = unpack "Ca*", $rx_buffer;
# Vérification du statut d'exception
if ($rx_bd_fc > 0x80) {
# Affichage du code exception
my ($rx_except_code) = unpack "C", $rx_body;
print 'exception (code '.$rx_except_code.')'."\n";
} else {
## Lecture de mot
my ($rx_bd_bc, $rx_read_word_data) = unpack "Ca*", $rx_body;
# Lecture d'entier de 16 bits
my @rx_disp_data = unpack 'n*', $rx_read_word_data;
disp_data(@rx_disp_data);
}
return 0;
}
# Attend $timeout secondes que la socket mette à disposition des données
sub can_read {
my ($sock_handle, $timeout) = @_;
my $hdl_select = "";
vec($hdl_select, fileno($sock_handle), 1) = 1;
return (select($hdl_select, undef, undef, $timeout) == 1);
}
# Affichage des valeurs reçues
sub disp_data {
# Affichage du résultat
# Format csv pour utilisation dans un script
foreach (@_) {
printf '%05d;', $_;
}
print "\n";
}
Marsh Posté le 10-02-2014 à 14:57:40
Je vois.
$opt_server = 192.168.1.253;
# Résolution DNS
my $server_ip = inet_aton($opt_server);
unless ($server_ip) {
print STDERR 'unable to resolve "'.$server_ip.'"'."\n";
exit 1;
}
Remplacer avec
$opt_server = '192.168.1.253'; ## ici, ' et '
# Résolution DNS
my $server_ip = inet_aton($opt_server);
unless ($server_ip) {
print STDERR 'unable to resolve "'.$opt_server.'"'."\n"; # et la,
exit 1;
}
la première ligne n'est pas correctement comprise sans quote, j'en avais mis dans mon texte.
Et pour le message d'erreur, mea culpa, j'avais mis le nom de la variable vide après echec, pas celui de la variable testée.
A+,
Marsh Posté le 10-02-2014 à 15:07:03
La commande compile nikel,
la je vais finir de comprendre le code.
Il ne me reste plus qu'a faire le code pour l'export en csv ou txt et le tour sera joué pour ce premier draft ^^
Merci pour le coup de main
julien
Marsh Posté le 10-02-2014 à 15:10:44
Sinon, comme j'ai dit plus dans l'autre sujet, ça peut se transposer en C de manière directe. C'est juste un dialogue sur une socket tcp de manière complètement standard.
A+,
Marsh Posté le 10-02-2014 à 15:12:54
pour le programme, il est plus simple à faire et à suivre en C ou Perl ?
je travaille depuis 1 an ou 2 en C/C++ et je ne savais pas que l'on pouvait travailler directement sur les TCP en C / C++ . . .
Le Perl est peut-etre plus simple à ecrire, pour ce que jai vu ici en tout cas.
Marsh Posté le 10-02-2014 à 15:26:19
>> je travaille depuis 1 an ou 2 en C/C++ et je ne savais pas que l'on pouvait travailler directement sur les TCP en C / C++ . . .
D'après toi, comment fonctionne l'essentiel de la couche réseau sur les machines?
Il y a des tutoriaux partout: http://www.csd.uoc.gr/~hy556/mater [...] torial.pdf
La je dois m'en aller, mais c'est 30 mn pour transposer le code perl spécialisé à cette requête précise en C.
Peut être ce soir si j'ai du temps.
A+,
Marsh Posté le 10-02-2014 à 15:29:27
Ok, c'est cool,
je regarde tout ça et je poserai une copie du code final su le post ce soir.
Merci pour le coup de main
Marsh Posté le 10-02-2014 à 16:19:19
Après modification, j'ai mis le code et il compile bien, mais comment exporter un champs précis, comme pra exemple le champs 267 de la table des datas ?
#!/usr/bin/perl
use strict;
use warnings;
use Socket;
# Paramètres ModBus/TCP
my $MODBUS_PORT = 502;
# Codes des fonctions lecture, ecriture, ...
my $READ_COILS = 0x01;
my $READ_DISCRETE_INPUTS = 0x02;
my $READ_HOLDING_REGISTERS = 0x03;
my $READ_INPUT_REGISTERS = 0x04;
my $WRITE_SINGLE_COIL = 0x05;
my $WRITE_SINGLE_REGISTER = 0x06;
# Codes des exceptions erreurs, ...
my $EXP_ILLEGAL_FUNCTION = 0x01;
my $EXP_DATA_ADDRESS = 0x02;
my $EXP_DATA_VALUE = 0x03;
my $EXP_SLAVE_DEVICE_FAILURE = 0x04;
my $EXP_ACKNOWLEDGE = 0x05;
my $EXP_SLAVE_DEVICE_BUSY = 0x06;
my $EXP_MEMORY_PARITY_ERROR = 0x08;
my $EXP_GATEWAY_PATH_UNAVAILABLE = 0x0A;
my $EXP_GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND = 0x0B;
# Valeurs par défaut
my $opt_server = 'localhost';
my $opt_server_port = $MODBUS_PORT; #502
my $opt_timeout = 5; # temps max de s s
my $opt_unit_id = 1;
my $opt_mb_fc = $READ_HOLDING_REGISTERS;
my $opt_mb_ad = 0;
my $opt_mb_nb = 1;
my $opt_bit_value = 0;
my $opt_word_value = 0;
$opt_server = '192.168.1.253'; # @ IP du serveur TCP
my $server_ip = inet_aton($opt_server); # on donne l'@ IP à la variable
unless ($server_ip) {
print STDERR 'unable to resolve "'.$opt_server.'"'."\n"; # et la,
exit 1;
}
# boucle infinie, a stopper avec >> kill # tourne sas cesse jusqu'au ctrl+C
sub query_info {
# Gestion du dialogue reseau
# Ouverture de la session TCP
socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
unless (connect(SERVER, sockaddr_in($MODBUS_PORT, $server_ip))) {
print STDERR 'connexion au serveur "'.$server_ip.':'.$MODBUS_PORT.'" impossible'."\n";
return 2;
}
# Création de la requête
my $tx_hd_tr_id = int(rand 65535);
my $tx_hd_length = 6;
my $tx_hd_pr_id = 0;
my $tx_buffer = pack("nnnCCnn", $tx_hd_tr_id, $tx_hd_pr_id , $tx_hd_length, $opt_unit_id, $opt_mb_fc, $opt_mb_ad, $opt_mb_nb);
# Emission de la requête
send(SERVER, $tx_buffer, 0);
# Attente d'une réponse
unless (can_read('SERVER', $opt_timeout)) {
close SERVER;
print STDERR 'receive timeout'."\n";
return 1;
}
# Réception de l'entête
my ($rx_frame, $rx_buffer);
recv(SERVER, $rx_buffer, 7, 0);
$rx_frame = $rx_buffer;
# Décodage de l'entête
my ($rx_hd_tr_id, $rx_hd_pr_id, $rx_hd_length, $rx_hd_unit_id) = unpack "nnnC", $rx_buffer;
# Vérifie la cohérence de l'entête
unless (($rx_hd_tr_id == $tx_hd_tr_id) &&
($rx_hd_pr_id == 0) &&
($rx_hd_length < 256) &&
($rx_hd_unit_id == 1)) {
close SERVER;
print STDERR 'error in receive frame'."\n";
return 1;
}
# Réception du corps du message
recv(SERVER, $rx_buffer, $rx_hd_length-1, 0);
$rx_frame .= $rx_buffer;
close SERVER;
# Décodage du corps du message
my ($rx_bd_fc, $rx_body) = unpack "Ca*", $rx_buffer;
# Vérification du statut d'exception
if ($rx_bd_fc > 0x80) {
# Affichage du code exception
my ($rx_except_code) = unpack "C", $rx_body;
print 'exception (code '.$rx_except_code.')'."\n";
}
else {
## Lecture de mot
my ($rx_bd_bc, $rx_read_word_data) = unpack "Ca*", $rx_body;
# Lecture d'entier de 16 bits
my @rx_disp_data = unpack 'n*', $rx_read_word_data;
disp_data(@rx_disp_data);
}
return 0;
}
# Attend $timeout secondes que la socket mette à disposition des données
sub can_read {
my ($sock_handle, $timeout) = @_;
my $hdl_select = "";
vec($hdl_select, fileno($sock_handle), 1) = 1;
return (select($hdl_select, undef, undef, $timeout) == 1);
}
# Affichage des valeurs recues
sub disp_data {
# Création du fichier 'cexport.txt'
open (FICHIER, "ctest.txt" ) || die ("Impossible de créer le fichier \"cexport.txt\"" );
foreach (@_) {
print FICHIER '%05d;', $_;
}
close (FICHIER);
}
Mais pas de fichier créé pour l'export des datas.
Je retente un morceau de code ^^
Marsh Posté le 11-02-2014 à 10:02:51
Après de multiples essais, je n'arrive pas à extraire les données, pourtant le programme se lance et aucun fichier est exporté.
J'ai mis mon code ci-dessus hier soir et j'ai travaille dessus hier soir.
Mais rien à faire, j'essaie de comprendre pourquoi il n'y a aucun export.
Si quelqu'un passe par là . . .
Merci
Marsh Posté le 11-02-2014 à 10:36:52
Remplacer
Code :
|
par
Code :
|
A+,
Marsh Posté le 11-02-2014 à 11:31:55
J'ai bien faits els modifications, cependant, il n'y a aucun export vers le fichier test.txt.
le programme compile, se lance, mais pas d'export
Need help
Marsh Posté le 11-02-2014 à 14:49:52
Et en rajoutant un
printf( $fh "\n" );
juste avant le close($fh);
pour flusher le buffer?
A+,
Marsh Posté le 11-02-2014 à 14:53:39
Pareil, pas d'export,
Le nombre de champs à exporter peut-il influencer le programme ?
Marsh Posté le 11-02-2014 à 14:57:28
#!/usr/bin/perl
use strict;
use warnings;
use Socket;
# Paramètres ModBus/TCP
my $MODBUS_PORT = 502;
# Codes des fonctions lecture, ecriture, ...
my $READ_COILS = 0x01;
my $READ_DISCRETE_INPUTS = 0x02;
my $READ_HOLDING_REGISTERS = 0x03;
my $READ_INPUT_REGISTERS = 0x04;
my $WRITE_SINGLE_COIL = 0x05;
my $WRITE_SINGLE_REGISTER = 0x06;
# Codes des exceptions erreurs, ...
my $EXP_ILLEGAL_FUNCTION = 0x01;
my $EXP_DATA_ADDRESS = 0x02;
my $EXP_DATA_VALUE = 0x03;
my $EXP_SLAVE_DEVICE_FAILURE = 0x04;
my $EXP_ACKNOWLEDGE = 0x05;
my $EXP_SLAVE_DEVICE_BUSY = 0x06;
my $EXP_MEMORY_PARITY_ERROR = 0x08;
my $EXP_GATEWAY_PATH_UNAVAILABLE = 0x0A;
my $EXP_GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND = 0x0B;
# Valeurs par défaut
my $opt_server = 'localhost';
my $opt_server_port = $MODBUS_PORT; #502
my $opt_timeout = 1; # temps max de 1 s
my $opt_unit_id = 1;
my $opt_mb_fc = $READ_HOLDING_REGISTERS;
my $opt_mb_ad = 0;
my $opt_mb_nb = 1;
my $opt_bit_value = 0;
my $opt_word_value = 0;
$opt_server = '192.168.1.253'; # @ IP du serveur TCP
my $server_ip = inet_aton($opt_server); # on donne l'@ IP à la variable
unless ($server_ip) {
print STDERR 'unable to resolve "'.$opt_server.'"'."\n"; # et la,
exit 1;
}
# boucle infinie, a stopper avec un kill # tourne sas cesse jusqu'au ctrl+C
sub query_info {
# Gestion du dialogue reseau
# Ouverture de la session TCP
socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
unless (connect(SERVER, sockaddr_in($MODBUS_PORT, $server_ip))) {
print STDERR 'connexion au serveur "'.$server_ip.':'.$MODBUS_PORT.'" impossible'."\n";
return 2;
}
# Création de la requête
my $tx_hd_tr_id = int(rand 65535);
my $tx_hd_length = 6;
my $tx_hd_pr_id = 0;
my $tx_buffer = pack("nnnCCnn", $tx_hd_tr_id, $tx_hd_pr_id , $tx_hd_length, $opt_unit_id, $opt_mb_fc, $opt_mb_ad, $opt_mb_nb);
# Emission de la requête
send(SERVER, $tx_buffer, 0);
# Attente d'une réponse
unless (can_read('SERVER', $opt_timeout)) {
close SERVER;
print STDERR 'receive timeout'."\n";
return 1;
}
# Réception de l'entête
my ($rx_frame, $rx_buffer);
recv(SERVER, $rx_buffer, 7, 0);
$rx_frame = $rx_buffer;
# Décodage de l'entête
my ($rx_hd_tr_id, $rx_hd_pr_id, $rx_hd_length, $rx_hd_unit_id) = unpack "nnnC", $rx_buffer;
# Vérifie la cohérence de l'entête
unless (($rx_hd_tr_id == $tx_hd_tr_id) &&
($rx_hd_pr_id == 0) &&
($rx_hd_length < 256) &&
($rx_hd_unit_id == 1)) {
close SERVER;
print STDERR 'error in receive frame'."\n";
return 1;
}
# Réception du corps du message
recv(SERVER, $rx_buffer, $rx_hd_length-1, 0);
$rx_frame .= $rx_buffer;
close SERVER;
# Décodage du corps du message
my ($rx_bd_fc, $rx_body) = unpack "Ca*", $rx_buffer;
# Vérification du statut d'exception
if ($rx_bd_fc > 0x80) {
# Affichage du code exception
my ($rx_except_code) = unpack "C", $rx_body;
print 'exception (code '.$rx_except_code.')'."\n";
}
else {
## Lecture de mot
my ($rx_bd_bc, $rx_read_word_data) = unpack "Ca*", $rx_body;
# Lecture d'entier de 16 bits
my @rx_disp_data = unpack 'n*', $rx_read_word_data;
disp_data(@rx_disp_data);
}
return 0;
}
# Attend $timeout secondes que la socket mette à disposition des données
sub can_read {
my ($sock_handle, $timeout) = @_;
my $hdl_select = "";
vec($hdl_select, fileno($sock_handle), 1) = 1;
return (select($hdl_select, undef, undef, $timeout) == 1);
}
# Affichage des valeurs recues
sub disp_data {
open(my $fh, ">>", 'Ctest.txt' ) || die ('Impossible de créer le fichier "ctest.txt"' );
foreach (@_)
{
printf( $fh "%05d;", $_);
}
printf ($fh "\n" );
close ($fh);
}
Marsh Posté le 11-02-2014 à 14:58:05
Parsque à aucun moment, on lui donne le champs à exporter dans le script, est-ce que sa peux venir de là ??
Marsh Posté le 11-02-2014 à 15:03:23
Et avec l'ancienne routine
# Affichage des valeurs reçues
sub disp_data {
# Affichage du résultat
# Format csv pour utilisation dans un script
foreach (@_) {
printf '%05d;', $_;
}
print "\n";
}
ça affiche quelque chose à l'écran?
Parce que si oui, ça restreint fortement la zone des problemes.
A+,
Marsh Posté le 11-02-2014 à 15:05:30
Non, pas d'affichage à l'écran.
pourtant le pgm compile et se lance normalement ^^
Marsh Posté le 11-02-2014 à 15:06:53
se lance normalement, c'est à dire que il n'y a pas d'erreur sur la console.
Marsh Posté le 11-02-2014 à 15:13:09
Ah ben il aurait fallu me le dire avant, ça, que ça affichait rien.
Bon, on va rester avec cette ancienne routine d'abord.
après cette ligne:
my ($rx_bd_bc, $rx_read_word_data) = unpack "Ca*", $rx_body;
ajoutez
print "fct code: $rx_bd_fc -- nb val: $rx_bd_bc\n";
et dites ce qui s'écrit en sortie.
A+,
Marsh Posté le 11-02-2014 à 15:17:40
En ajoutant la ligne :
>> print "fct code: $rx_bd_fc -- nb val: $rx_bd_bc\n";
my ($rx_bd_bc, $rx_read_word_data) = unpack "Ca*", $rx_body;
print "fct code: $rx_bd_fc -- nb val: $rx_bd_bc\n";
# Lecture d'entier de 16 bits
my @rx_disp_data = unpack 'n*', $rx_read_word_data;
disp_data(@rx_disp_data);
je n'ai rien en affichage sur la console
Marsh Posté le 11-02-2014 à 15:19:08
j'ai testé avec les 2 versions du pgm :
ancienne routine ,
nouvelle,
Pas de changements
Marsh Posté le 11-02-2014 à 15:23:07
Ah ben j'ai pigé:
Dans votre code, vous avez viré ce que j'avais mis:
my $status = query_info();
until ($status) {
sleep(10); # toutes les 10s, a adapter à ses besoins
$status = query_info();
}
# boucle infinie, a stopper avec un kill
alors évidemment, comme on n'appelle jamais query_info() on ne fait rien.
A+,
Marsh Posté le 11-02-2014 à 15:54:07
A bien tout de suite, quand je rajoute les lignes, j'ai bien un chiffre qui est exporté . . .
Désolé pour ce temps perdu, en tout cas, c'est ma faute si j'ai perdu du temps.
Marsh Posté le 11-02-2014 à 15:56:24
Mauintenant, est-ce que je peux cibler la valeur sur une adresse bien spécifique ? par exemple l'adresse 267 (binaire) ou 010B (Hexa) ?
merci Gilou pour le coup de main c'est sympa
Marsh Posté le 11-02-2014 à 16:59:29
Allez aussi voir ma réponse sur l'autre topic.
A+,
Marsh Posté le 13-02-2014 à 09:41:28
Mon export fonctionne maintenant bien (merci gilou) et
je commence a y apporter des améliorations. Je souhaite exporter d'autres champs mais sur le même fichier texte ou csv.
Je pense qu'il faut créer une matrice dans ce fichier et y exporter les datas. Mais comment créer cette matrice de forme 24 lignes et 5 colonnes? Lors de l'export du coup, je devrais choisir où je mets les valeurs exportées, non ?
Marsh Posté le 13-02-2014 à 12:26:11
Le plus simple:
vous créez un hash (une des grandes forces de perl, cette structure de données)
my %infos;
à chaque lecture de registre, vous stockez la valeur lue dans le hash
$infos{'conso'} = ....
lecture d'un autre registre
$infos{'conso en horaire de nuit'} = ....
et a la fin de tout ça, vous écrivez le hash sous forme d'une ligne au format csv dans le fichier.
A+,
Marsh Posté le 13-02-2014 à 13:40:50
Du coup, je lis mes variables dans differents champs et j'enregistre les valeurs dans le hash {h1}, {h2} ... et à la fin, pour ecrire, je peux faire un :
# Affichage des valeurs recues
sub disp_data {
open(my $fh, ">>", 'Ctest.csv' ) || die ('Impossible de créer le fichier "cjulien/test.csv"' );
foreach (@_)
{
printf( $fh "%05d;", {h1}, {h2});
}
printf ($fh "\n" );
close ($fh);
}
Marsh Posté le 13-02-2014 à 14:11:43
a quel moment du pgm, le registre est il lu et la valeur sortie ? parsqu si je suis la logique du pgm, on envoie la requete, on attent une répone, on décode et on verifie la coherence; puis on recoit le corps du message. Enfin, on lit le mot puis on le lit en entier de 16 bits. Mais au moment de l'exporter sur le $fh, la valeur du champse trouve dans quelle variable, $_ ? du coup, pour lire plusieurs champs, je dois faire une boucle qui vont lire et après une boucle qui va enregistrer dans le hash.
@+
Marsh Posté le 07-02-2014 à 11:33:35
Bonjour,
je travaille actuellement sur du PERL (nouveau pour moi) et je suis
un peu bloqué. Je dois exporter une valeur depuis un serveur web (@IP connue) et je ne
trouve pas la commande perl à ecrire dans mon script.
Ce langage est il le plus adapté pour faire ce genre de requete ou alors en C/C++
Je connais un peu le langage C et C++...
Merci pour votre aide
Julien
Message édité par clubber43 le 23-06-2014 à 10:15:43