Gambas France BETA


Pas de compte ? Incription

Comment enregistrer dans la bdd sqlite

Ce sujet est résolu.

1
AuteurMessages
spheris#1 Posté le 29/2/2024 à 19:28:46
Bonjour,
J'ai une application gb qui doit mesurer des valeurs physiques par l'intermédiaire de capteurs externes avec des cartes électroniques de mon cru et qui doit lancer plusieurs cycles avec des machines de traitement. (exemple, sonde de T°,hygro etc... et chauffage soufflant,buses adiabatiques etc...)
Sachant qu'un cycle complet de traitement d'un process dure une 30aine d'heures, et que je dois connaitre l'etat de toutes les entrées sorties du système, (mesures en entrée des capteurs, mise en route ou arrêts machines de traitement), je dois stocker les valeurs mesurées, les départs et arrêts machines dans une bdd sqlite pour traiter les données plus tard dans un module gbchart.

Le cadre étant posé, je propose deux variantes pour l'écriture dans la bdd:
A) J'écris dans un tableau virtuel de 30x3600 (30 heures x 3600 secondes) toutes les mesures les départs et arrêt machines à chaque changement d'état, et toutes les heures j'écris dans la bdd.
B) A chaque fois que je démarre un machine ou arrête ou mesure, etc.. je l'écris dans la bdd.

Et enfin ma questions:
A votre avis, quelle est la meilleure solution?
valaquarus#2 Posté le 1/3/2024 à 09:38:37
-- Unus Ex Altera --Bonjour Sphéris,
as tu prévu un onduleur pour alimenter l'ensemble ou non ?
- onduleur, tu peux écrire après dans la bdd
- pas d'onduleur, vaut mieux écrire les infos de suite pour ne pas en perdre au passage.

De toutes façons, perso j'écrirai de suite en bdd pour ne pas encombrer la mémoire.
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
linuxos#3 Posté le 1/3/2024 à 19:57:53
Un peu de sel, de poivre et la crevette sera... Spheris,

Bien evidement le mieux serait de stocker tes données dans une BD 'timeserie' vue que tes données sont liées au parametre temps.
Mais SQLite fera l'affaire sans probleme

Meme avis que 'valaquarus', je sauvegarderai les données dans la BD au fur est a mesure, de nos jours avec un disque SSD ce devrait etre instantané.


Idée interessante, il est facilement possible de sauvegarder un Object Collection en ficher JSON sur disque et de le relire pour le remettre dans un Objet Collection.
Je l'utilise avec des Collection de plus de 100000 Items+Sous-Items et cela ce fait en quelques secondes

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
linuxos#4 Posté le 1/3/2024 à 20:10:50
Un peu de sel, de poivre et la crevette sera... Spheris,

J'avais préparé cela mais je sais pas si cela t'aidera ou pas

1 - Ecrire au fur et a mesure de tes données dans la BD SQLite (donc pas besoin de sauvegarde toutes les heures)
2 - Ecrire les données dans un tableau, ou un Object Collection, ou un tableau d'Objets Class (Ex: ClassMesDonnees[])

- Exemple Tableau

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
## MMain ##
PUBLIC iaMonTableau AS NEW Integer[][]

PUBLIC Exemple_Tableau()

DIM iaRowData AS Integer[]
DIM i AS INTEGER
DIM j AS INTEGER

iaRowData = NEW Integer[]
iaRowData.Add(12)
iaRowData.Add(13)
iaRowData.Add(14)
iaRowData.Add(15)

iaMonTableau.Add(iaRowData)

iaRowData = NEW Integer[]
iaRowData.Add(25)
iaRowData.Add(26)
iaRowData.Add(27)
iaRowData.Add(28)

iaMonTableau.Add(iaRowData)

FOR i = 0 TO iaMonTableau.Max
FOR j = 0 TO iaMonTableau[i].Max
PRINT "[" & i & "][" & j & "] = " & iaMonTableau[i][j]
NEXT
NEXT

PRINT "iaMonTableau.Count = " & iaMonTableau.Count

END


- Exemple Collection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
## MMain ##
PUBLIC cMaCollection AS NEW Collection

PUBLIC SUB Exemple_Collection()

DIM iaRowData AS Integer[]
DIM i AS INTEGER

iaRowData = NEW Integer[]
iaRowData.Add(12)
iaRowData.Add(13)
iaRowData.Add(14)
iaRowData.Add(15)

cMaCollection.Add(iaRowData, "20240301-14:10")

iaRowData = NEW Integer[]
iaRowData.Add(25)
iaRowData.Add(26)
iaRowData.Add(27)
iaRowData.Add(28)

cMaCollection.Add(iaRowData, "20240301-14:15")

FOR EACH iaRowData IN cMaCollection
FOR i = 0 TO iaRowData.Max
PRINT "[" & cMaCollection.Key & "][" & i & "] = " & iaRowData[i]
NEXT
NEXT

END


- Exemple Tableau d'ojet Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
## ClassRowData Class ##
' Gambas class file

PUBLIC Date AS DATE
PUBLIC RowData AS Integer[]


PUBLIC SUB _new()
RowData = NEW Integer[]
END


## MMain ##

PUBLIC caMonTableauClass AS NEW ClassRowData[]

PUBLIC SUB Exemple_ClassTableau()

DIM cRowData AS ClassRowData
DIM i AS INTEGER

PRINT "-----------------------------------"
PRINT "Exemple_ClassTableau()"

cRowData = NEW ClassRowData

cRowData.RowData.Add(12)
cRowData.RowData.Add(13)
cRowData.RowData.Add(14)
cRowData.RowData.Add(15)
cRowData.Date = Now

caMonTableauClass.Add(cRowData)


cRowData = NEW ClassRowData

cRowData.RowData.Add(25)
cRowData.RowData.Add(26)
cRowData.RowData.Add(27)
cRowData.RowData.Add(28)
cRowData.Date = Now

caMonTableauClass.Add(cRowData)

FOR EACH cRowData IN caMonTableauClass
FOR i = 0 TO cRowData.RowData.Max
PRINT "[" & cRowData.Date & "][" & i & "] = " & cRowData.RowData[i]
NEXT
NEXT

PRINT "caMonTableauClass.Count = " & caMonTableauClass.Count

END



Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
spheris#5 Posté le 2/3/2024 à 20:14:14
Alors un grand merci pour vos réponses.
Tout d'abord merci valaquarus, un onduleur est essentiel pour cette application, je vais de ce pas m'en procurer un.

Ensuite l'idée d'enregistrer dès qu'une action se lance me parait aussi une bonne solution, sauf que,

Du coup une autre question survient:

Que se passe-t-il si une coupure secteur de 4 heures ou plus arrive?
L'onduleur ne tenant pas jusque là, comment savoir où le cycle doit reprendre? C'était donc l'idée de sauvegarder tous les X temps pour savoir où on en est dans le cycle.
A moins que vous n'ayez une autre solution?

LinuxOS,
Je ne comprends pas l'utilité de créer une classe pour gérer des données.
Une simple table virtuelle ou écrire directement dans la bdd parait plus simple, non?

linuxos#6 Posté le 3/3/2024 à 03:51:56
Un peu de sel, de poivre et la crevette sera... spheris

Oui bien sur écrire dans la BD parait plus simple, les exemples sont la pour donner des idées, juste ça, peut-etre pour ce projet ou pour un autre, qui sait.

Pour ce qui est du cycle, pourquoi ne pas sauver dans une autre table de la BD les cycles, indépendamment des valeurs.

Olivier

Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
spheris#7 Posté le 3/3/2024 à 09:04:01
Effectivement tu as raison pour les cycles et la nouvelle bdd. Je vais orienter la programmation dans ce sens là.
Merci à tous les deux
;-)
1