Utilisation du pointeur LIST

Forum traitant des automates industriels de marque Siemens.
raw93270
Apprend le binaire
Apprend le binaire
Messages : 6
Enregistré le : 27 juil. 2021, 09:18

Utilisation du pointeur LIST

Message par raw93270 »

Bonjour,

Je fais appel à votre aide, je suis débutant dans la programmation, je bloque depuis quelques jours sur ce problème, je vous explique:

J'ai un DB où je reçois un code en DINT ( DB4.DBD0 "RECU"),
un DB où des codes (150 codes) sont enregistrés (DB5 "STOCK"),
un DB ou sont stocké des numéro de recettes INT (DB6 "RECETTE"),
Et un DB ou je voudrai copier le code reçu, et le numéro de recette correspondant (DB8 "COPIE").


Je voudrais maintenant comparer le code reçu (DB4.DBD0) avec les codes disponible dans le DB5,
et si un code match je voudrais, copier le code reçu et le numéro de recette correspondant à la même adresse que le code trouvé, dans le DB8.
Je ne sais pas si c'est clair.

Voici ce que j'ai fais mais évidement ça ne fonctionne pas.

LAR1 P#0.0

Next: AUF "STOCK"
L DBD [AR1,P#0.0]
L "RECU".CODE_recu
==D
SPBNB saut // saut si résultat non vrai
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette

saut: +AR1 P#4.0
LOOP Next

Je m'excuse d'avance pour vos yeux.
Pouvez vous me pointer ce qui ne va pas, comment ça pourrai fonctionner.

Merci d'avance
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Utilisation du pointeur LIST

Message par philou77 »

Salut !

1 - N'ouvre pas ton DB systématiquement (AUF) mais une seule fois !!

pour faire un LOOP, il faut une variable ! NEXT est une étiquette de saut dans ton cas.

Exemple pour une boucle qui va de 9 à 0 (exécutée 10 fois donc)

L KF 9
BOUCLE : T MW10

L MW10
LOOP BOUCLE
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
raw93270
Apprend le binaire
Apprend le binaire
Messages : 6
Enregistré le : 27 juil. 2021, 09:18

Re: Utilisation du pointeur LIST

Message par raw93270 »

Salut,

Merci beaucoup pour la réponse, voici ce que j'ai fais:

LAR1 P#0.0

L 30
Next: T #COMPTEUR

AUF "STOCK"
L DBD [AR1,P#0.0]
L "RECU".CODE_recu
==D
SPBNB saut // saut si résultat non vrai
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette

saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next

J'ai fais une simulation, je n'ai toujours rien dans le DB COPIE,

Quand vous dites d'ouvrir le db qu'une seule fois, je l'ouvre avant la boucle mais au 2ème LOOP ça risque de prendre les valeurs du DB RECETTE non ?
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Utilisation du pointeur LIST

Message par philou77 »

re !

tu n'as pas qu'un seul résultat pour ta recherche ?

et il te manque un saut après T_copie pour finir vers une fin propre..
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
raw93270
Apprend le binaire
Apprend le binaire
Messages : 6
Enregistré le : 27 juil. 2021, 09:18

Re: Utilisation du pointeur LIST

Message par raw93270 »

Re,

Voici la nouvelle version avec le saut:



LAR1 P#0.0

L 30
Next: T #COMPTEUR

AUF "STOCK" // ici je compare ce que j'ai dans le DB STOCK
L DBD [AR1,P#0.0]
L "RECU".CODE_recu // avec ce que j'ai reçu ici, est-ce que cette partie est bonne ?
==D
SPBNB saut // saut si résultat non vrai , le saut ici est approprié ?
T "COPIE".COPIE_code // ici transfère ("RECU".CODE_recu)
AUF "RECETTE" //j'ouvre le DB recette
L DBD [AR1,P#0.0] // je charge les valeur de la même adresse que la ou on a trouvé le code (en tout cas c'est ce que je pense)
T "COPIE".COPIE_num_recette //et là, je transfère les valeurs chargées.
SPA Fin

saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next

Fin: NOP 0


Il y a donc 2 valeurs à copier.
Peut-être que je n'ai pas compris la question.
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Utilisation du pointeur LIST

Message par philou77 »

raw93270 a écrit : 27 juil. 2021, 14:29 Re,

Voici la nouvelle version avec le saut:



LAR1 P#0.0

L 30
Next: T #COMPTEUR

AUF "STOCK" // ici je compare ce que j'ai dans le DB STOCK
L DBD [AR1,P#0.0]
....


tu oublies de positionner AR1 à une valeur initiale de 0 je pense...
L DBD[AR1, P#0,0] ne fait que charger l'adresse "AR1" décalée de P#0.0 et en aucun cas ne met P#0.0 dans AR1 !!
il faut charger 0.0 dans AR1 avant de l'utiliser car il peut y avoir n'importe quoi dedans!
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
raw93270
Apprend le binaire
Apprend le binaire
Messages : 6
Enregistré le : 27 juil. 2021, 09:18

Re: Utilisation du pointeur LIST

Message par raw93270 »

Re,

Okey, j'ai ajouté l'initialisation de AR1 en premier, j'ai changé le type des données passant de DINT aux DWORD,
Quand je lance la simulation , j'ai le num de recette "1" qui apparait (valeur de la première adresse du DB RECETTE), mais la partie du code reste à Zéro

voici le nouveau script:

L P#0.0
LAR1 P#0.0

L 7
Next: T #COMPTEUR //ici next

L "RECU".CODE_recu
AUF "STOCK"
L DBD [AR1,P#0.0]
==D
SPBNB saut // saut si résultat non vrai
L "RECU".CODE_recu
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette
SPA Fin

saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next

Fin: NOP 0
Encore merci pour vos réponses, j'apprends et ça me débloque petit à petit
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Utilisation du pointeur LIST

Message par philou77 »

Re !

Ton L P#0.0 en début de prg ne sert a rien.. tu peux le supprimer

Tu recommence à ouvrir ton db dans chaque boucle.. ça remplit une pile d'appel des blocs et tu risque d'atteindre la limite d'appel sur des boucles plus longues..
raw93270 a écrit : 27 juil. 2021, 16:18 Quand je lance la simulation , j'ai le num de recette "1" qui apparait (valeur de la première adresse du DB RECETTE), mais la partie du code reste à Zéro
je comprend pas la phrase ??

quelles sont les valeurs qui sont dans tes DB ?
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
raw93270
Apprend le binaire
Apprend le binaire
Messages : 6
Enregistré le : 27 juil. 2021, 09:18

Re: Utilisation du pointeur LIST

Message par raw93270 »

Bonjour,

J'espère que vous allez bien,
philou77 a écrit : 28 juil. 2021, 11:29
je comprend pas la phrase ??

quelles sont les valeurs qui sont dans tes DB ?
J'avais pas bien compris le concept de l'AR1, AR2

Maintenant je comprends mieux. j'ai pu améliorer le script, et ça fonctionne sauf sur un point

Voici le nouveau script
L "RECU".CODE_recu
T #CODE
AUF "STOCK"
LAR1 P#DBX 0.0
AUF DI 6
LAR2 P#DIX 0.0

L 108
Loop: T #COMPTEUR
U(
L D [AR1,P#0.0]
L #CODE
==D
)
SPBNB non
L D [AR1,P#0.0]
T "COPIE_".COPIE_code // copie valeur 1ere add
L D [AR2,P#0.0]
T "COPIE_".COPIE_num_recette //copie valeur 2eme add
S "recette_trouve" //recette trouvé
R "recette_non_trouve" //recette non trouvé
SPA ok


non: +AR1 P#4.0
+AR2 P#4.0
U(
L #COMPTEUR
L 0
==I
)
SPBB nont

L #COMPTEUR
LOOP Loop

nont: S "recette_non_trouve" // recette non trouvé
R "recette_trouve" //recette trouvé

ok: NOP 0

Si la comparaison est vraie
U(
L D [AR1,P#0.0]
L #CODE
==D
)
Je veux copier les valeurs d'adresse AR1 et AR2, vers mon DB10 "COPIE_"
Capture.PNG
Capture.PNG (3.89 Kio) Vu 2936 fois

Le DB COPIE_
db_copie.PNG
db_copie.PNG (5.26 Kio) Vu 2936 fois
La copie du CODE se fait bien , sauf pour le numero de recette qui ne devrait pas avoir les meme valeur que le code
voici une capture de la simulation:
db_copie_simul.PNG
db_copie_simul.PNG (5.64 Kio) Vu 2936 fois

Je vous joins également des capture des DB STOCK et DB RECETTE

DB STOCK :
db_stock.PNG
DB RECETTE contenant les num de recette
db_recette.PNG

Pourriez vous me dire où est ce que je me trompe, pourquoi j'ai les même valeur copié deux fois.

Je vous remercie d'avance
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2142
Enregistré le : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Utilisation du pointeur LIST

Message par philou77 »

L "RECU".CODE_recu
T #CODE
AUF "STOCK" // CA C'EST BON
LAR1 P# 0.0
a supprimer ................. AUF DI 6
a supprimer ................. AR2 P# 0.0

L 108
Loop: T #COMPTEUR -> ca veut dire charger Accu 1 dans #Compteur
U(
L #CODE
L DBD [AR1,P#0.0] // tu DOIS charger un DBD (double mot dans un db à l'adresse AR1 + le décalage 0.0)
==D
)
SPBNB non
à supprimer ....L D [AR1,P#0.0] // en ayant fait l'inversion d'appel avec #CODE juste avant, tu as la bonne valeur dans ACCU 1
T "COPIE_".COPIE_code // copie valeur 1ere add
AUF DB (OUVRIR LE DB DE RECETTE QUE TU VEUX A CE MOMENT LA)
L DBD [AR1,P#0.0] // tu dois charger un DBD !!
T "COPIE_".COPIE_num_recette //copie valeur 2eme add
S "recette_trouve" //recette trouvé
R "recette_non_trouve" //recette non trouvé
SPA ok


non: +AR1 P#4.0
A supprimer …… +AR2 P#4.0

à supprimer ......................................
U( // supprime CE N'EST PAS UTILE, CAR LE LOOP FAIT D2JA CELA SUR LE CONTENU DE l'ACCU 1
L #COMPTEUR // supprime DONC A LA FIN DU LOOP, QUAND # COMPTEUR VAUDRA -1 (ou 0, je suis plus sûr) IL FERA L'INSTRUCTION SUIVANTE
L 0 // supprime
==I // supprime
) // supprime
SPBB nont // supprime
à supprimer .......................................

L #COMPTEUR -> charger #compteur dans accu 1
LOOP Loop -> ca veut dire accu1 = accu 1-1 / si >0 alors saut à l'étiquette, sinon faire ligne suivante

nont: S "recette_non_trouve" // recette non trouvé
R "recette_trouve" //recette trouvé

ok: NOP 0
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