program SlimLine Zmeură în „C”

Formularul SlimLine Raspberry pe lângă programarea conform reglementărilor IEC61131 în stil PLC, în mediu LogicLab o CODESYS, poate fi programat în limbajul „C” și/sau „C ++”, putând astfel accesa cantitatea enormă de software disponibilă pe Internet. Pentru cei care folosesc mediul LogicLab și dorește să adauge noi funcții și FB-uri scrise în limbajul „C” și/sau „C++” poate citi acest articol. Orice compilator poate fi folosit pentru dezvoltarea aplicațiilor, în acest articol vom folosi binecunoscutul IDE Codelite.

Instalarea cablurilor de instrumente

Pentru a putea compila programe executabile pe Raspberry trebuie să descărcați toolchain compilare încrucișată a Raspbian da GitHub, despachetați fișierul într-un folder de sistem de exemplu /home/elsist/dev. Acum adăugați folderul la PATH sistem, editarea fișierului etc/profile introducând în partea de jos linkul către cablul de instrumente din folderul către care a fost transferat, în continuare linkul pentru sisteme către biți 32 pe linia superioară și biți 64 pe linia inferioară.

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

După modificarea fișierului pentru a-l face activ, este necesar să executați comanda de la un terminal source /etc/profile, puteți verifica dacă PATH este activă cu comanda printenv. Dacă totul este corect, puteți compila un program simplu HelloWorld și rulați-l. Creați un fișier cu un editor de text main.c cu următorul conținut:

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

Compilați programul cu comanda arm-linux-gnueabihf-gcc main.c -g -o hello, fișierul executabil va fi creat hello cel transferat la zmeură poate fi executat. Chiar dacă avem acum tot ce avem nevoie pentru a compila un program, este de preferat să ne bazăm pe un IDE care să permită gestionarea dezvoltării de aplicații complexe într-un mod mai simplu, în cele ce urmează vom folosi Codelite.

Instalare IDE

Codelite este un IDE open source gratuit disponibil pentru Windows, Linux și MacOS pentru a funcționa cu limba C, din care programul poate fi descărcat de pe Site-ul oficial. Omit toate instrucțiunile de instalare care pe lângă faptul că sunt foarte simple sunt disponibile pe un număr infinit de ghiduri disponibile pe Internet. Deși programul este disponibil pentru Windows, recomand să-l instalați pe o mașină Linux, deoarece trebuie să dezvoltați aplicații pentru Raspberry aveți deja toate bibliotecile de bază disponibile.

Acum creați un nou spațiu de lucru pentru a adăuga un nou proiect, în proiect setați compilatorul pentru lanțul de instrumente Raspberry, faceți clic dreapta pe numele proiectului, alegeți Settings->General->Compiler și înființat Cross GCC (arm-linux-gnueabihf). Acum compilați proiectul și în folder Debug o Release proiectul va genera fișierul executabil. care a transferat la modulul Raspberry va fi posibil să-l execute. Un program demonstrativ este furnizat pentru descărcare PTP168 cu unele proiecte Codelite deja gata.

Captura de ecran CodeLite

Transfer de program în zmeură

Comanda de compilare compilează programul care este salvat în folder Debug o Release (Pe baza selecției versiunii) creat în folderul proiectului. Acum, folosind un SFTP, trebuie să-l transferați în modulul Raspberry pentru execuție. Există mulți clienți SFTP grafici potriviti pentru acest scop, cel mai cunoscut este Filezilla, dar este mai convenabil să acționați pur și simplu dintr-o fereastră de terminal folosind comanda scp combinând-o cu comanda sshpass (Dacă comanda sshpass nu este prezent, trebuie instalat).

Pentru a accesa sistemul, trebuie achiziționată cheia de autentificare SHA256, apoi executați comanda dintr-o fereastră a terminalului ssh <Username>@<Host> (Exemplu ssh [email protected]) și confirmați cu yes. Va fi solicitată parola de acces și cheia va fi adăugată la gazdele cunoscute (Fișier /home/user.ssh/known_hosts). Dacă sistemul gazdă este înlocuit, cheia trebuie ștearsă cu comanda ssh-keygen -R <Host> și să genereze o nouă cheie.

Acum presupunând că fișierul executabil HelloWorld compilate ambele în folder /home/HelloWorld/Release că modulul Raspberry are acreditări pi:raspberry și adresa IP 192.168.0.180, dorind să transfere executabilul în folder /home/pi trebuie să utilizați comanda sshpass urmată de parola de conectare

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

Codelite poate executa automat comanda la sfârșitul compilării scp transferul fișierului în modul Raspberry, pentru a-l seta trebuie să faceți clic dreapta pe numele proiectului, alegeți meniu Settings->Pre/Post Build Commands->Post Build și introduceți linia de comandă definită mai sus. În proiectele prezente în demonstrație, trebuie să modificați comanda post build pentru a transfera programul în modulul dvs. Raspberry.

Proiectul „HelloWorld”.

Acest proiect imprimă mesajul clasic Hello World! pe consolă.

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

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

// [End of file]

Proiectul „CPhrAccess”.

Programul activează watchdog (Vezi articolul) și gestionează un modul de extensie digital I/O conectat la magistrală. Biblioteca este prevăzută pentru dezvoltarea aplicațiilor care accesează hardware-ul sistemului și modulele de extensie libeS8CoreMng. Pentru a include biblioteca în proiect, faceți clic dreapta pe numele proiectului din meniu Settings->Compiler->Include Paths definiți folderul "./Lib/eS8CoreMng/Include”Unde se află biblioteca. Biblioteca folosește gestionarea firelor, așa că pentru a compila proiectul trebuie să faceți clic dreapta pe numele proiectului din meniu Settings->Linker->Linker Options parametrii -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]
A fost util acest articol?