Problème réglage de l'heure par programmation
Problème réglage de l'heure par programmation
Bonjour,
Je viens vers vous pour une petit problème pour régler l'heure d'un automate M340. Je m'explique, je reçois par une supervision 6 INT:
Synchro_annee = 2017 (en décimal)
Synchro_mois = 02
Synchro_jour = 17
Synchro_heure = 14
Synchro_minute = 36
Synchro_seconde = 00
En plus de cela, je reçois une variable booléenne Top_horloge pour prendre en compte les valeurs. Dans la pratique, je reçois d'abord les INT et ensuite le bit.
Mon problème étant que je n'arrive pas à faire la "conversion" des mots en décimal en héxa pour ensuite les mettre dans les mots %SW50 à %SW53, mon code est le suivant:
IF TC_Top_horloge THEN
%S50:=1;
%SW50:=Synchro_seconde AND 16#FF00;
%SW51:=(Synchro_heure AND 16#FF00)+(Synchro_minute AND 16#00FF);
%SW52:=(Synchro_mois AND 16#FF00)+(Synchro_jour AND 16#00FF);
%SW53:=Synchro_annee;
END_IF;
TON_524 (IN := TC_Top_horloge AND %S50(*BOOL*),
PT := t#1s(*TIME*),
Q => Fin_synchro(*BOOL*),
ET => Int_synchro(*TIME*));
IF Fin_synchro THEN
TC_Top_horloge:=0;
%S50:=0;
END_IF;
Concrètement la supervision m'envoie 2017 pour l'année par exemple et j'aimerai récupérer cette valeur en héxa et donc avoir 16#2017 et non pas la conversion de 2017 en hexa.
Si quelqu'un a une idée pour me débloquer un peu, ça serait super.
Merci d'avance =)
Je viens vers vous pour une petit problème pour régler l'heure d'un automate M340. Je m'explique, je reçois par une supervision 6 INT:
Synchro_annee = 2017 (en décimal)
Synchro_mois = 02
Synchro_jour = 17
Synchro_heure = 14
Synchro_minute = 36
Synchro_seconde = 00
En plus de cela, je reçois une variable booléenne Top_horloge pour prendre en compte les valeurs. Dans la pratique, je reçois d'abord les INT et ensuite le bit.
Mon problème étant que je n'arrive pas à faire la "conversion" des mots en décimal en héxa pour ensuite les mettre dans les mots %SW50 à %SW53, mon code est le suivant:
IF TC_Top_horloge THEN
%S50:=1;
%SW50:=Synchro_seconde AND 16#FF00;
%SW51:=(Synchro_heure AND 16#FF00)+(Synchro_minute AND 16#00FF);
%SW52:=(Synchro_mois AND 16#FF00)+(Synchro_jour AND 16#00FF);
%SW53:=Synchro_annee;
END_IF;
TON_524 (IN := TC_Top_horloge AND %S50(*BOOL*),
PT := t#1s(*TIME*),
Q => Fin_synchro(*BOOL*),
ET => Int_synchro(*TIME*));
IF Fin_synchro THEN
TC_Top_horloge:=0;
%S50:=0;
END_IF;
Concrètement la supervision m'envoie 2017 pour l'année par exemple et j'aimerai récupérer cette valeur en héxa et donc avoir 16#2017 et non pas la conversion de 2017 en hexa.
Si quelqu'un a une idée pour me débloquer un peu, ça serait super.
Merci d'avance =)
Re: Problème réglage de l'heure par programmation
Bonjour,
les mots %SW50 à %SW53 ne sont pas au format hexadécimal mais au format BCD !
Enseignant en BTS électrotechnique (Pas taper sur l'intru !)
Re: Problème réglage de l'heure par programmation
Merci, je me suis rendu compte de mon problème, je l'ai corrigé en appliquant mes masques et en utilisant la fonction INT_TO_BCD et ça marche bien.
Re: Problème réglage de l'heure par programmation
bonjour Julien, je suis un peu nouveau à tout ça et donc je serai vraiment reconnaissant si tu peux m'expliquer pourquoi t'as rajouté les 16#00FF ?JulienG a écrit : ↑17 févr. 2017, 14:57 Bonjour,
Je viens vers vous pour une petit problème pour régler l'heure d'un automate M340. Je m'explique, je reçois par une supervision 6 INT:
Synchro_annee = 2017 (en décimal)
Synchro_mois = 02
Synchro_jour = 17
Synchro_heure = 14
Synchro_minute = 36
Synchro_seconde = 00
En plus de cela, je reçois une variable booléenne Top_horloge pour prendre en compte les valeurs. Dans la pratique, je reçois d'abord les INT et ensuite le bit.
Mon problème étant que je n'arrive pas à faire la "conversion" des mots en décimal en héxa pour ensuite les mettre dans les mots %SW50 à %SW53, mon code est le suivant:
IF TC_Top_horloge THEN
%S50:=1;
%SW50:=Synchro_seconde AND 16#FF00;
%SW51:=(Synchro_heure AND 16#FF00)+(Synchro_minute AND 16#00FF);
%SW52:=(Synchro_mois AND 16#FF00)+(Synchro_jour AND 16#00FF);
%SW53:=Synchro_annee;
END_IF;
TON_524 (IN := TC_Top_horloge AND %S50(*BOOL*),
PT := t#1s(*TIME*),
Q => Fin_synchro(*BOOL*),
ET => Int_synchro(*TIME*));
IF Fin_synchro THEN
TC_Top_horloge:=0;
%S50:=0;
END_IF;
Concrètement la supervision m'envoie 2017 pour l'année par exemple et j'aimerai récupérer cette valeur en héxa et donc avoir 16#2017 et non pas la conversion de 2017 en hexa.
Si quelqu'un a une idée pour me débloquer un peu, ça serait super.
Merci d'avance =)
en fait, j'ai devant mes yeux un programme pour la synchronisation des horloges de supervision et automate mais je le comprend pas parfaitement
Re: Problème réglage de l'heure par programmation
Bonjour shahid,
Dites mois si je me trompe, donc pour séparer 2 valeurs dans un contenu en programmation on utilise les masques.
par exemple le bit système %SW51 contient HOURMIN et donc il faudrait faire un masque 16#00FF pour obtenir les minutes...et parfois il faudrait faire un décalage ou une rotation...
Dites mois si je me trompe, donc pour séparer 2 valeurs dans un contenu en programmation on utilise les masques.
par exemple le bit système %SW51 contient HOURMIN et donc il faudrait faire un masque 16#00FF pour obtenir les minutes...et parfois il faudrait faire un décalage ou une rotation...
-
- Mi homme - Mi automate
- Messages : 2076
- Inscription : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: Problème réglage de l'heure par programmation
Salut !
Oui, tu as tout compris !
Pour reprendre ton exemple
%SW51 = HHMM
en faisant :
un ET avec %SW51 et #00FF on obtient en résultat 00MM
un ET avec %SW51 et #FF00 on obtient HH00 (d'où le décalage à droite de 8 positions pour avoir 00HH )
Cela fait intervenir les tables de vérité BOOLEENES !
Pour le masque
# veut dire hexadécimal
0 = 0000
0 = 0000
F = 1111
F = 1111
on peut naturellement mettre n'importe quelle valeur en masque, il suffit de placer à '1' le(s) bit(s) dont on souhaite la connaitre la valeur !
Oui, tu as tout compris !
Pour reprendre ton exemple
%SW51 = HHMM
en faisant :
un ET avec %SW51 et #00FF on obtient en résultat 00MM
un ET avec %SW51 et #FF00 on obtient HH00 (d'où le décalage à droite de 8 positions pour avoir 00HH )
Cela fait intervenir les tables de vérité BOOLEENES !
Pour le masque
# veut dire hexadécimal
0 = 0000
0 = 0000
F = 1111
F = 1111
on peut naturellement mettre n'importe quelle valeur en masque, il suffit de placer à '1' le(s) bit(s) dont on souhaite la connaitre la valeur !
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part !
-
- Dieu du process
- Messages : 981
- Inscription : 12 nov. 2015, 21:02
- Localisation : 45 - Loiret
- Contact :
Re: Problème réglage de l'heure par programmation
J’ajouterai juste que %S51 / 256 (ou #100) tu obtient HH directementphilou77 a écrit : ↑30 juil. 2019, 15:13 Salut !
Oui, tu as tout compris !
Pour reprendre ton exemple
%SW51 = HHMM
en faisant :
un ET avec %SW51 et #00FF on obtient en résultat 00MM
un ET avec %SW51 et #FF00 on obtient HH00 (d'où le décalage à droite de 8 positions pour avoir 00HH )
Cela fait intervenir les tables de vérité BOOLEENES !
Pour le masque
# veut dire hexadécimal
0 = 0000
0 = 0000
F = 1111
F = 1111
on peut naturellement mettre n'importe quelle valeur en masque, il suffit de placer à '1' le(s) bit(s) dont on souhaite la connaitre la valeur !
-
- Mi homme - Mi automate
- Messages : 2076
- Inscription : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: Problème réglage de l'heure par programmation
Salut !
+1 MiGanuts.
la division et le décalage sont de proches parents dans le fonctionnement (mais cela ne fonctionne que pour les puissances de 2) !
+1 MiGanuts.
la division et le décalage sont de proches parents dans le fonctionnement (mais cela ne fonctionne que pour les puissances de 2) !
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part !