PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Front montant / Front descendant
Front montant / Front descendant
Iniciado por NathanBV, 15,abr. 2020 10:35 - 10 respuestas
Miembro registrado
12 mensajes
Publicado el 15,abril 2020 - 10:35
Bonjour à tous,

Je travaille sur une application de pilotage pour un automate, et je suis plutôt novice sur Windev. J'ai pas mal appris avec cette application mais je bloque sur quelques points notamment sur la gestion des "front montants".
En effet, je sais lire mes entrées digitales, je sais faire changer des interrupteurs à bascules en fonction de 1 ou 0 de l'entrée.
J'ai besoin de gérer des alarmes depuis ces entrées, dans un premier temps je pensais utiliser le traitement "à chaque modification" mais les interrupteurs étant modifié par programmation, je n'arrive pas à faire exécuter le code. J'ai fait quelques recherches, j'ai trouvé la fonction ..Modifié mais après quelques tests, pas plus de succès.
Le but étant de surveiller une entrée, si elle change d'état, il faut l'ajouter dans une table avec un certain statut ( tout ce qui est ajout d'une ligne, modification ligne, je sais le faire via des boutons de tests) et quand elle rechange modifié la ligne concernée.
Quand je souhaite passer par des thread en surveillance, j'ai des ajouts de lignes toutes les secondes, jusqu’à temps que le statut change. J'ai besoin de déclencher une action quand je passe à 1 par exemple et tant que je suis à 1 je ne fais rien, je fais une action quand je repasse à 0 et ainsi de suite.

Pourriez-vous m'aider sur ce point ?

N'hésitez pas à me demander plus d'informations si besoin,

Merci d'avance,
Publicado el 15,abril 2020 - 11:42
NathanBV vient de nous annoncer :
Bonjour à tous,

Je travaille sur une application de pilotage pour un automate, et je suis
plutôt novice sur Windev. J'ai pas mal appris avec cette application mais je
bloque sur quelques points notamment sur la gestion des "front montants". En
effet, je sais lire mes entrées digitales, je sais faire changer des
interrupteurs à bascules en fonction de 1 ou 0 de l'entrée.
J'ai besoin de gérer des alarmes depuis ces entrées, dans un premier temps je
pensais utiliser le traitement "à chaque modification" mais les interrupteurs
étant modifié par programmation, je n'arrive pas à faire exécuter le code.
J'ai fait quelques recherches, j'ai trouvé la fonction ..Modifié mais après
quelques tests, pas plus de succès. Le but étant de surveiller une entrée, si
elle change d'état, il faut l'ajouter dans une table avec un certain statut (
tout ce qui est ajout d'une ligne, modification ligne, je sais le faire via
des boutons de tests) et quand elle rechange modifié la ligne concernée.
Quand je souhaite passer par des thread en surveillance, j'ai des ajouts de
lignes toutes les secondes, jusqu’à temps que le statut change. J'ai besoin
de déclencher une action quand je passe à 1 par exemple et tant que je suis à
1 je ne fais rien, je fais une action quand je repasse à 0 et ainsi de suite.

Pourriez-vous m'aider sur ce point ?

N'hésitez pas à me demander plus d'informations si besoin,

Merci d'avance,


Bonjour,

Je ne suis pas spécialiste de ce genre de traitement mais dans le code
qui ajoute la ligne à la table tu peux pas simplement vérifier si le
statut a changé depuis la dernière entrée avant de l'ajouter ?

Bonne journée

--
Cordialement,
Pierre
Publicado el 15,abril 2020 - 12:28
Bonjour,

Pour ma part, et d'après ce que je comprends, je ferais d'abord un test de comparaison entre l'état de l'interrupteur actuel et celui dans lequel mon entrée digitale souhaite le basculer. S'il est identique, pas d'alarme, s'il est différent, alarme.

Cordialement.
Miembro registrado
12 mensajes
Publicado el 15,abril 2020 - 14:01
Bonjour Messieurs,

Merci pour vos réponses.
@Pierre
Dans ton idée, il faudra faire un code d'ajout de ligne "en permanence" mais si la ligne existe déjà je ne l'ajoute pas ? en comparant plusieurs critères à la limite.

@Didier
J'avais pensé à cette solution, mais je n'arrive pas justement à mettre en place un code qui garde l'ancienne valeur, cela se mets à jour au fur et à mesure. La lecture de l'automate est géré dans un thread en permanence qui lit toutes les secondes les entrées.
As-tu une idée du code ?

Merci
Miembro registrado
1.173 mensajes
Publicado el 16,abril 2020 - 13:48
Bonjour,
Avez-vous penser à utiliser les trigger ?

--
Thierry TILLIER
Développeur Windev-Webdev
Formation Windev (initiation aux classes) : https://coursdinfo.teachable.com/p/windev-programmer-avec-les-classes
Formateur bureautique (individualisation) : https://coursdinfo.net
Miembro registrado
12 mensajes
Publicado el 16,abril 2020 - 17:29
Bonjour @Thierry

Non je ne connais pas cette fonction et je viens de consulter la documentation. Mais je ne traite pas de fonctions HFSQL, juste les tables.ajoute par contre je ne trouve pas d'exemples là-dessus.
Pourrais-tu m'expliquer davantage ?

Merci d'avance,
Miembro registrado
1.173 mensajes
Publicado el 16,abril 2020 - 17:59
L'intérêt du trigger est d'intercepter un événement Hxx avant ou après son exécution. Mais il faut utiliser une base de données.
Dans votre cas, vous pourriez utiliser une structure ou une classe pour mémoriser :
- EtatFront_Avant
- EtatFront_Après
- EstModifié
- EtatActuel (=-1 à l'initialisation)....

à mon avis vous êtes obligé de trouver un moyen de lire / écrire ces informations (ou d'autres pertinentes).

--
Thierry TILLIER
Développeur Windev-Webdev
Formation Windev (initiation aux classes) : https://coursdinfo.teachable.com/p/windev-programmer-avec-les-classes
Formateur bureautique (individualisation) : https://coursdinfo.net
Publicado el 16,abril 2020 - 20:54
> La lecture de l'automate est géré dans un thread en permanence qui lit toutes les secondes les entrées.

Dans le code de ce thread, il DOIT y avoir un appel à une fonction en thread principal pour faire la mise à jour des interrupteurs (s'il n'y en a pas, il en faut une ou ca va planter)

Donc, dans CETTE fonction, on a la valeur à METTRE dans l'inter et le nom de l'inter (forcément)
On peut donc facilement comparer à ce niveau AVANT la mise à jour l'ancienne valeur (celle affichée) avec la nouvelle veant du thread de lecture...

Et donc faire ce dont tu as besoin si l'état change
Miembro registrado
12 mensajes
Publicado el 17,abril 2020 - 11:02
Bonjour Messieurs,

@Thierry - Je vois à peu près l'idée mais je n'ajoute pas en base de données les valeurs. Et la notion de structure ou classe ne m'est encore pas très parlante.

@Argus - Ta réponse m’intéresse, en effet, je pense avoir construit ma lecture comme tu le suggères. En effet, je déclenche ma procédure de lecture à l'ouverture de ma fenêtre en automatique, et plus bas dans ce code, j'ai
ExécuteThreadPrincipal(pl_RemplieChampDig,sNomChamp,nValeur)

Donc le nom de mon champ et la valeur associé.
Dans la procédure désignée ci-dessous j'ai :
Procedure pl_RemplieChampDig(sNomChamp est une chaîne, nVal est un entier)

{sNomChamp,indChamp} = nVal

ExécuteTraitement({sNomChamp,indChamp},trtModification)

J'avais bien eu l'idée de traiter mon objectif par ce moyen d'ou la ligne "exécute traitement", sur le principe cela fonctionne avec l'ajout de ligne souhaité mais toutes les secondes puisque je ne fais pas de comparaison, et c'est là que je bloque, comment faire cette comparaison ?
Pourrais-tu m'aider là-dessus ?

Merci d'avance,
Miembro registrado
1.173 mensajes
Publicado el 17,abril 2020 - 13:57
Pour comparer il faut absolument mémoriser d'une manière ou d'une autre l'ancienne valeur ou la lire avant son nouveau relevé. Si je comprends bien tout passe par un seul champ. Une comparaison de ce genre est-elle possible ?

Procedure pl_RemplieChampDig(sNomChamp est une chaîne, nVal est un entier)
SI {sNomChamp,indChamp} > nVal ALORS
//Front descendant
SINON
SI {sNomChamp,indChamp} = nVal ALORS
// même état
SINON
/ front montant
FIN
FIN

{sNomChamp,indChamp} = nVal

ExécuteTraitement({sNomChamp,indChamp},trtModification)



Tu peux aussi regarder avec un tableau de type "file d'attente" comme pour la téléphonie.

--
Thierry TILLIER
Développeur Windev-Webdev
Formation Windev (initiation aux classes) : https://coursdinfo.teachable.com/p/windev-programmer-avec-les-classes
Formateur bureautique (individualisation) : https://coursdinfo.net
Miembro registrado
12 mensajes
Publicado el 20,abril 2020 - 09:44
Bonjour Thierry,

Merci pour ce code de comparaison, j'étais sur cette piste en attribuant une valeur à une variable mais ce n'était pas concluant et pas assez complet.
Je n'avais pas eu le temps de tester vendredi, mais j'ai pu faire le test ce matin, et c'est bon cela fonctionne enfin j'ai juste dû inverser la comparaison de nVal. En effet, je lis des valeurs binaires 0 ou 1, elles sont toutes à 0 de base, et quand je déclenche la lecture tout restait à 0 car la comparaison n'était pas viable.

Si cela peut servir, voici le code que j'ai mis en place et qui fonctionne que je passe de 0 à 1 ou 1 à 0.
SI nVal > {sNomChamp,indChamp} ALORS
//Front montant
{sNomChamp,indChamp} = nVal
SINON
SI nVal = {sNomChamp,indChamp} ALORS
// Même état
{sNomChamp,indChamp} = nVal
SINON
// Front descendant
{sNomChamp,indChamp} = nVal
ExécuteTraitement({sNomChamp,indChamp},trtModification)
FIN
FIN


Maintenant, il me reste à adapter mon code "trtModification" qui en fonction de la valeur du champ fera la bonne action ( TableAjoute, TableModifie..)
En tout cas, merci pour votre aide à tous.

Vous souhaitant une bonne journée,