Traitement d'une entrée analogique
Traitement d'une entrée analogique
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
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
Re: Traitement d'une entrée analogique
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.
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.
Re: Traitement d'une entrée analogique
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 ) .
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 ) .
Re: Traitement d'une entrée analogique
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 !
J'essaye de passer ça dans un PLCSim tout à l'heure pour regarder/comparer !
Re: Traitement d'une entrée analogique
hello
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)
@+
parce qu'un pointeur chez Siemens pointe un bit et pas un octet (8 bits)Effectivement j'ai deja vu ce genre de manip (decalage de 3 bit ) sans vraiment comprendre le pourquoi du comment
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)
@+
Re: Traitement d'une entrée analogique
steph68,
Ha ! Donc le 8 c'est un pur hasard .
par contre dans mon cas le +2 sais tu as quoi il correspond ?
Ha ! Donc le 8 c'est un pur hasard .
par contre dans mon cas le +2 sais tu as quoi il correspond ?
Re: Traitement d'une entrée analogique
ben c'est pour lire PIW850 à partir d'un paramètre qui vaut 848, c'est logique ?!par contre dans mon cas le +2 sais tu as quoi il correspond
à 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 ...
@+
Re: Traitement d'une entrée analogique
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 )
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 )
Re: Traitement d'une entrée analogique
j'aime pas la notation anglaise
je te fais un pas à pas détaillé:
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)
on calcule une adresse qui correspond au bit 0 de (#add + 1)
si Add = 100 par ex, on copie l'entrée I101.0 dans #status.erAsh
on calcule une nouvelle adresse qui est 4 bits plus loin que la précédente (donc #point = #binary + P#0.4)
si Add = 100 par ex, on copie l'entrée I101.4 dans #status.scalOk
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
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
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
@+
je te fais un pas à pas détaillé:
Code : Tout sélectionner
L 0
A #En
JCN end
Code : Tout sélectionner
L #Add
L 1
+I
L 8
*I
T #binary
Code : Tout sélectionner
A I[#binary]
= #status.erAsh
Code : Tout sélectionner
L #binary
L P#0.4
+D
T #point
Code : Tout sélectionner
A I[#point]
= #status.scalOk
Code : Tout sélectionner
L #add
L 2
+I
L 8
*I
T #point
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
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
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
@+
Re: Traitement d'une entrée analogique
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 !
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 !


