[RESOLU] Boucle reset bit
[RESOLU] Boucle reset bit
Bonjour,
J'ai besoin d'aide car je ne trouve pas la solution pour mettre à 0 plusieurs bit.
Je m'explique : je souhaite mettre à 0 plusieurs bit qui se trouve dans plusieurs DB.
Ex : DB1.DBX20.0 à DB1.DBX20.6, puis DB2.DBX20.0 à DB2.DBX20.6 et ceci jusqu'au DB99.
Evidemment, en LIST, je peux écrire :
UN E1.0 (ma condition)
R DB1.DBX20.0
R DB1.DBX20.1
R DB1.DBX20.2
.
.
R DB99.DBX20.6
Mais je veux utiliser une boucle pour changer le numéro de DB et de bit. J'ai essayé la fonction LOOP mais je dois mal l'utiliser pck je ne suis pas arrivé à mes fins. I need your help.
(Programmation sous SIEMENS STEP7 V5.5)
GlenS
J'ai besoin d'aide car je ne trouve pas la solution pour mettre à 0 plusieurs bit.
Je m'explique : je souhaite mettre à 0 plusieurs bit qui se trouve dans plusieurs DB.
Ex : DB1.DBX20.0 à DB1.DBX20.6, puis DB2.DBX20.0 à DB2.DBX20.6 et ceci jusqu'au DB99.
Evidemment, en LIST, je peux écrire :
UN E1.0 (ma condition)
R DB1.DBX20.0
R DB1.DBX20.1
R DB1.DBX20.2
.
.
R DB99.DBX20.6
Mais je veux utiliser une boucle pour changer le numéro de DB et de bit. J'ai essayé la fonction LOOP mais je dois mal l'utiliser pck je ne suis pas arrivé à mes fins. I need your help.
(Programmation sous SIEMENS STEP7 V5.5)
GlenS
Re: Boucle reset bit
bonjour,
il faut le faire en LIST obligatoirement ?
il faut le faire en LIST obligatoirement ?
Re: Boucle reset bit
tu utilises le bit7 des octets ? Sinon il faudra faire un masque,
UN E1.0
BEB
AUF DB1 //Ouvre le DB1
L 0 // Charge 0
T DBB20 // Transfert 0 dans l''octet 20
UN E1.0
BEB
AUF DB1 //Ouvre le DB1
L 0 // Charge 0
T DBB20 // Transfert 0 dans l''octet 20
- djé
- Dieu du process

- Messages : 864
- Enregistré le : 20 oct. 2015, 09:55
- Localisation : Bretagne, Pays de la Loire, Nantes
- Contact :
Re: Boucle reset bit
Salut,
Pas évident car il faut indexer les DB.
J'ai essayé un truc qui a l'air de marcher avec 5 DB a suivre à toi de tester avec l'ensemble de tes DB (qui doivent être à suivre)
Voici la source:
C'est un peu compliqué, ptet qu'il ya moyen de faire autrement.
L'idée c'est de jouer avec la SFC20 "BLKMOV" et les pointeurs ANY
On crée de toute pièce le pointeur ANY dans lequel on pourra modifier le numero de la DB;
On lit (SFC20) ensuite la valeur (Octet) à modifier DBxxx.DBB20
On lui applique le masque pour ne pas affecter le bit 7.
On écrit (SFC20) la valeur DBxxx.DBB20 résultant de l'opération ET avec le masque.
Fourni As IS
Pas évident car il faut indexer les DB.
J'ai essayé un truc qui a l'air de marcher avec 5 DB a suivre à toi de tester avec l'ensemble de tes DB (qui doivent être à suivre)
Voici la source:
Code : Tout sélectionner
FUNCTION "MaFONCTION_TEST" : VOID
TITLE =Ma fonction reset bit a bit
VERSION : 0.1
VAR_TEMP
numDB : INT ;
Destination : ANY ;
wTEMP : INT ;
RESULT : BYTE ;
FINAL : BYTE ;
END_VAR
BEGIN
NETWORK
TITLE =
L 1; //Initialisation du numéro de DB
T #numDB;
LOOP: L #numDB;
L 99; // Dernière DB à Initialiser
>I ;
SPB FIN;
LAR1 P##Destination; //Charger l'adresse de début du pointeur ANY dans AR1.
L B#16#10; //Charger l'ID de syntaxe et la transférer dans le pointeur ANY.
T LB [AR1,P#0.0];
L B#16#2; //Charger le type de données octet et Transférer dans le pointeur ANY.
T LB [AR1,P#1.0];
L 1; // Charger 1 Octet et les transférer dans le pointeur ANY
T LW [AR1,P#2.0];
L #numDB; // La source correspond au DB"numDB", DBB20
T LW [AR1,P#4.0];
L P#DBX 20.0;
T LD [AR1,P#6.0];
CALL "BLKMOV" (
SRCBLK := #Destination,
RET_VAL := #wTEMP,
DSTBLK := #RESULT);
L #RESULT;
L W#16#80; // Masque pour les 7 derniers bits
UW ;
T #FINAL;
CALL "BLKMOV" (
SRCBLK := #FINAL,
RET_VAL := #wTEMP,
DSTBLK := #Destination);
L #numDB;
L 1;
+I ;
T #numDB;
SPA LOOP;
FIN: NOP 0;
END_FUNCTION
L'idée c'est de jouer avec la SFC20 "BLKMOV" et les pointeurs ANY
On crée de toute pièce le pointeur ANY dans lequel on pourra modifier le numero de la DB;
On lit (SFC20) ensuite la valeur (Octet) à modifier DBxxx.DBB20
On lui applique le masque pour ne pas affecter le bit 7.
On écrit (SFC20) la valeur DBxxx.DBB20 résultant de l'opération ET avec le masque.
Fourni As IS
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.
Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Re: Boucle reset bit
@djé on peux indexer l'ouverture du DB de cette manière c'est un peux plus simple du coup.
J'ai décalé le premier DB pour que cela commence au numéro 10 puis j'ai fait que deux boucle là aussi les DB doivent ce suivre.
Ah oui j'ai remis à zero les BIT 1 à 7 de l'octet 2 donc à adapter
J'ai décalé le premier DB pour que cela commence au numéro 10 puis j'ai fait que deux boucle là aussi les DB doivent ce suivre.
Ah oui j'ai remis à zero les BIT 1 à 7 de l'octet 2 donc à adapter
- djé
- Dieu du process

- Messages : 864
- Enregistré le : 20 oct. 2015, 09:55
- Localisation : Bretagne, Pays de la Loire, Nantes
- Contact :
Re: Boucle reset bit
Super!
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.
Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
- djé
- Dieu du process

- Messages : 864
- Enregistré le : 20 oct. 2015, 09:55
- Localisation : Bretagne, Pays de la Loire, Nantes
- Contact :
Re: Boucle reset bit
Je ne me rappelais pas qu'on pouvait indexer les DB comme çà.
Du coup y a pas photo c beaucoup plus simple.
Du coup y a pas photo c beaucoup plus simple.
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.
Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Re: Boucle reset bit
@Cyril93 : non pas en List obligatoirement. J'ai les langages CONT, LIST ou LOG sur ma version.
Et oui j'utilise le bit7 ^^ ce serai trop facile sinon ahah.
@djé : merci pour ta réponse, je t'avoue avoir lu 3 fois ton code pour comprendre.
En effet, @Cyril93 a simplifié le code.
Merci @Cyril93, je vais réécrire ça pour mon cas et compiler, je vous tiens au courant quand j'aurai transférer cela.
Et oui j'utilise le bit7 ^^ ce serai trop facile sinon ahah.
@djé : merci pour ta réponse, je t'avoue avoir lu 3 fois ton code pour comprendre.
En effet, @Cyril93 a simplifié le code.
Merci @Cyril93, je vais réécrire ça pour mon cas et compiler, je vous tiens au courant quand j'aurai transférer cela.
Re: Boucle reset bit
l'instruction AUF DB supporte l'index à la "schneider like" comme les tempo S7 il me semble.
@Glens, perso j'utilise le language SCL pour exécuter toutes ces manips mais il faut la version de step7 pro pour cela, cela faisait longtemps que j'avais pas fait du LIST
@Glens, perso j'utilise le language SCL pour exécuter toutes ces manips mais il faut la version de step7 pro pour cela, cela faisait longtemps que j'avais pas fait du LIST
Re: Boucle reset bit
@Cyril93 j'étais parti pour le faire en SCL aussi. Mais pour un soucis propreté de lecture du programme ^^ j'ai dû le faire comme cela.
Ps : la manip' fonctionne très bien ! J'ai bêtement recopié les lignes de @Cyril93 en adaptant à mon cas.
Merci pour ton aide !!
Ps : la manip' fonctionne très bien ! J'ai bêtement recopié les lignes de @Cyril93 en adaptant à mon cas.
Merci pour ton aide !!

