Comment créer des plugins¶
Un plugin est une assembly .NET (.DLL) qui permet de créer et d'ajouter de nouveaux nœuds à Connect I/O. Pour chaque nœud vous définissez des entrées, sorties et ajoutez la logique via du code. Ces plugins peuvent aller d'une logique simple à des opérations complexes comme l'interface avec du matériel ou un logiciel tiers.
Chaque nœud doit hériter de la classe CustomNode ou CustomNodeAsync contenue dans l'assembly ConnectIO.Plugins.dll. La classe CustomNode est la base pour des nœuds exécutant la logique dans le même thread que Connect I/O. Un bon exemple est le compteur descendant (CTD) qui exécute du code qui ne bloquera jamais le thread principal de Connect I/O. CustomNodeAsync est la base pour les nœuds exécutant la logique dans un thread distinct. Ces nœuds sont typiquement utilisés pour des opérations chronophages qui pourraient ralentir ou bloquer Connect I/O (ex. communications TCP/IP, accès aux drivers DAQ). Attention : les nœuds asynchrones ajoutent une surcharge d'exécution.
Les assemblies de plugins doivent se trouver dans le dossier plugins ou dans l'un de ses sous-dossiers pour être chargés automatiquement au démarrage. Pour le développement, il est recommandé d'utiliser Microsoft Visual Studio 2015 et le .NET Framework 4.5.
Attributs des nœuds¶
Les nœuds doivent porter des attributs pour définir leur organisation et affichage dans le panneau Plugins. Ils sont affichés par catégorie, sous-catégorie et nom. Les attributs Category et Name sont obligatoires, SubCategory est optionnel. L'attribut Documentation peut être utilisé pour spécifier le fichier de documentation (fichier texte .txt) pour chaque nœud.
[Category("Connect I/O Tutorials")]
[SubCategory("CustomNode Examples")]
[Name("ADD")]
[Documentation("ADD.txt")]
Sockets de nœud¶
Pour définir les entrées et sorties d'un nœud, vous devez utiliser des sockets. Il existe un socket distinct pour chaque type de données supporté par Connect I/O.
| Input Sockets | SocketBitInput, SocketByteInput, SocketShortInput, SocketIntInput, SocketLongInput, SocketFloatInput, SocketDoubleInput, SocketStringInput, SocketDateTimeInput, SocketTimeSpanInput |
| Output Sockets | SocketBitOutput, SocketByteOutput, SocketShortOutput, SocketIntOutput, SocketLongOutput, SocketFloatOutput, SocketDoubleOutput, SocketStringOutput, SocketDateTimeOutput, SocketTimeSpanOutput |
SocketBitInput input;
SocketBitOutput output;
public override void Initialize()
{
input = CreateSocketBitInput("IN");
output = CreateSocketBitOutput("OUT");
}
Créez un socket en appelant la méthode de création correspondante disponible sur la classe de base. Par exemple, pour créer un SocketBitInput utilisez CreateSocketBitInput.
Méthodes du nœud¶
Il y a cinq méthodes que vous devez redéfinir lors de la création d'un nœud.
public override void Initialize()
{ }
public override void Update(long cycleTime)
{ }
public override void Reset()
{ }
public override void Destroy()
{ }
public override void UpdateAsync(long cycleTime)
{ }
Initialize¶
Méthode appelée lorsqu'un nœud est ajouté au diagramme. Tous les sockets doivent être créés dans cette méthode ; utilisez-la pour les tâches d'initialisation.
Update¶
Méthode appelée à chaque cycle d'exécution de Connect I/O. Redéfinissez-la avec la logique spécifique au nœud. L'argument cycleTime est le temps en millisecondes écoulé depuis le dernier appel à Update.
UpdateAsync¶
Disponible uniquement pour CustomNodeAsync, appelée à une périodicité définie par la propriété UpdateRate (valeur par défaut 10 ms). Son exécution est contrôlée par Start et Stop. Elle s'exécute dans un thread séparé et doit être utilisée pour des opérations longues. L'argument cycleTime est le temps en ms écoulé depuis le dernier appel à UpdateAsync.
Reset¶
Méthode appelée lors du reset du diagramme. Utilisez-la pour réinitialiser l'état du nœud.
Destroy¶
Méthode appelée quand le nœud est supprimé du diagramme. Utilisez-la pour libérer ou réinitialiser les ressources.
Documentation des nœuds¶
Lorsque vous sélectionnez un nœud, des informations pertinentes sont affichées dans le panneau Propriétés. Pour créer la documentation d'un nœud, placez un fichier texte (.txt) à côté de l'assembly du plugin et indiquez son nom avec l'attribut Documentation.
Exemple¶
Cet exemple montre comment créer un CustomNodeAsync calculant la suite de Fibonacci.
using ConnectIO.Plugins;
using System.Windows.Media;
namespace ConnectIO.Tutorials
{
//Class attributes
[Category("Connect I/O Tutorials")]
[SubCategory("CustomNodeAsync Examples")]
[Name("Fibonacci")]
[Documentation("Fibonacci.html")]
public class Fibonacci : CustomNodeAsync
{
//The input socket for the bit to start and stop the calculation
SocketBitInput calculating;
//The output socket for the current result of the fibonacci sequence
SocketLongOutput result;
//The output socket for the current number of iterations
SocketIntOutput numberOfIterations;
//This holds the previous value of the fibonacci sequence
long previousNumber = 0;
/// <summary>
/// Called when the node is added to the diagram
/// </summary>
public override void Initialize()
{
//Create the inputs sockets and set the inputs label
calculating = CreateSocketBitInput("Start");
//Create the output socket and set the output label
result = CreateSocketLongOutput("Result");
numberOfIterations = CreateSocketIntOutput("Nr Iterations");
//Change the update rate to 1000 miliseconds for better visualization of the iterative calculation
UpdateRateAsyncTask = 1000;
//Set the initial state of the fibonacci sequence
previousNumber = 0;
result.Value = 1;
numberOfIterations.Value = 0;
}
/// <summary>
/// Called once in each update cycle
/// </summary>
public override void Update(long cycleTime)
{
//This input socket controls the execution of the "UpdateAsync" method through the Start and Stop methods
if (calculating.IsLinked)
{
if (calculating.Value && !IsRunning)
{
Start();
}
else if (!calculating.Value)
{
Stop();
}
}
}
public override void UpdateAsync(long cycleTime)
{
//Fibonacci Sequence iteration
long temp = previousNumber;
previousNumber = result.Value;
result.Value += temp;
//Increase the iteration counter
numberOfIterations.Value++;
}
/// <summary>
/// Called when the diagram is reset
/// </summary>
public override void Reset()
{
//Set the initial state of the fibonacci sequence
previousNumber = 0;
result.Value = 1;
numberOfIterations.Value = 0;
}
/// <summary>
/// Called when the node is removed from the diagram
/// </summary>
public override void Destroy()
{
//Do nothing
}
}
}
Déboguer un plugin¶
Il est possible de déboguer le code d'un plugin avec Microsoft Visual Studio. Pour déboguer un nœud suivez les étapes suivantes :
- Placez l'assembly du plugin dans le dossier
Connect I/O Plugins -
Ouvrez le projet du plugin dans Microsoft Visual Studio, cliquez sur FILE > Add > Existing Project…

-
Parcourez le dossier d'installation de Connect I/O et sélectionnez ConnectIO.exe, puis cliquez sur Open
-
Dans l'Explorateur de solutions, faites un clic droit sur Connect I/O puis Debug > Start new instance

-
Après le démarrage de Connect I/O, ajoutez le nœud à déboguer dans le canevas.