Connexion 1510SP-1 et enregistreur E+H RSG35

Forum traitant des automates industriels de marque Siemens.
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: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par andala »

Bon... suite a la doc du fournisseur, c'est plus compliquée que prévu
en gros, j'ai encore besoin de vous :? :lol:

Je vous explique :
J'ai des valeurs en int que je dois envoyer a mon esclave modbus. Jusque la tout va bien
Je dois envoyer ma données sur 3 registre :
registre 200 (Correspond a 40201 sur TIA)
registre 201 (Correspond a 40202 sur TIA)
registre 202 (Correspond a 40203 sur TIA)

Le registre 200 doit être envoyé en real et dois avoir la valeur 16#80. La, j'y arrive, rien de sorcier
par contre je dois écrire dans les registres 201 et 202 aussi en real, la valeur que je souhaite envoyer (car le 201 prend les 4 premier chiffre en hexa et le 202 prend les 4 derniers, dans ce style : pour une valeur de 42F6E979 par exemple, je dois envoyer comme suit : 201=42F6 et 202=E979) et c'est la ou mon cerveau a fondu !
Je ne comprend pas comment je peux écrire une valeur dans 2 variables ??? Sur Unity ou PL7 je m'en serais sortie mais la... je seche !
Vous pouvez m'aider pour ça ?
merci d'avance.... ENCORE ! :D
Une bonne action en entraine toujours une autre
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par philou77 »

Salut !

Ton registre 200 ne peut être un real, car les registres en modbus sont sur 16 bits et les real sont eux sur 32 bits..
Il est donc normal d'envoyer un real (32bits) sur 2 registres (2x16bits) 201 et 202 .

En admettant que ton real soit adressé à %MW100 dans l'automate, ton real occupe %MW100 et %MW101 :
- il te suffit d'écrire depuis l'adresse %MW100 2 registres ...

En admettant que les octets et mots soient dans le bon ordre, ce qui n'est pas sûr !

voir ici pour le format d'un real : http://www.plccenter.cn/Siemens_Step7/F ... zahlen.htm
Modifié en dernier par philou77 le 02 mars 2022, 13:07, modifié 1 fois.
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7806
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par itasoft »

slts,
Les registres sont toujours typés, envoyer une photo de la doc ou ça parle de ces registres
Automaticien privé (de tout)
itasoft@free.fr
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: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par andala »

voici le lien de la doc modbus : https://www.transfernow.net/dl/20220302ydvnP3UP
c'est a la page 9
cordialement
Une bonne action en entraine toujours une autre
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par philou77 »

Re !

Oui, ok.

Voir ici : 2.6.10.4 Status of the floating point number
Le registre 200 est pour dire que ton real est correct (c'est invariable #80)
Ensuite ton real est dans les 4 octets(2 mots) suivants

Voir ici : 2.6.10 Structure of the process values
La il y a la description du format de stockage de ton real !
Octet 0 -> signe + exposant
Octet 1 -> Exposant + Mantisse
Octet 2 -> Mantisse
Octet 3 -> Mantisse

ce qui est du little endian, contrairement à siemens qui est du big endian !

il te faudra faire une petite fonction pour passer du big endian au little endian avant de l'envoyer par modbus

Little endian <-> Big endian
Octet 0 - Octet 3
Octet 1 - Octet 2
Octet 2 - Octet 1
Octet 3 - Octet 0


on suppose ton real en mw100
utilise une adresse tampon (disons à partir de MB200)

L MB100
TMB203
LMB101
TMB202
LMB102
TMB201
LMB103
TMB200


à partir de MB200, tu as ton real en little endian (normalement)
Modifié en dernier par philou77 le 02 mars 2022, 20:26, modifié 2 fois.
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :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: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par andala »

J'ai programmé un FB comme suit :
sdertyu.jpg
donnée du FB :

Input
input_value Int 0.0 0

Output
output_status Real 2.0 16#80
output_value1 Real 6.0 0.0
output_value2 Real 10.0 0.0

Static
int_to_dint DInt 14.0 0
Dint_to_int_b1 Int 18.0 0
Dint_to_int_b2 Int 20.0 0
int_b1_to_real Real 22.0 0.0
int_b2_to_real Real 26.0 0.0


Je sais pas si ce que j'ai fait est cohérent mais bon ^^
Une bonne action en entraine toujours une autre
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par philou77 »

Re !

Il y a pas de conversion a faire, il faut juste mettre les octets de ton real d'origine au bon endroit dans la zone que tu va transférer !

C'est juste une question d'octets dans l'ordre (ou le désordre, comme le tiercé !)

à mon humble avis, il suffit d'écrire le petit bout de code de mon message précédent (adapté à tes variables..)

Et encore une fois, le mot #080 N'EST PAS un REAL mais un simple WORD

Post la partie ou tu envoies tes données sur le modbus stp
Modifié en dernier par philou77 le 02 mars 2022, 20:26, modifié 1 fois.
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par philou77 »

Re !

Ca me tracassait d'avoir peut être ('sûrement') dit une bêtise car le Modbus est big endian normalement, alors j'ai vérifié !
Sans titre 2.jpg
Chez siermens, les MD, MW, et MB occupent la même zone mémoire.


Je suppose que tu utilises un bloc MODBUS_MASTER

il te faut donc ranger tes données dans ton DB DATA_PTR
Soit en octets (il faudra écrire 6 Octets)
Adresse DBB 0 -> #00
Adresse DBB1 -> #80
Adresse DBB2 -> Octet MB0 de ton real
Adresse DBB3 -> Octet MB1 de ton real
Adresse DBB4 -> Octet MB2 de ton real
Adresse DBB5 -> Octet MB3 de ton real

Soit en Mots (il faudra écrire 3 mots)
Adresse DBW 0 -> #080
Adresse DBW 2 - >Mot MW0 de ton real
Adresse DBW4 -> Mot MW2 de ton real

tu peux regarder ici :https://www.google.com/url?sa=t&rct=j&q ... akUlfUsxF9
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :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: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par andala »

Re,
J'utilise un bloc MB_client pour envoyer mes données sur l'enregistreur pour info.

En fait, sur Unity pro, on arrive facilement a créer une variable et lui affecter un %M/MW mais ici, j'y arrive pas, malgré ma formation Siemens qui date de 2 semaine, a vraiment comprendre comment faire.
J'ai créé un bloc DB ou j'ai décoché l’accès au bloc optimisé car je me souviens quand même que c'est que comme ça que je peux être sur d'affecter les bonnes valeurs aux bonnes zones mémoires.

Pour faire simple, prenons un exemple :
Je veux envoyer la variable (int) qui est l'image de mon capteur de débit, (disons la tag "debit_eau_1") et je souhaite l'envoyer sur les registre 209, 210 et 211.
Je fait un FB avec une patte pour l'entrée, 3 pattes pour la sortie:
patte de l'entrée : debit_eau_1
patte de sortie 1 : toujours égale à 16#80
patte de sortie 2 : ???
patte de sortie 3 : ???

Je me dis alors :
Je créé un DB avec tout ce dont j'ai besoin pour la connexion puis un array[0..35] to int pour avoir mes 16 enregistrements possibles maximum disponible (nomons-le "send_value") que j'attribu à la patte MB_data_PTR du MB_Client. (et une tag pour la connexion en Tcon_ip_v4 évidement)

A partir de la, il suffirait, en Unity, que je donne la valeur %MW400 (par exemple) à send_value[0] puis, la valeur %MW401 (par exemple) à send_value[1], etc...
Ce qui me permettrai ensuite d'inscrire debit_eau_1 dans le %MD401 pour que ça fonctionne.
Le problème c'est qu'en Siemens j'arrive pas bien a comprendre comment eux fonctionne pour ce type d'opération.

Si quelqu'un peu m'éclairer la dessus, ce serai top!

Philou77 :
Quand tu dit : " Il y a pas de conversion a faire, il faut juste mettre les octets de ton réal d'origine au bon endroit dans la zone que tu va transférer !" Il n'y a pas de real d'origine; je suis en int pour ma donnée
puis : "Et encore une fois, le mot #080 N'EST PAS un REAL mais un simple WORD" tu veux dire que c'est juste cette valeur la qui est en Word ou les 3 registre a envoyer ?

Merci encore d'avance ^^
Une bonne action en entraine toujours une autre
DurandO
Maître du binaire
Maître du binaire
Messages : 482
Enregistré le : 21 mars 2021, 15:31

Re: Connexion 1510SP-1 et enregistreur E+H RSG35

Message par DurandO »

Bonjour,
si ta valeur est un entier, ta conversion est bonne : int ->Dint, Dint--> Real.
Pour ta table d'émission, tu peux déclarer des datas dans tes paramètres de bloc FB comme ceci :

Code : Tout sélectionner

	Input									
	Valeur1	Int	0	Non rémanent	True	True	True	False		
	Valeur2	Int	0	Non rémanent	True	True	True	False		
	Valeur3	Int	0	Non rémanent	True	True	True	False		
	Valeur4	Int	0	Non rémanent	True	True	True	False		
	Valeur5	Int	0	Non rémanent	True	True	True	False		
	Output									
	InOut									
	Static									
	Data1	Struct		Non rémanent	True	True	True	False		
	Byte0	Byte	16#00	Non rémanent	True	True	True	False		
	Byte1	Byte	16#80	Non rémanent	True	True	True	False		
	Value	Real	0.0	Non rémanent	True	True	True	False		
	Data2	Struct		Non rémanent	True	True	True	False		
	Data3	Struct		Non rémanent	True	True	True	False		
	Data4	Struct		Non rémanent	True	True	True	False		
	Data5	Struct		Non rémanent	True	True	True	False		
	Temp									
	EntierDouble	DInt								
	Constant									
										

Tu fait ta conversion simplement comme ceci : Exemple
Répondre