Traitement d'une entrée analogique

Forum traitant des automates industriels de marque Siemens.
Yacub
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 102
Enregistré le : 07 févr. 2016, 18:27

Traitement d'une entrée analogique

Message par Yacub »

Bonjour,

J'ai une petite question sur un script que je ne comprends pas tres bien,
Je dispose d'un capteur de poids ayant l'adresse PIW848, et le traitement de l'information est en peu particulier je trouve .
Dans mon programme cette entree analogique n'est lu ou écrite nulle part, par contre j'ai trouvé des blocs FB (un pour chaque capteur) avec un paramétre d'entée qui est un integer ecris en dur et j'en ai un qui est "848" .

voici ce que j'ai a l'interieur de ce bloc :

L #Add ( parametre d'entrée ici 848)
L 2
+I
L 8
*I
T #point
L PIW [#point]
L 0
<I
JC end
TAK

end: T # Meas

si je comprends bien ce code vient lire l'entrée PIW6800, et transfert le contenu dans le OUT #Meas si le contenu est superieur a 0. Le probleme c'est que je n'ai pas d'entre PIW6800 pourtant ca marche !

Moi si je dois taper un programme dans lequel je souhaite mettre un offset de 2, et multiplier la valeur de mon capteur par 8 j'aurais fait ca :

L #Add
T PIW [#Add]
L 2
+I
L 8
*I
T #Temp
L 0
<I
JC end
TAK

end: T # Meas
R26R
Aguerri de l'automation
Aguerri de l'automation
Messages : 92
Enregistré le : 19 juin 2016, 20:04

Re: Traitement d'une entrée analogique

Message par R26R »

Salut,

Si je dis pas de connerie, quand tu utilise un pointeur : PIW[x], il faut faire un décalage de 3 bits de la valeur x.

Je sais que ce que je dis est pas clair, mais c'est comme si tu faisais ce code :

L #Add ( parametre d'entrée ici 848)
SLD 3
T #point
L PIW [#point]
L 0
<I
JC end
TAK

end: T # Meas

En gros ça permet de passer "x" du format double mot à format pointer...

Et par conséquent je te confirmer que ça va lire l'adresse 848 et pas 6800

Bon y'en a qui expliqueront peut être mieux, mais je crois que c'est ça, à confirmer.
Yacub
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 102
Enregistré le : 07 févr. 2016, 18:27

Re: Traitement d'une entrée analogique

Message par Yacub »

Merci pour ta reponse R26R,

Effectivement j'ai deja vu ce genre de manip (decalage de 3 bit ) sans vraiment comprendre le pourquoi du comment .
Par contre ici c'est différent non ? L'instruction SLD 3 , et L 2, +I reviens a la même chose ?
Il n'y a qu'une seule chose que je comprends, c'est la signification de la valeur 8 ( elle corresponds a un nombre de tour de mon tambour, en gros la valeur de poids sur le crochet de mon treuil correspond a 8 x la valeur du capteur de poids car il se trouve en amont du systeme ) .
R26R
Aguerri de l'automation
Aguerri de l'automation
Messages : 92
Enregistré le : 19 juin 2016, 20:04

Re: Traitement d'une entrée analogique

Message par R26R »

Effectivement je suis peut-être allé un peu vite et comme ça juste avec un papier j'ai du mal à expliquer, ce que j'ai dit semble faux au final.

J'essaye de passer ça dans un PLCSim tout à l'heure pour regarder/comparer !
steph68
Codeur fou
Codeur fou
Messages : 275
Enregistré le : 21 oct. 2015, 08:23

Re: Traitement d'une entrée analogique

Message par steph68 »

hello
Effectivement j'ai deja vu ce genre de manip (decalage de 3 bit ) sans vraiment comprendre le pourquoi du comment
parce qu'un pointeur chez Siemens pointe un bit et pas un octet (8 bits)

donc le 100ème octet et 3ème bit, reviens à l'adresse 803 (803ème bit)

ça permet de tester facilement un bit, mais ça complique un peu le calcul de l'adresse (décalage de 3 pas, soit *8)

@+
Yacub
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 102
Enregistré le : 07 févr. 2016, 18:27

Re: Traitement d'une entrée analogique

Message par Yacub »

steph68,

Ha ! Donc le 8 c'est un pur hasard .
par contre dans mon cas le +2 sais tu as quoi il correspond ?
steph68
Codeur fou
Codeur fou
Messages : 275
Enregistré le : 21 oct. 2015, 08:23

Re: Traitement d'une entrée analogique

Message par steph68 »

par contre dans mon cas le +2 sais tu as quoi il correspond
ben c'est pour lire PIW850 à partir d'un paramètre qui vaut 848, c'est logique ?! :mrgreen:

à mon avis, il manque un bout du programme et celui-ci fait une boucle pour scruter plusieurs adresses

donc tu fais +2 à chaque itération pour lire le mot suivant (1 mot = 1 PIW = 2 octets)

mais comme tu n'as pas tout copier / coller ici et que ma boule de cristal est cassé ...

un truc qui boucle jusqu'à ce qu'une des entrées est < 0 ... (d'où le JC end)

ou alors le gars s'est planté et en dernière minute a mis un offset pour rattraper le coup sans avoir à se palucher toutes les constantes qui trainent dans le programme

donc si tu cherches le bloc qui lit PIW848, faut trouver celui avec le paramètre 846 ...

@+
Yacub
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 102
Enregistré le : 07 févr. 2016, 18:27

Re: Traitement d'une entrée analogique

Message par Yacub »

steph68,


Voici le code complet du bloc, merci pour ton aide.
Pour infos ce bloc est appele plusieurs fois (pour chaque capteur) est le parameter d'entree "Add" correspond a a la PEW (ici par exemple c'est la PEW272 et la valeur de Add vaut bien 272 )
Fichiers joints
Untitled.png
Untitled 2.png
steph68
Codeur fou
Codeur fou
Messages : 275
Enregistré le : 21 oct. 2015, 08:23

Re: Traitement d'une entrée analogique

Message par steph68 »

j'aime pas la notation anglaise :evil:
je te fais un pas à pas détaillé:

Code : Tout sélectionner

L 0
A #En
JCN end
on met 0 dans l'accu, et si l'entrée En = 0 on saute à la fin (l'accu sera transféré dans la sortie Meas par la suite)

Code : Tout sélectionner

L #Add
L 1
+I
L 8
*I
T #binary
on calcule une adresse qui correspond au bit 0 de (#add + 1)

Code : Tout sélectionner

A I[#binary]
= #status.erAsh
si Add = 100 par ex, on copie l'entrée I101.0 dans #status.erAsh

Code : Tout sélectionner

L #binary
L P#0.4
+D
T #point
on calcule une nouvelle adresse qui est 4 bits plus loin que la précédente (donc #point = #binary + P#0.4)

Code : Tout sélectionner

A I[#point]
= #status.scalOk
si Add = 100 par ex, on copie l'entrée I101.4 dans #status.scalOk

Code : Tout sélectionner

L #add
L 2
+I
L 8
*I
T #point
on calcule une nouvelle adresse qui est 2 octets plus loin que #add
on aurait pu faire +12 bits (P#1.4) par rapport à la précédente calculée

Code : Tout sélectionner

L PIW[#point]
L 0
<I
JC end
TAK
si Add = 100 par ex, on interroge l'entrée PIW102
on compare l'infériorité à 0 et si c'est le cas on saute à la fin (ce qui aura pour effet de mettre la sortie Meas à 0) soit une limitation basse de la valeur
sinon on vire le 0 de la pile (TAK = dépilement), pour que ce soit la valeur du PIW qui soit transférée dans la sortie Meas

Code : Tout sélectionner

end: T #Meas
sauvegarde de la dernière valeur manipulée (pile / accu) dans la sortie

le dernier réseau est du combinatoire pour gérer une alarme (FLT)
si acquittement (ACK) alors reset défaut (FLT)
si #En = 1 et #status.scalOk = 1 et #status.erAsh = 0 ou si #En = 0 alors rien (à cause du NOT) sinon FLT est setté

faut lire simplement et ne pas hésiter à fouiller la doc siemens
ce n'est vraiment pas compliqué

il y a 4 octets pour les entrées
les 2 premiers correspondent à un registre de controle (report de défaut par ex) --> soit des drapeaux
les 2 derniers correspondent à la valeur mesurée
il faut se reporter à la doc de ton capteur pour plus d'infos

@+
Yacub
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 102
Enregistré le : 07 févr. 2016, 18:27

Re: Traitement d'une entrée analogique

Message par Yacub »

Steph68,

un grand merci a toi !
Apres avoir jeter une 2 ieme fois un coup d'oeil a ces fameuse carte Siwarex et tes explications sur la nature du *8 et du +2 j'ai enfin compris la logique de ce code.

Visiblement ces cartes sont beaucoup plus complexes qu'une carte ana standard, en gros mon erreur de départ fut de tenter de lire l'adresse de départ de la carte d'entrée analogique siwarex pensant que ce serait pareil que pour une carte d'entée ana classique.

la carte dispose de 2 * 8 octets et la structure pour chaque channel est la suivante :

Avec ca je comprends mieux pourquoi il décale de deux octets a partir de l'adresse de depart ( "Add").
Simplement car l'octets 2 et 3 sont dédiés au retour de la mesure du capteur ( et l'octet 1 comme feedback de l'etat de mon organe de mesure) .

Super ! maintenant je vais tenter de comprendre un peu mieux cette notions de pointeurs car je t'avoue ne pas trop avoir compris l'histoire du décalage aurais tu une lecture ou doc technique a me conseiller la dessus ?

Merci tous le monde pour votre participation a ce topic !
Fichiers joints
Sans titre.png
Répondre