la máquina digital 2. hmibmi y node-red · 2020-05-27 · la máquina digital 2. hmibmi y node-red...
TRANSCRIPT
La Máquina Digital 2. HMIBMI y Node-Red
Webinars únicos para ocasiones únicas.
Confidential Property of Schneider Electric
Ramón Antonio Hormigo Luque
Page 2Confidential Property of Schneider Electric |
1 Escalera de Valor
2 Arquitectura
3 ¿Qué es Node-Red?
4 Instalación de Node-Red
5 Instalación del paquete Modbus
6 Importación del Flow de ejemplo
7Creación de Maquina en Machine
Advisor
8 Configuración del Flow
1. Escalera de Valor del Fabricante de Maquinaria.
No Conectada
Conectable
Conectada
Inteligente
Integrada
Nuevo Modelo
de Negocio
M251MESE
Eth1
IP: 192.168.10.51
MK:255.255.255
GT:192.168.10.1
Eth0
IP: 192.168.10.1
MK:255.255.255
GT: -
wlan0
IP: 192.168.1.113
Router
IP: 192.168.1.1
Secure Connect
Advisor
Machine Expert
HMIBMI (Windows 10)
Page 4Confidential Property of Schneider Electric |
2. Arquitectura
Page 5Confidential Property of Schneider Electric |
3. ¿Qué es Node-Red?https://nodered.org/
Page 6Confidential Property of Schneider Electric |
Primero se instala Node.js
https://nodejs.org/en/
La versión a instalar es la LTS.
En la instalación dejar las opciones por
defecto.
4. Instalación de Node-Red (1)El procedimiento actualizado para realizar la instalación de Node-Red se puede encontrar en:
https://nodered.org/docs/getting-started/local
.
Page 7Confidential Property of Schneider Electric |
En una ventana de comandos o
en PowerShell se teclea:
npm install -g --unsafe-perm
node-red
Si se utiliza Powershell hay que
permitir la ejecución de scripts.
set-executionpolicy
remotesigned
4. Instalación de Node-Red (2)El procedimiento actualizado para realizar la instalación de Node-Red se puede encontrar en:
https://nodered.org/docs/getting-started/local
Page 8Confidential Property of Schneider Electric |
Si se tecla node-red se lanza la
herramienta.
4. Instalación de Node-Red (3)El procedimiento actualizado para realizar la instalación de Node-Red se puede encontrar en:
https://nodered.org/docs/getting-started/local
Page 9Confidential Property of Schneider Electric |
Se accede a Node-Red
tecleando en el explorador de
internet:
http://127.0.0.1:1880/
4. Instalación de Node-Red (4)El procedimiento actualizado para realizar la instalación de Node-Red se puede encontrar en:
https://nodered.org/docs/getting-started/local
Page 10Confidential Property of Schneider Electric |
Install pm2
• npm install pm2 -g
Install and config pm2-windows-startup
package :
• npm install pm2-windows-startup -g
• pm2-startup install
Locate the Node-Red red.js File and add it to
pm2:
• pm2 start C:\Users\<USER-
NAME>\AppData\Roaming\npm\node_mo
dules\node-red\red.js
• pm2 save
4. Instalación de Node-Red (5)Instalación de .pm2 para el arranque automático de Node-Red
Page 11Confidential Property of Schneider Electric |
pm2 list → Lista los procesos en ejecución
pm2 stop 0 → Para el proceso con id 0
pm2 start 0 → Arranca el proceso id 0
Pm2 restart 0 → Reinicia el proceso id 0
pm2 info red → Muestra información de la
aplicación red
4. Instalación de Node-Red (6)Comandos .pm2
Page 12Confidential Property of Schneider Electric |
Se abre el menú y se selecciona la
opción Manage palette
Utilizamos el node-red-contrib-modbus.
https://flows.nodered.org/node/node-
red-contrib-modbus
5. Instalación del paquete ModbusPara realizar la comunicación entre la HMIBMI y el controlador, M251, se utiliza un cliente
Modbus TCP. El M251 será el servidor y desde la HMIBMI se leerán los datos.
Page 13Confidential Property of Schneider Electric |
Copiar el
texto de la
columna
de la
derecha
[{"id":"d7dede69.b317f","type":"modbus-
read","z":"be86bda5.2f414","name":"","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"unitid":"1","dataType":"HoldingRegister","adr":"0","quantity":"4","rate":"60","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"d5c
95a01.34b7b8","useIOFile":false,"ioFile":"","useIOForPayload":false,"x":140,"y":110,"wires":[["1d812745.55ab49"],[]]},{"id":"686630d5.7b04d","type":"debug","z":"be86bda5.2f414","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":
"false","x":1030,"y":100,"wires":[]},{"id":"1d812745.55ab49","type":"function","z":"be86bda5.2f414","name":"Format Tango I/W/DW/F","func":"//*****************************CONFIGURACIÓN*************************************\nvar tipoVar = \"INT\"; //INT,WORD,
DWORD o FLOAT. WORD --> Array in = Array Out\nvar body_id = \"HMIBMI_1\"; //Descripción Dispositivo.\n//****************************************************************************\n\nvar body_vr = msg.payload; //Array de datos de entrada\nvar body_st =
msg.input.payload.address; //Primera Word a leer\nvar body_n = msg.input.payload.quantity; // Número de Words a Leer. Se utiliza si el tipo de variable es WORD.\n\n//*******************************Date format*************************************\nvar now =
new Date();\nvar dd = now.getUTCDate();\nvar mm = now.getUTCMonth()+1; //January is 0!\nvar yyyy = now.getUTCFullYear();\nvar hh = now.getUTCHours();\nvar mi = now.getUTCMinutes();\nvar ss = now.getUTCSeconds();\n\nif(dd<10){\n dd='0'+dd;\n}
\nif(mm<10){\n mm='0'+mm;\n} \nif(hh<10){\n\thh='0'+hh;\n} \nif(mi<10){\n\tmi='0'+mi;\n} \nif(ss<10){\n\tss='0'+ss;\n} \n\nvar now_formated = dd+'/'+mm+'/'+yyyy+'
'+hh+':'+mi+':'+ss;\n\n//********************************************************************************\nswitch(tipoVar)\n{\n case \"INT\":\n var aux_body_vr = [];\n \n for(var i=0;i<body_vr.length;i+=1){\n var i16 = new Int16Array([body_vr[i]]);\n
aux_body_vr[i]=i16;\n }\n var body='{\"ID\":\"'+body_id+'\",\"TS\":\"'+now_formated+'\",\"ST\":\"'+body_st+'\",\"VR\":['+aux_body_vr+']}';\n break;\n \n case \"WORD\":\n var
body='{\"ID\":\"'+body_id+'\",\"TS\":\"'+now_formated+'\",\"ST\":\"'+body_st+'\",\"N\":\"'+body_n+'\",\"V\":['+body_vr+']}';\n break;\n case \"DWORD\":\n var aux_body_vr = [];\n for(var i=0;i<body_vr.length;i+=2){\n var ui16 = new
Uint16Array([body_vr[i],body_vr[i+1]]);\n var ui32 = new Uint32Array(ui16.buffer, ui16.byteOffset, ui16.byteLength / Uint32Array.BYTES_PER_ELEMENT);\n aux_body_vr[i/2] = ui32;\n }\n var
body='{\"ID\":\"'+body_id+'\",\"TS\":\"'+now_formated+'\",\"ST\":\"'+body_st+'\",\"VR\":['+aux_body_vr+']}';\n break;\n case \"FLOAT\":\n var aux_body_vr = [];\n for(var i=0;i<body_vr.length;i+=2){\n var ui16 = new
Uint16Array([body_vr[i],body_vr[i+1]]);\n var fl32 = new Float32Array(ui16.buffer, ui16.byteOffset, ui16.byteLength / Float32Array.BYTES_PER_ELEMENT);\n aux_body_vr[i/2] = fl32;\n }\n var
body='{\"ID\":\"'+body_id+'\",\"TS\":\"'+now_formated+'\",\"ST\":\"'+body_st+'\",\"VR\":['+aux_body_vr+']}';\n break;\n default:\n var body='Define tipo de datos, WORD, DWORD, FLOAT';\n}\nmsg.payload = body;\n\nreturn
msg;\n","outputs":1,"noerr":0,"x":420,"y":100,"wires":[["e1c23328.687a6"]]},{"id":"e1c23328.687a6","type":"function","z":"be86bda5.2f414","name":"Request Builder","func":"msg.headers = {};\nmsg.headers['Content-Type'] =
'application/json';\nmsg.headers['Authorization'] = 'SharedAccessSignature sr=cnm-ih-na.azure-devices.net%2Furn%3Adev%3Aops%3A000000-EMA-prod-
f5acb509ceea5d696de7acce&sig=LNZE5srU2VKaA%2BIXrrlzuOARAIUdeD3Ob5r94su34%2Fg%3D&se=1617356661';\nreturn msg;\n//Authorization;SharedAccessSignature sr=cnm-ih-na.azure-devices.net%2Furn%3Adev%3Aops%3A000000-EMA-prod-
f5acb509ceea5d696de7acce&sig=LNZE5srU2VKaA%2BIXrrlzuOARAIUdeD3Ob5r94su34%2Fg%3D&se=1617356661","outputs":1,"noerr":0,"x":660,"y":100,"wires":[["7216f91d.390fd8"]]},{"id":"7216f91d.390fd8","type":"http
request","z":"be86bda5.2f414","name":"HTTP Request","method":"POST","ret":"txt","paytoqs":false,"url":"https://cnm-ih-na.azure-devices.net/devices/urn%3Adev%3Aops%3A000000-EMA-prod-f5acb509ceea5d696de7acce/messages/events?api-
version=2016-11-14","tls":"","persist":false,"proxy":"","authType":"","x":850,"y":100,"wires":[["686630d5.7b04d"]]},{"id":"3519a14e.652b6e","type":"comment","z":"be86bda5.2f414","name":"Ejemplo Inyección de Datos en Machine
Advisor","info":"","x":200,"y":40,"wires":[]},{"id":"ad4eff04.75dec","type":"comment","z":"be86bda5.2f414","name":"https://docs.ipdata.co/","info":"https://api.ipdata.co?api-
key=test","x":120,"y":190,"wires":[]},{"id":"a86d2fd2.196ad","type":"debug","z":"be86bda5.2f414","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":630,"y":350,"wires":[]},{"id":"7ee396f8.01a598","type":"
http request","z":"be86bda5.2f414","name":"","method":"GET","ret":"obj","paytoqs":false,"url":"https://api.ipdata.co?api-
key=test","tls":"","persist":false,"proxy":"","authType":"","x":280,"y":240,"wires":[["c4d18847.ad59d8","3cac5f5b.e70e1"]]},{"id":"186a179e.b121a8","type":"inject","z":"be86bda5.2f414","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","o
nce":true,"onceDelay":"1","x":110,"y":240,"wires":[["7ee396f8.01a598"]]},{"id":"c4d18847.ad59d8","type":"function","z":"be86bda5.2f414","name":"From Geo to MA","func":"var msg1 = {};\nmsg1.input = {};\nmsg1.input.payload = {};\nvar lat =
msg.payload.latitude;\nvar lon = msg.payload.longitude;\nmsg1.payload = [lat,lon];\nmsg1.input.payload.address = 10000;\nmsg1.input.payload.quantity = 2;\n\n\nreturn
msg1;\n\n\n","outputs":1,"noerr":0,"x":190,"y":350,"wires":[["82c37724.76ab88"]]},{"id":"82c37724.76ab88","type":"function","z":"be86bda5.2f414","name":"Format Tango
I/W/DW/F","func":"//*****************************CONFIGURACIÓN*************************************\nvar tipoVar = \"WORD\"; //INT,WORD, DWORD o FLOAT. WORD --> Array in = Array Out\nvar body_id = \"HMIBMI_1\"; //Descripción
Dispositivo.\n//****************************************************************************\n\nvar body_vr = msg.payload; //Array de datos de entrada\nvar body_st = msg.input.payload.address; //Primera Word a leer\nvar body_n = msg.input.payload.quantity; //
Número de Words a Leer. Se utiliza si el tipo de variable es WORD.\n\n//*******************************Date format*************************************\nvar now = new Date();\nvar dd = now.getUTCDate();\nvar mm = now.getUTCMonth()+1; //January is 0!\nvar
yyyy = now.getUTCFullYear();\nvar hh = now.getUTCHours();\nvar mi = now.getUTCMinutes();\nvar ss = now.getUTCSeconds();\n\nif(dd<10){\n dd='0'+dd;\n} \nif(mm<10){\n mm='0'+mm;\n} \nif(hh<10){\n\thh='0'+hh;\n} \nif(mi<10){\n\tmi='0'+mi;\n}
\nif(ss<10){\n\tss='0'+ss;\n} \n\nvar now_formated = dd+'/'+mm+'/'+yyyy+' '+hh+':'+mi+':'+ss;\n\n//********************************************************************************\nswitch(tipoVar)\n{\n case \"INT\":\n var aux_body_vr = [];\n \n for(var
i=0;i<body_vr.length;i+=1){\n var i16 = new Int16Array([body_vr[i]]);\n aux_body_vr[i]=i16;\n }\n var body='{\"ID\":\"'+body_id+'\",\"TS\":\"'+now_formated+'\",\"ST\":\"'+body_st+'\",\"VR\":['+aux_body_vr+']}';\n break;\n \n case
\"WORD\":\n var body='{\"ID\":\"'+body_id+'\",\"TS\":\"'+now_formated+'\",\"ST\":\"'+body_st+'\",\"N\":\"'+body_n+'\",\"V\":['+body_vr+']}';\n break;\n case \"DWORD\":\n var aux_body_vr = [];\n for(var i=0;i<body_vr.length;i+=2){\n var
ui16 = new Uint16Array([body_vr[i],body_vr[i+1]]);\n var ui32 = new Uint32Array(ui16.buffer, ui16.byteOffset, ui16.byteLength / Uint32Array.BYTES_PER_ELEMENT);\n aux_body_vr[i/2] = ui32;\n }\n var
body='{\"ID\":\"'+body_id+'\",\"TS\":\"'+now_formated+'\",\"ST\":\"'+body_st+'\",\"VR\":['+aux_body_vr+']}';\n break;\n case \"FLOAT\":\n var aux_body_vr = [];\n for(var i=0;i<body_vr.length;i+=2){\n var ui16 = new
Uint16Array([body_vr[i],body_vr[i+1]]);\n var fl32 = new Float32Array(ui16.buffer, ui16.byteOffset, ui16.byteLength / Float32Array.BYTES_PER_ELEMENT);\n aux_body_vr[i/2] = fl32;\n }\n var
body='{\"ID\":\"'+body_id+'\",\"TS\":\"'+now_formated+'\",\"ST\":\"'+body_st+'\",\"VR\":['+aux_body_vr+']}';\n break;\n default:\n var body='Define tipo de datos, WORD, DWORD, FLOAT';\n}\nmsg.payload = body;\n\nreturn
msg;\n","outputs":1,"noerr":0,"x":420,"y":350,"wires":[["e1c23328.687a6","a86d2fd2.196ad"]]},{"id":"3cac5f5b.e70e1","type":"debug","z":"be86bda5.2f414","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":710,"y":240,"w
ires":[]},{"id":"d5c95a01.34b7b8","type":"modbus-
client","z":"","name":"","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"tcpHost":"192.168.10.51","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-
BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectOnTimeout":false,"reconnectTimeout":"2000","parallelUnitIdsAllo
wed":false}]
6. Importación del Flow de ejemplo (1)Para subir datos a Machine Advisor partiremos de un Flow de ejemplo.
Page 14Confidential Property of Schneider Electric |
Se copia y se pega el Flow
Tras ello aparece el
siguiente Flow en el
navegador.
6. Importación del Flow de ejemplo (2)Tras la importación aparece el flow.
Page 15Confidential Property of Schneider Electric |
En mi subscripciones
Y se selecciona el equipo del que se va
se a ser “purchaser”
7. Creación de Maquina en Machine Advisor (1)Para subir datos a Machine Advisor se debe ser el “purchaser” del equipo.
Page 16Confidential Property of Schneider Electric |
En fleet se registra una
máquina
Se introduce el nombre, tipo,
cliente, localización y se pulsa
finish
7. Creación de Maquina en Machine Advisor (2)Link a Machine Advisor: https://machine-advisor.schneider-electric.com/
Page 17Confidential Property of Schneider Electric |
En monitor configuration se
pulsa sobre connect your
machine
Aparecerán los datos que se
necesitan para realizar la
conexión la HMIBMI
7. Creación de Maquina en Machine Advisor (3)Link a Machine Advisor: https://machine-advisor.schneider-electric.com/
Page 18Confidential Property of Schneider Electric |
8. Configuración del Flow (1)Cómo funciona el Flow.
Modbus Read,
get MW from the
M2xx.
Return an array
of words.
p.e:
[12,54,45678,0]
Converts the array
of words to int,
dword, float and
create the Tango
formatted json
Create the
structure for the
HTTP Request
The HTTP
Request.
Return the
response
Payload to
debug console to
check the
response.
If “” then is Ok.
Page 19Confidential Property of Schneider Electric |
En este ejemplo se leen 4 MWs
declaradas en el M251
8. Configuración del Flow (2)Configurar direcciones del controlador a leer.
Page 20Confidential Property of Schneider Electric |
En la función de formato se
indica el tipo de las variables a
leer y el nombre de dispositivo
que aparecerá en Machine
Advisor
En Request Builder se copia el
token de Machine Advisor.
Quitando la parte de Autorization
Authorization;SharedAccessSignature sr=cnm-ih-na.azure-
devices.net%2Furn%3Adev%3Aops%....
8. Configuración del Flow (3)Configuración de formato y request builder
Page 21Confidential Property of Schneider Electric |
Se copia y pega la información
del servidor de Machine Advisor
Si en la Ventana de debug se
visualiza “” el envío ha sido
correcto.
8. Configuración del Flow (3)Configuración de HTTP server y visualización de salida en debug
Page 22Confidential Property of Schneider Electric |
9. Visualización de datos en Machine Advisor (1)Desde Machine Advisor se pueden ver las variables.
Page 23Confidential Property of Schneider Electric |
9. Visualización de datos en Machine Advisor (2)Desde Machine Advisor se pueden ver las variables.
Page 24Confidential Property of Schneider Electric |
Sigue conectado con nosotros y disfruta de la Información más actualizada en el Portal de Partners
https://www.se.com/es/es/partners/