Copie de DB entier

Forum traitant des automates industriels de marque Siemens.
Répondre
Avatar du membre
Aurélien
Code son premier grafcet
Code son premier grafcet
Messages : 38
Enregistré le : 03 déc. 2015, 14:44
Localisation : Rhône-Alpes
Contact :

Copie de DB entier

Message 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
Apprenti ingénieur en électronique, informatique et systèmes avancés
Champion de France, Huitième Mondial et Médaille d'Excellence - Contrôle Industriel
Produits d'automatisme
Avatar du membre
Bernardo59
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1054
Enregistré le : 20 oct. 2015, 05:48
Localisation : Nimes
Contact :

Re: Copie de DB entier

Message par Bernardo59 »

Bonjour Aurelien,

Pourquoi ne pas faire X pages avec X DB à récupérer dans l'API pour X machines ?
Avatar du membre
Aurélien
Code son premier grafcet
Code son premier grafcet
Messages : 38
Enregistré le : 03 déc. 2015, 14:44
Localisation : Rhône-Alpes
Contact :

Re: Copie de DB entier

Message 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.
Apprenti ingénieur en électronique, informatique et systèmes avancés
Champion de France, Huitième Mondial et Médaille d'Excellence - Contrôle Industriel
Produits d'automatisme
Lorent2
Maître du binaire
Maître du binaire
Messages : 487
Enregistré le : 27 déc. 2015, 08:52

Re: Copie de DB entier

Message par Lorent2 »

La simplification du programmeur, n'est pas toujours la simplification du dépanneur qui devra assurer derrière :?
Si quelquefois tu te sens petit, inutile, démoralisé ou dépressif, n'oublies jamais que tu as été un jour le plus rapide et le meilleur spermatozoïde de ta bande ...
kosbor
Aguerri de l'automation
Aguerri de l'automation
Messages : 83
Enregistré le : 23 oct. 2015, 18:29

Re: Copie de DB entier

Message 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
Avatar du membre
Aurélien
Code son premier grafcet
Code son premier grafcet
Messages : 38
Enregistré le : 03 déc. 2015, 14:44
Localisation : Rhône-Alpes
Contact :

Re: Copie de DB entier

Message 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 ?
Apprenti ingénieur en électronique, informatique et systèmes avancés
Champion de France, Huitième Mondial et Médaille d'Excellence - Contrôle Industriel
Produits d'automatisme
kosbor
Aguerri de l'automation
Aguerri de l'automation
Messages : 83
Enregistré le : 23 oct. 2015, 18:29

Re: Copie de DB entier

Message 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?
Avatar du membre
Aurélien
Code son premier grafcet
Code son premier grafcet
Messages : 38
Enregistré le : 03 déc. 2015, 14:44
Localisation : Rhône-Alpes
Contact :

Re: Copie de DB entier

Message 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.
Apprenti ingénieur en électronique, informatique et systèmes avancés
Champion de France, Huitième Mondial et Médaille d'Excellence - Contrôle Industriel
Produits d'automatisme
kosbor
Aguerri de l'automation
Aguerri de l'automation
Messages : 83
Enregistré le : 23 oct. 2015, 18:29

Re: Copie de DB entier

Message 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


@+
Avatar du membre
Aurélien
Code son premier grafcet
Code son premier grafcet
Messages : 38
Enregistré le : 03 déc. 2015, 14:44
Localisation : Rhône-Alpes
Contact :

Re: Copie de DB entier

Message par Aurélien »

Merci pour le code kosbor !

Je vais grandement m'en inspirer.
Apprenti ingénieur en électronique, informatique et systèmes avancés
Champion de France, Huitième Mondial et Médaille d'Excellence - Contrôle Industriel
Produits d'automatisme
Répondre