Autor Tema: Servidor de red ModBus  (Leído 3925 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mirazulado

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 142
Servidor de red ModBus
« en: 19 de Mayo de 2004, 13:03:00 »
Que tal a todos.. los consulto para ver si alguien me puede ayudar con mi problema.. resulta que estoy armando una red con Pic (16f628) conectados via rs485 y corriendo una variante propia del ModBus. Ya tengo el software de prueba (no el final, me falta muuuuucho) de los controladores y funcionan bien mediente el hiperterminal de Windows. Comence a codificar el Servidor en Visual Basic y me lleve la sorpresa de que se complica mucho atender a los 10 controladores 3 o 4 veces por segundo y ademas atender al operador humano, lo que me llevo a creer que lo ideal es hacer dos programas independientes, uno servidor de los Pic y el otro que atienda al humano mientras que ambos comparten las mismas bases de datos..
 Es esto posible ? calculo que tendria que hacer un servidor de Pic que se ejecute en el fondo y atienda a los pic y otro que este activo a la vista y que atienda a los cambios en las Bases de datos. Sabe alguien si se puede hacer con Visual Basic y que tipo de proyecto tendria que iniciar para hacer el servidor ?
 Bueno, desde ya muchas gracias y disculpen la pregunta tan larga..
 Saludos a todos Mariano ..

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Servidor de red ModBus
« Respuesta #1 en: 19 de Mayo de 2004, 16:48:00 »
no se si vistes el codigo para implementar un esclavo modbus en un micro en mi web junto con alguna info y un maestro para el pc para comprobar el codigo, velocidades,....

respecto al programa en vb no entiendo tu problema...simplemente crea un bucle y comprueba cada esclavo. implementa un time out por si alguno no responde y poco mas...
te ayusaria el tener en todos los esclavos un area comun para no complicar demasiado el codigo o, si le pegas bien a vb, create una clase donde encapsules tus rutinas para modbus.

estas empleando vb6 o vb.net???

saludos

Desconectado mirazulado

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 142
RE: Servidor de red ModBus
« Respuesta #2 en: 20 de Mayo de 2004, 09:56:00 »
si... vi el codigo del esclavo de ModBus de tu pagina y es parecido al que me quedo a mi, por lo menos la idea es la misma.. La implementacion del servidor es como vos decis, bucles y time out y esas cosas. El problema ocurre por que ademas de todo eso el servidor ademas debe dar soporte al operador con una interface super completa, con muchos graficos y muchas ventanas.. aca esta el problema se complica mostrar graficos y ventanas y ademas atender a los Pic en tiempo real lo cual exigiria la atencion completa..
Si queres un ejemplo, intenta insertar manejo de graficos, bases de datos y demas sobre el codigo de tu servidor.. se complicar el manejo de tiempos, por eso preguntaba si alguno soluciono el problema de otra forma y no haciendo unico programa en VB.
Uso vb6.. si usara VB.net creo que podria crear hilos de ejecucion y manejar mejor el tema, no ?
 Un abrazo Mariano..

 

Desconectado Tec_Claudio_Perez

  • PIC12
  • **
  • Mensajes: 62
RE: Servidor de red ModBus
« Respuesta #3 en: 21 de Mayo de 2004, 09:25:00 »
Hola,
Desde hace un tiempo que vengo haciendo placas de adquisición RS-485, con PICs, y Visual Basic para la interface con el operador con mucho gráficos y controles visuales, inclusive con animaciones Flash.
La verdad no entiendo eso de que a VB no le da la capacidad, a menos que tengas una velocidad de muestreo excesivamente alta.
Solo hay que fijarse bien de no perder bytes. Por ejemplo si quiero recibir un mensaje en ASCII formado por un byte de inicio del paquete ":", x bytes de datos, y un byte de fin del paquete (Chr$(13));
(ej. ":12345"+Chr$(13)), el código seria así:

"Variables globales
CadDatos as string         "Almacena los bytes de datos recibidos.
BandHeader as boolean "Indica que ya se recibio el byte de inicio.

Private Sub Form_Load()
"Configurar el puerto serie.
    " Usar el COM1.
    MSComm1.CommPort = 1
    "19200 baudios, sin paridad, 8 bits de datos y 1 bit de parada.
    MSComm1.Settings = "19200,N,8,1"
    " Indica al control que lea todo el búfer al usar Input.
    MSComm1.InputLen = 0
    "Indica que envie el evento al recibir un caracter.
    MSComm1.RThreshold = 1
   
    "Abrir el puerto
    MSComm1.PortOpen = True    
End Sub

Private Sub MSComm1_OnComm()
Dim ByteRx As String  "Almacena el caracter actualmente procesado.
Dim RxString As String "Almacena todo el buffer recibido del puerto.        
Dim i as integer         "Controla el siguiente caracter a procesar.

"Ver si es un evento de recepcion.
If MSComm1.CommEvent = comEvReceive Then
    "Leer todo el buffer recibido, puede haber mas de un caracter.
    RxString = MSComm1.Input
    "Procesar cada caracter del buffer individualmente.
    For i = 1 To Len(RxString)
        ByteRx = Mid$(RxString, i, 1)
        "Mostrar la recepcion de bytes en hexa.
        Texto1.Text = Texto1.Text + " 0x" + Hex$(Asc(ByteRx)) + " "
        If ByteRx = Chr$(13) Then
            Texto1.Text = Texto1.Text + Chr$(10)
        End If
        "Si ya se recibió el inicio del paquete,
        If BandHeader Then
            "Almacenar el byte en la cadena de datos.            
            CadDatos = CadDatos + ByteRx
        End If
        "Ver si es el inicio del paquete.
        If ByteRx = ":" Then
            BandHeader = True    "Ya se recibio el inicio del paquete.
            CadDatos = ""            "Inicializar la cadena de datos.
        End If
        "Ver si se recibio el fin del paquete.
        If ByteRx = Chr$(13) Then
            "Mostrar la cadena recibida sin el protocolo.
            Texto1.Text = Texto1.Text + "Paquete Recibido:"+CadDatos
            BandHeader = False
        End If
    Next i
End If
End Sub

Por supesto esto es a lineas generales, el código es para no perder bytes. En RS-485 ademas se puede agregar la dirección del dispositivo, o usar un tipo de control mas estricto, como la generación y verificación de CRC, con reenvío de mensajes, etc.

Para la interface con el operador yo utilizo unos controles ActiveX de instrumentación de IoComp http://www.iocomp.com/

Las placas RS-485, se conectan mediante un conversor RS-232/485 al puerto serie de una PC conectada en red. El problema que tuve fue que hace poco se quería poder leer las entradas de las placas, desde cualquier computadora conectada a la red.

En esta situación tenía dos opciones:
-Usar un servidor de páginas web.
-Utilizar OPC (OLE para control de procesos).

En el primer caso la idea era usar un servidor de páginas web, y desde mi aplicación en VB, capturar la pantalla, convertirla a JPG y actualizar el archivo que muestra el servidor web. La desventaja es la poca velocidad de actualización de la página, mas o menos 5 segundos, pero para mi aplicación estaba bien. Tambíen tuve que aprender un poco de JavaScript.

El segundo caso era usar OPC, una norma que ya soporta la mayoría de los fabricantes de PLCs. Aquí se usan dos niveles, un servidor OPC (que es el que realmente se comunica con la placa de adquisición) y un cliente OPC(que puede estar corriendo en cualquier computadora de la red). Para mayores detalles de OPC vean http://www.automatas.org/redes/opc.htm
El problema es que es mas sencillo hacer un cliente OPC en VB que un servidor, a menos que compren un Control ActiveX http://www.opcconnect.com/complib.php. La ventaja es que la visualización en el cliente es mucho más rápida, se puede embeber en una página web, y que se puede comprar software OPC de distintos fabricantes para distintas aplicaciones. Para programación de OPC ver http://www.opcconnect.com

Luego pude "conseguir" un servidor OPC para ModBus http://www.automatedsolutions.com/products/opcservers.asp. Teniento este servidor OPC, lo que me quedaba era convertir el protocolo de mis placas a la norma ModBus. En este sentido me ayudó mucho la página de pacalaconcurso(www.pacalaconcurso.com), donde obtuve las primeras herramientas (simuladores Modbus Maestro-Esclavo, especificación de la norma, etc).

Así la cuestión, creo que en tu caso sí podrías hacer todo en una sola aplicación VB, pero de última podrías separar la adquisición del resto usando OPC.

Espero que te sirva.

     Téc. Claudio J. Pérez
interrupt_request@hotmail.com
Ciberar-Sistemas & Desarrollos
        Jujuy-Argentina

Desconectado mirazulado

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 142
RE: Servidor de red ModBus
« Respuesta #4 en: 21 de Mayo de 2004, 10:57:00 »
Fantastica explicacion Claudio.. Mi programa servidor es muy parecido al tuyo. El proyecto que estoy armando contaba con muchas placas de muestreo las cuales contenia una eeprom con los datos necesarios para que funcionen correctamente mientras que estos datos se podrian actualizar cada una o dos horas.. Como es un proyecto final de mi carrera (analista de sistemas) elimine la eeprom y todas las rutinas del pic para la lectura y busqueda de datos en la eeprom por cuestiones de tiempo (ya llevo 4 meses). Esto me trae el problema que tengo que consultar a los pic por lo menos 3 veces por segundo por si necesitan la info que tendrian que tener en la eeprom eliminada y para colmo mi proyecto debe poder trabajar con 10 o 20 controladores. Esta era la consulta nomas... como es mucho el trabajo necesario para las comunicacones me era dificultosa la codificacion de la interface.. pero no se hagan problemas ya que pensando mucho y con muchos timer cruzados estoy solucionando el problema.. Conozco sistemas donde utilizan un sistema similar y utilizan solo una maquina servidora de los controladores y atra para servir de interface..
 Saludos Mariano.. MDP Arg.

Pd: el sistema que estoy armando es un control de acceso por tarjeta magnetica de ahi que el tiempo de refresco es critico.

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Servidor de red ModBus
« Respuesta #5 en: 21 de Mayo de 2004, 16:35:00 »
dices bien mariano... actualmente ya trabajo en la plataforma .NET y ciertamente se pueden ejecutar varios hilos en paralelo, con prioridades diferentes y demas....
no se exactamente que graficas debes insertar en tu programa...ya puse algun ejemplo de como me quedo un programa de analisis de lazos PID el cual se conecta a un PLC S7 400 y obtiene unas 60 word de datos varias veces por segundo y plotea varios valores en una grafica sin mayor problema.

ya sabes que en VB6 si usas varios timer con periodos bajos la cosa no va demasiado bien....usa la api o  implementa un solo temporizador/contador...

saludos

Desconectado NarKo

  • PIC10
  • *
  • Mensajes: 12
Re: Servidor de red ModBus
« Respuesta #6 en: 29 de Mayo de 2006, 20:22:39 »
hola, yo ise un sistema asi para una empresa aki en chile y solucione el problema del muestreo de la siguiente forma utilixe 2 programas unidos por hilos en el cual el programa A solo se encarga de hacer el muestreo pro todas las placas y almacenando los datos en una cola y los datos almacenados aqui eran procesador por el programa B si los tiempos de respuestas eran exelentes, si necesitas ayuda con eso escribe.



chau.