programa SlimLine Frambuesa en "C"

el módulo SlimLine Raspberry además de programar de acuerdo a las regulaciones IEC61131 en estilo PLC, en el entorno LogicLab o CODESYS, se puede programar en lenguaje "C" y / o "C ++", pudiendo acceder así a la enorme cantidad de software disponible en Internet. Para los que usan el medio ambiente LogicLab y quiere agregar nuevas funciones y los FB escritos en lenguaje "C" y / o "C ++" pueden leer este artículo. Cualquier compilador puede usarse para el desarrollo de aplicaciones, en este artículo usaremos el conocido IDE Codelite.

Instalación de cadena de herramientas

Para poder compilar programas ejecutables en Raspberry necesita descargar el toolchain compilación cruzada de Raspbian da GitHub, descomprima el archivo en una carpeta de sistema de ejemplo /home/elsist/dev. Ahora agregue la carpeta a la PATH sistema, editando el archivo etc/profile insertando en la parte inferior el enlace a la cadena de herramientas en la carpeta a la que se transfirió, en adelante el enlace para los sistemas a bits 32 en la línea superior y bits 64 en la línea 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

Después de modificar el archivo para activarlo, es necesario ejecutar el comando desde un terminal source /etc/profile, puedes verificar que el PATH está activo con el comando printenv. Si todo está correcto, puede compilar un programa simple HelloWorld y ejecutarlo Crea un archivo con un editor de texto main.c con el siguiente contenido:

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

Compila el programa con el comando arm-linux-gnueabihf-gcc main.c -g -o hello, se creará el archivo ejecutable hello que se transfiere a la Raspberry se puede ejecutar. Incluso si ahora tenemos todo lo que necesitamos para compilar un programa, es preferible confiar en un IDE que permita gestionar el desarrollo de aplicaciones complejas de una manera más simple, en lo siguiente utilizaremos Codelite.

Instalacion IDE

Codelite es un IDE de código abierto gratuito disponible para Windows, Linux y MacOS para trabajar con el lenguaje C, el programa se puede descargar desde Sitio oficial. Omito todas las instrucciones de instalación que además de muy sencillas están disponibles en una infinidad de guías disponibles en Internet. Aunque el programa está disponible para Windows, recomiendo instalarlo en una máquina Linux ya que tiene que desarrollar aplicaciones para Raspberry ya tiene todas las bibliotecas básicas disponibles.

Ahora cree un nuevo espacio de trabajo para agregar un nuevo proyecto, en el proyecto configure el compilador de la cadena de herramientas de Raspberry, haga clic derecho en el nombre del proyecto, elija Settings->General->Compiler y establecer Cross GCC (arm-linux-gnueabihf). Ahora compila el proyecto y en la carpeta Debug o Release el proyecto generará el archivo ejecutable. que transferido al módulo Raspberry será posible ejecutarlo. Se proporciona un programa de demostración para descargar PTP168 con algunos proyectos Codelite ya listo.

Captura de pantalla de CodeLite

Programa de transferencia a frambuesa

El comando de compilación compila el programa que está guardado en la carpeta Debug o Release (Basado en la selección de compilación) creado dentro de la carpeta del proyecto. Ahora, usando un SFTP, debe transferirlo al módulo Raspberry para su ejecución. Hay muchos clientes SFTP gráficos adecuados para este propósito, el más conocido es Filezilla, pero es más conveniente simplemente actuar desde una ventana de terminal utilizando el comando scp combinándolo con el comando sshpass (Si el comando sshpass no está presente, debe estar instalado).

Para acceder al sistema, debe adquirir la clave de autenticación SHA256, luego ejecutar el comando desde una ventana de terminal ssh <Username>@<Host> (Ejemplo ssh [email protected]) y confirmar con yes. Se solicitará la contraseña de acceso y la clave se agregará a los hosts conocidos (Archivo /home/user.ssh/known_hosts). Si se reemplaza el sistema host, la clave debe eliminarse con el comando ssh-keygen -R <Host> y generar una nueva clave.

Ahora suponiendo que el archivo ejecutable HelloWorld compilado ambos en la carpeta /home/HelloWorld/Release que el módulo Raspberry tiene credenciales pi:raspberry y dirección IP 192.168.0.180, queriendo transferir el ejecutable a la carpeta /home/pi necesitas usar el comando sshpass seguido de la contraseña de inicio de sesión

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

Codelite puede ejecutar automáticamente el comando al final de la compilación scp transferir el archivo al módulo Raspberry, para configurarlo, debe hacer clic derecho en el nombre del proyecto, elegir el menú Settings->Pre/Post Build Commands->Post Build e ingrese la línea de comando definida anteriormente. En los proyectos presentes en la demostración, debe modificar el comando de compilación posterior para transferir el programa a su módulo Raspberry.

Proyecto "HelloWorld"

Este proyecto imprime el mensaje clásico Hello World! en la consola.

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

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

// [End of file]

Proyecto "CPhrAccess"

El programa activa el perro guardián (Ver artículo) y gestiona un módulo de ampliación de E / S digital conectado al bus. La biblioteca se proporciona para el desarrollo de aplicaciones que acceden al hardware del sistema y a los módulos de extensión. libeS8CoreMng. Para incluir la biblioteca en el proyecto, haga clic derecho en el nombre del proyecto en el menú. Settings->Compiler->Include Paths definir la carpeta "./Lib/eS8CoreMng/Include”Dónde se encuentra la biblioteca. La biblioteca utiliza la gestión de subprocesos, por lo que para compilar el proyecto, debe hacer clic con el botón derecho en el nombre del proyecto en el menú. Settings->Linker->Linker Options los 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]
¿Le resultó útil este artículo?