Merci pour votre réponse. Je précise que le décodage et la récupération des millisecondes se font sans problème, ci-après ma démarche: `
J'ai créer une structure:
struct CP56Time2a {
uint16_t milliseconds;
uint8_t minute: 6;
uint8_t hour: 5;
uint8_t day: 5;
uint8_t dow: 3;
uint8_t month: 4;
uint8_t year: 7;
};
CP56Time2a heureEtDate;<CODE/>
Je décode ma Date et heure reçu dans ma trame "data":
void decodeCP56Time2a(CP56Time2a& cp56Time, uint8_t* data, int length) {
cp56Time.milliseconds = (data[16] << 8) | data[15];
cp56Time.minute = (data[17] & 0x3F);
cp56Time.hour = (data[18] & 0x1F);
cp56Time.day = (data[19] & 0x1F);
cp56Time.dow = (data[19] & 0xE0) >> 5; // Lire les bits correspondants à dow
cp56Time.month = (data[20] & 0x0F);
cp56Time.year = (data[21] & 0x7F);
heureEtDate.milliseconds = cp56Time.milliseconds;
}
Après je met ma RTC à l'heure comme le suivant:
void mettreAjourDS1307(CP56Time2a& cp56Time) {
// Vérifier si l'horloge RTC est disponible
if (!rtc.begin()) {
Serial.println("Erreur 03 : Défaut horloge RTC");
while (1);
}
// Créer un objet DateTime avec les données décodées
DateTime now(cp56Time.year, cp56Time.month, cp56Time.day, cp56Time.hour, cp56Time.minute, cp56Time.milliseconds / 1000);
// Mettre à jour l'horloge DS1307
rtc.adjust(now);
Serial.println("Horloge mise à jour avec succès !");
}
Et ma question principale, c'est comment garder mes millisecondes à jour pour pouvoir après l'utiliser lorsque j'enverrai une trame contenant l'horodatage à jour avec les millisecondes ma trame IEC104 est la suivante:
void TSD1_SEND_TIME()
{
DateTime rtcTime = rtc.now(); // Obtenir la date et l'heure actuelle de la RTC
iec104SPI1[0] = 104; //Caractère de début 0x68
iec104SPI1[1] = 21; //APDU length = APCI (4) + ASDU (10), M_DP_TB_1
iec104SPI1[2] = (byte)(txcnt_NS << 1);
iec104SPI1[3] = (byte)(txcnt_NS >> 7);
iec104SPI1[4] = (byte)(rxcnt_NR << 1);
iec104SPI1[5] = (byte)(rxcnt_NR >> 7);
iec104SPI1[6] = 31; //type 4, M_DP_TB_1
iec104SPI1[7] = 1; //no. of objects
iec104SPI1[8] = cot; //CAUSE of TRansmission
iec104SPI1[9] = ORG; //OA
iec104SPI1[10] = (byte)(ca); // CA
iec104SPI1[11] = (byte)(ca >> 8); // CA
iec104SPI1[12] = (byte)(IOA_DP1); //IOA ADRESSE
iec104SPI1[13] = (byte)(IOA_DP1 >> 8);//IOA ADRESSE
iec104SPI1[14] = (byte)(IOA_DP1 >> 16); //IOA ADRESSE*/
iec104SPI1[16] = ??????;
iec104SPI1[17] = ??????; // Octet de poids faible pour les millisecondes
iec104SPI1[18] = rtcTime.minute();
iec104SPI1[19] = rtcTime.hour();
// Utiliser l'octet pour stocker à la fois le jour et le DOW (Day of Week)
iec104SPI1[20] = ((rtcTime.dayOfWeek() << 5) | rtcTime.day());
iec104SPI1[21] = rtcTime.month();
iec104SPI1[22] = rtcTime.year() % 100; // Utiliser les deux derniers chiffres de l'année
authorizedClient.write(iec104SPI1, 23);
trameIndex = iec104SPI1[1] + 2;
afficherTrame_TX();
Serial.print(">E I(NS:"); Serial.print(txcnt_NS); Serial.print(","); Serial.print("NR:"); Serial.print(rxcnt_NR); Serial.print(")");
Serial.print(" Changement Etat Télécomande Daté (M_DP_TA_1)"); imprimer_cot (cot);
if (digitalRead(entrees[6]) == HIGH && digitalRead(entrees[7]) == LOW) {
Serial.print(ORGANE1); Serial.print(" : ETAT OUVERT ");
} else if (digitalRead(entrees[6]) == LOW && digitalRead(entrees[7]) == HIGH) {
Serial.print(ORGANE1); Serial.print(" : ETAT FERME ");
} else {
Serial.print(ORGANE1); Serial.print(" : ETAT INDEFINI ");
}
txcnt_NS++;
}
Et pour information, suivant la norme le format CP56Time2a est organisé comme cela:
TYPE T_CP56Time2a :
STRUCT
Milliseconds : WORD;
IVResMinute : BYTE;
SURes2Hour : BYTE;
DOWDay : BYTE;
Res3Month : BYTE;
Res4Year : BYTE;
END_STRUCT
END_TYPE
Milliseconds: Milliseconds := <0..59999>.
IVResMinute: Bit 7 = IV := <0=valid, 1=invalid time>, bit 6 = res (reserved) := <0>, bit 0..5 = minute := <0..59>.
SURes2Hour: Bit 7 = SU := <0=standard time, 1=summer time>, bits 5..6 = res2 (reserved) := <0>, bits 0..4 = hour := <0..23>.
DOWDay : Bits 5..7 = DOW (day of the week) := <0=not used, 1=Monday..7=Sunday>, bits 0..4 = day (day of the month) := <1..31>.
Res3Month: Bits 4..7 = res3 (reserved) := <0>, bits 0..3 = month := <1..12>.
Res4Year: Bit 7 = res4 (reserved) := <0>, bits 0..6 = year := <0..99>.
Merci beaucoup pour vos retour.