ArduWebPLC

Hola a todos.

Estoy haciendo una especie de mini PLC (automata programable) con servidor web
para poder actuar y visualizar las entradas/salidas. De momento el nombre en clave es ArduWebPLC. Hace falta pulirlo un pocoy en cuanto este visible y documentado lo colgaré aquí a la espera de vuestros comentarios y aportaciones.

Esta es la primera fase de un proyecto que espera ser un poco mas amplio si no desespero en el intento. La idea es llegar a tener una especie de PLC formado por un arduino principal con entradas/salidas distribuidas en varios arduinos secundarios o esclavos comunicados por bus CAN y ethernet, gracias a la shield de Igor.
Como soy programador amateur, siempre avanzo imitando y adaptando ejemplos parecidos de otros mas capacitados que yo.

La segunda fase sería conseguir que un arduino (al que conectariamos sensores/actuadores) actuando como cliente y que se comunica con un servidor en el que hay una web en la que visualice el estado de los sensores o bien se pueda actuar sobre los actuadores.

Seguramente existen ejemplos parecidos en parte, pero llevo dias encallado buscando y necesito alguna propuesta con la visión desde fuera, en fin, !aire fresco!

Saludos y enhorabuena al equipo del vinciDuino (estoy a punto de recibir el mío).

Jaume Nogues
Barcelona

Pinta bien si señor. A la hora de tener mejor organizado todo el proyecto puedes usar estas paginas.

http://code.google.com/intl/es-ES/

parece un proyecto super interesante, mantén nos informados !! y suerte !

Hola Jaume,

En los últimos días, he visto varias proyectos por el foro, que podrían juntarse esfuerzos, ya que el 80% del código podría ser parecido.
Por ejemplo, yo estoy poco a poco haciendo una especie de interprete. Es decir, le pasas ordenes al Arduino y las procesa en tiempo de ejecución.
La idea, es que le pases dichos comandos por el medio que quieras (ethernet, serie, bus can, router por telnet, twitter,...). Estos scripts, también podrían estar guardados en una memoria externa, SD, EEPROM.

Tampoco es que sea el mejor interprete del mundo, lo primero porque es la primera vez que hago uno, y lo segundo porque tampoco las pretensiones son altas.
Existe ya uno que tiene una pinta muy buena => http://bitlash.net/wiki/start
De momento para probar el concepto tengo funcionando:

DWH xx => digitalWrite(xx,HIGH)
DWL xx => digitalWrite(xx,LOW)
AR xx Ryy => Ryy=analogRead(xx)
PRINT Ryy => Serial.print(Ryy)
PRINTB Ryy => Serial.print(Ryy,BIN)
PRINTX Ryy=> Serial.print(Ryy,HEX)

A los print, si le añades un EOL, añade fin de línea.

Hay definidas 20 variables de sistema, que he llamado registros (R01,R02,....,R20).
Ahora mismo, en el sketch recoge los comandos que le llegan por serie (acabados en ";").

No tengo nada optimizado, pero funciona. Si alguien le parece que puede servirle, podemos juntar esfuerzos. Como siempre suelo intentar hacer, prioridad fácilidad para poder ir añadiendo más comandos, funciones, etc frente a optimización.

El concepto de las funciones, es una especie de ensamblador, que haces todas las operaciones,etc usando esos registros del sistema que ya estan definidos (para hacer fácil el core).

Primero quiero terminar lo genérico ( comparar registros con >,<,==, etc , inicializarlos, y añadir IF). Mi intención es hacer algo para bus CAN, para tener módulos "tontos" que les pases comandos y para cuando vas a una máquina/coche, puedes empezar a trastear con los mensajes e info que hay, sin tener que andar compilando y pasando programas nuevos.

Si os parece que se puede adaptar a lo que estás haciendo, y asi juntamos esfuerzos, pues estaría muy bien. Por ejemplo, yo no voy hacer nada para ethernet,i2c etc. Si os animais....

Salu2

:wink:

Mi idea es poder programar el funcionamiento de mi instalación con la facilidad que ofrece un plc, por ejemplo el Logo! de siemens.

Si alguno habéis utilizado uno de estos bichos, se programan a través de un diagrama de contactos (ladder) que equivale a un circuito eléctrico. Este circuito es muy fácil convertirlo en su ecuación lógica. Por ejemplo un paro-marcha del tipo industrial se programa

Motor1=!PulsadorParo && (PulsadorMarcha || Motor1)

que es lo mismo que decir que el pulsador de paro normalmente cerrado, está en serie con el paralelo del pulsador de marcha y un contacto del Motor1.
Para automatizaciones sencillas (y no tanto), esta es una manera muy útil de modelizar el funcionamiento de la instalación

Para eso necesito operar las entradas-salidas de forma booleana, disponer de temporizadores, contadores, marcas (reles auxiliares), teleruptores (relé de impulsos) y algunas cosas más, pero utilizándolas al estilo de los PLC's. Así quien haya programado uno de ellos se sentirá muy cómodo con el arduino. Especialmente si eres eléctrico y no electrónico, como es mi caso.

De momento esto está solucionado (más o menos) y le llamaré ArduPLC.

En oposición a la facilidad de programación del PLC, su punto débil es cuando los pulsadores, interruptores, accionamientos, etc, están alejados del mismo. Existen soluciones de buses comerciales como KNX o ASi, pero son carísimas.

Ahí es cuando el bus CAN puede salir en mi ayuda, pero aun no me he metido con el.

De momento el ArduPLC se ha transformado en ArduWebPLC, porque gracias al ethernet shield puedo visualizar estados y interactuar con él. Ahí me he inspirado en openDomo.
La próxima semana intentare montarlo para que sea accesible públicamente.

Bueno, no me enrollo más.

Jaume

Para el proyecto de casa domotica que tengo entre manos he mirado los buses de comunicación KNX, LIN, ASi, RS485, Ethernet y CAN. Al final lo voy hacer con este ultimo por ser la solución mejor.
Hay cosas muy chulas como el ModbusTCP que también lo puedes usar.
https://launchpad.net/modbusmq

http://code.google.com/p/mudbus/

Si pones un pc como webserver te aconsejaria python para conectar arduino -PC y django para la web o is manejas php hacer la conexion con los scripts de python.

flico:
Para el proyecto de casa domotica que tengo entre manos he mirado los buses de comunicación KNX, LIN, ASi, RS485, Ethernet y CAN. Al final lo voy hacer con este ultimo por ser la solución mejor.
Hay cosas muy chulas como el ModbusTCP que también lo puedes usar.
Modbusmq in Launchpad

Google Code Archive - Long-term storage for Google Code Project Hosting.

creo que la opción de CAN es sin duda la mejor, pero a modo informativo, estaba teniendo muchos problemas leyendo un sensor de ultrasonidos que tenia separado del arduino unos 20 metros haciendo el PingIn.
he decidido poner un arduino donde conectar el sensor de ultrasonidos y por el cable que antes hacia el PingIn ahora me comunico por Serial con el arduino BASE y estoy muy contento porque funciona la comunicación !!
esta claro que si fuese a hacer algo mas complejo como lo tuyo flico optaria y optare en el futuro por la opción mas profesional CAN.

Igor lo tuyo es enredar :smiley:

jnogues:
Mi idea es poder programar el funcionamiento de mi instalación con la facilidad que ofrece un plc, por ejemplo el Logo! de siemens.

Si alguno habéis utilizado uno de estos bichos, se programan a través de un diagrama de contactos (ladder) que equivale a un circuito eléctrico. Este circuito es muy fácil convertirlo en su ecuación lógica.

¿Cómo lo haces? Me refiero, ¿conviertes tu ladder a C/C++/Arduino y luego lo compilas+envias a Arduino; usas firmata(ó algo que necesitas pc) ó te has creado tu propio lenguaje interpretado?

Hola Igor. Convierto el ladder a ecuación lógica a mano. Es muy fácil para automatismos binarios, cuando lo tenga acabado pondré algunos ejemplos. Sería la repera que hubiera un IDE
para "dibujar" el ladder y que lo tradujera a Arduino. Pero no tengo ni idea de programación de software, (quizas algun día con Gambas).
Soy profe de FP de electricidad, y esta manera de trabajar resulta muy fácil para alumnos que han utilizado un Logo! de siemens. Pero con la ventaja del precio, salidas y entradas analogicas, connexión a internet, etc. Cada uno se compra un arduino y aumenta su interés por la electrónica.

Saludos

buenas,

trabajo en automatismos industrial, y tu proyecto me parece muy interesante. yo tambien me estoy iniciando en el mundo del desarrollo en micros y arduino es genial por la informacion y codigo que hay por todos los lados.
una pregunta, veo que el tema protocolos para tu proyecto, no mencionas ninguno que usea tcp/ip, como modbus/tcp o ethernet/ip, los has tenido en cuenta? junto con los protocolos serie son los buses de campo mas extendidos y a su vez es una forma barata de y sencilla de incorporar periferia a un plc
estare atento a tu proyecto, y si puedo ayudarte en algo...... que no sea codigo, jejej po aqui estare

saludos

Ok Jaume.

Por curiosidad, si son automatismos sencillos.... no es parecido, hablando de dificultad, hacerlo directamente en lenguaje Arduino? Me explico, si les preparas una plantilla que en el setup les configure directamente 8 entradas y 8 salidas y una función actualizar().... (por poner un ejemplo).
Si se lo haces en forma de librería, sólo es poner un #include, así que ni ven la declaración de variables, ni el código de las funciones para que el primer "impacto" sea programas de 4 líneas.

byte Input1,Input2,Input3,Output1,Output2,Output3
setup()
{
configurarPLC();
}
loop()
{
actualizarIO();
//aquí es dónde hacen sus operaciones binarias básicas.
Output1=(Input1 && Input2) || Input3;
Output2= Input1;
Output3= Input3 || Output1;
}

Tu actualizarIO(), pues hace el Input1=digitalRead(5); Input2=digitalRead(6),..... digitalWrite(3,Output1),digitalWrite(4,Output2),...
To configuraPLC(), pues los tipicos pinMode(5,INPUT); pinMode(6,INPUT).....pinMode(3,Output),pinMode(4,Output),....

Lo digo, porque así poco a poco le cogen el tranquillo, no? Así pueden entender un poco la filosofía de "Leo entradas-Ejecuto código-Actualizo salidas" de un autómata.

Luego para meterles comunicaciones con CAN, pues también es muy fácil. Hacer el típico ejemplo de las entradas de un Arduino1, que actuen sobre las salidas de un Arduino2, es casi inmediata. Aunque la librería de SECUduino está bastante sencilla, incluso se lo puedes adornar para que sea "coser y cantar" (preconfigurada la velocidad del bus, fijo la id del mensaje, y que sólo tengan que hacer CAN1=Input1,CAN2=Input2,.... siendo CAN1-CAN8 los 8 bytes de datos del mensaje fijo que se manda, y lo mismo los otros Arduinos).

Bueno, son ideas... tampoco me dedico a la enseñanza. Pero cuanto antes vayan haciendo el paso a un lenguaje de programación, antes aprenden a "pensar" a programar. Y Arduino es una capa bastante alta, como para darles el empujón directo.... no?

:wink:

Igor, has descrito muy bien lo que he hecho o lo que querría hacer. Como no se hacer librerías, he descompuesto mi sketch en tres subsketchs, en los que en uno de ellos esta las ec. lógicas y en los otros el resto. Voy a colgarlo aunque no este del todo documentado y pulido. Esta manera es una cutrada, pero ha sido la única manera que sabía para aislar el ladder del resto.
También sigo la filosofía de leo entradas, proceso código, actualizo salidas.
Las entradas se llaman I1, I2, I3 yI4. Las salidad Q1, Q2, Q3 y Q4. Dispone de 4 temorizadores T1, T2, T3 y T4 (ampliable a cuantos se quiera), 4 contadores C1, C2, C3 y C4. Marcas auxiliares M1,...y M6. Contacto de toggle cada 0,5 segundos. Contacto de toggle cada 10.000 scans (ciclo de programa). Activación de salidas por telerruptor(relé de impulsos) mediante trQ1, trQ2, trQ3 y trQ4. Y quizás alguna cosa que me dejo, porque estoy en ello. Uso las librería flash para enviar texto por el puerto serie.

Respecto a protocolos, enano_rumbero, no he descartado usar alguno existente o hacer uno desde 0 que me sea fácil de implementar y explicar, pero no tengo nada decidido. Creo que para mi sería más facil hacerlo.

Saludos

_2012_01_23_ArduPLC.rar (3.82 KB)

Buenas,
Otra cosa, no se si lo has tenido en cuenta, pero existen programas para programar, que no llegara a se ladder, pero es muy intuitivo y sencillo si lo conoces, te hablo de flowcode o programas similares.
Lo que nose dado mi poco conocimiento en micros, es si podrias usar las bibliotecas y todo lo necesari en el programa de arduino, y usar el codigo c que te genera flowcode para el programa en si que quieras que te ejecute el micro

Añado algunas imágenes (a mano) de los ejemplos más sencillos.

http:///arduplc.awardspace.biz/documentos/ArduPLC.jpg
http:///arduplc.awardspace.biz/documentos/ArduPLC2.jpg
http:///arduplc.awardspace.biz/documentos/ArduPLC3.jpg

Saludos

Ya veo como lo estás planteando. Ese código no funciona, verdad? Te falta de meterlo todo en funciones, llamarlas, etc. no?

Ya tienes millis() en Arduino, veo que lo estas haciendo con el timer2...
Vas hacer en plan timers? Con millis() lo hacen en un periquete, no? Digo por si te merece la pena entrar tanto en detalle.... Y hacer una función para emular un biestable RS ? Con una función biestable, con millis() y con las funciones de readInputs, updateOutputs, o como se llamen... no sería bastante? Lo digo, porque una vez que ya se juega con ésto, ya se puede ir metiendo poco a poco programación, no?

bool set1= I1 && I2;
bool reset1= I3;
Q1=biestable(set1,reset1);

Es simple curiosidad, no digo que sea ni mejor ni peor. Es un "brainstorming".

:wink:

Hola Igor. Ese código es la parte ladder del sketch (partido en 3) que adjunté en un post anterior.

Estoy utilizando el timer 2 (siguiendo el ejemplo de tu página), porque cuando todo esto lo implemento en el ArduWebPLC, mientras el Arduino está atendiendo al cliente que le requiere por internet, pierdo entre 1/2 segundo y 1 segundo en esta gestión, y durante este tiempo muerto el refresco periódico de los tempos se pierde. Además si se pulsa algun pulsador durante ese tiempo tampoco me entero de que ha pasado.
Entonces aprovecho la interrupción de timer 2 para actualizar una alternativa a millis y para comprobar si hay alguna entrada activa en ese lapso de tiempo.

Respecto a la función RS tienes toda la razón. La quiero incorporar (estoy en ello) para orientarla a la implementación de GRAFCETS.

Estoy encantado con tus aportaciones. Yo soy un programador "dominguero" y necesito la visión de los que teneis mas experiencia que yo.

También añadiré funciones horarias con el RTC (el DS1307), pero estoy esperando el día que pueda pasar por la tienda buscarlo. ¿me recomiendas alguna librería para su uso?

Saludos a todos

Jaume

Yo tambien soy un "dominguero"!! Simplemente me pongo como usuario de una caja negra, y que pediria para poder hacer la mayoria de las cosas. Por ejemplo, para pasar de Grafcet a programacion, con tener un if, operaciones logicas y variables, no necesito mas (para cosas normales).
Ej:
state=(state==1 && Input1) ? 2 : state; //Si estado=1 y Input1=ON, entonces estado=2, si no es asi, no hago nada.
state=(state==2 && !Input1) ? 1 : state; //Si estado=2 u Input1=OFF, entonces estado=1, si no es asi, no hago nada.
....
output1=(state==1) ? 1:0; //Si estado=1, entonces output1=ON, si no output1=OFF

Pero claro, esto ya es cosa de cada uno.... Yo he hecho cosas asi con ECU's comerciales para procesar canales periodicos en "tiempo real" en que solo te dejaban 5 variables por canal y una funcion del estilo if (se llamaba choose). Lo importante es saber aprender a "pensar", que es lo importante/dificil de transmitir a los alumnos, no??
Simplemente hay que prohibir la funcion delay!!! je,je,je

Lo decia porque cuanto mejor-sofisticado sea tu PLC, mas dificil sera para los alumnos pasar a Arduino dejando fuera tu "corePLC". A parte de esto, es un proyecto muy bonito!!

:wink:

Nota.- ni enyes ni acentos

Hola a todos
Estoy empezando con arduino y me parece fenomenal para dar clase a los chavales de electronica, pero como muchas veces quieres ir por delante de lo que estas haciendo, he visto que arduino se puede conectar por ethernet, pero mi duda es si se pueden conectar varios arduinos 4 o 5 por ethernet sin que ninguno sea servidor, creo que tendrian que ser todos clientes. Mi idea es que por ethernet los chavales puedan encender salidas que esten en otro arduino accionando pulsadores que este en el suyo, y los otros arduinos igual. Me gustaria que me pudierais orientar a como hacerlo, gracias y me parece fenomenal este foro. Un saludo