Liaison Modbus TCP ET200 1510 SP

Forum traitant des automates industriels de marque Siemens.
Avatar du membre
Sycon88
Première mise en service
Première mise en service
Messages : 64
Enregistré le : 22 févr. 2019, 17:43
Localisation : Vosges

Liaison Modbus TCP ET200 1510 SP

Message par Sycon88 »

Bonjour à tous,

Je suis entrain de paramétrer des blocs de liaisons modbus tcp MB_CLIENT dont je me suis déjà servie.

Mais la je rencontre un problème, le bloc MB_client dialogue bien avec l'appareil car je vois les paquets d'échanges mais les valeurs en REAL ne correspondent pas entre le MB_DATA_PTR et l'appareil ou je viens chercher les infos.


Mon bloc MB_ client a les paramètres suivant :

-REQ cadencé a 10Hz
-Disconnect FALSE
-MB_MODE en 0
-MB_DATA_ADRR 40130 (Mapping en photo)
-MB_DATA_LEN 2

J'ai bien le 7006 en status et le busy done ce cadence.

Je pense que c'est un problème soit de paramétrage du bloc notamment l'adressage du DATA pointeur ou de format de variable.

Mapping :
Sans titre2.png

Merci à vous pour votre aide :)
Avatar du membre
maxpeigne
Dieu du process
Dieu du process
Messages : 772
Enregistré le : 11 oct. 2015, 17:31
Localisation : Nord pas de calais

Re: Liaison Modbus TCP ET200 1510 SP

Message par maxpeigne »

Bonjour,
Sycon88 a écrit : 06 mars 2022, 17:33 Je suis entrain de paramétrer des blocs de liaisons modbus tcp MB_CLIENT dont je me suis déjà servie.
Tu t'as déja utilisé avec un Reel?
Cela fonctionne avec des DINT?

Quand tu dis que les Reels ne correspondent pas, ce n'est pas une histoire d'inversion d'octet?
CAD.png
http://automacile.fr - Site et tutoriels sur l'arduino.
Avatar du membre
Sycon88
Première mise en service
Première mise en service
Messages : 64
Enregistré le : 22 févr. 2019, 17:43
Localisation : Vosges

Re: Liaison Modbus TCP ET200 1510 SP

Message par Sycon88 »

Oui je l'ai déjà utilisé en float et sur mon data_ptr en real ça marche avec un jumo logoscreen nt

MB_ADRR : 44695

Mapping :
Sans titre.png
Je devrais avoir une valeur de température en °C au lieu de ça j'ai des valeurs en 10^-6 qui bouge

J'ai oublier de préciser que c'est un appareil de la marque SCAN concube D330.
Avatar du membre
andala
Créateur de langage
Créateur de langage
Messages : 505
Enregistré le : 19 déc. 2016, 10:24
Localisation : Atlantide

Re: Liaison Modbus TCP ET200 1510 SP

Message par andala »

Salut,
maintenant que je suis expert en Modbus TCP pour le Siemens je peux t'aider :roll: (viewtopic.php?p=40405#p40405) lol

Ton MB_MODE = 0 donc tu fait de la lecture de donnée :
Sur la doc du materiel c'est indiqué (page 26 https://www.qsenz.nl/application/files/ ... 200114.pdf)=>

Code : Tout sélectionner

Mapping of Parameter specific Input Register :
Input register,16bit, RO => parameter 1 result :
Tag name => bmP1Status
Address => 0x0080
Type => bitmask
Length =>1
R/W => R
Description => Para.1 status
Address=>128

Tag name => xP1Value
Address => 0x0082
Type => float
Length =>1
R/W => R
Description => Para.1 result
Address=>130
Il faut donc mettre la valeur 40129 à ton MB_DATA_ADDR puis, à partir de la logiquement je dirais que tu as, dans ton MB_DATA_PTR:
Premiere valeur :
PTR[1] = status de la connexion
PTR[2] = 1ere partie de la valeur
PTR[3] = 2eme partie de la valeur

Deuxième valeur :
PTR[4] = status de la connexion
PTR[5] = 1ere partie de la valeur
PTR[6] = 2eme partie de la valeur

Etc...

D'abord, bien allée dans propriété et désactiver l’accès au bloc optimisé de ton DB ou il y a tes variables PTR ensuite, par exemples, si le numéro de décalage de ta variable PTR[2] = 22.0 (et logiquement PTR[3] = 24.0) alors il te suffit de convertir ta variable PTR[2] qui est en INT en REAL et la normalement la variable REAL va donc prendre les Bytes 22.0 à 25.0 soit les INT PTR[2] et PTR[3] et donc, tu auras ta bonne valeur.

Dites moi si c'est clair et corrigez moi si je me trompe ;)
Une bonne action en entraine toujours une autre
Avatar du membre
Sycon88
Première mise en service
Première mise en service
Messages : 64
Enregistré le : 22 févr. 2019, 17:43
Localisation : Vosges

Re: Liaison Modbus TCP ET200 1510 SP

Message par Sycon88 »

Salut,

Merci pour ta réponse très explicite j'ai presque tout saisi ;)

Par contre je n'est pas compris comment tu décompose la valeur dans une variable que je reçoit en REAL dans mon DB sur le DATA_PTR en 3 parties de valeurs pour l'adresse 40129. :)

Mon MB_DATA_PTR je l'ai mis dans le même DB de gestion du bloc MB_client, c'est a dire ou il y a le TCON_IP_v4 ça ne pose pas de problème ça ? Même si je désactive l'accès au bloc optimisé ?

J'ai aussi trouvé ça sur le net :
support.industry.siemens.com.png
Vue que je suis en registre d'entrée peut-être qu'il faut que j'utilise l'adressage en 30000 ? Je n'est pas essayé encore :)
Avatar du membre
andala
Créateur de langage
Créateur de langage
Messages : 505
Enregistré le : 19 déc. 2016, 10:24
Localisation : Atlantide

Re: Liaison Modbus TCP ET200 1510 SP

Message par andala »

Sycon88 a écrit : 09 mars 2022, 15:44 Mon MB_DATA_PTR je l'ai mis dans le même DB de gestion du bloc MB_client, c'est a dire ou il y a le TCON_IP_v4 ça ne pose pas de problème ça ? Même si je désactive l'accès au bloc optimisé ?
Non, aucun probleme.
Sycon88 a écrit : 09 mars 2022, 15:44 Par contre je n'est pas compris comment tu décompose la valeur dans une variable que je reçoit en REAL dans mon DB sur le DATA_PTR en 3 parties de valeurs pour l'adresse 40129. :)
En fait, tu reçois 3 valeurs par le modbus (et c'est la ou la doc nous induit en erreur car c'est envoyé en INT x2 et pas réellement en REAL) :
L’état de la connexion : PTR[1] qui est un INT
Ta valeur mesuré sur PTR[2] ET PTR[3] qui est ton REAL (4 bytes) transmis en 2 x INT (2x2 bytes soit bien tes 4 bytes)
Il te suffit juste de mettre un bloc CONVERT avec en IN ton tag PTR[2] et en OUT le tag de ton choix en REAL.

Vu que le INT prend 2 bytes, et que le REAL en prend 4, l'automate va prendre les 2 bytes de PTR[2] mais aussi ceux du PTR[3] car c'est lui qui est a la suite autrement dit, le INT, si il est en 22.0 et 23.0 (2 bytes), le REAL, étant sur 4 Byte va prendre 22.0 et 23.0 mais aussi 24.0 et 25.0 ! Normal car il a besoin de 4 bytes consécutif. Du coup pas besoin de faire quoi que ce soit avec le PTR[3] qui du coup, sera lu implicitement par la conversion

Pour la valeur du MB_DATA_ADDR, c'est bien 40001 + ton numéro de registre (128) soit 40129. je suis pratiquement sur pour le 40000 car je viens tous juste de finir le même type de com d’où mon message au dernier post :lol:

C'est clair pour toi ? :)
Une bonne action en entraine toujours une autre
Avatar du membre
Sycon88
Première mise en service
Première mise en service
Messages : 64
Enregistré le : 22 févr. 2019, 17:43
Localisation : Vosges

Re: Liaison Modbus TCP ET200 1510 SP

Message par Sycon88 »

Ok je crois que j'ai compris :lol:

Si je résume je reçoit deux INT un avec le status de la com 20.0 et l'autre INT 22.0 qui contient le PTR[2] ET PTR[3] que je met dans un bloc convert en input et je sort m'a valeur en REAL :D
Avatar du membre
andala
Créateur de langage
Créateur de langage
Messages : 505
Enregistré le : 19 déc. 2016, 10:24
Localisation : Atlantide

Re: Liaison Modbus TCP ET200 1510 SP

Message par andala »

Sycon88 a écrit : 09 mars 2022, 16:40 Ok je crois que j'ai compris :lol:

Si je résume je reçoit deux INT un avec le status de la com 20.0 et l'autre INT 22.0 qui contient le PTR[2] ET PTR[3] que je met dans un bloc convert en input et je sort m'a valeur en REAL :D
Tu reçois bien 3 INT : Le status sur 1 INT et ta valeur sur 2 INT (ou sur 1 REAL vu que c'est pareil car 1 INT = 2 bytes et 1 REAL = 4 bytes = 2xINT)

Tu rentres PTR[2] en IN, sur le bloc CONVERT et tu sort en REAL sur OUT. Le bloc regarde la valeur d'entrée : La il remarque que c'est un INT (2 bytes) or la sortie lui demande un REAL (4 bytes). Du coup, il se pose la question : "ou vais-je trouver les 2 bytes qui me manque pour la sortie ?" et la il se dit : "et si je prenais les 2 bytes qui suivent ceux que je viens de lire pour avoir les 4 qu'il me faut ?"
Du coup, le PTR[2] qui est sur les bytes 22.0 et 23.0 ne suffisant pas pour le REAL (qui a besoin, je le rappel, de 4 bytes), celui-ci prend aussi le PTR[3] soit les bytes 24.0 et 25.0.
Du coup, pour te sortir le REAL de la conversion, il te prend bien des bytes 22.0 à 25.0 (4 bytes) soit PTR[2] et PTR[3] (2 bytes chacun)

J'ai jamais autant écris le mot "byte" et en plus mon "personnage Modbus" je l'aime maintenant :lol:
Modifié en dernier par andala le 10 mars 2022, 08:24, modifié 2 fois.
Une bonne action en entraine toujours une autre
Avatar du membre
Sycon88
Première mise en service
Première mise en service
Messages : 64
Enregistré le : 22 févr. 2019, 17:43
Localisation : Vosges

Re: Liaison Modbus TCP ET200 1510 SP

Message par Sycon88 »

Vous m'avez beaucoup fait rire dans votre dernier message :lol:

Merci pour les informations c'est tout de suite plus parlant maintenant mais j'aurai jamais pensé que les variables envoyées était décomposées de ce genre. Et la doc induit vraiment en erreur pour le coup..

Je vais essayer ça et je vous tiens au courant dans les jours a venir ;)
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Liaison Modbus TCP ET200 1510 SP

Message par philou77 »

Salut !

J'en remet une couche !

Un bit est la plus petite information numérique (0 ou 1).
Un octet (Byte) c'est un groupe de 8 bits.

Avec les octets, on stocke une valeur binaire qui peut présenter différents formats !


Un INT c'est la représentation Signée d'un entier sur 16 bits (soit 2 octets)
- si on parle d'INT, cela veut dire que l'on donne un sens à ce qu'on lit dans les 2 octets !

Un real c'est la représentation Signée d'un réel sur 32 Bits Signe + Mantisse + Exposant (soit 4 octets)
- si on parle de Real, cela veut dire que l'on donne un sens à ce qu'on lit dans les 4 octets !


Le Modbus communique UNIQUEMENT en Octet !
La notion de registre dans modbus fait référence à un Mot (soit 2 octets)
En fonction de ce que l'on veut lire/écrire, il faudra Recevoir/envoyer plus ou moins d'octet !
Si on lit un REAL , on reçoit les octets du real dans le sens Big Endian.
Pas de conversion a faire car les octet représentent déjà un REAL.
Il faut juste les remettre (MOVE) au bon endroit si besoin.

Convertir c'est passer d'un format à un autre
(c'est à dire attribuer un sens différent à la valeur binaire)
DINT -> real
INT -> BCD
Etc

Par exemple

0000 0000 0100 0000 Valeur Binaire (Word)
ça donne 100 (Octal)
ça donne 64 (INT)
ça donne #40 en Hexa décimal

plusieurs formats et pourtant la même valeur binaire !



Dans le cas de Sycon88,
Cela marchait avant et pas avec son nouveau matériel.
A voir le descriptif des matériels (ancien et nouveau), la différence porte sur le registre de status !
Donc la même programmation avec le nouveau matériel fait qu'il prend le registre de status + le premier registre de son real -> résultat, il n'a pas la bonne valeur !
Il suffit juste d'adapter la lecture de son nouveau matériel afin de prendre en compte les bons octets.

les docs sont en général bien faites.
Le problème est souvent l'interface Chaise / Clavier.
L'automate ne se trompe pas, il fait ce qu'on lui dit de faire (et pas ce qu'on pense lui dire de faire)

amha
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
Répondre