Tutorial de Node-RED: Cómo conectar PostgreSQL con Raspberry Pi PLC

Guarda los datos de tus proyectos de código abierto en una base de datos relacional de objetos
9 de noviembre de 2021 por
Tutorial de Node-RED: Cómo conectar PostgreSQL con Raspberry Pi PLC
Boot & Work Corp. S.L., Fernandez Queralt Martinez

Introducción

Cada vez aparecen más programas con los que se puede programar sin tener que codificar estrictamente, como es el caso de Node-RED.

En esta entrada del blog, haremos una pequeña aplicación en la que recibiremos datos de entrada del PLC, y los enviaremos a la base de datos.

Do you want to know how? 

Últimas publicaciones

Your Dynamic Snippet will be displayed here... This message is displayed because you did not provided both a filter and a template to use.

NODE-RED-CONTRIB-POSTGRESQL

Una vez que tengas todas las herramientas listas para hacer que Node-RED se ejecute en tu PLC industrial Raspberry Pi, abre tu navegador favorito con Node-RED, ¡y empecemos!

La aplicación consistirá en leer una entrada analógica cada cinco segundos, y si el valor es superior a 1023, enviaremos la información a la base de datos. Además, iremos solicitando todos los datos de la tabla durante el mismo tiempo, cinco segundos, y mostraremos el resultado de los últimos datos almacenados en un cuadro de mando.

Así, hay tres nodos que necesitaremos que no están instalados por defecto con Node-RED y que vamos a instalar. Ve al Menú > Gestionar Paleta > Instalar, y escribe e instala estos tres:

  1. node-red-contrib-postgresql
  2. node-red-dashboard
  3. node-red-contrib-rpiplc-node


Una vez instalado, ¡desarrollemos nuestro flujo!

  • Por un lado, añadir un inject node, y repetir un intervalo cada 5 segundos.
  • Añade un nodo de lectura analógica desde Industrial Shields, selecciona tu modelo y la entrada donde añadirás un voltaje.
  • Justo después del nodo de lectura analógica, cablea un switch node y establece la propiedad msg.payload a dos condiciones:

    1. otherwise
    2. > (number) 1023
  • A partir de la salida número 1 (en caso contrario), conectaremos un debug node, donde veremos los valores cada 5 segundos.
  • Desde la salida número 2 del switch node, añade un function node con la siguiente condición:

    var now = new Date().toLocaleString("es-ES");
    msg.time = now;
    return msg;
  • Después del function node, añadiremos un nodo postgresql. Configuraremos un servidor. Como hicimos en la entrada del blog de la lectura anterior, vamos a establecer los siguientes parámetros en el nodo postgresql:

    Host: 127.0.0.1

    Port: (number) 5432
    Database: (String) isdb
    SSL: false

    En la pestaña Seguridad, establezca un usuario y una contraseña.


    En la sección de consultas, vamos a añadir la siguiente consulta:
     
    INSERT INTO myIStable VALUES ('I0.7', '{{msg.payload}}', '{{msg.time}}');
  • Por otro lado, añade un postgresql después del inject node con el mismo servidor, y añade esta consulta: 
    SELECT * FROM myIStable ORDER BY datetime DESC;
  • Obtenga la información añadiendo un debug node con la salida establecida en msg.payload[0];
  • Por último, vamos a añadir los nodos de texto. 
    En el primero, vamos a establecer la etiqueta a "Input", y el formato del valor a: "{{msg.payload[0].name}}".

    En el segundo, haremos lo mismo pero estableciendo la etiqueta como Valor, y el formato del valor como {{msg.payload[0].data}}

    Por último, añadiremos un tercer text dashboard node, con la etiqueta Datetime y el formato del valor: {{msg.payload[0].datetime}}

Así es como se ve la estructura básica de nuestra base de datos:

Base de datos - Tutorial de Node-RED: Cómo conectar PostgreSQL con Raspberry Pi PLC

Si no has conseguido que tu flujo se ejecute, compáralo con nuestro flows.json e inicia tu aplicación.

flows.json - Tutorial de Node-RED: Cómo conectar PostgreSQL con Raspberry Pi PLC
[{"id":"a2278800.0ea508","type":"tab","label":"Industrial Shields","disabled":false,"info":""},{"id":"686ee02c.306a","type":"postgreSQLConfig","name":"@127.0.0.1:5432/postgres","host":"127.0.0.1","hostFieldType":"str","port":"5432","portFieldType":"num","database":"isdb","databaseFieldType":"str","ssl":"false","sslFieldType":"bool","max":"10","maxFieldType":"num","min":"1","minFieldType":"num","idle":"1000","idleFieldType":"num","connectionTimeout":"10000","connectionTimeoutFieldType":"num","user":"pi","userFieldType":"str","password":"raspberry","passwordFieldType":"str"},{"id":"711d368a.8b1ec8","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false},{"id":"b0f41cb4.00be5","type":"ui_base","theme":{"name":"theme-light","lightTheme":{"default":"#0094CE","baseColor":"#0094CE","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":true,"reset":false},"darkTheme":{"default":"#097479","baseColor":"#097479","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":false},"customTheme":{"name":"Untitled Theme 1","default":"#4B7930","baseColor":"#4B7930","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"},"themeState":{"base-color":{"default":"#0094CE","value":"#0094CE","edited":false},"page-titlebar-backgroundColor":{"value":"#0094CE","edited":false},"page-backgroundColor":{"value":"#fafafa","edited":false},"page-sidebar-backgroundColor":{"value":"#ffffff","edited":false},"group-textColor":{"value":"#1bbfff","edited":false},"group-borderColor":{"value":"#ffffff","edited":false},"group-backgroundColor":{"value":"#ffffff","edited":false},"widget-textColor":{"value":"#111111","edited":false},"widget-backgroundColor":{"value":"#0094ce","edited":false},"widget-borderColor":{"value":"#ffffff","edited":false},"base-font":{"value":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"}},"angularTheme":{"primary":"indigo","accents":"blue","warn":"red","background":"grey","palette":"light"}},"site":{"name":"Node-RED Dashboard","hideToolbar":"false","allowSwipe":"false","lockMenu":"false","allowTempTheme":"true","dateFormat":"DD/MM/YYYY","sizes":{"sx":48,"sy":48,"gx":6,"gy":6,"cx":6,"cy":6,"px":0,"py":0}}},{"id":"5ca14fd8.ffd9b","type":"ui_group","name":"Last","tab":"711d368a.8b1ec8","order":1,"disp":true,"width":"6","collapse":false},{"id":"c907ade9.bac43","type":"rpiplc-config","model":"RPIPLC_21","name":""},{"id":"97597042.0079","type":"postgresql","z":"a2278800.0ea508","name":"","query":"SELECT * FROM myIStable order by datetime DESC;","postgreSQLConfig":"686ee02c.306a","split":false,"rowsPerMsg":1,"outputs":1,"x":330,"y":360,"wires":[["9616bb0.fc2d348","b48447e6.f139c8","81d99e93.465bb","d08407fe.6d5de8"]]},{"id":"b48447e6.f139c8","type":"ui_text","z":"a2278800.0ea508","group":"5ca14fd8.ffd9b","order":0,"width":0,"height":0,"name":"Last name","label":"Input","format":"{{msg.payload[0].name}}","layout":"row-spread","className":"","x":750,"y":400,"wires":[]},{"id":"9616bb0.fc2d348","type":"debug","z":"a2278800.0ea508","name":"Select last from db table","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload[0]","targetType":"msg","statusVal":"","statusType":"auto","x":790,"y":360,"wires":[]},{"id":"81d99e93.465bb","type":"ui_text","z":"a2278800.0ea508","group":"5ca14fd8.ffd9b","order":0,"width":0,"height":0,"name":"Last data","label":"Value","format":"{{msg.payload[0].data}}","layout":"row-spread","className":"","x":740,"y":440,"wires":[]},{"id":"e231470c.234588","type":"rpiplc-analog-read","z":"a2278800.0ea508","rpiplc":"c907ade9.bac43","pin":"I0.7","name":"","x":320,"y":160,"wires":[["73b6875.cf02878"]]},{"id":"411796a1.e76da8","type":"inject","z":"a2278800.0ea508","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"5","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":130,"y":260,"wires":[["e231470c.234588","97597042.0079"]]},{"id":"73b6875.cf02878","type":"switch","z":"a2278800.0ea508","name":"payload > 1023 ? 2 : 1","property":"payload","propertyType":"msg","rules":[{"t":"else"},{"t":"gt","v":"1023","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":520,"y":160,"wires":[["5358c90c.ea5ef8"],["418defc9.3ae52"]]},{"id":"5358c90c.ea5ef8","type":"debug","z":"a2278800.0ea508","name":"Value under 1023","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":100,"wires":[]},{"id":"bd13d364.a8193","type":"postgresql","z":"a2278800.0ea508","name":"","query":"INSERT INTO myIStable VALUES ('I0.7', '{{msg.payload}}', '{{msg.time}}');\n","postgreSQLConfig":"686ee02c.306a","split":false,"rowsPerMsg":1,"outputs":1,"x":970,"y":220,"wires":[[]]},{"id":"418defc9.3ae52","type":"function","z":"a2278800.0ea508","name":"Get time","func":"var now = new Date().toLocaleString(\"es-ES\");\nmsg.time = now;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":740,"y":220,"wires":[["9ea6befc.650a","bd13d364.a8193"]]},{"id":"9ea6befc.650a","type":"debug","z":"a2278800.0ea508","name":"get msg with value above 1023","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1030,"y":180,"wires":[]},{"id":"d08407fe.6d5de8","type":"ui_text","z":"a2278800.0ea508","group":"5ca14fd8.ffd9b","order":0,"width":0,"height":0,"name":"Last datetime","label":"Datetime","format":"{{msg.payload[0].datetime}}","layout":"row-spread","className":"","x":760,"y":480,"wires":[]}]

Pruebas

Ahora, vamos a probar nuestra aplicación con dos valores.

  1. Desde el PLC industrial Raspberry Pi, toma un cable de los 5V al I0.7, y obtén el resultado. El valor debe ser 1022.
  2. Ahora, toma el cable de los 24V a la entrada analógica I0.7 y obtén el resultado. El valor debe ser 2047.

 

Buscar en nuestro blog

Tutorial de Node-RED: Cómo conectar PostgreSQL con Raspberry Pi PLC
Boot & Work Corp. S.L., Fernandez Queralt Martinez 9 de noviembre de 2021
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>