elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  secuencia de instrucciones en VB6
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: secuencia de instrucciones en VB6  (Leído 3,214 veces)
xadap

Desconectado Desconectado

Mensajes: 220


http://www.tac822.net


Ver Perfil WWW
secuencia de instrucciones en VB6
« en: 2 Septiembre 2005, 20:01 pm »

holas

me estoy volviendo majara...llevo unos cuantos días intentando que funcione una cosa en el programa de control de Gilean (el robot que manejamos con el paralelo :) )

ya tengo algunas cosas de la inteligencia artificial bastante mejoradas (reacciona bien cuando se choca, si recibe demasiada señal pide rescate con los SWAT, etc) pero...

os cuento:

Gilean va "corriendo". se encuentra una pared y los dos sensores frontales tocan,por lo que dan señal. Gilean debería retroceder primero, y girar después.

he probado a jugar con los timers, y no consigo nada. cómo lo haríais vosotros? visual basic 6


En línea

yeikos


Desconectado Desconectado

Mensajes: 1.424



Ver Perfil
Re: secuencia de instrucciones en VB6
« Respuesta #1 en: 2 Septiembre 2005, 21:49 pm »

Expón algo del código para poder situarnos algo mejor...


En línea

Slasher-K


Desconectado Desconectado

Mensajes: 1.477


Ver Perfil
Re: secuencia de instrucciones en VB6
« Respuesta #2 en: 3 Septiembre 2005, 04:22 am »

Deberías saber que el impulso viene de esos sensores, no entiendo cuál es el problema y para qué usas timers. Explicate un poco mejor.

Saludos.
En línea



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*
xadap

Desconectado Desconectado

Mensajes: 220


http://www.tac822.net


Ver Perfil WWW
Re: secuencia de instrucciones en VB6
« Respuesta #3 en: 3 Septiembre 2005, 23:04 pm »

a ver, ahora copio códigos y lo que me deje ya reclamaréis :)

yo estoy haciendo un programa para controlar un robot a través delpuerto paralelo. este robot está compuesto por dos motores,  3 bumpers (sensores físicos, para los no aficionados al tema :) ), 6 leds (en grupos de 3) que se encienden a modo de faros de coche, y una especie de bocina.

desde el programa podemos elegir 3 modos de funcionamiento (siempre con cable conectado al robot): manual, automático y programado.

manual:
posibilidad de encender/apagar leds-faros a voluntad
posibilidad de hacer sonar la bocina a voluntad
control de dirección: hacia adelante, hacia atrás
control de giro: hacia adelante-derecha, adelante-izquierda, sobre él mismo  a la derecha, sobre él mismo a la izquierda, hacia atrás-derecha, hacia atrás-izquierda.

programado:
leyendo instrucciones de un archivo de texto (esta parte todavía no está lista)

automático:
hay una serie de instrucciones en un módulo que se cargan cuando el usuario hace click en "modo automático". entonces se desactiva toda la parte manual excepto el botón de parada.
según lo que le llegue de los sensores actúa de una forma u otra.
aquí viene el problema.
Gilean  (el robotito tiene nombre, jejeje :)) detecta un obstáctulo perfectamente perpendicular a él (dos sensores frontales dando señal). lo que debería hacer es ir hacia atrás durante 1.5s y luego girar sobre sí mismo durante 1s.
no consigo hacer esta secuencia de instrucciones. cómo lo haríais vosotros, aunque no fuese en este contexto. me refiero a hacer dos cosas seguidas controlando el tiempo de ejecución de cada una (por ejemplo mostrar un contenido u otro en una caja de texto).


para más señas os copio aquí el código a ejecutar en un caso (dentro de un select case)

Código:
Case 88 'sensor frontal izq- ir izq/atrás

'evitamos repetir la frase en el historial:
    If lLastValue <> vEntrada Then
        lLastValue = CLng(vEntrada)

        frmPrincipal.txtHistorial.Text = frmPrincipal.txtHistorial.Text & Time & " SFE - izquierda y atrás" & vbCrLf
        frmPrincipal.txtHistorial.SetFocus 'cursor a última línia
        frmPrincipal.txtHistorial.SelStart = Len(frmPrincipal.txtHistorial) 'cursor a última línia
    End If

   
'sacamos valores por el puerto:   
    Call SetPortBit(888, 0)
    Call ClrPortBit(888, 1)
    Call ClrPortBit(888, 2)
    call ClrPortBit(888, 3)
    Call ClrPortBit(888, 4)
    Call ClrPortBit(888, 5)
    Call ClrPortBit(888, 6)
    Call ClrPortBit(888, 7)
     
   
    frmPrincipal.tmrSFE.Enabled = True
    frmPrincipal.tmrEndarrere.Enabled = True
    frmPrincipal.tmrVEntrada.Enabled = False
    frmPrincipal.lblExecucio.Caption = "Giro izq-atrás"

el tmrSFE hace que el giro acabe en 1.5s según su código:
Código:
Private Sub tmrSFE_Timer()
   
    tmrVEntrada.Enabled = True
    tmrSFE.Enabled = False
   
End Sub
la variable VEntrada es donde se almacena la información que le llega por los sensores.
durante el giro se desactiva para evitar que cancele su operación al dejar de recibir señal. cuando acaba el giro vuelve asu estado funcional.

tmrEndarrere es el timer con el siguiente código:

Código:
Private Sub tmrEndarrere_Timer()
    vEntradaEndarrere = PortIn(889) 'lee cada 0.1s cuando gilean gira hacia atrás
    If cmdModeAutomatic.Enabled = False Then
     AI 'instruccions a ArtInt
    End If
   
    If vEntradaEndarrere = 56 Then
     
    Static lLastValue&
    If lLastValue <> vEntradaEndarrere Then
        lLastValue = CLng(vEntradaEndarrere)

        frmPrincipal.txtHistorial.Text = frmPrincipal.txtHistorial.Text & Time & " SP - endavant" & vbCrLf
        frmPrincipal.txtHistorial.SetFocus 'cursor a última línia
       frmPrincipal.txtHistorial.SelStart = Len(frmPrincipal.txtHistorial) 'cursor a última línia
    End If

'seguimos hacia adelante
    Call SetPortBit(888, 1)
    Call SetPortBit(888, 5)
    Call ClrPortBit(888, 4)
    Call ClrPortBit(888, 0)
    Call ClrPortBit(888, 2)
    Call ClrPortBit(888, 6)
    Call ClrPortBit(888, 7)
   
    frmPrincipal.tmrEndarrere.Enabled = False
    frmPrincipal.tmrVEntrada.Enabled = True
End If
End Sub
éste lee el valor de entrada al puerto cuando gilean está girando hacia atrás, de manera que si toca contra un obstáculo pare de girar y siga hacia alante. de esta forma evitamos causar daños al aparato.


si necesitáis algo más del código pedídmelo sin rodeos, no faltaba más :) aunque creo que todo este copiar y pegar no sirve de mucho :P
con que me lo digáis con palabras me basta, yo lo paso a código :) sólo se trata de hacer una secuencia de instrucciones controlando el tiempo de ejecución de cada una.

muchas gracias por adelantado :)
« Última modificación: 3 Septiembre 2005, 23:11 pm por xadap » En línea

Slasher-K


Desconectado Desconectado

Mensajes: 1.477


Ver Perfil
Re: secuencia de instrucciones en VB6
« Respuesta #4 en: 4 Septiembre 2005, 00:08 am »

Antes que todo, excelente proyecto :), mis felicitaciones.

Ahora con el código, podrías usar un timer y una variable estática. El siguiente ejemplo muestra como hacerlo:

Código:
Private Sub Timer1_Timer()
        Static iState%

  Select Case iState
    Case 0:
      'Haces que el robot realice una acción, en este caso sería que vaya hacia atrás.

    Case 1:
      'El Robot gira.

    Case Else
      iState = 0
       Timer1.Enabled = False 'Deshabilita el Timer para que sólo haga la secuencia una vez.
  End Select

  iState = iState + 1
End Sub

Saludos.
En línea



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*
xadap

Desconectado Desconectado

Mensajes: 220


http://www.tac822.net


Ver Perfil WWW
Re: secuencia de instrucciones en VB6
« Respuesta #5 en: 4 Septiembre 2005, 00:22 am »

uis, no entiendo nada :(

por qué una variable estática?

dónde meto eso? un timer nuevo? lo llamo desde el select case del módulo de "inteligencia" artificial?

primero declaramos la variable.
luego, como no tiene ningún valor asignado va hacia case else, por lo que le damos cero. al mismo tiempo deshabilitamos el timer y se acaba, no?

 voy a probarlo de todas formas, gracias :D

editado:
no funciona :(
hace la primera parte durante el tiempo correcto, pero luego, cuando tiene que girar, lo hace durante un espacio muy corto de tiempo :( lo mismo que me ocurría a mi con tropecientas líneas de código :(
« Última modificación: 4 Septiembre 2005, 00:32 am por xadap » En línea

Slasher-K


Desconectado Desconectado

Mensajes: 1.477


Ver Perfil
Re: secuencia de instrucciones en VB6
« Respuesta #6 en: 4 Septiembre 2005, 00:56 am »

Primero te explico lo que hace. La variable estática sirve para mantener el mismo valor en cada intervalo de tiempo. Si no fuera estática cuando termina el procedimiento (End Sub) se borraría el valor.

Ahora con la cuestión del tiempo, el problema es que el Timer tiene un valor en la propiedad Interval predeterminado. Lo que podés hacer es crear un procedimiento para que espere un determinado tiempo, luego usarlo para esperar cuando el robot tiene que girar.

Por ejemplo:

Código:
Sub WaitSyn(Milliseconds As Long)
      Dim snTimer!

  snTimer = Timer

  'Entra al bucle y lo ejecuta hasta que se cumpla el tiempo especificado.
  '
  Do While (Timer - snTime) < (Milliseconds / 1000)
    DoEvents
  Loop
End Sub

Luego llamas a este procedimiento para que espere un determinado tiempo antes de que el robot gire:

Código:
Private Sub Timer1_Timer()
        Static iState%

  Select Case iState
    Case 0:
      'Haces que el robot realice una acción, en este caso sería que vaya hacia atrás.

    Case 1:
      'El Robot gira.

      'Espera tres segundos antes de hacer que el robot gire.
      '
      Call WaintSyn(3000)
    Case Else
      iState = 0
       Timer1.Enabled = False 'Deshabilita el Timer para que sólo haga la secuencia una vez.
  End Select

  iState = iState + 1
End Sub

Saludos.
En línea



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*
Xpeed


Desconectado Desconectado

Mensajes: 472


Res Publica Non Dominetur


Ver Perfil
Re: secuencia de instrucciones en VB6
« Respuesta #7 en: 4 Septiembre 2005, 01:10 am »

Do While (Timer - snTimer) < (Milliseconds / 1000)*

xD

un saludo.
« Última modificación: 4 Septiembre 2005, 01:12 am por Xpeed » En línea

xadap

Desconectado Desconectado

Mensajes: 220


http://www.tac822.net


Ver Perfil WWW
Re: secuencia de instrucciones en VB6
« Respuesta #8 en: 4 Septiembre 2005, 01:27 am »

mañana le hecho un vistazo, que el ventanucos se ha calado y cuando he reniniciado he arrancado linux :)
En línea

xadap

Desconectado Desconectado

Mensajes: 220


http://www.tac822.net


Ver Perfil WWW
Re: secuencia de instrucciones en VB6
« Respuesta #9 en: 4 Septiembre 2005, 23:50 pm »

pues ahora se queda atascado, pero en un punto no especificado. yo le he dicho que girase hacia la derecha y lo hace hacia la izquierda...
uhms, si al final será más lioso de lo esperado :(
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
(Duda) Interrumpir una secuencia de while
Programación C/C++
javier_SL 5 3,300 Último mensaje 20 Junio 2011, 20:15 pm
por javier_SL
Bucle incremental con secuencia de valores ajustados
Programación C/C++
VladisMSX1 3 1,637 Último mensaje 14 Mayo 2012, 17:41 pm
por VladisMSX1
leer secuencia separada por espacios
Programación C/C++
pMV2ere 2 3,264 Último mensaje 2 Diciembre 2012, 18:22 pm
por pMV2ere
No entiendo la secuencia de un bucle « 1 2 »
Scripting
Linton 13 3,965 Último mensaje 20 Febrero 2013, 19:27 pm
por Linton
Instrucciones 64-bit vs. Instrucciones Avanzadas (SSE, SSE2, SSE3, SSE4, AVX)
ASM
Fly_NighT 8 5,301 Último mensaje 5 Marzo 2014, 07:45 am
por cpu2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines