Notre objectif : cette bibliothèque est conçue pour vous aider à créer votre propre automate programmable . Elle vise à créer un écosystème de dispositifs programmables avec Fulmatic SOFT , vous offrant un contrôle maximal sur votre matériel . Vous pouvez utiliser cette bibliothèque complète avec n’importe quelle puce et environnement de développement intégré (IDE) de votre choix. Vous pouvez définir vous-même le schéma du circuit et toutes les autres spécifications matérielles.
Fulmatic SOFT : Intégrez la bibliothèque Fulmatic Core à votre code source en suivant les instructions, et vous pourrez programmer vos systèmes embarqués avec Fulmatic SOFT en utilisant le langage Ladder ( IEC 61131-3 ). Fulmatic SOFT vous offre bien plus qu'un simple automate programmable : il intègre toutes les fonctionnalités des automates modernes, ainsi que les protocoles TCP, UDP, de mouvement et les commandes par carte SD. Fulmatic SOFT met à votre disposition un vaste espace de travail avec 771 blocs (255 DB, 256 PB, 256 FB et 4 OB) et 16 384 E/S.
Firmware PLC gratuit : Vous pouvez utiliser gratuitement la bibliothèque PLC jusqu'à 2 048 octets (dont 1 026 octets utilisés par DB0). Si vous avez besoin de plus de mémoire, vous devez acheter une licence (10 USD) . Sans licence, le PLC fonctionnera pendant 60 minutes. Notre modèle de licence transparent est sans contrat ni procédure complexe. Vous devez ajouter une puce TSHA204A-SSHDA à votre circuit. Lors de l'achat d'une licence, une clé vous sera fournie. L'application de gestion des licences se connectera à notre serveur avec cette clé et chargera le code de licence dans la puce via le port série ou Ethernet. Le nombre de licences disponibles sur le serveur sera décrémenté simultanément.
GitHub : Vous pouvez télécharger notre exemple de projet, préparé avec VS Code pour STM32F407VGTx, depuis GitHub afin de tester la bibliothèque PLC . https://github.com/FultekPLC/Plc-Firmware
Ce projet inclut le firmware complet de l'automate programmable, exploitant la quasi-totalité des fonctionnalités de la puce et disponible en open source. Vous pouvez modifier les spécifications matérielles de la puce avec le logiciel Cube MX et poursuivre votre travail sur le même projet. Il est également possible de modifier les spécifications matérielles et logicielles avec VS Code. Vous pouvez ajouter des fonctions personnalisées au firmware de l'automate et les exécuter directement depuis le code de l'automate. Vous pouvez utiliser n'importe quelle marque et modèle de puce ARM, en spécifiant le nombre et les types d'E/S. En résumé, vous pouvez utiliser la bibliothèque Fulmatic Core sans aucune restriction, conformément aux termes de la licence.
Mise à jour du firmware : Les clients utilisant votre produit peuvent effectuer les mises à jour du firmware de l’automate programmable grâce à Fulmatic SOFT. Le code de mise à jour du firmware est entièrement open source ; vous pouvez consulter et modifier le code du chargeur de démarrage dans l’exemple de projet. Outre le code que nous recommandons, vous pouvez également écrire votre propre code de chargeur de démarrage.



Guide du code
Nous travaillons à simplifier l'utilisation de l'exemple de projet de 256 Ko . Un projet de 256 Ko pour une puce est relativement conséquent. Comprendre, modifier et implémenter un projet de cette taille ne sera pas chose aisée. Nous avons tenté d'expliquer les fonctions sur cette page et dans le code, et nous continuons à améliorer ces explications. Nous nous efforcerons de répondre à vos questions dans la section Discussions de notre dépôt GitHub. Malheureusement, nous n'offrons pas de support gratuit pour Fulmatic Core. Vous pouvez toutefois nous demander un devis pour la prise en charge complète du projet, y compris la conception du circuit imprimé.
Vous pouvez télécharger l'exemple de projet depuis notre lien GitHub : https://github.com/FultekPLC/Plc-Firmware. Ce projet vous permet de visualiser et de modifier toutes les fonctionnalités de l'automate programmable grâce au code source ouvert. Vous pouvez supprimer les fonctions inutiles et en ajouter de nouvelles.
Vous trouverez toutes les informations concernant les environnements de développement intégrés (IDE) et les outils de compilation dans notre dépôt GitHub. Sur cette page, nous expliquerons les fonctions permettant l'intégration de la bibliothèque à votre code microcontrôleur.
FulmaticConfig.h
Ce fichier définit la version du firmware et la taille des chaînes de caractères.
FulmaticCore.h
Ce fichier contient les en-têtes des fonctions de la bibliothèque que vous appellerez depuis votre code microcontrôleur. Vous y trouverez la description de chaque fonction. La bibliothèque utilise de nombreuses variables et chaînes de caractères. Vous devez créer ces variables et chaînes de caractères dans votre code microcontrôleur. La structure `variables_TypeDef` sert à transmettre les variables que vous créez à la bibliothèque. Vous ne pouvez pas modifier cette structure.
FulmaticInit : Cette commande ne doit être exécutée qu’une seule fois, lors de la première mise sous tension de la puce. La valeur 1 indique que la puce de licence a été correctement lue et fonctionne sous licence.
FulmaticExecute est une fonction appelée dans main.c pour exécuter le programme automate programmable . Elle est appelée lors du bloc Startup (au démarrage de l'automate), du bloc Main (à chaque cycle), du bloc Shutdown (à l'arrêt de l'automate), lors d'une interruption d'entrée numérique dans Interrput.c et lors d'une interruption temporelle (Timer) dans Fulmatic.c.
Fulmatic.c
Toutes les fonctions nécessaires à l'utilisation de la bibliothèque dans votre code sont regroupées dans le fichier Fulmatic.c. Ce fichier contient des dépendances vers d'autres fichiers. Les fonctions sont regroupées en quatre catégories. Leur description se trouve dans le fichier où est implémenté le corps de la fonction.
- Fonctions nécessaires au projet d'exemple mais non utilisées par la bibliothèque.
- Fonctions utilisées par la bibliothèque et qui doivent être incluses dans votre code.
- Fonctions utilisées par la bibliothèque à des fins de gestion des licences. Fonctions non requises pour une utilisation sans licence.
- Les fonctionnalités de la bibliothèque dépendent des commandes de l'automate programmable utilisé. Par exemple, si votre automate n'utilise pas les protocoles TCP, UDP, SPI, le port série et la carte SD, la bibliothèque fonctionnera sans ces fonctionnalités.
_DefaultEprom : Les paramètres matériels sélectionnables avec Fulmatic SOFT sont stockés dans les tableaux PlcSetupEprom[STPMEMORYSIZE] et PlcEprom[PRGMEMORYSIZE] (code Ladder ). La fonction _DefaultEprom de ce fichier contient les paramètres par défaut de l'automate. Vous pouvez personnaliser la configuration dans une certaine mesure en utilisant ces tableaux dans votre code.
`_EachMilliSecond` : Cette fonction, exécutée toutes les millisecondes, est gérée par le fichier principal et la bibliothèque. Dans l'exemple de projet, les indicateurs sont définis via `TIM7_IRQHandler` dans `Interrupt.c`, et non exécutés directement. De plus, la valeur `TIM7->ARR` est calibrée avec l'horloge temps réel (RTC). Veuillez consulter la fonction `_RtcCalibration` dans `Fulmatic.c`. Un calibrage incorrect entraînera des erreurs mineures dans toutes les opérations temporelles de l'automate.
_DelayUs : Il peut être nécessaire de modifier le code pour garantir un réglage précis en fonction de la fréquence de la puce. Il est recommandé de le tester et de l'étalonner sur une période prolongée. Il est étalonné pour 168 MHz.
_SetOutputs : Normalement, les entrées sont lues et les sorties écrites dans main.c. Cependant, en cas d’interruption temporelle ou d’entrée numérique, le bloc d’interruption OB2 est déclenché. Ce dernier est alors appelé depuis la bibliothèque pour configurer les sorties sans délai.
_GetMsTimerCount : Utilisée pour mesurer la durée dans de nombreuses opérations, cette fonction doit être présente dans votre code. Vous devez activer la lecture de la valeur du minuteur en millisecondes.
_CrcCalculate : Permet de calculer les sommes de contrôle à l’aide du matériel. Vous devez vous assurer de son bon fonctionnement en fonction de la puce utilisée.
Communication.c
Ce fichier contient le code nécessaire à l'utilisation d'Ethernet, du port série et du protocole SPI au sein de l'automate programmable. Les appels Modbus et Fulmatic SOFT sont reçus dans ce fichier. La cohérence des données est assurée par un délai entre l'exécution de la réponse et le lancement du programme dans main.c. De plus, le code de mise à jour du firmware et de gestion de la carte SD est explicitement inclus dans ce fichier. Fulmatic SOFT effectue les mises à jour du firmware et les opérations sur la carte SD à l'aide de ce code. Vous pouvez modifier ce code pour réaliser des opérations similaires avec votre propre logiciel. Les autres opérations Fulmatic SOFT et Modbus sont envoyées à la bibliothèque et reçoivent les réponses de celle-ci via ce code. En modifiant le code, vous pouvez également répondre aux appels Modbus sans les transmettre à la bibliothèque.
Flash.c
Le code de l'automate et les informations du compteur de temporisation persistant sont sauvegardés dans la mémoire flash lorsque l'automate est mis hors tension. À la remise sous tension, le dernier code sauvegardé est lu depuis le fichier flash.h. N'oubliez pas de configurer les informations de secteur de la puce utilisée. Le circuit suivant permet de détecter la mise hors tension de l'automate.

Ce circuit met la broche de détection d'arrêt à l'état bas lorsque la tension chute de 24 volts à environ 19 volts. Le condensateur C1 permet à la puce de continuer à fonctionner pendant un court laps de temps. Durant cette période prolongée, l'effacement et la réécriture de la mémoire flash sont risqués. Il est donc impératif de suivre les étapes suivantes.
- Lors de la première mise sous tension de l'automate programmable, nous copions le secteur 10 dans le secteur 11. Si l'alimentation est interrompue pendant le démarrage, les données intactes sont stockées dans le secteur 11.
- Pour enregistrer de nouvelles données dans la mémoire Flash, il faut d'abord les supprimer. La suppression étant beaucoup plus longue que l'enregistrement, nous effaçons le secteur 10 au démarrage et attendons l'arrêt du système.
- Le circuit de détection d'arrêt nous accorde un délai d'un peu plus d'une seconde. Lorsqu'un arrêt est détecté, les données sont sauvegardées dans le secteur 10 en 100 à 200 ms. Étant donné que le bloc d'arrêt OB 1 s'exécute avant l'arrêt et qu'un programme à relais important peut être présent dans l'automate programmable, le condensateur C1 doit avoir une capacité minimale de 2200 µF. Une résistance de limitation de courant de 100 ohms est utilisée pour éviter toute surtension dans le circuit due à cette capacité élevée.
- Au démarrage, l'automate programmable lit toutes les données du secteur 10 et effectue un contrôle d'intégrité. En cas de coupure de courant pendant le démarrage, ce contrôle échouera. Pas d'inquiétude : des données fiables sont toujours disponibles dans le secteur 11. Le démarrage se fait automatiquement à partir de ce secteur.
Interrupt.c
Les interruptions d'entrée numérique, de CAN, de temporisateur et d'UART sont définies dans ce fichier. Elles sont activées et désactivées selon le mode de fonctionnement de l'automate programmable dans la fonction `_INTSetup` du fichier `Fulmatic.c`. N'oubliez pas d'adapter le code de `_INTSetup` à votre matériel. Les fonctions de ce fichier doivent s'exécuter rapidement. Dans notre exemple, nous avons utilisé la commande `switch` pour améliorer la lisibilité du code. Cependant, il existe des méthodes pour optimiser son exécution. Par exemple, les opérations effectuées avec la commande `switch` peuvent être écrites sous forme de fonctions distinctes.
- void Handle_Encoder(void)
- void (*EXTI0_Handler_Ptr)(void);
- Selon la sélection effectuée avec Fulmatic SOFT dans INTSetup : EXTI0_Handler_Ptr = Handle_Encoder ;
- Lorsqu'une interruption se produit : Exécutez EXTI0_Handler_Ptr() ; à l'intérieur de EXTI0_IRQHandler.
Une autre méthode d'accélération consiste à convertir un octet en 32 bits. Vous pouvez utiliser ce code pour la série STM : *(int32_t *)&PlcIO[EncIAdr[0]] = __rev(ValueS32);
Il ne faut pas utiliser la bibliothèque HAL pour effacer les indicateurs d'interruption. Il est préférable d'utiliser la méthode plus rapide consistant à modifier directement la valeur du registre. TIM3->SR = 0; //__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
Interruptions d'entrée numérique : utilisées pour les compteurs à grande vitesse, les encodeurs et les applications similaires.
CAN : Nous n’utilisons pas l’accès direct à la mémoire (DMA) ; nous effectuons les opérations de lecture du CAN au sein de l’interruption. Cela nous permet d’effectuer des opérations de filtrage.
Minuteur : Nous l’utilisons pour un minuteur d’une milliseconde et les sorties de prise de force. Il ne suffit pas que le minuteur interrompe le signal toutes les millisecondes ; il doit également compter de 0 à 999.
USART : Les interruptions du port série sont utilisées pour la transmission et la réception de données. De plus, Fulmatic.c -> _EachMilliSecond contient les opérations sur la broche d'activation RS485.
Carte SD.c
Les opérations sur la carte SD sont gérées dans ce fichier. Vous pouvez également procéder différemment de notre exemple. Les codes de communication pour le chargement et le téléchargement de fichiers vers l'automate programmable sont fournis en open source dans le fichier Communication.c. Vous pouvez effectuer ces opérations à l'aide du logiciel Fulmatic. Si votre projet ne comporte pas de carte SD, vous pouvez supprimer toutes les fonctions correspondantes.
principal c
Ce fichier sera modifié à chaque enregistrement du projet avec Cube MX. Pour que vos commandes restent inchangées, vous devez écrire votre code dans les zones prévues à cet effet dans Cube MX. /* USER CODE BEGIN 2 */ Écrivez votre code ici. /* USER CODE END 2 */
Vous pouvez créer toutes les variables nécessaires à la bibliothèque dans ce fichier. Il peut être nécessaire de créer de grands tableaux à une adresse spécifique. `uint8_t PlcEprom[PRGMEMORYSIZE] __attribute__((section(“.ccmram”))));`
Examinez attentivement le fonctionnement de la boucle while. Toute modification apportée ne doit pas perturber sa structure globale. Le code écrit ailleurs dans votre programme ne doit pas ralentir cette boucle.
