Ecrire dans un db en fonction de son numéro d'index
Ecrire dans un db en fonction de son numéro d'index
Bonjour à tous,
Je bute sur un problème sur TIA.
J'ai un projet avec énormément de moteurs et je dois écrire tous un tas de données dans des DB globaux différents pour une supervision tierce.
J'ai environ 1000 DB dans lesquels je dois venir écrire des valeurs.
Ex : Les données de mon disjoncteur moteur 1 doivent être écrite dans DB_DISJ_MOTEUR1, celles du disjoncteur moteur 2 dans DB_DISJ_MOTEUR2 etc.....
Comme dis ci-dessus c'est une supervision tierce et je n'ai donc pas le choix de travailler de cette manière...
Afin de réduire le travail de saisis, je souhaitais intégrer en d'entrée de mon FB Moteur un "index num DB", qui m'aurais permis d'aller écrire dans le bon DB en fonction de son Index (un peu comme il est possible de faire sur WinCC).
Ex: le DB du disjoncteur moteur 1 à pour numéro DB1000.
Je rentre donc 1000 sur l'entrée "INumDB" de mon FB Moteur et dans le FB, je traite les informations comme suit :
%DB[INumDB].DBX0.0 := DISJ_MOTEUR;
Sauf que contrairement à WinCC, TIA ne permet pas de saisir le numéro du DB entre crochet, il n'accepte que cette formulation :
%DB1000.DBX0.0 := ........;
Est-ce que quelqu'un saurait me dire si il est possible d'aller taper dans un DB en fonction de son numéro ou si je fais fausse route et que je vais devoir me palucher toute la saisie à la mano?
Merci d'avance pour votre aide
Je bute sur un problème sur TIA.
J'ai un projet avec énormément de moteurs et je dois écrire tous un tas de données dans des DB globaux différents pour une supervision tierce.
J'ai environ 1000 DB dans lesquels je dois venir écrire des valeurs.
Ex : Les données de mon disjoncteur moteur 1 doivent être écrite dans DB_DISJ_MOTEUR1, celles du disjoncteur moteur 2 dans DB_DISJ_MOTEUR2 etc.....
Comme dis ci-dessus c'est une supervision tierce et je n'ai donc pas le choix de travailler de cette manière...
Afin de réduire le travail de saisis, je souhaitais intégrer en d'entrée de mon FB Moteur un "index num DB", qui m'aurais permis d'aller écrire dans le bon DB en fonction de son Index (un peu comme il est possible de faire sur WinCC).
Ex: le DB du disjoncteur moteur 1 à pour numéro DB1000.
Je rentre donc 1000 sur l'entrée "INumDB" de mon FB Moteur et dans le FB, je traite les informations comme suit :
%DB[INumDB].DBX0.0 := DISJ_MOTEUR;
Sauf que contrairement à WinCC, TIA ne permet pas de saisir le numéro du DB entre crochet, il n'accepte que cette formulation :
%DB1000.DBX0.0 := ........;
Est-ce que quelqu'un saurait me dire si il est possible d'aller taper dans un DB en fonction de son numéro ou si je fais fausse route et que je vais devoir me palucher toute la saisie à la mano?
Merci d'avance pour votre aide
-
Pierro
- Première mise en service

- Messages : 61
- Enregistré le : 17 mars 2020, 16:58
- Localisation : 127.0.0.1
Re: Ecrire dans un db en fonction de son numéro d'index
Salut,
Je pense que tu pourrait peux etre déclarer dans le DB1000 tes objets sous forme d'array[0..NbMaxMoteur] of type pour ensuite faire l'indexage avec une variable DisjMoteur[INumDB]?
A+
Je pense que tu pourrait peux etre déclarer dans le DB1000 tes objets sous forme d'array[0..NbMaxMoteur] of type pour ensuite faire l'indexage avec une variable DisjMoteur[INumDB]?
A+
Re: Ecrire dans un db en fonction de son numéro d'index
Bonjour,
Il manque une précision : les 1000 DB sont existants (c'est à dire dans le projet TIA) ou sont ils créés à l'exécution (en appelant dans ton code la fonction d'ajout de DB) ?
En fait, pour moi, tu prends le problème dans le mauvais sens : plutôt que de passer ton numéro de DB, passe le DB en paramètre (TIA va jouer avec des pointeurs mais c'est transparent pour toi). Pour faire ça, il faut que le DB soit de type UDT utilisateur : tu dois donc créer un UDT Moteur puis créer 1000 DB de type UDT Moteur.
A+
Il manque une précision : les 1000 DB sont existants (c'est à dire dans le projet TIA) ou sont ils créés à l'exécution (en appelant dans ton code la fonction d'ajout de DB) ?
En fait, pour moi, tu prends le problème dans le mauvais sens : plutôt que de passer ton numéro de DB, passe le DB en paramètre (TIA va jouer avec des pointeurs mais c'est transparent pour toi). Pour faire ça, il faut que le DB soit de type UDT utilisateur : tu dois donc créer un UDT Moteur puis créer 1000 DB de type UDT Moteur.
A+
Re: Ecrire dans un db en fonction de son numéro d'index
Salut,
Merci pour vos réponses.
Les 1000 DB sont existants et malheureusement, je dois respecter la structure des DB qui m'est imposée par la supervision.
Mon problème principal est que je ne peux pas modifier les variables à l'intérieur des DB et que je ne peux donc pas créer des array of struct qui me faciliterait grandement la vie...
C'est pour ca que je voulais aller taper dans le numéro du db.
Si qq'un à une idée
Bonne journée
Merci pour vos réponses.
Les 1000 DB sont existants et malheureusement, je dois respecter la structure des DB qui m'est imposée par la supervision.
Mon problème principal est que je ne peux pas modifier les variables à l'intérieur des DB et que je ne peux donc pas créer des array of struct qui me faciliterait grandement la vie...
C'est pour ca que je voulais aller taper dans le numéro du db.
Si qq'un à une idée
Bonne journée
Re: Ecrire dans un db en fonction de son numéro d'index
Bonjour,
Si vraiment ça n'est pas possible (je ne vois pas pourquoi), la seule option qui te reste est de mettre les DB en non optimisé pour y accéder avec un adressage absolu.
De la sorte, tu pourras passer à ton bloc le numéro de DB et ainsi utiliser en LIST l'instruction "auf db" pour avoir accès aux données du DB qui t'intéresse (de mémoire, sinon il faut que je fouille, ça fait très longtemps que je n'ai pas fait ça).
Par contre, quelque soit la méthode, n'active pas là remanance sur tes 1000 DB (tu vas dépasser la capacité mémoire de travail).
A+
Je réitère donc : rien ne t'empêche de créer un udt avec les données et la structure imposées par la supervision. Ensuite, au lieu de créer 1000 DB "standard", tu n'auras "qu'à" créer 1000 DB de ce type UDT. Pour ta supervision, ça ne change absolument rien, par contre, ça va grandement te faciliter la vie.
Si vraiment ça n'est pas possible (je ne vois pas pourquoi), la seule option qui te reste est de mettre les DB en non optimisé pour y accéder avec un adressage absolu.
De la sorte, tu pourras passer à ton bloc le numéro de DB et ainsi utiliser en LIST l'instruction "auf db" pour avoir accès aux données du DB qui t'intéresse (de mémoire, sinon il faut que je fouille, ça fait très longtemps que je n'ai pas fait ça).
Par contre, quelque soit la méthode, n'active pas là remanance sur tes 1000 DB (tu vas dépasser la capacité mémoire de travail).
A+
Re: Ecrire dans un db en fonction de son numéro d'index
Dis moi si je me trompe mais l'utilisation des Db Array me permettrait "juste" de gagner du temps sur la création de mes DB mais ca ne me permettrait pas de venir taper dans les DB en fonction de leur numéro.
J'ai vu pas mal de sujet concernant l'instruction "auf", et je pense que je vais devoir partir la dessus même si ca ne me plait pas trop de travailler en List.
Merci pour tes réponses en tout cas
J'ai vu pas mal de sujet concernant l'instruction "auf", et je pense que je vais devoir partir la dessus même si ca ne me plait pas trop de travailler en List.
Merci pour tes réponses en tout cas
Re: Ecrire dans un db en fonction de son numéro d'index
Re,
Un exemple ici (2ème message) : https://sieportal.siemens.com/en-fr/sup ... -db/260920
Une fois ton DB crée, tu peux le passer en paramètre de ton bloc fonction (au lieu de passer un numéro)
La méthode à l'ancienne (adressage absolu, ...) est à éviter autant que possible.
A+
Je ne suis pas sûr que l'on se comprenne. Lorsque tu crées un DB, dans la fenêtre contextuelle, au lieu de choisir DB global, tu choisis ton UDT.
Un exemple ici (2ème message) : https://sieportal.siemens.com/en-fr/sup ... -db/260920
Une fois ton DB crée, tu peux le passer en paramètre de ton bloc fonction (au lieu de passer un numéro)
La méthode à l'ancienne (adressage absolu, ...) est à éviter autant que possible.
A+
Re: Ecrire dans un db en fonction de son numéro d'index
Salut,
Oui je sais comment créer les DB UDT mais les db ont des structures différentes en fonction de l'organes concerné (1 UDT pour le disj moteur, 1 pour le disj frein, 1 pour le var etc..).
En utilisant ta technique, il faudra quand même que j'aille pointer chaque db vers la bonne sortie de mon FB, ce que je voulais éviter de base..
Oui je sais comment créer les DB UDT mais les db ont des structures différentes en fonction de l'organes concerné (1 UDT pour le disj moteur, 1 pour le disj frein, 1 pour le var etc..).
En utilisant ta technique, il faudra quand même que j'aille pointer chaque db vers la bonne sortie de mon FB, ce que je voulais éviter de base..
Re: Ecrire dans un db en fonction de son numéro d'index
Pour ceux que ca intéresse, j'ai ducoup du utiliser la fonction OPN en list comme suit dans un FC:
///////////////////VAR/////////////////////////////
INPUT
DB_NUMBER Int
ADRESS Pointer
VALUE Int
TEMP
DB_NO_TEMP Int
///////////////////FONCTION/////////////////////////////
L #DB_NUMBER // Chargement du Numéro de DB
T #DB_NO_TEMP // Variable temporaire
L P##ADRESS // Chargement de l'adresse du pointeur
LAR1 // Sauvegarde dans le registre d'adresse
L D [ AR1 , P#2.0 ] // Chargement de la zone pointeur
LAR1
OPN DB [ #DB_NO_TEMP] // Ouverture DB
L #VALUE // Chargement de la valeur contenu dans DBW
T DBW [ AR1 , P#0.0 ] // Transfert de la valeur du mot
Dans DB_NUMBER, on rentre le numéro du DB dans lequel on veut écrire.
Dans ADRESS, on rentre le Pointer du mot sur lequel on veut écrire (Ex: si on veut écrire sur le mot 2 du db : P#2.0)
Dans VALUE, la valeur qu'on veut écrire dans le DB.
Attention le FC ou FB que vous utilisez pour cette fonction ne doit pas être optimisé tout comme les DB dans lesquels on va taper.
Il faut aussi être sur que le db et le mot dans lequel on va taper sont existant sinon l'automate passe en Stop.
A+
///////////////////VAR/////////////////////////////
INPUT
DB_NUMBER Int
ADRESS Pointer
VALUE Int
TEMP
DB_NO_TEMP Int
///////////////////FONCTION/////////////////////////////
L #DB_NUMBER // Chargement du Numéro de DB
T #DB_NO_TEMP // Variable temporaire
L P##ADRESS // Chargement de l'adresse du pointeur
LAR1 // Sauvegarde dans le registre d'adresse
L D [ AR1 , P#2.0 ] // Chargement de la zone pointeur
LAR1
OPN DB [ #DB_NO_TEMP] // Ouverture DB
L #VALUE // Chargement de la valeur contenu dans DBW
T DBW [ AR1 , P#0.0 ] // Transfert de la valeur du mot
Dans DB_NUMBER, on rentre le numéro du DB dans lequel on veut écrire.
Dans ADRESS, on rentre le Pointer du mot sur lequel on veut écrire (Ex: si on veut écrire sur le mot 2 du db : P#2.0)
Dans VALUE, la valeur qu'on veut écrire dans le DB.
Attention le FC ou FB que vous utilisez pour cette fonction ne doit pas être optimisé tout comme les DB dans lesquels on va taper.
Il faut aussi être sur que le db et le mot dans lequel on va taper sont existant sinon l'automate passe en Stop.
A+
Re: Ecrire dans un db en fonction de son numéro d'index
Bonjour,
En fait, Siemens préconise de rester en optimisé pour ne pas risquer d'impacter les performances des CPU 1200/1500 (sur l'ancienne gamme, tout le code (ladder, grafcet, ...) était transformé et exécuté en List, ce qui n'est plus le cas maintenant).
Je ne connais que l'instruction AUF (je n'utilise pas là notation internationale sur du matériel teuton
).
A+
En fait, Siemens préconise de rester en optimisé pour ne pas risquer d'impacter les performances des CPU 1200/1500 (sur l'ancienne gamme, tout le code (ladder, grafcet, ...) était transformé et exécuté en List, ce qui n'est plus le cas maintenant).
Je ne connais que l'instruction AUF (je n'utilise pas là notation internationale sur du matériel teuton
A+
