Page 1 sur 2
[RESOLU] Boucle reset bit
Posté : 19 mars 2016, 12:52
par GlenS
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
Re: Boucle reset bit
Posté : 21 mars 2016, 08:42
par Cyril93
bonjour,
il faut le faire en LIST obligatoirement ?
Re: Boucle reset bit
Posté : 21 mars 2016, 08:57
par Cyril93
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
Re: Boucle reset bit
Posté : 21 mars 2016, 16:01
par djé
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:
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
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
Re: Boucle reset bit
Posté : 21 mars 2016, 16:14
par Cyril93
@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

Re: Boucle reset bit
Posté : 21 mars 2016, 16:19
par djé
Super!
Re: Boucle reset bit
Posté : 21 mars 2016, 16:32
par djé
Je ne me rappelais pas qu'on pouvait indexer les DB comme çà.
Du coup y a pas photo c beaucoup plus simple.

Re: Boucle reset bit
Posté : 21 mars 2016, 19:35
par GlenS
@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.
Re: Boucle reset bit
Posté : 22 mars 2016, 08:38
par Cyril93
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

Re: Boucle reset bit
Posté : 22 mars 2016, 19:09
par GlenS
@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 !!