-
WRITE VAR sur Unity Pro
Bonjour,
J'utilise la fonction WRITE_VAR pour envoyer des requêtes Modbus RTU sur un contrôleur avec Unity Pro depuis un automate Schneider M340.
La fonction utilise un tableau INT pour envoyer les données. Le problème est que mes données sont en bit, word et dword. pour ce qui est des Word, pas de souci, c'est le même format. A priori je devrais pouvoir me débrouiller avec les bit mais je n'arrive pas à envoyer de double mot du fait du format INT du tableau d'émission.
Quelqu'un aurait il une idée ?
Merci d'avance.
Pascal.
-
wwwwwwwwww
slts,
pour les bits il faut les copier sur des mots (INT ou WORD)
Pour les DWORD ça équivaut à envoyer 2 mots WORD
ceci dit tu dois envoyer ça ou ? vers quoi ? ???
Exemple pour envoyer le tableau %MW100 à %MW110 vers un autre automate M340 (B)
-Sur automate M240 (A) déclarer une variable DWORD_A de type DWORD à l’adresse absolue %MW100 (ça occupe %MW100 et %MW101)
-Sur automate M240 (B) déclarer une variable DWORD_B de type DWORD à l’adresse absolue %MW100
Après le WRITE_VAR , On doit retrouver la valeur de DWORD_A de l’automate (A) dans la variable DWORD_B de l’automate (B)
Compris ?
itasoft@free.fr
-
2 pièce(s) jointe(s)
Salut,
Merci pour ta réponse.
En fait il s'agit d'un contrôleur d'axe électrique en Modbus RTU sur 16 mots, position, accélération, décélération, etc ... Tout ce qui est relatif à une position est en DWORD. J'ai créé mon tableau mais visiblement on ne peut le créer qu'en INT. J'ai adressé mes variables tableau depuis %MW100. Lorsque je crée ma variable position en DWORD elle ne passe pas dans le tableau (incompatibilité de type).
ça parait surement bête pour un pro mais en TIA Portal ça ne fonctionne pas pareil (je maîtrise, unity j'ai découvert vendredi) quant à GP pro (où mon pilotage Modbus RTU fonctionne nickel) c'est encore plus simple donc je ne peux pas m'en inspirer.
Pièce jointe 401695Pièce jointe 401696
voici comment j'ai défini ça mais tout ce qui est en DWORD (position, area 1, area 2 et INP) impossible de le renseigner.
Une idée ?
Merci d'avance
Désolé si je parais largué mais là je suis en phase d'apprentissage ;), Je bosse les docs mais là je dois trouver pour avancer.
Pascal.
-
1 pièce(s) jointe(s)
wwwwwww
slts,
c'est normal , c'est un tableau de INT , il faut pas utiliser de tableau mais des variables indépendantes avec chacune une adresses absolue,
EX:
Data_emission_00 DWORD %MW100
Data_emission_01 DWORD %MW102
Data_emission_02 DWORD %MW104
Data_emission_03 WORD %MW106
Data_emission_04 WORD %MW107
Data_emission_05 WORD %MW108
Pièce jointe 401719
-
Hello,
Merci de ta réactivité, c'est vraiment génial :)
Si je comprends bien je crée une variable position en DWORD à l'adresse %MW102, etc ...
J'essaie ça lundi, j'ai hâte de gérer ça, après j'attaque un contrôleur en Ethernet/IP sur ma carte NOC401 :)
Encore merci.
Pascal.
-
wwwwwwww
slts,
la table d’émission doit être obligatoirement un tableau de INT , Sinon l'autre façon de faire sans utiliser aucune adresses absolues (%MW) ni dans le Tableau
pour envoyer des mots doubles 32 bits type DINT il faut ranger les poids faibles et forts du mot dans 2 mots du tableau
EX :
Déclarer la variable VITESSE Type DINT et y mettre la valeur de la vitesse ,pas mettre d’adresse absolue (%MW)
VITESSE:=123456;
(* Ranger la vitesse dans 2 mots INT du tableau *)
Data_emission[0]:=LOW_INT(VITESSE);
Data_emission[1]:=HIGH_INT(VITESSE);
-
Salut,
J'ai noté, je viens de recommencer mon programme suivant ta dernière remarque sans utiliser les adresses absolues.
J'essaie ça demain en espérant que mon axe bouge.
Je ne ferme pas la discussion tout de suite, je te tiendrais au courant demain. Si ça marche ce sera quand même grâce à toi.
Encore merci :)
Pascal.
-
1 pièce(s) jointe(s)
Salut,
Désolé j'ai travaillé sur un autre projet cette semaine et je ne me suis remis sur unity que vendredi.
J'ai bien préparé la trame générale, je pense avoir compris mais je crois avoir des problèmes sur la transmission de bit au final.
J'ai un mot dans mon contrôleur en 90C2 (hexa) qui me permet de mettre sous tension le circuit d'asservissement, le retour à l'origine etc .. (c'est un contrôleur d'axe électrique).
Je galère toujours avec ce maudit format INT sur le bloc WRITE VAR.je pense que mes adresses sont ok puisque j'ai essayé avec les adresses Modbus classique et directement en 90C2 donc c'est ma technique qui doit pas fonctionner.
En fait la première étape est de mettre mon bit 10 du mot en 90C2 à 1 avant de faire quoique soit. Problème, comment écrire directement dans le bit 10 ? De plus ce bit doit impérativement rester à 1 pour toutes les autres opérations.
Voici ce que j'ai fait :
Pièce jointe 403173
En espérant pouvoir bénéficier encore de ton aide.
Merci d'avance.
Pascal.
-
xxxxxxxxxxxxx
Slts,
On ne peut pas commander un bit, On envoi tout le mot INT de 16 bits
Admettons que dans la variable Type INT COMMANDES on as 16 bits de commandes
Bit 0=Marche mis à 1=Marche mis à 0=Arrêt
Bit 1=Sens Avant
Bit 2=Sens Arrière
Ect...........
(*mise à 1 du bit 0 (marche)*)
COMMANDES :=COMMANDES OR 2#0000000000000001
(*mise à 1 du bit 1 (Sens Avant)*)
COMMANDES :=COMMANDES OR 2#0000000000000010
Envoi par WRITE_VAR
(*mise à 0 du bit 0 (pour faire un arrêt)*)
COMMANDES :=COMMANDES AND 2#1111111111111110
(*mise à 0 du bit 1 (arrêt Sens Avant)*)
COMMANDES :=COMMANDES AND 2#1111111111111101
Envoi par WRITE_VAR
-
Salut,
T'es génial. Toujours aussi réactif :)
J'avais pas fais gaffe qu'on pouvait associer un nombre binaire à une valeur INT. Décidément j'ai du mal avec ce format. J'aurais dû embarquer mon M340 pour essayer ça aujourd'hui. Je vais préparer (heureusement j'ai le PC) et lundi matin à la première heure j'essaie, je te tiens au courant.
Encore merci. A lundi ;)
Pascal.
-
1 pièce(s) jointe(s)
Salut,
Allez promis c'est la dernière après je t'embête plus. en fait je galère toujours avec le pilotage des bits. depuis hier je pense que j'ai tout essayé en utilisant ta méthode ( que j'espère avoir comprit) mais je n'y arrive pas. J'ai essayé mes adresses de mots, de bits mais rien n'y fait. j'ai vérifié le câblage, pas de soucis de ce côté là et j'ai refait un test sur un Proface où j'avais développé un programme en Modbus RTU sur ce contrôleur. ça marche nickel. Mais unity je bloque :-(
voici le bloc que j'ai écrit, si tu pouvais juste me dire si tu penses que c'est ok pour toi. J'ai essayé avec %MW en OBJ sur 1 mot (NB), j'ai essayé en %M sur 16 bits (NB), ça ne fonctionne pas. J'ai essayé aussi de renseigner le mot 2#0000000000000001 en mettant l'adresse du bit uniquement (comme je fais sur Proface avec les adresses Modbus en 0000001 pour les coils) et en transmettant un OBJ %M sur un nombre transmis de 1 (NB).
voici le bloc :
Pièce jointe 403813
Par contre j'ai remarqué ce soir que la led de la com série de mon M340 ne clignote pas alors que tous mes paramètres série sont ok.
Si tu me confirmes que mon bloc est valide c'est qu'il y a un problème matériel ou que je zappe une étape pour activer la com.
Dans l'espoir que tu m'aides une dernière fois. j'espère que je vais moins galérer sur l'Ethernet/IP
Merci encore ;-)
Pascal.
-
xxx
Slts,
La première chose à faire c’est de savoir si ça communique , dans le bloc WRITE_VAR
c’est quoi le bit Start_SVON ?
-
Salut,
En fait c'est juste pour me laisser le temps de faire les étapes une par une en forçage. Le but pour l'instant c'est de faire des tests et après de faire une programmation propre.
Les étapes obligatoire c'est :
1 - Passage du contrôleur en mode série Modbus RTU. bit 30(h) à l'adresse 90C2(h)
2 - SVON c'est la mise sous tension du circuit codeur de l'axe électrique bit 19(h) à l'adresse 90C1(h)
3 - SETUP : Le retour à l'origine de l'axe bit 1C à l'adresse 90C1(h). il y a un mot à l'adresse 90C1 avec plusieurs bit de fonctions.
Après on peut faire les opérations de mouvement en laissant le bit série et le bit SVON à 1 en permanence.
Du coup j'ai ajouté 3 contacts Start série, SVON et SETUP pour les forcer un par un une fois que j'ai chargé le programme. Ils disparaitront dans le programme puisque j'ai des retours de contrôles ( que je lirais avec READ_VAR du coup). Si jamais j'arrive à comprendre comment envoyer les requêtes je devrais pour lire les retours ( enfin j'espère).
Je pense avoir comprit tes explications sur la trame, j'ai fait un tableau INT de 16 mots, j'ai convertie les doubles mots de position etc.. en High et Low pour les faire entrer dans le tableau après j'enverrais les 16 mots de ma trame (je croise les doigts). Mais sans passer par les étapes cités en début de réponse je ne peux rien faire.
Je pensais pas coincer à ce point, je dois rater un détail.
Pascal.
-
test com
Slts,
Avant toutes chose il faut constater que la communication fonctionne,
pour ça faire une lecture avec le bloc READ_VAR et lire une adresse et mettre la valeur lue dans une variable de type INT ex : VARINT0
Dans une table d’animation mettre une valeur quelconque dans VARINT0 si cette valeur est écrasée par la valeur lue ça veut dire que ça communique si cette valeur reste ça veut dire que ça communique pas
Pour les tests le bloc READ_VAR doit être commandé par un front montant du bit horloge 100ms %S5 mais on ne peut pas faire de front montant sur le bit %S5 alors il faut d’abord le copier un bit ex : %M5 et faire le front montant avec ce bit. Comme dans mon exemple sur le message du 05/08/2018 à 16H59
Mettre un time Out dans le 3ème mot du tableau Management sinon ça bloque le bloc READ_VAR
Bb
-
Salut,
J'avais remarqué le bit système %S5 ajouté sur un des schémas mais je reconnais que je n'ai pas été vérifier à quoi il correspondait je suis désolé.
Je vais tester la com avec tes indications. Demain férié, jeudi il va falloir que je me mette sur autre chose, vendredi matin j'essaie. Comme j'ai mon PC je vais pouvoir préparer ça ce soir.
Merci de ta patience c'est vraiment sympa.
Pascal.
-
ok
slts,
OK,
Pour les tests je dirais même d'utiliser le bit horloge %S6 (1s) au lieu du bit %S5 (100ms) pour les tests il vaut mieux ralentir la COM
-
2 pièce(s) jointe(s)
Salut,
C'est bon j'ai préparé mon test.
Je peux faire mon retour à l'origine par un logiciel indépendant et ensuite j'ai un bit de retour qui est obligatoirement à 1 ensuite à l'adresse 9084 donc je vais essayer de lire ça. j'ai ajouté le time out au mot 3.
Pièce jointe 404004
Pièce jointe 404008
Je ne sais pas si je vais tenir jusqu'à vendredi, je vais prioriser ça demain matin.
Je te tiens au courant.
Pascal.
-
1 pièce(s) jointe(s)
Salut,
je suis sur mes tests et je viens de valider que la com est ok. J'ai bien la led série qui clignote et lorsque je déconnecte j'ai une erreur de communication sur mon contrôleur ( normal). J'arrive à lire la position de mon axe ( que je déplace avec un logiciel indépendant).
Par contre, l'écriture/lecture de bit, impossible. J'ai essayé les adresses que j'utilise dans mon Proface, les adresses que j'utilise sur un simulateur Modbus ( Modbus doctor). Dans les 2 cas ça marche mais pas avec le Schneider. J'ai mis des time out sur mes blocs et je les pilote avec les bits %S5 et %S6 pour la lecture et les adresses des mots 9084h et 90C1h.
Pièce jointe 404231
Je suis désespéré ( pas d'inquiétude sur la position c'est au centième de mm)
Pascal.
-
lect
slts,
donc le READ_VAR pour la lecture de l'adresse 9084h fonctionne c'est bien ça ?
-
Salut,
Non, le 9084h c'est 16 bits de validation qui sont l'image des 16 bits de commande à l'adresse 90C1h.
Ensuite il y a les adresses de données ( lecture vitesse, position, etc.. et écriture vitesse, position, accélération, etc ...), c'est ça qui fonctionne. A priori tout ce qui est données de mot je lis nickel, je ne peux pas envoyer de trame. du fait qu'un des bits doit être à 1 en permanence avant toutes opérations de pilotage.
Ce sont uniquement les bits que je n'arrive ni à lire, ni à écrire.
Encore que, bizarrement, mon bit de passage du contrôleur en liaison série semble fonctionner. Il est seul sur un mot et j'envoie "1" à l'adresse du bit. L'adresse du mot est en 90C2h et l'adresse du bit est 30h.J'envoie un bit %M, sur l'adresse et apparemment ça passe l'automate en liaison.
Ce qui est bizarre c'est que le rapport ne semble pas donner de défaut en retour.