Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Automation Discussion :

Lecture db et ecriture SCL


Sujet :

Automation

  1. #1
    Futur Membre du Club
    Lecture db et ecriture SCL
    Bonjour à tous,
    Donc je suis en stage en informatique industriel. Je dois développer un bloc assez complexe. Donc je m'entraine à plus simple pour commencer
    Donc j'ai fais un nouveaux projet sous simatic manager (je dois utiliser cela car je dois faire un programme compatible avec s7-1200,1500
    J'ai créé un DB20 de test avec plusieurs information de type REAL.
    Je voudrais depuis un un FC lire toutes les information une à une dans mon db.
    Plusieurs question se pose.
    1) je voudrais utiliser un ARRAY[0..n] la valeur n n'est pas connu à la compilation donc problème. Allocation dynamique peut être? Si oui quel est la procédure. Car pas de fonction malloc etc... Et comment connaitre la taille du db pas facile a trouver.
    2)J'ai fuiné sur le net et je trouve des solutions avec pointeur mais je ne vois pas ou mon db est lier. Ni comment accèder à toutes les adress du db. Voici le code que j'ai adapter sans trop comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    FUNCTION FC123:VOID
    VAR_TEMP
        // création d'un pointeur
        pDB:ANY;
          // Liaison du pointeur sur la strucuture de donnée
       pAny AT pDB:
    STRUCT
        S7Code:BYTE;
        DataType:BYTE;
        Lenght :INT;
        DBNumber:INT;
        MemoryArea:BYTE;
        ByteAdressMSB:BYTE;
        ByteAdressLSB:WORD;
    END_STRUCT;     
    END_VAR
    
    VAR_INPUT
        TAILLE_DB:INT;
        NUMERO_DB:INT;
        NOMBRE_DE_POINT:INT;
        LECTURE_CAPTEUR:REAL;
        UNITER_DE_LECTURE:CHAR;
        
    END_VAR
    VAR_OUTPUT
        INDEX_VALUE:INT;
        VALEUR_CHARGE:REAL;
        VALEUR_CAPTEUR_DB:REAL;
    END_VAR
    // Initialisation des composante de la structure
    pAny.S7Code := 16#10;
    // type REAL 
    pAny.DataType := 16#08;
    
    pAny.Lenght := TAILLE_DB;
    pAny.DBNumber := NUMERO_DB;
    pAny.MemoryArea := 16#84;
    pAny.ByteAdressMSB :=0;
    pAny.ByteAdressLSB :=0;
    
    
    END_FUNCTION

    Je voudrais aussi savoir comment dans un FB je peux instancier un DB car a chaque fois que je met un fb dans mon ob1 bah cela s'affiche en rouge donc je dois avoir oublier quelques chose. Alors je met une db en input, mais c'est pas ce que je cherche à faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    FUNCTION_BLOCK FB1
    
    VAR_INPUT
        DB_TEST: BLOCK_DB;
    END_VAR
    
    VAR_OUTPUT
        outputest:REAL;
    END_VAR
    
    VAR
        stat_var1:REAL;
    END_VAR
    outputest:=DWORD_TO_REAL(DB_TEST.dd0);
    
    END_FUNCTION_BLOCK
    Je sèche un peu et je suis débutant SCL merci à vous de m'aider

  2. #2
    Membre actif
    salut

    1) je voudrais utiliser un ARRAY[0..n] la valeur n n'est pas connu à la compilation donc problème.
    Ce n'est pas possible, ton array doit toujours avoir une taille déterminée.
    Les pointeurs sur les db fonctionne mieux quand celle ci sont "non optimisé" car a ce moment la la db est contenue dans un seul "morceau" de mémoire.
    En cherchant un peu dans les bibliothèques de TIA , tu devrais trouver des instructions lié au DB

    Je voudrais aussi savoir comment dans un FB je peux instancier un DB car a chaque fois que je met un fb dans mon ob1 bah cela s'affiche en rouge donc je dois avoir oublier quelques chose. Alors je met une db en input, mais c'est pas ce que je cherche à faire.
    Les FB on besoin d'un espace mémoire,
    soit le fb est instanciable et alors tu crées une variables du même type que le fb, ou alors tu dois utilisé une DB