Lo primero que voy a hacer es un proyecto en Step7 con un único DB, por ejemplo el DB10, con un único dato de formato BYTE. Lo transferiero al WinAC y pongo el PLC software en modo Run. Me pongo on line y monitorizo la variable.
En el PLC no voy a tocar nada más. A continuación lo que haré será una aplicación en Visual Basic, usando la biblioteca Libnodave a través de ethernet, que se conectará al PLC y leerá y escribirá en esa variable como prueba que el sistema funciona.
El aspecto que tendrá mi aplicación puede ser algo tan sencillo como esto:
Para realizar la conexión es nesaria una dirección IP (en mi caso la de la máquina virtual donde tengo el WinAC), un número de puerto (que según la documentación de Libnodave debe ser el 102), un número de rack (lo habitual aquí es un cero) y un número de slot (que será el número de slot donde tengamos configurado el PLC, lo podemos ver en la configuración hardware, en mi caso el dos). La programación en Visual Basic va ser muy parecida a la que hice en esta entrada, uso la misma biblioteca de la misma forma así que no repito aquí el procedimiento para incluirla en el proyecto. He adaptado la clase que creé en su momento para encapsular las funciones de acceso al PLC a través de ethernet, quedando de la siguiente manera:
Public Class Libnodave_WinACLo que he hecho es cambiar el protocolo serie por el protocolo ethernet. Su uso es muy sencillo, a la función Conectar se le pasan la dirección IP, el puerto, el rack y el slot. Si no hay error, con las funciones LeerBytesDB y EscribirBytesDB accedemos a datos almacenados en cualquier DB de la memoria del PLC (son exactamente las mismas funciones que en la versión serie). Al acabar debemos desconectarnos con la función Desconectar. La clase se podría completar con funciones para acceder a otras zonas de memoria permitidas por Libnodave.
Dim daveSerie As libnodave.daveOSserialType
Dim daveInter As libnodave.daveInterface
Dim daveConex As libnodave.daveConnection
Public BufferLectura(1000) As Byte
Public BufferEscritura(1000) As Byte
Public Conectado As Boolean = False
Public Mensaje As String
Public Function Conectar(Optional ByVal Puerto As Integer = 102, _
Optional ByVal IP As String = "192.168.65.18", _
Optional ByVal Rack As Integer = 0, _
Optional ByVal Slot As Integer = 2) As Boolean
If Conectado Then
Mensaje = "Conexión abortada, ya existe una conexión."
Conectar = False
Exit Function
End If
Dim Respuesta As Integer
Mensaje = "Abriendo una conexión serie..."
daveSerie.rfd = libnodave.openSocket(Puerto, IP)
daveSerie.wfd = daveSerie.rfd
If daveSerie.rfd > 0 Then
Mensaje = "Conexión OK, creando interface..."
daveInter = New libnodave.daveInterface(daveSerie, "", _
0, _
libnodave.daveProtoISOTCP, _
libnodave.daveSpeed187k)
daveInter.setTimeout(1000000) 'Make this longer if you have a very long response time
Mensaje = "Inicialización del adaptador OK, creando conexión..."
daveConex = New libnodave.daveConnection(daveInter, 0, Rack, Slot)
Respuesta = daveConex.connectPLC()
If Respuesta = 0 Then
Mensaje = "Conexión correcta, lista para operar."
Conectado = True
Else
libnodave.closeSocket(daveSerie.rfd)
Mensaje = "Error al abrir la conexión [" & _
libnodave.daveStrerror(Respuesta) & "]"
Conectado = False
End If
Else
Mensaje = "Error al abrir la conexión"
Conectado = False
End If
Conectar = Conectado
End Function
Public Function Desconectar() As Boolean
If Conectado Then
daveConex.disconnectPLC()
libnodave.closeSocket(daveSerie.rfd)
Conectado = False
Mensaje = "Conexión correctamente terminada."
Desconectar = True
Else
Mensaje = "No existe conexión activa."
Desconectar = False
End If
End Function
Public Function LeerBytesDB(ByVal NumDB As Integer, _
ByVal Dir As Integer, _
ByVal NumBytes As Integer) As Boolean
Dim Respuesta As Integer
Respuesta = daveConex.readBytes(Libnodave.daveDB, NumDB, Dir, NumBytes, BufferLectura)
If Respuesta = 0 Then
Mensaje = "Leídos " & NumBytes & " bytes a partir de la dirección " & _
Dir & " en el DB " & NumDB
LeerBytesDB = True
Else
Mensaje = "Error al leer " & NumBytes & " bytes a partir de la dirección " & _
Dir & " en el DB " & NumDB
LeerBytesDB = False
End If
End Function
Public Function EscribirBytesDB(ByVal NumDB As Integer, _
ByVal Dir As Integer, _
ByVal NumBytes As Integer) As Boolean
Dim Respuesta As Integer
Respuesta = daveConex.writeBytes(Libnodave.daveDB, NumDB, Dir, NumBytes, BufferEscritura)
If Respuesta = 0 Then
Mensaje = "Escritos " & NumBytes & " bytes a partir de la dirección " & _
Dir & " en el DB " & NumDB
EscribirBytesDB = True
Else
Mensaje = "Error al escribir " & NumBytes & " bytes a partir de la dirección " & _
Dir & " en el DB " & NumDB
EscribirBytesDB = False
End If
End Function
End Class
Ejecuto mi aplicación, pongo los parámetros de conexión y pulso Conectar. Si todo va bien me pondrá un mensaje que el enlace está realizado. Con los botones de lectura y escritura puedo ver como modifico y leo el contenido del DB10 en mi PLC.
Si nos equivocamos al dar la dirección IP o el puerto, nos dará error. Sin embargo si ponemos un rack o slot incorrectos, puede que nos diga que la conexión está correcta, pero evidentemente no lograremos leer ni escribir nada.
Si quieres ver el código completo de este sencillo proyecto, lo tienes aquí. Si además quieres echar un vistazo a la configuración de Step7 que he usado, descárgate este proyecto.
Aunque esta prueba está hecha sobre un WinAC en una máquina virtual, pienso que el código servirá para acceder a un PLC S7-300/400 con puerto ethernet. Si algún lector hace la prueba, le agradeceré una reseña en los comentarios.
Este es un ejemplo muy sencillo, símplemente para comprobar que Libnodave funciona y es sencillo de usar. Ahora mismo se me ocurren un par de antiguos proyectos en los que podría haber usado Libnodave, consiguiendo abaratar su coste, al ahorrarnos licencias. Sin embargo no debemos olvidar que Libnodave, a pesar de su buen desempeño, no tiene una empresa detrás que nos de garantía o soporte, y que si lo usamos es por nuestra cuenta y riesgo.
Como siempre, agradeceré cualquier comentario.


















Gracias de nuevo por tus articulos !
ResponderSuprimirConocí LIBNODAVE gracias a ti, pero siempre he tenido un problema, la libreria dll de libnodave no puedo compilarla al crear el "instalador" desde visual basic, tienes alguna solucion ?
Gracias de nuevo
Cuando tengo problemas de una dll lo que hago es ponerla en el mismo directorio donde está el ejecutable. Lo ideal sería que un instalador te la metiese en el sistema para no tener que ir arrastrándola.
ResponderSuprimirCreo que te refieres a eso.
Un saludo y gracias por el interés.
Hola
ResponderSuprimirMadre mia parece que me leyeras el pensamiento.
Precisamente tengo que generar unos informes en excel de datos de produccion contenidos en un DB.
Ya conocia la libreria pero nunca la habia usado y no sabia si funcionaria por Ethernet.
De todas maneras, hay otra libreria que incorpora libnodave y que viene con bastante documentacion y ejemplos en .NET (yo soy mas de C#)
http://siemensplctoolboxlib.codeplex.com/
Esta es la que voy a usar proximamente.
PD: Por cierto que luego he visto la otra entrada de OPC con RS Logix y adivina que tengo que hacer tambien....
Pues eso generar los mismos informes Excel usando OPC y el RSLInx Classic :)))))
Un saludo y como siempre los articulos geniales.
Hola Ragundo, me alegra que lo que escribo te sea de utilidad. Y gracias por el enlace, le echaré un vistazo.
ResponderSuprimirPODRIAS ACLARAR MAS AL DETALLE LO DEL RACK Y LO DEL SLOT, PORQUE LO DEL RACK ME SUENA A LOS ARMARIOS DE TELECOMUNICACIONES, Y EN ESTE CASO HABLAMOS DE PLC, MUCHAS GRACIAS. JG
ResponderSuprimir¿¿¿¿¿¿¿¿
un número de rack (lo habitual aquí es un cero) y un número de slot (que será el número de slot donde tengamos configurado el PLC, lo podemos ver en la configuración hardware, en mi caso el dos) ??????
Cuando realizas la configuración hardware de un proyecto de Step7, el primer paso es añadir un bastidor. Entiendo que el número de rack es el número de bastidor, y como lo habitual es tener solamente uno (nunca me he topado con un proyecto con múltiples bastidores), le corresponderá el número cero.
ResponderSuprimirDentro de cada bastidor hay una serie de huecos donde poner los distintos componentes. Cada uno de estos huecos es un slot. El slot uno suele estar reservado para una fuente de alimentación y en el dos suele colocarse el PLC.
Espero haber aclarado tu duda, un saludo.
ACLARADO, MUY BIEN.
ResponderSuprimirSENCILLEZ, CLARIDAD, CALIDAD, BUENOS ARTICULOS.
MUCHAS GRACIAS. JG
Por si ha alguien le resulta interesante, he logrado leer y escribir datos a un S7-1200 utilizando la libreria Libnodave y el código expuesto en este articulo.
ResponderSuprimirNo hay que hacer modificación alguna al código en VB, simplemente configurar el Rack = 0 y el Slot = 1. Respecto al PLC, en el STEP 7 BASIC hay que controlar que los DBs que vayamos a leer o escribir NO hayan sido creados "solo para acceso simbólico".
Espero mi comentario sea de utilidad.
Gracias por artículos tan buenos como estos!
Saludos.
Muchas gracias amigo anónimo por tu aporte, estoy seguro de que a más de uno le resultará de utilidad.
ResponderSuprimirANONIMO DIJO:
ResponderSuprimirhay que controlar que los DBs que vayamos a leer o escribir NO hayan sido creados "solo para acceso simbólico".
SI SE PONE:
L valores.N1
Acceso simbólico a la variable
n1. “valores” es el nombre simbólico
del DB que contiene dicha variable.
ENTONCES QUEDARIA ASI ?
L N1
Acceso a la variable n1.
PUEDEN DEFINIRLO MAS CLARAMENTE, GRACIAS.JG
Saludos,
ResponderSuprimirme dejaron un proyecto que me parecia colosal hasta que encontré tu ejemplo, te lo agradezco mucho.
veras actualmente leo y escribo el plc desde una película flash empotrada en mi vb.
yo realmente no se mucho de plc solo he recibido un curso de LOGO de siemens por con esto he leido y escritro las entradas fisicas de maravilla.
tengo una pregunta. quisiera poder llevar mas lejos y tener lecturas analogicas, save si debería diferir en algo o me puedes orientar??
Hola CH4V3Z,
ResponderSuprimirNo veo ningún inconveniente en tener lecturas analógicas, de hecho con libnodave puedes leer del área de entradas directamente.
Un saludo.
Hola me parece genial tu trabajo. Lo estoy probando pero tengo un pequeño problemilla.
ResponderSuprimirQuiero hacer la conexión con un PLC en remoto mediante una VPN. Levanto la VPN y establezco correctamente la comunicación con el automata, el problema es cuando quiero leer de un DB que no lo consigo, me da error y no obtengo los datos.
Si en conexión directa te funciona bien quizá exista alguna incompatibilidad. Nunca he usado una VPN y lamento no poder resultar de ayuda.
ResponderSuprimirUn saludo.
Hola GR ya he conseguido que funcionará a través de una VPN. Como aporte decir que si levantas una VPN contra el autómata a través de dos routers con el ejemplo que ha aportado nuestro amigo GR puedes obtener los datos del PLC remotamente.
ResponderSuprimirTan sólo tengo una pregunta porque me pasa algo curioso y es lo siguiente.
Estoy leyendo varias variables de un bloque de varios DBs, el buffer de lectura lo tengo con 200 posiciones por ejemplo, la primeras veces lee bien pero tras varias repeticiones deja de leer y la respuesta da el código -1025 que no he logrado interpretar que es. Yo creo que es como si se llenará el buffer pero corrígeme si me equivoco en cada lectura se sobrescriben los datos o se guardan al final del último dato existente en el buffer.
Otra cosa que me llama la atención es que si cierro la conexión después de una lectura y la abro antes nunca falla.
Según lo he programado, en cada lectura guarda los datos desde el principio del buffer. Prueba a ampliar el buffer, no vayas a estar leyendo más bytes de los que caben.
ResponderSuprimirUn saludo.