Programm SlimLine Himbeere in "C"

das Modul SlimLine Raspberry zusätzlich zur vorschriftsmäßigen Programmierung IEC61131 im SPS-Stil, in der Umgebung LogicLab o CODESYS, es kann in den Sprachen "C" und / oder "C++" programmiert werden und kann so auf die enorme Menge an Software zugreifen, die im Internet verfügbar ist. Für diejenigen, die die Umwelt nutzen LogicLab und möchte neue Funktionen hinzufügen und FBs die in "C" und / oder "C++" Sprache geschrieben sind lesen können dieser Artikel. Jeder Compiler kann für die Anwendungsentwicklung verwendet werden, in diesem Artikel verwenden wir die bekannte IDE Codelite.

Toolchain-Installation

Um ausführbare Programme auf kompilieren zu können Raspberry müssen die herunterladen toolchain Cross-Compilation von Raspbian da GitHubentpacken Sie die Datei in einen Beispiel-Systemordner /home/elsist/dev. Fügen Sie nun den Ordner dem hinzu PATH System, Bearbeiten der Datei etc/profile Fügen Sie unten den Link zur Toolchain in den Ordner ein, in den sie übertragen wurde, im Folgenden den Link für die Systeme zu den 32-Bits in der oberen Zeile und den 64-Bits in der unteren Zeile.

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

Nach dem Ändern der Datei, um sie zu aktivieren, muss der Befehl von einem Terminal ausgeführt werden source /etc/profilekönnen Sie überprüfen, dass die PATH ist mit dem Befehl aktiv printenv. Wenn alles in Ordnung ist, können Sie ein einfaches Programm kompilieren HelloWorld und lass es laufen. Erstellen Sie eine Datei mit einem Texteditor main.c mit folgendem Inhalt:

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

Kompilieren Sie das Programm mit dem Befehl arm-linux-gnueabihf-gcc main.c -g -o hellowird die ausführbare Datei erstellt hello das auf die Himbeere übertragene kann ausgeführt werden. Auch wenn wir jetzt alles haben, was wir zum Kompilieren eines Programms benötigen, ist es vorzuziehen, sich auf eine IDE zu verlassen, mit der die Entwicklung komplexer Anwendungen auf einfachere Weise verwaltet werden kann Codelite.

IDE-Installation

Codelite ist eine kostenlose Open-Source-IDE für Windows, Linux und MacOS, die mit der Sprache C funktioniert. Das Programm kann von heruntergeladen werden Offizielle Website. Ich lasse alle Installationsanweisungen weg, die nicht nur sehr einfach sind, sondern auch in einer unendlichen Anzahl von Anleitungen im Internet verfügbar sind. Obwohl das Programm für Windows verfügbar ist, empfehle ich, es auf einem Linux-Rechner zu installieren, da Sie Anwendungen dafür entwickeln müssen Raspberry Sie haben bereits alle grundlegenden Bibliotheken zur Verfügung.

Erstellen Sie nun einen neuen Arbeitsbereich, um ein neues Projekt hinzuzufügen, im Projektsatz den Raspberry-Toolchain-Compiler, klicken Sie mit der rechten Maustaste auf den Projektnamen, wählen Sie Settings->General->Compiler und eingestellt Cross GCC (arm-linux-gnueabihf). Kompilieren Sie nun das Projekt und in den Ordner Debug o Release Das Projekt generiert die ausführbare Datei. die auf das Raspberry-Modul übertragen wurde, kann ausgeführt werden. Ein Demoprogramm wird zum Download bereitgestellt PTP168 mit einigen Projekten Codelite bereits bereit.

CodeLite Screenshot

Programm auf Raspberry übertragen

Der Befehl build kompiliert das Programm, das im Ordner gespeichert ist Debug o Release (Basierend auf der Build-Auswahl) im Projektordner erstellt. Mit einem SFTP müssen Sie es nun zur Ausführung auf das Raspberry-Modul übertragen. Es gibt viele grafische SFTP-Clients, die für diesen Zweck geeignet sind, der bekannteste ist FilezillaEs ist jedoch praktischer, mit dem Befehl einfach von einem Terminalfenster aus zu agieren scp Kombinieren Sie es mit dem Befehl sshpass (Wenn der Befehl sshpass es ist nicht vorhanden, es muss installiert werden).

Um auf das System zugreifen zu können, muss der SHA256-Authentifizierungsschlüssel erworben und der Befehl über ein Terminalfenster ausgeführt werden ssh <Username>@<Host> (Beispiel ssh [email protected]) und bestätigen mit yes. Das Zugangspasswort wird abgefragt und der Schlüssel wird den bekannten Hosts hinzugefügt (Datei /home/user.ssh/known_hosts). Wenn das Hostsystem ersetzt wird, muss der Schlüssel mit dem Befehl gelöscht werden ssh-keygen -R <Host> und generieren Sie einen neuen Schlüssel.

Nun wird davon ausgegangen, dass die ausführbare Datei HelloWorld beides im Ordner zusammengestellt /home/HelloWorld/Release dass das Raspberry-Modul Zugangsdaten hat pi:raspberry und IP-Adresse 192.168.0.180, die ausführbare Datei in den Ordner übertragen möchten /home/pi Sie müssen den Befehl verwenden sshpass gefolgt vom Login-Passwort

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

Codelite kann den Befehl am Ende der Kompilierung automatisch ausführen scp Übertragen der Datei auf das Modul Raspberry, um es einzustellen, müssen Sie mit der rechten Maustaste auf den Projektnamen klicken, Menü auswählen Settings->Pre/Post Build Commands->Post Build und geben Sie die oben definierte Befehlszeile ein. In den in der Demonstration vorhandenen Projekten müssen Sie den Post-Build-Befehl ändern, um das Programm auf Ihr Raspberry-Modul zu übertragen.

Projekt "HelloWorld"

Dieses Projekt druckt die klassische Botschaft Hello World! auf der Konsole.

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

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

// [End of file]

Projekt "CPhrAccess"

Das Programm aktiviert den Watchdog (Siehe Artikel) und verwaltet ein an den Bus angeschlossenes digitales E/A-Erweiterungsmodul. Die Bibliothek wird für die Entwicklung von Anwendungen bereitgestellt, die auf die Systemhardware und Erweiterungsmodule zugreifen libeS8CoreMng. Um die Bibliothek in das Projekt aufzunehmen, klicken Sie mit der rechten Maustaste auf den Projektnamen im Menü Settings->Compiler->Include Paths Definiere den Ordner "./Lib/eS8CoreMng/Include„Wo sich die Bibliothek befindet. Die Bibliothek verwendet Threads-Management. Um das Projekt zu kompilieren, müssen Sie mit der rechten Maustaste auf den Projektnamen im Menü klicken Settings->Linker->Linker Options die Parameter -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]
War dieser Artikel hilfreich?