Page 2 sur 2

Re: Traitement d'une entrée analogique

Posté : 25 oct. 2017, 22:31
par djé
Salut,
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 ?
En Siemens les pointeurs (32bits) sont construit (en autre) sur un modèle:
......[N°d'Octet].[N°deBit] allant de 0.0 à 65535.7 soit :
......Codage N°d'octet sur 16 bits et codage n° de bit sur 3 bits.

Admettons tu désires charger un décalage d'adresse de 118 (dw#0000 0000 0111 0110)
si tu écrits:
L 118
T #Idx
L PIW[#Idx] <ici le décalage vaut 14.6 (14*8 +6 =...118 ! :? )

En fait tu vas récuper une valeur 16bit mais à partir de l'adresse PIW14.6 (dw#0000 0000 0000 1110.110)

Donc pour obtenir la bonne valeur de décalage tu décales de 3 bits vers la gauche (ou une multiplication *8) d’où le fameux SLW3.
L 118......(dw#0000 0000 0111 0|110)
SLW 3......(dw#0000 0011 1011 0|000)
T #Idx
L PIW[#Idx]

et là tu récupères ta valeur de 16 bits à partir de l'adresse PIW118 (dw#0000 0000 0111 0110.000)

Il n'y a que les zone Tempos (T), Compteur (Z) et DB qui peuvent être indexés directement sans décalage avec une valeur 16 bits:
L 118
T #Idx
AUF DB[#Idx]

Pour un très bon condensé de la programmation en Siemens(S7) je te conseille de lire cet excellent fascicule ici. Tu y trouveras qq explication supplémentaires sur la structure des pointeurs à la fin de la doc

Re: Traitement d'une entrée analogique

Posté : 26 oct. 2017, 09:27
par djé
En fait tu vas récuper une valeur 16bit mais à partir de l'adresse PIW14.6 (0000 0000 0000 1110.110)
tu vas surtout planter la CPU si l'ob121 n'est pas chargée car le décalage 14.6 n'est pas valide pour un accès mot.

Re: Traitement d'une entrée analogique

Posté : 26 oct. 2017, 10:22
par steph68
pour compléter:

le pointeur SIEMENS permet d'adresser un seul bit en n'utilisant qu'une seule variable (un seul index)

admettons que tu souhaites pointer l'entrée I4.5

tu pourrais dire Adresse = 4 et Bit = 5
mais il te faudrait 2 variables pour l'exprimer
parce que tu raisonnes avec une adresse sur un octet (4ème octet)

si tu raisonnes avec une adresse sur un bit (37ème bit = 4 * 8 + 5), une seule variable te suffit

évidemment si tu accèdes à un mot entier par ex, la variable "Bit" n'a pas de sens et elle doit être égale à 0 (sinon erreur)

la notation P#adresse.bit est juste visuelle dans l'éditeur (tout comme on peut exprimer une constante en hexa, en octal, en décimal ou en binaire)
pour l'automate, cette notation correspond à la valeur "adresse * 8 + bit"

maintenant dans ton programme, tu as un paramètre #Add qui est une adresse sur un octet
et pour faire de l'indexation, il te faut une adresse sur un bit
donc il faut convertir la valeur par le petit calcul *8 ou décalage de 3 vers la gauche (ce qui est strictement identique)

@+

Re: Traitement d'une entrée analogique

Posté : 27 oct. 2017, 20:06
par Yacub
Steph68, Djé merci pour vos explications précieuses qui vont m'aide a progresser, je potasse le document plusieurs fois pour que cette notion de pointeur soit entièrement maîtrisé et pour que ça rentre une bonne fois pour toute .