Programmare SlimLine Framboise en "C"

le module SlimLine Raspberry en plus d'une programmation conforme à la réglementation IEC61131 dans le style PLC, dans l'environnement LogicLab o CODESYS, il peut être programmé en langage "C" et/ou "C++", pouvant ainsi accéder à l'énorme quantité de logiciels disponibles sur Internet. Pour ceux qui utilisent l'environnement LogicLab et souhaite ajouter de nouvelles fonctions et les FB écrits en langage "C" et/ou "C++" peuvent lire cet article. N'importe quel compilateur peut être utilisé pour le développement d'applications, dans cet article nous utiliserons le célèbre IDE Codelite.

Installation de la chaîne d'outils

Pour pouvoir compiler des programmes exécutables sur Raspberry besoin de télécharger le toolchain compilation croisée de Raspbian da GitHub, décompressez le fichier dans un exemple de dossier système /home/elsist/dev. Maintenant, ajoutez le dossier à la PATH système, édition du fichier etc/profile insérer en bas le lien vers la chaîne d'outils dans le dossier vers lequel elle a été transférée, ci-après le lien pour les systèmes vers les bits 32 sur la ligne supérieure et les bits 64 sur la ligne inférieure.

export PATH=/home/elsist/dev/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:$PATH
export PATH=/home/elsist/dev/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH

Après avoir modifié le fichier pour le rendre actif, il est nécessaire d'exécuter la commande à partir d'un terminal source /etc/profile, vous pouvez vérifier que le PATH est actif avec la commande printenv. Si tout est correct, vous pouvez compiler un programme simple HelloWorld et l'exécuter. Créer un fichier avec un éditeur de texte main.c avec le contenu suivant:

#include <stdio.h>
int main()
{
    printf("Hello World!\r\n");
    return 0;
}

Compiler le programme avec la commande arm-linux-gnueabihf-gcc main.c -g -o hello, le fichier exécutable sera créé hello celui transféré à la framboise peut être exécuté. Même si nous avons maintenant tout ce dont nous avons besoin pour compiler un programme, il est préférable de s’appuyer sur un IDE qui permet de gérer le développement d’applications complexes de manière plus simple. Codelite.

Installation de l'IDE

Codelite est un IDE open source gratuit disponible pour Windows, Linux et MacOS pour fonctionner avec le langage C, le programme peut être téléchargé à partir de Site officiel. J'omets toutes les instructions d'installation qui en plus d'être très simples sont disponibles sur une infinité de guides disponibles sur Internet. Bien que le programme soit disponible pour Windows, je recommande de l'installer sur une machine Linux car il faut développer des applications pour Raspberry vous avez déjà toutes les bibliothèques de base disponibles.

Créez maintenant un nouvel espace de travail pour ajouter un nouveau projet, dans le projet défini le compilateur de la chaîne d'outils Raspberry, faites un clic droit sur le nom du projet, choisissez Settings->General->Compiler et mettre Cross GCC (arm-linux-gnueabihf). Compilez maintenant le projet et dans le dossier Debug o Release le projet générera le fichier exécutable. celui transféré au module Raspberry il sera possible de l'exécuter. Un programme de démonstration est fourni en téléchargement PTP168 avec quelques projets Codelite déjà prêt.

Capture CodeLite

Programme de transfert à la framboise

La commande build compile le programme qui est enregistré dans le dossier Debug o Release (Basé sur la sélection de build) créé dans le dossier du projet. Maintenant, en utilisant un SFTP, vous devez le transférer vers le module Raspberry pour l'exécution. Il existe de nombreux clients graphiques SFTP adaptés à cette fin, le plus connu est Filezilla, mais il est plus pratique d’agir simplement à partir d’une fenêtre de terminal à l’aide de la commande scp en le combinant avec la commande sshpass (Si la commande sshpass il n'est pas présent, il doit être installé).

Pour accéder au système, vous devez acquérir la clé d'authentification SHA256, puis exécuter la commande à partir d'une fenêtre de terminal ssh <Username>@<Host> (Exemple ssh [email protected]) et confirmez avec yes. Le mot de passe d'accès sera demandé et la clé sera ajoutée aux hôtes connus (Fichier /home/user.ssh/known_hosts). Si le système hôte est remplacé, la clé doit être supprimée avec la commande ssh-keygen -R <Host> et générer une nouvelle clé.

Supposons maintenant que le fichier exécutable HelloWorld compilé à la fois dans le dossier /home/HelloWorld/Release que le module Raspberry a des identifiants pi:raspberry et l'adresse IP 192.168.0.180, voulant transférer l'exécutable dans le dossier /home/pi vous devez utiliser la commande sshpass suivi du mot de passe de connexion

sshpass -p 'raspberry' scp /home/HelloWorld/HelloWorld/Release/HelloWorld [email protected]:/home/pi

Codelite peut exécuter automatiquement la commande à la fin de la compilation scp transférer le fichier dans le module Raspberry, pour le définir, vous devez faire un clic droit sur le nom du projet, choisissez le menu Settings->Pre/Post Build Commands->Post Build et entrez la ligne de commande définie ci-dessus. Dans les projets présents dans la démonstration, vous devez modifier la commande post build pour transférer le programme sur votre module Raspberry.

Projet "HelloWorld"

Ce projet imprime le message classique Hello World! sur la console.

BonjourMonde (Ptp168)
// #include <stdio.h>

int main(int argc, char **argv)
{
    printf("hello world\n");
    return 0;
}

// [End of file]

Projet "CPhrAccess"

Le programme active le chien de garde (Voir l'article) et gère un module d'extension d'E/S numériques connecté au bus. La bibliothèque est fournie pour le développement d'applications qui accèdent au matériel du système et aux modules d'extension libeS8CoreMng. Pour inclure la bibliothèque dans le projet faites un clic droit sur le nom du projet dans le menu Settings->Compiler->Include Paths définir le dossier "./Lib/eS8CoreMng/Include« Où se trouve la bibliothèque. La bibliothèque utilise la gestion des threads donc pour compiler le projet vous devez faire un clic droit sur le nom du projet dans le menu Settings->Linker->Linker Options les paramètres -pthread -lrt.

CPhrAccess (Ptp168)
// *****************************************************************************
// PROGRAM "CPhrAccess"
// *****************************************************************************
// A simple programs that shows how to access to peripheral modules attached to
// the SlimLine extension BUS.
// -----------------------------------------------------------------------------

#include <stdio.h>
#include <PhrFcts.h>
#include <Library.h>
#include <WatchDog.h>
#include <PhrI2cBus.h>
#include <SystemTime.h>
#include <LastError.h>
using namespace Elsist; //Defines namespace

// -----------------------------------------------------------------------------
// MAIN PROGRAM
// -----------------------------------------------------------------------------

int main(int argc, char **argv)
{
    // Define variables.
    
    int8_t Result; //Function result
    uint8_t PModules; //Peripheral modules
    uint32_t DInputs; //Digital inputs
    static uint32_t DOutputs; //Digital outputs
    static uint32_t TimeBf; //Time buffer (uS)

    // -------------------------------------------------------------------------
    // SYSTEM INITIALIZATION
    // -------------------------------------------------------------------------
    // A welcome message is displayed.

    printf("Elsist PTP168A000, CPhrAccess, Library:%s\n", eGetLibVersion());

    // Initialize the library, this must be done before use any function.
    // Function returns 0 if Ok or the error code.

    if ((Result=eLibInit()) != 0) {printf("eLibInit error %d\n", Result); return(0);}

    // Defines wich I2C device has been to used to manage the extension bus,
    // and initializes it. Function returns 0 if Ok or the error code.
    
    Result=ePhrI2cBusInit((char_t*)"/dev/i2c-4");
    switch(Result)
    {
        // Error on bus initializing there's some hardware problem.

        case -1: printf("Bus init error: %d\n", Result); return(0);
        
        // System has been restarted by a watchdog intervention.
        // "Result" returns the number of subsequent watchdog interventions.

        default:
        if (Result == 0) printf("System power up\n");
        if (Result != 0) printf("System has been rebooted for %d times\n", Result);
        
        // After a defined number of system reboots by watchdog interventions,
        // a decision must be taken. In this example the program is stopped.
        
        if (Result > 2)
        {
            printf("Too wdog reboot\n");
            eResetWDog(); //Watchdog reset, it reinits the reboot counter
            return(0);
        }
    }

    // Set the peripheral bus ready, this activates all the attached modules.
    // Set also the wdog timeout to 2 seconds. Time range (1 to 60000 mS).
    
    while (!ePhrI2cBusReady(true, 2000)); //Set ready signal on peripheral bus

    // -------------------------------------------------------------------------
    // PROGRAM LOOP
    // -------------------------------------------------------------------------
    // This is the main program loop, here all the program tasks has to be done
    // in this example the 8 digital outputs of an extension module are managed.

    while(true)
    {
        // The watchdog control has been set so it must be refreshed. If it's
        // not refreshed in the time set the system is rebooted.

        eWDogRefresh(); //Refresh the watchdog circuit

        // Read how many modules are attached to the bus, if no modules ends.

        PModules=eGetModulesOnPhrI2cBus(); //Peripheral modules
        if (PModules == 0) return(0);

        // Supposing to have a logic I/O module (With address 0) attached to the bus
        // are reading the inputs and managed the outputs.

        if (!eIsPhrI2cBusExtModuleAv(0)) return(0); //Exit if module not present
        if (!eGetPhrDI(0, DI_MODE::DI_8_LL, &DInputs))
            {printf("eGetPhrDi error: %u\n", eGetLastError()); return(0);}

        // Copy Di00 input status on Do00 output.

        if (DInputs&eBITPATTERN(0)) eBITSET(DOutputs, 0); else eBITRESET(DOutputs, 0);

        // Blink the Do01 outputs.

        if (TimeBf == 0) TimeBf=eGetSysTime(); //Initialize the reference time
        if ((eGetSysTime()-TimeBf) > eSEC(1))
        {
            TimeBf=eGetSysTime(); //Time buffer (uS)
            if (DOutputs&eBITPATTERN(1)) eBITRESET(DOutputs, 1); else eBITSET(DOutputs, 1);
        }

        // Transfer the value on the extension module digital outputs.

        if (!eSetPhrDO(0, DO_MODE::DO_8_LL, &DOutputs))
            {printf("eSetPhrDO error: %u\n", eGetLastError()); return(0);}
    }
}

// [End of file]
Cet article a-t-il été utile?