//======================================================================================================================================================================== // ETALONNAGE_CARTE.QML // Ce fichier traite l'étalonnage d'une carte. La page affiche notamment : // - La valeur brute actuelle // - la valeur corrigée actuelle (rensignée manuellement) // - l'offset actuel // La page est appelée depuis la page information_materiel.qml, en cliquant sur le bouton ETALONNAGE lorsqu'il est disponible. //======================================================================================================================================================================== import QtQuick 2.12 import QtQuick.Controls 2.12 import qt.koriolan.shipheart 1.0 Shipheart_page { id: page_etalonnage_carte // Mis en forme : readonly property double pourcentage_largeur_colonne_gauche: 0.75 readonly property double espace_colonnes_principales: 20 readonly property double pourcentage_hauteur_ligne_haut: 1 readonly property double espace_lignes_principales: 20 readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas readonly property int hauteur_ligne_formulaire: 60 readonly property double pourcentage_largeur_labels_formulaire: 0.4 readonly property double nombre_colonnes_secondaires: 2 // Cette valeur permet de découper les (1.0 - pourcentage_largeur_labels_formulaire) x pourcentage_largeur_colonne_gauche pour afficher les infos de chaque point d'étalonnage readonly property double espace_colonnes_secondaires: 20 readonly property int nombre_circuits_affiches_sur_une_colonne: 5 readonly property int hauteur_bouton_droit: 80 readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 1 readonly property int periode_init_raffraichissement_parametres: 1 // En ms readonly property int periode_raffraichissement_parametres: 1000 // En ms // Affichage : property bool bouton_bandeau_bas_zone_retour_actif: false property int protection_mode: 0 property bool flag_init: true // Permet de bloquer certains affichage tant que l'init n'est pas terminée // Données : property int adresse_module: -1 property string nom_carte: "---" property int id_batterie: -1 // Cle_primaire de la batterie à laquelle le module est affecté (cas d'un ShipBS) property string eeprom: "" property double courant_differentiel: 0 property double courant_decharge: 0 property double tension: 0 property double resistance: 0 property bool flag_point_memorise_1: false property double courant_differentiel_1: 0 property double courant_decharge_1: 0 property double tension_1: 0 property bool flag_point_memorise_2: false property double courant_differentiel_2: 0 property double courant_decharge_2: 0 property double tension_2: 0 // Modèles : // Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes //=========================================================== // Timer periode raffraichissement parametres capteur : //=========================================================== Timer { id: timer_raffraichissement_parametres interval: periode_init_raffraichissement_parametres triggeredOnStart: false running: true repeat: true onTriggered: { if (interval == periode_init_raffraichissement_parametres) // Premier passage, 1ms après le premier chargement { interval = periode_raffraichissement_parametres; init_page(); } else if (!clavier.active) mise_a_jour(); // Permet la mise à jour en temps réel du moment que le clavier n'est pas actif. } } // Titre de la page : Shipheart_titre_1 {titre:qsTr("Etalonnage du module [%1 - #%2]").arg(nom_carte).arg(adresse_module); hauteur: shipheart_hauteur_bandeau_haut} //------------------------------------------------------- // Ecran Haut - Gauche : //------------------------------------------------------- Rectangle { id: zone_affichage_haut_gauche x: 0 y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2); color: "transparent" //------------------------------------------------------------------------------- // Ligne de formulaire : N° des points d'étalonnage Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" // Label de la ligne : Shipheart_formulaire_label { id: label_no_points text: "" width: parent.width * pourcentage_largeur_labels_formulaire } // Première valeur d'étalonnage : Rectangle { id: val_1_no_points width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2) height: parent.height anchors { left: label_no_points.right leftMargin: 0 } color: "transparent" Label { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 18 color: couleur_blanc_casse font.weight: Font.Bold text: qsTr("Point 1"); } } // Deuxième valeur d'étalonnage : Rectangle { id: val_2_no_points width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2) height: parent.height anchors { left: val_1_no_points.right leftMargin: espace_colonnes_secondaires } color: "transparent" Label { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 18 color: couleur_blanc_casse font.weight: Font.Bold text: qsTr("Point 2"); } } } //------------------------------------------------------------------------------- // Ligne de formulaire : Courant de décharge Rectangle { y: hauteur_ligne_formulaire width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" // Label de la ligne : Shipheart_formulaire_label { id: label_courant_decharge text: qsTr("Courant de décharge") width: parent.width * pourcentage_largeur_labels_formulaire } // Première valeur d'étalonnage : Rectangle { id: val_1_courant_decharge width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2) height: parent.height anchors { left: label_courant_decharge.right leftMargin: 0 } color: "transparent" Label { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 18 color: couleur_blanc_casse text: courant_decharge_1.toFixed(3) + " A" } } // Deuxième valeur d'étalonnage : Rectangle { id: val_2_courant_decharge width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2) height: parent.height anchors { left: val_1_courant_decharge.right leftMargin: espace_colonnes_secondaires } color: "transparent" Label { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 18 color: couleur_blanc_casse text: courant_decharge_2.toFixed(3) + " A" } } // Ligne de séparation : Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_haute } } //------------------------------------------------------------------------------- // Ligne de formulaire : Courant différentiel Rectangle { y: 2 * hauteur_ligne_formulaire width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" // Label de la ligne : Shipheart_formulaire_label { id: label_courant_differentiel text: qsTr("Courant différentiel") width: parent.width * pourcentage_largeur_labels_formulaire } // Première valeur d'étalonnage : Rectangle { id: val_1_courant_differentiel width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2) height: parent.height anchors { left: label_courant_differentiel.right leftMargin: 0 } color: "transparent" Label { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 18 color: couleur_blanc_casse text: courant_differentiel_1.toFixed(3) + " A" } } // Deuxième valeur d'étalonnage : Rectangle { id: val_2_courant_differentiel width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2) height: parent.height anchors { left: val_1_courant_differentiel.right leftMargin: espace_colonnes_secondaires } color: "transparent" Label { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 18 color: couleur_blanc_casse text: courant_differentiel_2.toFixed(3) + " A" } } // Ligne de séparation : Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_haute } } //------------------------------------------------------------------------------- // Ligne de formulaire : Boutons de mémorisation Rectangle { y: 3 * hauteur_ligne_formulaire width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_bouton_droit : 0 color: "transparent" // Label de la ligne : Shipheart_formulaire_label { id: label_boutons text: "" width: parent.width * pourcentage_largeur_labels_formulaire } // Première valeur d'étalonnage : Rectangle { id: val_1_boutons width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2) height: parent.height - 10 radius: shipheart_rayon_bouton anchors { left: label_boutons.right leftMargin: 0 verticalCenter: parent.verticalCenter } color: shipheart_couleur_fond_bouton Label { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 18 color: flag_point_memorise_1 ? couleur_gris_fonce : couleur_blanc_casse text: flag_point_memorise_1 ? qsTr("Recalculer ce point") : qsTr("Mémoriser ce point") } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); if (flag_point_memorise_1) flag_point_memorise_1 = false; else { if (flag_point_memorise_2) { if ((courant_differentiel_1 === courant_differentiel_2) || (courant_decharge_1 === courant_decharge_2)) { boite_alerte.open(); } else flag_point_memorise_1 = true; } else flag_point_memorise_1 = true; } } } } // Deuxième valeur d'étalonnage : Rectangle { id: val_2_boutons width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2) height: parent.height - 10 radius: shipheart_rayon_bouton anchors { left: val_1_boutons.right leftMargin: espace_colonnes_secondaires verticalCenter: parent.verticalCenter } color: shipheart_couleur_fond_bouton Label { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 18 color: flag_point_memorise_2 ? couleur_gris_fonce : couleur_blanc_casse text: flag_point_memorise_2 ? qsTr("Recalculer ce point") : qsTr("Mémoriser ce point") } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); if (flag_point_memorise_2) flag_point_memorise_2 = false; else { if (flag_point_memorise_1) { if ((courant_differentiel_1 === courant_differentiel_2) || (courant_decharge_1 === courant_decharge_2)) { boite_alerte.open(); } else flag_point_memorise_2 = true; } else flag_point_memorise_2 = true; } } } } // Ligne de séparation : Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_haute_basse } } //------------------------------------------------------------------------------- // Boutons de circuits : ListView { id: grille_principale x: parent.width * pourcentage_largeur_labels_formulaire y: (3 * hauteur_ligne_formulaire) + hauteur_bouton_droit width: parent.width * (1- pourcentage_largeur_labels_formulaire) height: parent.height - y snapMode: GridView.SnapToRow // L'arret de l'affichage se fera sur une rangée entière clip: true // Nécessaire pour que les Delegates s'arretent à l'intérieur de la GridView model: modele_grille_principale delegate: Rectangle { width: grille_principale.width height: grille_principale.height / nombre_circuits_affiches_sur_une_colonne color: "transparent" Rectangle { // c'est le bouton proprement dit... width:parent.width height: parent.height - 10 color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton anchors.bottom: parent.bottom Text { // Nom du circuit... anchors.fill: parent horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignTop topPadding: 10 leftPadding: 20 text: model.nom color: commandable ? couleur_blanc_casse : couleur_gris_fonce font.pixelSize: 18 } Text { // Intensité du circuit... anchors.fill: parent horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignBottom bottomPadding: 10 leftPadding: 20 text: model.intensite.toFixed(1) + " A" color: commandable ? couleur_blanc_casse : couleur_gris_fonce font.pixelSize: 18 } Rectangle { // Zone de consigne du circuit... anchors { top: parent.top bottom: parent.bottom right: parent.right } width: 100 radius: shipheart_rayon_bouton color: (consigne === 0) ? couleur_rouge_transparent : couleur_vert_transparent visible: commandable Text { // Valeur de la consigne... anchors.fill: parent horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter text: (consigne === 0) ? qsTr("Off") : ((consigne === 100) ? qsTr("On") : qsTr("On (%1 %%)").arg(consigne)) color: (consigne === 0) ? couleur_rouge : couleur_green_yellow font.pixelSize: 18 } } MouseArea{ anchors.fill : parent onClicked: { shipheart_clic(); toggle_circuit(index); } } } } /* footer: Rectangle { // Permet de dégager la place suffisante en fin de GridView pour accéder même au dernier élément lorsque que clavier est déplié height: shipheart_hauteur_clavier color: "transparent" } */ ListModel { id: modele_grille_principale } } } //------------------------------------------------------- // Ecran Droite : //------------------------------------------------------- Rectangle { id: zone_affichage_droite x: zone_affichage_haut_gauche.width + espace_colonnes_principales y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * (1 - pourcentage_largeur_colonne_gauche)) - (espace_colonnes_principales / 2) height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2); color: "transparent" Column { anchors.fill: parent spacing: 10 // Bouton Enregistrer : Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: // !clavier.active && // SDIR #255 !flag_init && flag_point_memorise_1 && flag_point_memorise_2 Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: qsTr("Enregistrer") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); enregistrement(); sortie(); stackView.pop(); } } } // Bouton Information : Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: (clavier.active || flag_init) ? false : true; // Si le clavier est déplié ou si l'init est eb cours, on ne propose pas le bouton Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: qsTr("Aide") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); boite_information_shipbs.open(); } } } } } //------------------------------------------------------- // Bandeau bas : //------------------------------------------------------- Row { x: 0 y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas; width: shipheart_largeur_page; height: shipheart_hauteur_bandeau_bas; spacing: 5 padding: 5 //................................................. // Bouton retour //................................................. Rectangle { id: bandeau_bas_zone_retour width: (parent.width * pourcentage_bandeau_bas_largeur_zone_retour) - (2 * parent.padding) height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding; radius: shipheart_rayon_bouton color: shipheart_couleur_fond_bouton Image { source: "/images/icone_retour.png" sourceSize.height: 30 anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } } MouseArea { // Zone d'interaction. On est obligé de la mettre dans la grille pour que Rectangle et MouseArea soient frères ou parent/enfant ET qu'on n'occupe qu'un espace dans la grille. id: mouse_area_bandeau_bas_zone_retour anchors.fill: parent onClicked: { shipheart_clic(); sortie(); stackView.pop() } } } } //=========================================================== // Boite d'alerte : //=========================================================== Shipheart_boite_dialogue { id: boite_alerte niveau: 1 imageTitreSource: "/images/attention.png"; message: qsTr("L'étalonnage ne peut pas se faire avec deux points identiques.

Essayer de modifier au moins l'un des deux points de référence en jouant sur la commande des circuits ci-dessous.
") } //=========================================================== // Boite d'information : //=========================================================== Shipheart_boite_dialogue { id: boite_information_shipbs niveau: 0 imageTitreSource: "/images/ampoule.png"; alignementMessage: Text.AlignJustify message: qsTr("Le principe de l'étalonnage est de comparer en 2 points différents la valeur de courant différentiel mesurée par le ShipBS d'une part et le courant de décharge mesuré par le système ShipHeart d'autre part.
Par exemple, en soumettant le ShipBS en cours d'étalonnage à une consommation faible ou nulle (premier point) puis en mettant en fonctionnement un ou plusieurs appareils pour obtenir une consommation de plusieurs ampères si possible (second point).

Très important : pendant toute la phase d'étalonnage aucun courant de charge ne doit être appliqué sur ShipBS ! Il est donc essentiel de déconnecter tous les chargeurs, régulateurs solaires, etc... du système pendant l'étalonnage. Faute de cela, les valeurs d'étalonnage seront erronées...

Remarques :
- toutes les consommations doivent passer par le système ShipHeart ! Il faut donc s'assurer qu'aucune charge n'est connectée directement au parc de batteries.
- les valeurs de courant n'ont pas d'importance.
- le courant du point 2 peut être inférieur ou supérieur à celui du point 1 (mais, aussi \"éloignés\" que possible l'un de l'autre).
- il est conseillé de choisir des charges dont la consommation est relativement stable ou, a minima, évolue peu sur une période de quelques secondes.") } //=========================================================== // Economiseur : Doit être placé en fin de page pour fonctionner //=========================================================== MouseArea { anchors.fill: parent preventStealing: true // Permet que cela fonctionne même si un élément flickable (notamment) soit derrière et "vole" le click enabled: flag_economiseur_actif onClicked: { mise_en_veille(0); } } //============================================================================================================= // Initialistion de la page //============================================================================================================= function init_page() { var i; var req, res; var nb; var id_variable; var tmp; if (adresse_module <= 0) { console.log("La page 'etalonnage_carte.qml' a été appelée sans 'adresse_module' valide. L'affichage de la page est impossible"); return; } // Recherche des informations sur la carte : req = 'SELECT Eeprom, Type FROM TB_Modules_physiques WHERE Adresse_k_bus=' + adresse_module + ' '; nb = bdd.requete(req); if (nb !== 0) { res = bdd.lecture_ligne(); i = 0; eeprom = res[i++]; // Sauvegarde car on va l'écraser sur la carte switch(Number(res[i++])) { //----------------------------------------- case shipheart_type_module_shipbase: nom_carte = "ShipBase"; break; //----------------------------------------- case shipheart_type_module_shippower812: nom_carte = "ShipPower812"; break; //----------------------------------------- case shipheart_type_module_shipBS: nom_carte = "ShipBS"; break; //----------------------------------------- case shipheart_type_module_shippower4AC: nom_carte = "ShipPower4AC"; break; //----------------------------------------- case shipheart_type_module_shippower8DC: nom_carte = "ShipPower8DC"; break; //----------------------------------------- default: nom_carte = "Modèle inconnu"; break; } } else { console.log("Aucun module n'existe avec l'adresse K-bus indiquée. L'affichage de la page 'etalonnage_carte.qml' est impossible") return; } // Recherche des informations sur la batterie affectée à cette carte : req = 'SELECT Cle_primaire, Resistance_interne FROM TB_Batteries WHERE Type_entrees=' + shipheart_batteries_type_entrees_ibs + ' AND Adresse_module=' + adresse_module + ' '; nb = bdd.requete(req); if (nb !== 0) { res = bdd.lecture_ligne(); i = 0; id_batterie = Number(res[i++]); resistance = Number(res[i++]); } else { console.log("Aucune batterie n'est affectée à la carte à étalonner. L'affichage de la page 'etalonnage_carte.qml' est impossible") return; } //------------------------------------------------------------------- // Remplissage du modèle de circuits : modele_grille_principale.clear(); // Récupération des informations sur les circuits rattachés à ce ShipBS : req = 'SELECT Cle_primaire, Nom, Consigne, Intensite, Adresse_module, No_circuit FROM TB_Circuits WHERE Adresse_module IN (SELECT Adresse_k_bus FROM TB_Modules_config WHERE ID_Batterie=' + id_batterie + ') ORDER BY Adresse_module, No_circuit'; nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { if ((Number(res[4]) !== 0) || (Number(res[5]) !== 2)) // On exclus le port USB arrière car sa consommation est inclue dans ShipBase et sa commande semble peu pertinente... { modele_grille_principale.append({ "id": Number(res[0]), "nom": res[1], "consigne": Number(res[2]), "consigne_init": Number(res[2]), "intensite": Number(res[3]), "commandable": !((Number(res[4]) === 0) && (Number(res[5]) === 0)) }); } } else break; // Ne devrait pas arriver.... } //-------------------------------------------------------------------- // Demande de mis à 0 du gain et offset de la carte (uniquement les valeurs courantes, pas les valeurs usine) : req = 'UPDATE TB_Modules_physiques SET Eeprom="00000000", New_eeprom=1 WHERE Adresse_k_bus=' + adresse_module + ' '; bdd.requete_unique(req); boite_information_shipbs.open(); flag_init = false; } //============================================================================================================= // Mise à jour de la valeur instantannée //============================================================================================================= function mise_a_jour() { var req, res; var nb; var i; i = 0; // Récupération des informations sur les circuits rattachés à ce ShipBS : for (i=0; i < modele_grille_principale.count; i++) // L'init de 'i' dépend de la présence ou non de ShipBase dans la liste { req = 'SELECT Consigne, Intensite FROM TB_Circuits WHERE Cle_primaire=' + modele_grille_principale.get(i).id + ' '; res = bdd.requete_unique(req); modele_grille_principale.set(i, {"consigne": Number(res[0]), "intensite": Number(res[1])}); } // Récupération des courants différentiel et de décharge de la batterie en cours : req = 'SELECT Courant_decharge, courant_differentiel, Tension FROM TB_Batteries WHERE Cle_primaire=' + id_batterie + ' '; res = bdd.requete_unique(req); i = 0; courant_decharge = Number(res[i++]); courant_differentiel = Number(res[i++]); tension = Number(res[i++]); if (!flag_point_memorise_1) { courant_decharge_1 = courant_decharge; courant_differentiel_1 = courant_differentiel; tension_1 = tension; } if (!flag_point_memorise_2) { courant_decharge_2 = courant_decharge; courant_differentiel_2 = courant_differentiel; tension_2 = tension; } } //============================================================================================================= // Commande d'un circuit //============================================================================================================= function toggle_circuit(index) { var consigne; if (modele_grille_principale.get(index).consigne === 0) consigne = 100; else consigne = 0; modele_grille_principale.set(index, {"consigne": consigne}); // Mise à jour de la nouvelle consigne du circuit: bdd.requete_unique('UPDATE TB_Circuits SET New_consigne=' + consigne + ' WHERE Cle_primaire="' + modele_grille_principale.get(index).id + '" '); synchro_bdd(shipheart_type_synchro_data); } //============================================================================================================= // Enregistrement des nouvelles valeur d'étalonnage //============================================================================================================= function enregistrement() { var req; var a, b; var gain, offset; var chaine_gain, chaine_offset; a = (courant_decharge_1 - courant_decharge_2) / (courant_differentiel_1 - courant_differentiel_2); b = courant_decharge_1 - (a * courant_differentiel_1); gain = Math.round(((a - 1) * 10000)); offset = Math.round((b * 1000)); if ((gain > -9999) && (gain < 9999) && (offset > -32000) && (offset < 32000)) // Si l egain ou l'offset sont hors limite, on n'enregistre pas de valeur d'étalonnage... { chaine_gain = bdd.int16_to_chaine_hexa(gain); chaine_offset = bdd.int16_to_chaine_hexa(offset); //console.log("Gain = " + gain + " soit, en hexa = [" + chaine_gain + "] et Offset = " + offset + " soit, en hexa = [" + chaine_offset + "]"); var new_eeprom; new_eeprom = chaine_offset.substring(2,3) + chaine_offset.substring(3,4) + chaine_offset.substring(0,1) + chaine_offset.substring(1,2); new_eeprom += chaine_gain.substring(2,3) + chaine_gain.substring(3,4) + chaine_gain.substring(0,1) + chaine_gain.substring(1,2); new_eeprom += eeprom.substring(8); eeprom = new_eeprom; } // Sinon, on conserve la valeur précédente de l'EEPROM qui va être rechargée dans le module. //console.log("Eeprom = " + eeprom); } //============================================================================================================= // Opération avant sortie //============================================================================================================= function sortie() { var req; var i; var r; // Estimation de la résistance interne : if ((tension_1 !== tension_2) && (courant_decharge_1 !== courant_decharge_2)) { r = ((tension_1 - tension_2) * 1000) / (courant_decharge_1 - courant_decharge_2); // Le 'x 1000' permet d'avoir une valeur en mOhms. Le sens (I1 - I2) est inversé par rapport à la formule car les courants de décharge sont négatifs par convention. } //console.log("tension_1 = " + tension_1 + "V, tension_2 = " + tension_2 + "V, courant_decharge_1 = " + courant_decharge_1 + "A, courant_decharge_2 = " + courant_decharge_2 + "A"); if ((r > 0) && (r < 10000)) resistance = r.toFixed(2); // On ne prend pas en compte les valeurs négatives ou > 10 Ohms else console.log("La valeur de résistance interne calculée est erronée : " + r + " mOhms"); // Mise à jour de la résistance dans TB_Batteries : req = 'UPDATE TB_Batteries SET Resistance_interne="' + resistance + '" WHERE Cle_primaire=' + id_batterie + ' '; //console.log("Requête = " + req) bdd.requete_unique(req); // Mise à jour de la valeur d'EEPROM : req = 'UPDATE TB_Modules_physiques SET Eeprom="' + eeprom + '", New_eeprom=1 WHERE Adresse_k_bus=' + adresse_module + ' '; //console.log("Requête = " + req) bdd.requete_unique(req); // Mise à leur valeur initiale des consignes des circuits rattachés à ce ShipBS : for (i=0; i < modele_grille_principale.count; i++) // L'init de 'i' dépend de la présence ou non de ShipBase dans la liste { bdd.requete_unique('UPDATE TB_Circuits SET New_consigne=' + modele_grille_principale.get(i).consigne_init + ' WHERE Cle_primaire="' + modele_grille_principale.get(i).id + '" '); } // Demande de reconfiguration système via la BDD car on a modifié des valeurs de configuration : // synchro_bdd(shipheart_type_synchro_config); } }