Définition de tableaux personnalisés dans les blocs de fonctions natifs – Guide pratique
Pourquoi cet article ?
En fait, cet article a été créé car lors du développement du bloc de fonctions natif (Native Function Block), j'ai découvert qu'il était impossible d'utiliser un tableau de structures personnalisées. Ou pour le dire autrement, c'est dommage que le GitHub officiel de PLCnext n'ait pas de tutoriels de ce type. Si vous utilisez le tutoriel C# pour créer un tableau personnalisé dans un bloc de fonctions natif, vous constaterez que vous ne pouvez pas le compiler avec succès, ou que la définition des valeurs du tableau dans PLCnext Engineer n'a aucune réponse. L'exemple dans ce cas concerne simplement la base de données.
Description de la démo
- L'exemple suivant utilise le bloc de fonctions natif pour créer une interface de tableau définie par l'utilisateur avec l'outil plcncli toolchain
- Le tableau se compose de 21 éléments, chacun étant une structure. La structure contient deux IecString80 et une énumération, comme le montre le diagramme suivant.
https://github.com/Leeable/UserDefineArray_NativeFB/tree/Master
Prérequis
- Assurez-vous que la version du ToolChain est 23.0 ou supérieure. Cet exemple utilise le ToolChain 23.6 pour la démonstration.
- Familier avec le processus de base de création d'un bloc de fonctions natif.
- Visual Studio 2019 ou 2022 avec les plugins d'extension ToolChain
$ plcncli --version plcncli 23.6.0.1450 (23.6.0.1450)
ÉTAPE 1
- Créez un nouveau projet dans Visual Studio, sélectionnez le type de projet « Shared Native Function Block » et nommez le projet « ArrayTest ».
- Ensuite, dans le projet ArrayTest dans Visual Studio, créez un nouveau bloc de fonctions natif nommé « ArrayCplus ».
ÉTAPE 2
Copiez ce code dans ArrayCplus.cs
En raison de problèmes d'affichage lors de l'inclusion directe du code source ici, comme & et >, j'ai fourni un lien à la place.
par exemple, le & sera encodé en
&dans ce html.....
ArrayCplus.cs
ÉTAPE 3
Ouvrez le terminal dans le dossier ArrayTestCpp et entrez ce qui suit.
$ plcncli generate code
Après la génération du code, localisez les fichiers ArrayTest-cli32.h et ArrayTest-cli64.h dans le répertoire src, et trouvez les endroits où #error est indiqué.
Nous devons supprimer les commentaires et améliorer le code. Cliquez pour accéder à InArrayFB-cli.cpp et modifier l'implémentation.
IntArrayFB-cli.cpp
ÉTAPE 4
Dans ArrayCplus.cpp, entrez le code suivant. Le contenu contenant des chaînes doit être initialisé dans le processus plutôt que dans la région Init ; l'initialisation dans la région Init ne fonctionnera pas, entraînant l'impossibilité d'écrire des valeurs dans sName et sAttribute via Engineer.
ArrayCplus-cli.cpp
ÉTAPE 5
Ouvrez le terminal dans le dossier ArrayTestCpp et entrez ce qui suit.
$ plcncli build all $ plcncli deploy
ÉTAPE 6
Ouvrez PLCnext Engineer et chargez le ArrayTest.pcwlx, ajoutez une variable à ArrayTest nommée arr
Maintenant, cela fonctionne
Questions
- Bien que cette méthode fonctionne en pratique, pourquoi est-il nécessaire d'initialiser le contenu contenant IecString ou String défini par l'utilisateur dans void PInvoke ArrayTest::ArrayCplus::Process() au lieu de void PInvoke ArrayTest::ArrayCplus::Init() ? Cela ne fonctionne pas si je mets le code dans void PInvoke ArrayTest::ArrayCplus::Init().
- Il est clair qu'il n'y a pas de tutoriel correspondant sur les tableaux définis par l'utilisateur pour les blocs de fonctions natifs sur GitHub. Quelqu'un peut-il le compléter et l'améliorer ? (la méthode du tableau Userdefine Csharp ne fonctionne pas dans le bloc de fonctions natif)
- Un dernier point qui me trouble aussi : pourquoi, que ce soit IecString, User-defined String, ou IecStringEx*, s'ils contiennent des chaînes, ils doivent être sous la forme 【InOut】 dans le code CSharp lorsqu'ils sont utilisés comme bloc de fonctions natif ?
Note :
Le blog Makers présente des applications et des histoires d'utilisateurs de membres de la communauté qui ne sont pas testés ou revus par Phoenix Contact. Utilisez-les à vos propres risques.
Technologie industrielle
- Comment l'ERP réduit les stocks et améliore l'efficacité opérationnelle
- Conception efficace d'un convertisseur abaisseur 12V vers 5V (Buck Converter)
- Primitives des fonctions exponentielles de base e
- Top 7 des logiciels de gestion de stocks 2022 : maximisez précision et efficacité
- Filtres passe-bande : conception, implémentation et conseils pratiques
- Nouvel algorithme quantique : 20 millions de qubits pour casser le RSA 2048 bits en 8 heures
- 3 avantages clés de la gestion de maintenance de bâtiment mobile
- Assemblages Rainure-Langue : Applications, Avantages et Guide de Réalisation
- Podcast : Accélérer la connectivité Edge dans l'IoT industriel