Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Comment écouter le bus KNX avec la librairie Falcon.net v5 (SDK) en c# et en Windev
#1
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.
Code :
bus.WriteValue(new GroupAddress("0/0/4"),new GroupValue(True),Priority.Low);
D'où la célèbre citation : "viens voir,.. la lampe s'allume, la lampe s'allume..".. totalement ignoré par ma femme. Dodgy

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).



Pièces jointes
.zip   Falcon .NET SDK.zip (Taille : 902,09 Ko / Téléchargements : 45)
Répondre
#2
Mild ... tu utilises quelle version de Windev ?
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)
Répondre
#3
avec Windev 20,.. avec la 21, l'import du SDK Falcon le fait planter.. je soumettrais le problème au support technique Windev.. bientôt.
Répondre
#4
Tu as essayé d'utiliser la fonction Timer ?

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)
Répondre
#5
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..

Répondre
#6
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.
Répondre
#7
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())

**'tain.. chui trop content ! Cool

Pour le tuto complet voir ce post : http://www.knx-fr.com/showthread.php?tid...0#pid30240
Répondre
#8
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)


Pièces jointes
.zip   pack_fr_100925.zip (Taille : 2,31 Mo / Téléchargements : 30)
Répondre
#9
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é.
Répondre
#10
(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 Sad
Répondre
#11
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
Répondre
#12
(17/12/2018, 07:13:18)mil3d a écrit : 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

Hello,

J'ai réussi à m'en sortir finalement, en VB.Net on doit passer par un handler comme ceci :

AddHandler _bus.GroupValueReceived, AddressOf BusOnGroupValueReceived

Bonne journée !
Répondre
#13
Tant mieux !
Bon dev'
Répondre
#14
(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 ?
Répondre
#15
Je n'ai jamais testé sur une grosse installation...
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)