programa SlimLine Framboesa em "C"

o módulo SlimLine Raspberry além de programar de acordo com os regulamentos IEC61131 no estilo PLC, no ambiente LogicLab o CODESYS, pode ser programado nas linguagens "C" e / ou "C ++", permitindo assim o acesso à enorme quantidade de softwares disponíveis na Internet. Para quem usa o meio ambiente LogicLab e deseja adicionar novas funções e FBs escritos em linguagem "C" e / ou "C ++" podem ler Neste artigo. Qualquer compilador pode ser usado para o desenvolvimento de aplicativos, neste artigo usaremos o conhecido IDE Codelite.

Instalação do Toolchain

Para poder compilar programas executáveis ​​em Raspberry precisa baixar o toolchain compilação cruzada de Raspbian da GitHub, descompacte o arquivo em uma pasta de sistema de exemplo /home/elsist/dev. Agora adicione a pasta ao PATH sistema, editando o arquivo etc/profile inserindo na parte inferior o link para a cadeia de ferramentas na pasta para a qual foi transferido, daqui em diante o link para os sistemas para bits 32 na linha superior e bits 64 na linha inferior.

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

Após modificar o arquivo para torná-lo ativo, é necessário executar o comando a partir de um terminal source /etc/profile, você pode verificar se o PATH está ativo com o comando printenv. Se tudo estiver correto, você pode compilar um programa simples HelloWorld e execute. Crie um arquivo com um editor de texto main.c com o seguinte conteúdo:

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

Compile o programa com o comando arm-linux-gnueabihf-gcc main.c -g -o hello, o arquivo executável será criado hello que transferido para o Raspberry pode ser executado. Mesmo que agora tenhamos tudo o que precisamos para compilar um programa, é preferível confiar em um IDE que permita gerenciar o desenvolvimento de aplicativos complexos de uma maneira mais simples, do seguinte modo usaremos Codelite.

Instalação IDE

Codelite é um IDE de código aberto gratuito disponível para Windows, Linux e MacOS para trabalhar com a linguagem C, o programa pode ser baixado em Site oficial. Omiti todas as instruções de instalação que além de muito simples estão disponíveis em uma infinidade de guias disponíveis na Internet. Embora o programa esteja disponível para Windows, recomendo instalá-lo em uma máquina Linux para ter que desenvolver aplicativos para Raspberry você já tem todas as bibliotecas básicas disponíveis.

Agora crie um novo espaço de trabalho para adicionar um novo projeto, no conjunto de projetos do compilador do conjunto de ferramentas Raspberry, clique com o botão direito do mouse no nome do projeto e escolha Settings->General->Compiler e definir Cross GCC (arm-linux-gnueabihf). Agora compile o projeto e na pasta Debug o Release o projeto irá gerar o arquivo executável. que transferido para o módulo Raspberry será possível executá-lo. Um programa de demonstração é fornecido para download PTP168 com alguns projetos Codelite já pronto.

Captura de tela do CodeLite

Transferir programa para Raspberry

O comando build compila o programa que é salvo na pasta Debug o Release (Com base na seleção de construção) criado dentro da pasta do projeto. Agora, usando um SFTP, você precisa transferi-lo para o módulo Raspberry para execução. Existem muitos clientes gráficos SFTP adequados para este fim, o mais conhecido é Filezilla, mas é mais conveniente simplesmente agir a partir de uma janela do terminal usando o comando scp combinando-o com o comando sshpass (Se o comando sshpass não estiver presente, deve ser instalado).

Para acessar o sistema, você precisa adquirir a chave de autenticação SHA256 e, em seguida, executar o comando em uma janela de terminal ssh <Username>@<Host> (Exemplo ssh [email protected]) e confirme com yes. A senha de acesso será solicitada e a chave será adicionada aos hosts conhecidos (Arquivo /home/user.ssh/known_hosts) Se o sistema host for substituído, a chave deve ser excluída com o comando ssh-keygen -R <Host> e gerar uma nova chave.

Agora assumindo que o arquivo executável HelloWorld compilado ambos na pasta /home/HelloWorld/Release que o módulo Raspberry tem credenciais pi:raspberry e endereço IP 192.168.0.180, querendo transferir o executável para a pasta /home/pi você precisa usar o comando sshpass seguido pela senha de login

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

Codelite pode executar automaticamente o comando no final da compilação scp transferindo o arquivo para o módulo Raspberry, para configurá-lo você precisa clicar com o botão direito no nome do projeto, escolher o menu Settings->Pre/Post Build Commands->Post Build e digite a linha de comando definida acima. Nos projetos presentes na demonstração, você precisa modificar o comando post build para transferir o programa para o seu módulo Raspberry.

Projeto "HelloWorld"

Este projeto imprime a mensagem clássica Hello World! no console.

Olá Mundo (Ptp168)
// #include <stdio.h>

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

// [End of file]

Projeto "CPhrAccess"

O programa ativa o watchdog (Veja o artigo) e gerencia um módulo de extensão de E / S digital conectado ao barramento. A biblioteca é fornecida para o desenvolvimento de aplicativos que acessam o hardware do sistema e módulos de extensão libeS8CoreMng. Para incluir a biblioteca no projeto clique com o botão direito no nome do projeto no menu Settings->Compiler->Include Paths definir a pasta "./Lib/eS8CoreMng/Include”Onde está localizada a biblioteca. A biblioteca usa gerenciamento de threads, então para compilar o projeto você precisa clicar com o botão direito no nome do projeto no menu Settings->Linker->Linker Options os parâmetros -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]
Esse artigo foi útil?