Bonjour,
C'est mon premier Raspberry, ainsi que ma première tentative de programmation avec CodeSys et en st (habitué à siemens TiaPortal en ladder)
Mon matériel:
Raspberry Pi3
UPS PIco - Uninterruptible Power Supply & I2C Control HAT - USV
Codesys V3.5 SP10
(prochainement ; Wago 750-375 (coupleur profinet IO 3rd gen))
Problème :
Je n'arrive pas à obtenir l'heure et la date de mon raspberry dans mon programme CodeSys
La seule date / time que j'obtiens dans codesys est : DT#1970-1-1-0:0:0
Mon UPS pico est configurer correctement il me semble "sudo hwclock -r" et m'affiche l'heure actuel correctement (Fri 14 Apr 2017 19:48:26 CEST -0.834737 seconds)
Faut-il initialiser quelque chose dans CodeSys ? une commande à envoyer depuis le raspberry ? une librairie dans CodeSys ?
Une petite aide me serait bienvenue, car sans la date et l'heure je ne puis continuer mon projet ;S
merci
[Résolu] Problème : affichage heure dans Codesys avec RTC + Raspberry
[Résolu] Problème : affichage heure dans Codesys avec RTC + Raspberry
Modifié en dernier par ospium le 23 avr. 2017, 16:09, modifié 2 fois.
Re: Problème : affichage heure dans Codesys avec RTC + Raspberry
Bonsoir,
Voici un exemple réalisé sur mon Raspberry Pi avec CODESYS V3 pour gérer un thermostat d'ambiance de chaudière.
1°) Ajouter bibliothèque : SysTimeRtc (Catégorie System - Syslibs)
2°)
Déclaration des variables -----------------------------------------
VAR
Bidon:UDINT;
DateHeure:SYSTIMEDATE;
Jour_Semaine:STRING(10);(*Jour de la semaine*)
// Heure française
Heure_Fr: UINT; (*Heure internationnale + 1*)
Heures: UINT; (* coordinated universal time : Heure internationnale*)
Minutes: UINT;
Secondes: UINT;
Angle:WORD;
Ch_Heures:STRING(2); (*Heures pour affichage sur écran*)
Ch_Minutes:STRING(2); (*Minutes pour affichage sur écran*)
Ch_Secondes:STRING(2); (*Secondes pour affichage sur écran*)
Ch_Annee: STRING(4);
Ch_Mois:STRING(9);
Ch_Jour:STRING(2);
Ch_Date:STRING(26);
Ch_Heure:STRING(12);
END_VAR
------------------------------------------------------------------------------
3°)
Programme --------------------------------------
(*Ajouter bibliothèque : SysTimeRtc (Catégorie System - Syslibs)*)
(*Lecture Date et heure*)
Temps:=SysTimeRtcGet(pResult:=Bidon);
SysTimeRtcConvertUtcToDate(dwTimestampUtc:=Temps , pDate:=DateHeure );
(*Affichage jour de la semaine*)
CASE DateHeure.wDayOfWeek OF
1:Jour_Semaine:='Lundi';Jour_Semaine_Aff:='Lun ';
2:Jour_Semaine:='Mardi';Jour_Semaine_Aff:='Mar ';
3:Jour_Semaine:='Mercredi';Jour_Semaine_Aff:='Mer ';
4:Jour_Semaine:='Jeudi';Jour_Semaine_Aff:='Jeu ';
5:Jour_Semaine:='Vendredi';Jour_Semaine_Aff:='Ven ';
6:Jour_Semaine:='Samedi';Jour_Semaine_Aff:='Sam ';
7:Jour_Semaine:='Dimanche';Jour_Semaine_Aff:='Dim ';
END_CASE
(*Heure française*)
Heure_Fr:=DateHeure.wHour+1;
Heures:=DateHeure.wHour;
Minutes:=DateHeure.wMinute;
Secondes:=DateHeure.wSecond;
(*Affichage formaté des heures*)
IF Heure_Fr<10 THEN
CASE Heure_Fr OF
0:Ch_Heures:='00';
1:Ch_Heures:='01';
2:Ch_Heures:='02';
3:Ch_Heures:='03';
4:Ch_Heures:='04';
5:Ch_Heures:='05';
6:Ch_Heures:='06';
7:Ch_Heures:='07';
8:Ch_Heures:='08';
9:Ch_Heures:='09';
END_CASE;
ELSE
Ch_Heures:=UINT_TO_STRING(Heure_Fr);
END_IF;
(*Affichage formaté des Minutes*)
IF Minutes<10 THEN
CASE Minutes OF
0:Ch_Minutes:='00';
1:Ch_Minutes:='01';
2:Ch_Minutes:='02';
3:Ch_Minutes:='03';
4:Ch_Minutes:='04';
5:Ch_Minutes:='05';
6:Ch_Minutes:='06';
7:Ch_Minutes:='07';
8:Ch_Minutes:='08';
9:Ch_Minutes:='09';
END_CASE;
ELSE
Ch_Minutes:=UINT_TO_STRING(Minutes);
END_IF;
(*Affichage formaté des Secondes*)
IF Secondes<10 THEN
CASE Secondes OF
0:Ch_Secondes:='00';
1:Ch_Secondes:='01';
2:Ch_Secondes:='02';
3:Ch_Secondes:='03';
4:Ch_Secondes:='04';
5:Ch_Secondes:='05';
6:Ch_Secondes:='06';
7:Ch_Secondes:='07';
8:Ch_Secondes:='08';
9:Ch_Secondes:='09';
END_CASE;
ELSE
Ch_Secondes:=UINT_TO_STRING(Secondes);
END_IF;
(*Affichage de la date*)
Ch_Annee:=UINT_TO_STRING(DateHeure.wYear);
(*Affichage des mois en lettres*)
CASE DateHeure.wMonth OF
1:Ch_Mois:='Janvier';
2:Ch_Mois:='Février';
3:Ch_Mois:='Mars';
4:Ch_Mois:='Avril';
5:Ch_Mois:='Mai';
6:Ch_Mois:='Juin';
7:Ch_Mois:='Juillet';
8:Ch_Mois:='Août';
9:Ch_Mois:='Septembre';
10:Ch_Mois:='Octobre';
11:Ch_Mois:='Novembre';
12:Ch_Mois:='Décembre';
END_CASE
(*Affichage foraté du jour*)
IF (DateHeure.wDay)<10 THEN
CASE (DateHeure.wDay) OF
0:Ch_Jour:='00';
1:Ch_Jour:='01';
2:Ch_Jour:='02';
3:Ch_Jour:='03';
4:Ch_Jour:='04';
5:Ch_Jour:='05';
6:Ch_Jour:='06';
7:Ch_Jour:='07';
8:Ch_Jour:='08';
9:Ch_Jour:='09';
END_CASE;
ELSE
Ch_Jour:=UINT_TO_STRING(DateHeure.wDay);
END_IF;
Ch_Heure:=CONCAT(Ch_Heures,' : ');
Ch_Heure:=CONCAT(Ch_Heure,Ch_Minutes);
Ch_Heure:=CONCAT(Ch_Heure,' : ');
Ch_Heure:=CONCAT(Ch_Heure,Ch_Secondes);
Ch_Date:=CONCAT(CH_Jour,' ');
Ch_Date:=CONCAT(Ch_Date,Ch_Mois);
Ch_Date:=CONCAT(Ch_Date,' ');
Ch_Date:=CONCAT(Ch_Date,Ch_Annee);
Ch_Date:=CONCAT(' ',Ch_Date);
Ch_Date:=CONCAT(Jour_Semaine,Ch_Date);
----------------------------------------------------------------------------------
Seules les 2 premières lignes du programme sont utiles pour récupérer la date et l'heure dans une structure de type "SYSTIMEDATE" (voir bibliothèque).
Les reste me sert à afficher les différents éléments sur un écran.
Par contre, de base, l'heure et la date ne sont pas mise à jour quand le raspberry est non alimenté. Il faudrait ajouter une carte Horloge avec une pile.
En espérant que ceci vous aide.
Voici un exemple réalisé sur mon Raspberry Pi avec CODESYS V3 pour gérer un thermostat d'ambiance de chaudière.
1°) Ajouter bibliothèque : SysTimeRtc (Catégorie System - Syslibs)
2°)
Déclaration des variables -----------------------------------------
VAR
Bidon:UDINT;
DateHeure:SYSTIMEDATE;
Jour_Semaine:STRING(10);(*Jour de la semaine*)
// Heure française
Heure_Fr: UINT; (*Heure internationnale + 1*)
Heures: UINT; (* coordinated universal time : Heure internationnale*)
Minutes: UINT;
Secondes: UINT;
Angle:WORD;
Ch_Heures:STRING(2); (*Heures pour affichage sur écran*)
Ch_Minutes:STRING(2); (*Minutes pour affichage sur écran*)
Ch_Secondes:STRING(2); (*Secondes pour affichage sur écran*)
Ch_Annee: STRING(4);
Ch_Mois:STRING(9);
Ch_Jour:STRING(2);
Ch_Date:STRING(26);
Ch_Heure:STRING(12);
END_VAR
------------------------------------------------------------------------------
3°)
Programme --------------------------------------
(*Ajouter bibliothèque : SysTimeRtc (Catégorie System - Syslibs)*)
(*Lecture Date et heure*)
Temps:=SysTimeRtcGet(pResult:=Bidon);
SysTimeRtcConvertUtcToDate(dwTimestampUtc:=Temps , pDate:=DateHeure );
(*Affichage jour de la semaine*)
CASE DateHeure.wDayOfWeek OF
1:Jour_Semaine:='Lundi';Jour_Semaine_Aff:='Lun ';
2:Jour_Semaine:='Mardi';Jour_Semaine_Aff:='Mar ';
3:Jour_Semaine:='Mercredi';Jour_Semaine_Aff:='Mer ';
4:Jour_Semaine:='Jeudi';Jour_Semaine_Aff:='Jeu ';
5:Jour_Semaine:='Vendredi';Jour_Semaine_Aff:='Ven ';
6:Jour_Semaine:='Samedi';Jour_Semaine_Aff:='Sam ';
7:Jour_Semaine:='Dimanche';Jour_Semaine_Aff:='Dim ';
END_CASE
(*Heure française*)
Heure_Fr:=DateHeure.wHour+1;
Heures:=DateHeure.wHour;
Minutes:=DateHeure.wMinute;
Secondes:=DateHeure.wSecond;
(*Affichage formaté des heures*)
IF Heure_Fr<10 THEN
CASE Heure_Fr OF
0:Ch_Heures:='00';
1:Ch_Heures:='01';
2:Ch_Heures:='02';
3:Ch_Heures:='03';
4:Ch_Heures:='04';
5:Ch_Heures:='05';
6:Ch_Heures:='06';
7:Ch_Heures:='07';
8:Ch_Heures:='08';
9:Ch_Heures:='09';
END_CASE;
ELSE
Ch_Heures:=UINT_TO_STRING(Heure_Fr);
END_IF;
(*Affichage formaté des Minutes*)
IF Minutes<10 THEN
CASE Minutes OF
0:Ch_Minutes:='00';
1:Ch_Minutes:='01';
2:Ch_Minutes:='02';
3:Ch_Minutes:='03';
4:Ch_Minutes:='04';
5:Ch_Minutes:='05';
6:Ch_Minutes:='06';
7:Ch_Minutes:='07';
8:Ch_Minutes:='08';
9:Ch_Minutes:='09';
END_CASE;
ELSE
Ch_Minutes:=UINT_TO_STRING(Minutes);
END_IF;
(*Affichage formaté des Secondes*)
IF Secondes<10 THEN
CASE Secondes OF
0:Ch_Secondes:='00';
1:Ch_Secondes:='01';
2:Ch_Secondes:='02';
3:Ch_Secondes:='03';
4:Ch_Secondes:='04';
5:Ch_Secondes:='05';
6:Ch_Secondes:='06';
7:Ch_Secondes:='07';
8:Ch_Secondes:='08';
9:Ch_Secondes:='09';
END_CASE;
ELSE
Ch_Secondes:=UINT_TO_STRING(Secondes);
END_IF;
(*Affichage de la date*)
Ch_Annee:=UINT_TO_STRING(DateHeure.wYear);
(*Affichage des mois en lettres*)
CASE DateHeure.wMonth OF
1:Ch_Mois:='Janvier';
2:Ch_Mois:='Février';
3:Ch_Mois:='Mars';
4:Ch_Mois:='Avril';
5:Ch_Mois:='Mai';
6:Ch_Mois:='Juin';
7:Ch_Mois:='Juillet';
8:Ch_Mois:='Août';
9:Ch_Mois:='Septembre';
10:Ch_Mois:='Octobre';
11:Ch_Mois:='Novembre';
12:Ch_Mois:='Décembre';
END_CASE
(*Affichage foraté du jour*)
IF (DateHeure.wDay)<10 THEN
CASE (DateHeure.wDay) OF
0:Ch_Jour:='00';
1:Ch_Jour:='01';
2:Ch_Jour:='02';
3:Ch_Jour:='03';
4:Ch_Jour:='04';
5:Ch_Jour:='05';
6:Ch_Jour:='06';
7:Ch_Jour:='07';
8:Ch_Jour:='08';
9:Ch_Jour:='09';
END_CASE;
ELSE
Ch_Jour:=UINT_TO_STRING(DateHeure.wDay);
END_IF;
Ch_Heure:=CONCAT(Ch_Heures,' : ');
Ch_Heure:=CONCAT(Ch_Heure,Ch_Minutes);
Ch_Heure:=CONCAT(Ch_Heure,' : ');
Ch_Heure:=CONCAT(Ch_Heure,Ch_Secondes);
Ch_Date:=CONCAT(CH_Jour,' ');
Ch_Date:=CONCAT(Ch_Date,Ch_Mois);
Ch_Date:=CONCAT(Ch_Date,' ');
Ch_Date:=CONCAT(Ch_Date,Ch_Annee);
Ch_Date:=CONCAT(' ',Ch_Date);
Ch_Date:=CONCAT(Jour_Semaine,Ch_Date);
----------------------------------------------------------------------------------
Seules les 2 premières lignes du programme sont utiles pour récupérer la date et l'heure dans une structure de type "SYSTIMEDATE" (voir bibliothèque).
Les reste me sert à afficher les différents éléments sur un écran.
Par contre, de base, l'heure et la date ne sont pas mise à jour quand le raspberry est non alimenté. Il faudrait ajouter une carte Horloge avec une pile.
En espérant que ceci vous aide.
Re: Problème : affichage heure dans Codesys avec RTC + Raspberry
merci bien
je n'utilisais pas la bonne librairie je pense ... j'en avais testé plusieurs sans succès ^^
Il me reste à comprendre comment ça fonctionne exactement mtn hehe
je n'utilisais pas la bonne librairie je pense ... j'en avais testé plusieurs sans succès ^^
Il me reste à comprendre comment ça fonctionne exactement mtn hehe