Page 1 sur 1

Copie de DB entier

Posté : 19 juil. 2016, 15:50
par Aurélien
Bonjour à tous,

Je réalise actuellement un programme d'une machine qui se charge d'alimenter en pièces d'autres machines.

Je souhaite réalise le programme le plus générique possible. Notament au nioveau de l'afficheur : avoir une seule page avec tous les paramètres d'une machine.

Quand on appuie sur le bouton de la machine 1, ça copie les données de la machine 1 dans les données à afficher sur l'HMI et ça appelle la page générique qui lie les données à afficher. Quand on quitte la page, on réalise l'opération inverse.

Pour chaque machine, il n'y a pas de programme générique à faire, il y aurait juste un décompte de temps à faire lorsque qu'une entrée est à 1. (temps d'attente depuis la demande d'approvisionnement).

Je ne sais pas trop comment faire, quelle est la meilleure solution entre les deux suivantes (peut-être que vous avez de meilleures idées ?) :

Solution 1
  • Je créée une variable struct qui contient toutes les données de la machine.
  • Ensuite, je réalise un Array[0 .. 9] of MachineStruct pour pouvoir faire des appels génériques de type Machines[2]
  • La partie décompte de temps dans ce cas ne peut pas être générique
Solution 2
  • Je créée un DB qui contient les données de la machine
  • Je créée un FB qui gère le décompte de temps
  • Sur l'afficheur, je ne sais pas comment je peux faire un appel générique du DBx ?

Merci par avance pour vos avis :)
Aurélien

Re: Copie de DB entier

Posté : 19 juil. 2016, 18:01
par Bernardo59
Bonjour Aurelien,

Pourquoi ne pas faire X pages avec X DB à récupérer dans l'API pour X machines ?

Re: Copie de DB entier

Posté : 19 juil. 2016, 18:26
par Aurélien
Merci pour la réponse.

Je souhaite faire quelque chose d'optimal, d'optimisé, avec le moins de répétitions de code, vues identiques.

Je pourrai effectivement faire "au plus simple" et faire une vue par machine avec un simple copier/coller, idem pour le code, mais ce n'est pas mon souhait sur ce projet.

Re: Copie de DB entier

Posté : 19 juil. 2016, 19:00
par Lorent2
La simplification du programmeur, n'est pas toujours la simplification du dépanneur qui devra assurer derrière :?

Re: Copie de DB entier

Posté : 19 juil. 2016, 20:25
par kosbor
bjr,

Je partirai sur un import de variable d'une structure de ta machine pour le HMI
Si tu as 10 machines ça fera beaucoup moins de var à importer et le jour ou tu veux rajouter des machines pas besoin de toucher au HMI
Apres que tu mettes ça dans un array de struct, ou UDT dans un DB, ou dans un DB c'est la meme chose 'l'indexage est différent

C'est pas au hmi d'appeler directement le DB , le hmi ou le BP donne l'index de la machine et la validation puis l'automate les mets à dispo dans la struct de variable(importée) de ta machine
En gros dans l' Array[0 .. 9] of MachineStruct ,j'importerai juste la variable Array[0].MachineStruct et les 9 autre reste dans l'automate
donc l'Array[0].MachineStruct est la zone qui sera tout le temps affiché sur la page

Re: Copie de DB entier

Posté : 19 juil. 2016, 22:59
par Aurélien
Lorent2 a écrit :La simplification du programmeur, n'est pas toujours la simplification du dépanneur qui devra assurer derrière :?
Je simplifie uniquement la partie affichage, en soit, ça ne touche pas le fonctionnement qui peut tomber en panne !


kosbor, tout à fait d'accord avec toi. A la base, je serai bien parti avec des DB et un FB pour gérer le décompte de temps, mais je n'ai pas trouver comment faire appeler indirectement à un DB ?

Sinon, je trouve la solution du tableau Array[..] of MachinesStruct très prope ! Mais après je n'ai pas trouvé un moyen de gérer "automatiquement" le décompte de temps quelque soit le nombre d'éléments dans le tableau. Peut-etre qu'il faut le faire en ST ou autre avec une boucle de type for each et un appel toutes les secondes pour incrémenter/décrémenter ?

Re: Copie de DB entier

Posté : 20 juil. 2016, 00:27
par kosbor
J'aimerais t'aider mais je comprend pas tout:
notament:
Aurélien a écrit : Quand on appuie sur le bouton de la machine 1, ça copie les données de la machine 1 dans les données à afficher sur l'HMI et ça appelle la page générique qui lie les données à afficher. Quand on quitte la page, on réalise l'opération inverse.
L'operation inverse c'est quoi? on remet les infos de la machine affichée dans la les données de la machine 1?
accés en lecture et ecriture cad que si edition de la page qui affiche la machine lorsqu'on quitte on ecrit les données dans la machine?

Aurélien a écrit :Pour chaque machine, il n'y a pas de programme générique à faire, il y aurait juste un décompte de temps à faire lorsque qu'une entrée est à 1. (temps d'attente depuis la demande d'approvisionnement).
faut toujours faire des exemples genre :
si on appuie sur une entrée machine 1 ça decompte ou decompte dans compteur 1 ,?
si on appuie sur une entrée machine 2 ça decompte ou decompte dans compteur 2 ,?
le compeur visible à l'ecran sera celui de la machine choisi lors de l' appuie sur le bouton de la machine X?

Re: Copie de DB entier

Posté : 20 juil. 2016, 08:32
par Aurélien
kosbor a écrit :L'operation inverse c'est quoi? on remet les infos de la machine affichée dans la les données de la machine 1?
accés en lecture et ecriture cad que si edition de la page qui affiche la machine lorsqu'on quitte on ecrit les données dans la machine?
Oui, tout à fait, cette page serait la page de paramétrage de chaque machine. Au chargement, on copie les données de la machine dans une variable temporaire. Ensuite, quand on quitte la page, on copie les données de la variables temporaire dans la variable de la machine pour mettre à jour les informations éditées.
kosbor a écrit :faut toujours faire des exemples genre :
si on appuie sur une entrée machine 1 ça decompte ou decompte dans compteur 1 ,?
si on appuie sur une entrée machine 2 ça decompte ou decompte dans compteur 2 ,?
le compeur visible à l'ecran sera celui de la machine choisi lors de l' appuie sur le bouton de la machine X?
Dès que la machine x active sa demande de chargement, on commence à décompter un temps pré-défini (différent pour chaque machine). Une fois ce temps écoulé, on indique que la machine doit être chargée en priorité de toutes les autres.

Il n'y a pas besoin d'afficher le décompte en cycle. Cependant, la valeur de pré-sélection doit être affichée sur la page du point précédent.

Re: Copie de DB entier

Posté : 20 juil. 2016, 20:30
par kosbor
Re je te propose ça c'est vraiment basique je n'ai pas eu le temps de tester , je pense que tu as plus qu'à adapter en fonction de tes besoins
Programmer c'est simple mais comprendre ce que les gens veulent c'est le pire

Code : Tout sélectionner


TYPE UDT30
    STRUCT   
        ID           : INT;   
        Nom          : STRING[50] ;
        Bouton       : BOOL;
        BoutonMemoire: BOOL;
        MyData       : ARRAY  [0 .. 100] OF BYTE;
        Decompteur   : STRUCT  
            Input    : BOOL;  
            SP       : INT; 
            PV       : INT; 
        END_STRUCT ;              
    END_STRUCT ; 
END_TYPE


FUNCTION_BLOCK FB61

CONST
    IDX_MIN :=1  ;
    IDX_MAX :=10 ;

END_CONST

VAR_INPUT
  Impul_1s  :BOOL;
    
END_VAR

VAR_IN_OUT
    
END_VAR

VAR_TEMP
    I                  : INT ;
END_VAR

VAR
    QuittePage  : BOOL;
    FlagINIT    : BOOL;
    Machines    : ARRAY  [IDX_MIN .. IDX_MAX] OF UDT30  ;    
    Machine     : UDT30;    
    MachineVide : UDT30;           
END_VAR

BEGIN
    
    // Init des ID et nom
    IF NOT FlagINIT THEN
        FOR I := IDX_MIN TO IDX_MAX DO
            Machines[I].ID :=I;
            Machines[I].Nom:=CONCAT (IN1:= 'Machine',IN2:= INT_TO_STRING(I));
        END_FOR ;
        FlagINIT:=True;
    END_IF;
    
    //boucle principale
    FOR I := IDX_MIN TO IDX_MAX DO
        
        IF Machines[I].Bouton AND NOT Machines[I].BoutonMemoire THEN
            Machines[I].BoutonMemoire:=true;
            Machines[I].Decompteur.PV:=Machines[I].Decompteur.SP; 
        END_IF;
        
        
        IF QuittePage AND Machine.ID<>0 THEN
            QuittePage:=False;
            Machines[Machine.ID]:=Machine; 
            Machine:=MachineVide;   
        ELSIF QuittePage AND Machine.ID=0 THEN
            QuittePage:=False;
            Machine:=MachineVide;                       
        ELSIF Machines[I].BoutonMemoire AND Machines[I].Decompteur.PV>0 AND Impul_1s THEN
            Machines[I].Decompteur.PV:= Machines[I].Decompteur.PV-1;
        ELSIF Machines[I].BoutonMemoire AND Machines[I].Decompteur.PV<=0 THEN
            Machines[I].BoutonMemoire:=false;
            //on remett la vielle machine à sa place et on met celle qui à la prio EN affichage par exemple à adapter 
            IF Machine.ID<>0  THEN
                Machines[Machine.ID]:=Machine;
                Machine:=Machines[I]; 
            ELSE
                Machine:=Machines[I];     
            END_IF;      
        END_IF;     
    END_FOR ;
    

END_FUNCTION_BLOCK


@+

Re: Copie de DB entier

Posté : 21 juil. 2016, 09:39
par Aurélien
Merci pour le code kosbor !

Je vais grandement m'en inspirer.