22/11/2016, 07:21:27 (Modification du message : 17/12/2016, 07:09:44 par mil3d.)
Bonjour,
j'essaie d'utiliser la librairie Falcon.net version 5 avec Visual Studio 2015 puis windev 20. J'arrive pour les deux à me connecter à ma passerelle :
Code :
//IP address = "192.34.241.35" port = 3671 and NAT mode is not used
using (Bus bus = new Bus(new KnxIpTunnelingConnectorParameters("192.34.241.35", 0x0e57, false)))
{
bus.Connect();
}
et envoyer une commande sur une adresse de groupe.
D'où la célèbre citation : "viens voir,.. la lampe s'allume, la lampe s'allume..".. totalement ignoré par ma femme.
J'aimerais donc maintenant bien sûr "écouter" tout changement d'état sur une adresse de groupe. Mais avec quelle commande dois-je le faire?
Je vois bien la commande de lecture du bus :
Code :
bool oneBitValue = (bool)bus.ReadValue("1/1/2");
mais je ne vais quand même pas devoir faire une boucle infinie qui vérifie si l'état de mon adresse de groupe a changé toutes les secondes ??!!
Je ne trouve pas la commande "événement" qui permet d'écouter et d'éxécuter du code dès qu'un changement survient (peut-être une commande qui écoute tout ce qui passe sur le bus?).
Si une âme charitable passe par là !
Merci.
ci-joint l'aide du SDK Falcon.net version 5 (renommer l'extension .zip en .chm, les .chm ne sont pas acceptés par le forum). Je suppose que la solution se trouve dans knx.falcon Namespace/KNX.Falcon.sdk/BUS class)
ATTENTION : si vous avez Falcon.net version 2 installé sur votre PC, vous ne pourrez pas voir le contenu du fichier d'aide. Il semble y avoir un conflit dans le fichier d'aide quand on a une autre version de falcon.net
EDIT : solution trouvée : voir le post #6 pour une solution en c# et le post #7 pour une solution avec Windev (wLanguage).
Le perfectionnement de soi et l'accession à sa légende personnelle passe obligatoirement par le partage de son savoir et de son expérience avec les profanes en demande d'initiation. (R. Bach)
A l'époque ou j'utilisais Windev pour du Dev c'est avec cette fonction que "j'écoutais" les ports RS232
Le perfectionnement de soi et l'accession à sa légende personnelle passe obligatoirement par le partage de son savoir et de son expérience avec les profanes en demande d'initiation. (R. Bach)
22/11/2016, 08:38:33 (Modification du message : 22/11/2016, 08:39:21 par mil3d.)
Oui je pense qu'une boucle infinie (timer dans windev) permettra de vérifier toutes les x millisecondes si l'état d'UNE adresse de groupe a changé.
Mais je cherche plutôt quelle fonction dans le SDK permet de vérifier le changement de TOUTES les adresses sur le bus et dans ce cas quelle adresse? et quelle valeur pour cette adresse?...
J'imaginais qu'il devait y avoir une fonction dans le SDK qui permet ça..
05/12/2016, 15:41:11 (Modification du message : 05/12/2016, 16:19:11 par mil3d.)
Bon... déjà j'ai réussi à faire ce que je voulais pour écouter le bus.. en tout cas en C#.
Pour Windev, je rame toujours.
La méthode (l'événement?) pour écouter toute activité sur le bus est Bus.GroupValueReceived Event
Ça me renvoi (ou plutôt ça me permet d'utiliser au sein d'une procédure encapsulée) un GroupValueEventArgs qui contient l'adresse de groupe de cet événement et sa valeur.
Code :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Knx.Falcon.Sdk;
using Knx.Bus.Common.Configuration;
using Knx.Bus.Common;
using Knx.Bus.Common.GroupValues;
namespace WindowsFormsApplication1
{
//déclaration de la fenêtre
public partial class Form1 : Form
{
//déclare et initialise une variable globale bus
public Bus bus = new Bus(new KnxIpTunnelingConnectorParameters("192.168.0.21", 0x0e57, false));
public Form1()
{
InitializeComponent();
//Se connecte au bus
bus.Connect();
//lance l'écoute du BUS
EcouteLeBus();
}
//procedure pour lancer l'écoute du bus et afficher un msgbox() en cas de réception d'événement.
private void EcouteLeBus()
{
bus.GroupValueReceived += eventargs =>
{
//affiche un MsgBox() avec comme texte l'adresse de groupe qui a changé suivi de sa nouvelle valeur
MessageBox.Show(eventargs.Address.ToString() + " -> " + eventargs.Value.ToString(), "MonTitre_MsgBox",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
};
}
}
}
J'essaie maintenant de traduire ça en Windev mais je n'y arrive pas encore.
C'est cette encapsulation eventargs => UneProcedureEncapsulee qui me pose problème en Windev et que je n'arrive pas à reproduire.
05/12/2016, 18:38:53 (Modification du message : 06/12/2016, 13:19:11 par mil3d.)
Ha ben si... ça marche.. j'ai réussi à le transcrire en Windev.. c'est tellement simple que je n'aurais jamais pensé au début à écrire ça comme ça !!
Code :
//Procédure globale de la fenêtre
bErreur est un booléen
QUAND EXCEPTION DANS
//déclaration d'une variable globale de type BUS
//"0x0e57" est le port de communication au format hexadécimal
gclMonBusKNX est un Bus(new KnxIpTunnelingConnectorParameters("192.168.0.21", 0x0e57, False))
FAIRE
// en cas d'erreur : Message complet de l'erreur principale
gen_MessageErreur est une chaîne = "erreur : " + ExceptionInfo(errComplet) + RC
// Parcours des sous-erreurs (s'il y en a)
POUR i = 1 _A_ ExceptionInfo(errNombreSousErreur)
// Message complet de chaque sous-erreur
gen_MessageErreur += "Sous-erreur " + i + " : " + ExceptionInfo(errMessage, i)
FIN
Info(gen_MessageErreur)
bErreur = vrai
FIN
si bErreur = faux alors
//connecte le bus..
//parfois il faut le faire 2 fois avant que ça fonctionne.. chez moi en tout cas (en fait c'est la même chose dans ETS 3.0f)
gclMonBusKNX.connect()
//allumer une lampe :
gclMonBusKNX.WriteValue(new GroupAddress("0/0/4"),new GroupValue(True),Priority.Low)
//éteindre une lampe
gclMonBusKNX.WriteValue(new GroupAddress("0/0/5"),new GroupValue(false),Priority.Low)
//écouter le BUS KNX :
//je crée une variable de type procédure
pMaProcedure est une Procédure
//j'ajoute la procédure TraceAdresseGroupe dans la variable pMaProcedure (sans passer de paramètre !)
pMaProcedure += TraceAdresseGroupe //!!! pas de parenthèse !! pas de passage de paramètre !!
//j'affecte mon cBus:GroupValueReceived avec ma procédure... le cBus exécutera ma procédure TraceAdresseGroupe() à chaque événement sur le bus KNX
gclMonBusKNX.GroupValueReceived += pMaProcedure
FIN
//voici ma procédure qui sera exécutée à chaque événement sur le Bus KNX
PROCEDURE TraceAdresseGroupe(clMonGroupValueEventArgs est un GroupValueEventArgs())
//affiche dans une fenêtre de trace() l'adresse de groupe qui a changé et sa valeur (ON, OFF ou autre)
Trace(clMonGroupValueEventArgs.Address.ToString() + " -> " + clMonGroupValueEventArgs.Value.ToString())
08/12/2016, 18:34:24 (Modification du message : 09/12/2016, 08:56:12 par mil3d.)
Pcsoft vient de me fournir un correctif pour windev 21 (version 210067F) qui resoud le problème d'importation de l'assemblage .net du sdk falcon.net. Ils sont très réactifs ! Je leur ai signalé le problème hier seulement..
Le voici en pièce jointe (fichiers à mettre dans le dossier \Programmes\ de WINDEV 21)
Pour info, la dernière version de Windev 22 (version 01F220052e du 22/02/2017) permet elle aussi maintenant d'ouvrir le SDK falcon.net, le bug a aussi été corrigé.
(05/12/2016, 15:41:11)mil3d a écrit : Bon... déjà j'ai réussi à faire ce que je voulais pour écouter le bus.. en tout cas en C#.
Pour Windev, je rame toujours.
La méthode (l'événement?) pour écouter toute activité sur le bus est Bus.GroupValueReceived Event
Ça me renvoi (ou plutôt ça me permet d'utiliser au sein d'une procédure encapsulée) un GroupValueEventArgs qui contient l'adresse de groupe de cet événement et sa valeur.
Code :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Knx.Falcon.Sdk;
using Knx.Bus.Common.Configuration;
using Knx.Bus.Common;
using Knx.Bus.Common.GroupValues;
namespace WindowsFormsApplication1
{
//déclaration de la fenêtre
public partial class Form1 : Form
{
//déclare et initialise une variable globale bus
public Bus bus = new Bus(new KnxIpTunnelingConnectorParameters("192.168.0.21", 0x0e57, false));
public Form1()
{
InitializeComponent();
//Se connecte au bus
bus.Connect();
//lance l'écoute du BUS
EcouteLeBus();
}
//procedure pour lancer l'écoute du bus et afficher un msgbox() en cas de réception d'événement.
private void EcouteLeBus()
{
bus.GroupValueReceived += eventargs =>
{
//affiche un MsgBox() avec comme texte l'adresse de groupe qui a changé suivi de sa nouvelle valeur
MessageBox.Show(eventargs.Address.ToString() + " -> " + eventargs.Value.ToString(), "MonTitre_MsgBox",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
};
}
}
}
J'essaie maintenant de traduire ça en Windev mais je n'y arrive pas encore.
C'est cette encapsulation eventargs => UneProcedureEncapsulee qui me pose problème en Windev et que je n'arrive pas à reproduire.
Hello,
Je ne trouve simplement pas l'évennement Bus.GroupValueReceived
En quelle version de Falcon as-tu cet évennement ? Je suis en 5.6 et ne le vois pas
17/12/2018, 07:13:18 (Modification du message : 17/12/2018, 07:15:59 par mil3d.)
Bonjour,
j'ai fait les tests en version 5.5.
Je ne l'ai jamais mis à jour en 5.6, je n'ai pas vu qu'il y avait une mise à jour, mais vu la liste des nouveautés entre 5.5 et 5.6, ce serait étonnant que ce soit à cause de ça que tu ne vois pas Bus.GroupeValueReceived
j'ai fait les tests en version 5.5.
Je ne l'ai jamais mis à jour en 5.6, je n'ai pas vu qu'il y avait une mise à jour, mais vu la liste des nouveautés entre 5.5 et 5.6, ce serait étonnant que ce soit à cause de ça que tu ne vois pas Bus.GroupeValueReceived
Hello,
J'ai réussi à m'en sortir finalement, en VB.Net on doit passer par un handler comme ceci :
(17/12/2018, 07:20:31)mil3d a écrit : Tant mieux !
Bon dev'
Merci bien !
Par contre j'ai une valise test pour la lecture du bus et tout fonctionne parfaitement. Par contre sur une grosse installation (plusieurs centaines de participants) l'écoute du bus ne me renvoie rien ...
Est-ce que tu as aussi des problèmes de lecture sur des grosses installations ?