Bonjour à tous,
Dans le cadre d'un projet universitaire, trois collègues et moi même avons pour projet de réaliser un échange d'informations entre un iDevice et un automate Schneider M340. Nous sommes plus ou moins novices dans le domaine de la programmation, voila pourquoi nous éprouvons quelques difficultés.
Quand je parle d'échange d'informations, je veux dire que nous cherchons à échanger des trames Modbus avec l'automate afin de lire ou écrire une valeur dans un mot %MW de l'automate.
Voici donc le bout de code pour former et envoyer cette trame:
La trame est en hexadécimal. Lorsque que j'écris la trame manuellement comme ci-dessus, la valeur data envoyée à l'automate (visible dans le log) est <00000000 00060106 01090018>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //Trame Trame=[NSString stringWithFormat:@"\x00\x00\x00\x00\x00\x06\x01\x06\x01\x09\x00\x08]; //Adresse du registre en rouge //Valeur du registre en vert NSLog(@"Le texte est %@",Trame); Info.text = [NSString stringWithFormat:@"%@%@%@",Info.text, Trame, @"\r"]; //Envoie de la trame NSData *data = [[NSData alloc] initWithData:[Trame dataUsingEncoding:NSASCIIStringEncoding]]; Info.text = [NSString stringWithFormat:@"%@%@%@",Info.text, data, @"\r"]; [outputStream write:[data bytes] maxLength:[data length]];
Cependant, je souhaite pas écrire ma trame en dur à chaque fois mais plutôt récupérer mes données d'adresse et de valeur du mot de l'automate depuis une variable. (Je ne sais pas si je suis très clair)
Voici le code en ajoutant les deux variables à la fin de la trame :
L'idée est de concaténer le début de la trame (qui ne change jamais) avec les deux variables (adresse et valeur).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //Trame Trame=[NSString stringWithFormat:@"\x00\x00\x00\x00\x00\x06\x01\x06%@%@%@%@%@%@%@%@",@"\\x",MSBplc,@"\\x",LSBplc,@"\\x",MSBValeur,@"\\x",LSBValeur]; NSLog(@"Le texte est %@",Trame); Info.text = [NSString stringWithFormat:@"%@%@%@",Info.text, Trame, @"\r"]; //Envoie de la trame NSData *data = [[NSData alloc] initWithData:[Trame dataUsingEncoding:NSASCIIStringEncoding]]; Info.text = [NSString stringWithFormat:@"%@%@%@",Info.text, data, @"\r"]; [outputStream write:[data bytes] maxLength:[data length]]; NSLog(@"La data est %@",data);
La valeur data envoyée à l'automate (visible dans le log) est <00000000 00060106 5c783030 5c783030 5c783030 5c783030>
Voila donc le soucis, il semble que le programme n'ait pas interprété \x09 comme un hexadécimal mais plutôt comme une suite de caractères (\ - x - 0 et 9) et traduire chaque caractères en ASCII.
Ma question est la suivante, existe t'il une autre méthode pour concaténer? A t'on réalisé une mauvaise déclaration des variables? Autres ?
Le problème vous paraitra peut-être évident et je l'espère.
Si je ne suis pas clair faites le moi savoir.
Merci de votre aide.
A bientôt
Giroquoi
Partager