La penúltima entrega de la traducción del tutorial realizado por Dave Parker sobre programación de bloques en NXT-G.
Crear Mis Bloques más complejos
En las secciones siguientes, se muestran dos ejemplos más de Mis Bloque que muestran algunas técnicas que se pueden utilizar para hacer cosas más complejas. En primer lugar vamos a crear un Mi Bloque llamado OutAndBack que se basa en los bloques que hemos creado hasta el momento para hacer un robot avanzar una distancia especificada, de la vuelta la misma distancia para volver al punto de partida y suenen los pitidos antes de cada movimiento. A continuación, vamos a dar un repaso a través de la creación de un Mi Bloque más complejo llamado LimitNumber que se puede utilizar para probar y modificar un valor numérico asegurándose que está dentro de un rango especificado. El bloque LimitNumber es lo suficientemente complejo para requerir una cuidadosa planificación y prueba. Finalmente terminaremos mostrando un proceso paso a paso que se puede utilizar como guía en el proceso de creación de Mis Bloques más complejos.
Uso de Mis Bloques dentro de otros Mis Bloques
Para construir el Mi Bloque OutAndBack, podemos notar que las tres cosas que queremos hacer ya se han desarrollado en los bloques Forward, Backward y BeepBeep. Afortunadamente, un Mi bloque puede contener usos de Mi Bloque, por lo que el bloque OutAndBack será fácil de crear usando estos otros tres bloques. La figura 43 muestra el programa utilizado para crear el bloque OutAndBack. La principal funcionalidad se logra simplemente insertando los bloques previamente creados desde la paleta personalizada. Puesto que el bloque OutAndBack tendrá dos parámetros de entrada (Distance cm y Power), dos bloques de constantes se utilizan como fuentes de datos para estos valores antes de crear el Mi Bloque.
Figura 43: Un Mi Bloque se puede crear uniendo de otros Mi Bloque.
Utilizar parámetros de entrada más de una vez dentro de un Mi Bloque
Como se muestra en la Figura 43, los parámetros de entrada Power y Distance cm se utilizan dentro del Mi Bloque en los bloques Forward y Backward. Cuando un parámetro de entrada se utiliza más de una vez en el contenido de un Mi Bloque, es importante que todos los usos del parámetros se conecten al mismo bloque constante (o fuente de datos) en el programa que se utiliza para crear el Mi Bloque. Esto garantiza que todos los diferentes usos reciben el mismo valor y que un único parámetro se convertirá en la fuente de todos los usos. Recuerde que a la hora de seleccionar los bloques para formar el mi bloque, los bloques seleccionados todos deben ser contiguos, de modo que los bloques constantes en la Figura 43 deben estar colocados al principio de la secuencia.
En cuanto a la selección de bloques de la Figura 43 que se seleccionan para formar el Mi Bloque, se observa que cuatro cables cruzan la frontera de la selección. Sin embargo, estos cuatro cables sólo representan dos diferentes rutas de datos, debido a que algunos de los cables se unen a la misma fuente de datos. Sólo se crea un parámetro por para cada fuente de datos diferente que está fuera de la selección, por lo que en este caso sólo se crean dos parámetros de entrada. La figura 44 muestra el contenido del Mi Bloque OutAndBack resultante. Hay dos bloque de conexión de parámetros, cada uno de los cuales se utiliza dos veces dentro del bloque.
Figura 44: El Mi Bloque OutAndBack utiliza otros Mis bloques en su interior
y utiliza cada parámetro de entrada dos veces.
Creación de un Mi Bloque con un puerto de salida de datos
En las siguientes secciones, vamos a construir un Mi Bloque más complejo llamado LimitNumber, que incluirá un puerto de salida de datos en su centro de datos. Esto permitirá que el Bloque pueda pasar un valor de resultado de vuelta al programa que utiliza el bloque. Este Mi Bloque será más difícil de probar que mis otros bloques que hemos creado hasta el momento, por lo que se mostrará un método de comprobación antes y después de crear el Bloque.
El Bloque LimitNumber aceptará un parámetro de entrada Number junto con otros dos parámetros de entrada llamados Min y Max. Comprobará si Number está en el rango numérico de Min a Max y producirá un valor de salida que está dentro de ese rango. Específicamente, el resultado de LimitNumber puede especificarse como sigue:
Si el Number es mayor que Max, el resultado es Max.
Si el Number es inferior al Min, el resultado es Min.
Si el Number está en el rango de Min a Max, el resultado es Number.
Como LimitNumber tendrá tres parámetros de entrada, vamos a empezar con tres bloques de constantes que sean las fuentes de datos para estos parámetros. Estas constantes se denominan Min, Max,y Number en la Figura 45.
Para el resultado de salida, también necesitamos un lugar para conectar un cable de datos que contiene los datos de los resultados a una ubicación fuera del bloque que conforman el Mi Bloque. Inversamente a la forma en que se crean los parámetros de entrada cuando una selección de bloques se convierte en un Mi Bloque, un puerto de salida de datos se creará para cada ruta de datos que se origina en el interior de los bloques seleccionados y se conecta a un lugar fuera de los bloques seleccionados.
Regla: Un puerto de salida se creará para cada ruta de datos que se origina en el interior de los bloques seleccionados para crear Mi Bloque y que está conectado a un lugar fuera de (detrás) de los bloques seleccionados.
|
Una manera fácil de crear esta conexión es utilizar un bloque de escritura Variable para recibir el resultado de la salida. Para mayor claridad, se puede usar Edición - Definir variables para definir una variable del tipo apropiado con un nombre descriptivo. Para un puerto de salida, el bloque de escritura variable debe ser colocado en el extremo de la secuencia utilizada para crear el Mi Bloque como se muestra en la Figura 45.
Figura 45: Preparación para hacer un Mi Bloque con tres parámetros de entrada y un puerto de salida de datos.
Usando una variable local en un Mi Bloque
Para una fórmula compleja, como la especificación del resultado LimitNumber basada en los valores de Number, Min y Max que se muestra más arriba, a menudo es útil usar una o más variables temporales para almacenar y modificar resultados intermedios antes de producir el resultado final. Si tuviéramos una variable temporal denominada TempResult, entonces se podría aplicar la fórmula para LimitNumber mediante la siguiente secuencia ordenada de acciones:
Almacene en la variable TempResult el valor de Number.
Comparar Number con Max, y si Number es superior a Max a continuación, sobrescribir la variable TempResult con el valor de Max.
Comparar Number con Min, y si el Number es menor que Min sobrescribe la variable TempResult con el valor de Min.
Conecte la variable TempResult a la ruta de datos de salida.
La variable temporal TempResult en esta secuencia se utiliza sólo en el interior de los contenidos del Bloque y no es necesario antes o después de que Mi Bloque se ejecute. Sin embargo, un posible problema con el uso de una variable temporal dentro de un Mi Bloque es que si la variable tiene un nombre que coincide con otra variable utilizada por un programa que usa el bloque, la variable temporal sobreescribirá a la variable del programa y probablemente creará un error. Algunos lenguajes de programación ofrecen una manera de crear algo que se llama una variable local, lo cual no afectará el programa fuera, pero NXT-G no, así que vamos a utilizar una convención de denominación de variables para evitar este problema.
Nota: Todas las variables en NXT-G son "globales", lo que significa que dos variables con el mismo nombre se refieren a la misma ubicación de almacenamiento. No se puede definir una variable "local" garantizando que afecta sólo al contenido de Mi Bloque.
|
Usando una convención de nomenclatura para variables significa seguir unas normas acerca de cómo deletrear las variables que se utilizan en diferentes lugares, con el fin de evitar conflictos de nombres. Una variable temporal con un nombre como TempResult es, por desgracia muy probable que entre en conflicto con otra variable que se utiliza en el programa (incluso si no tiene una variable llamada así ahora, puede agregarla más adelante).
La convención de nomenclatura para las variables que sugiero es:
Las variables temporales de un Mi bloque empiezan con una letra minúscula y tienen el nombre del Bloque al final después de un guión bajo ("_").
Las variables normales comienzan con una letra mayúscula.
Esta convención se asegurará de que las variables temporales no interfieran con las variables normales en un programa o cualquier variable temporal en otros Mis bloques. También hace más fácil identificar las variables temporales de un vistazo porque comienzan con una letra minúscula. La figura 46 muestra una variable temporal number_LimitNumber para su uso en el Bloque LimitNumber.
Figura 46: convención de nomenclatura para las variables "locales" utilizadas sólo en el interior de un Mi Bloque.
La Figura 47 muestra un programa que puede ser utilizado para crear Mi Bloque LimitNumber utilizando la variable temporal number_LimitNumber y la secuencia de las acciones planificadas anteriormente. Tenga en cuenta que sólo una parte del nombre de las variables temporales es visible en los bloques de variables, pero todavía se puede ver la parte importante del nombre al principio.
Como se mencionó en el ejemplo anterior OutAndBack, todos los usos de un parámetro de entrada necesitan ser conectados a la misma ruta de datos que conduce al bloque constante para ese parámetro. Para Mi Bloques largos, puede ser difícil hacer esto. Por ejemplo, tenga en cuenta que la ruta de datos para el parámetro Min en la Figura 47 es bastante larga. Si es demasiado difícil de cablear el acceso a un parámetro de entrada en todos los lugares necesarios, puede introducir otra variable temporal para almacenar una copia del parámetro de entrada. En este caso se utiliza un bloque de escritura Variable para copiar el valor del parámetro de entrada a la variable temporal al inicio del bloque, entonces puede utilizar varios bloques de lectura variable para acceder a la variable temporal en todo el programa.
Nota: El programa de la figura 47 incluye algunos comentarios para su claridad, pero por lo general tendrá que esperar hasta después de la creación de Mi Bloque antes de añadir los comentarios, ya que puede ser necesario cambiarlos de posición después de crear el Mi Bloque.
|
Prueba de un Mi Bloque antes y después de crearlo
El programa LimitNumber que se muestra en la Figura 47 es más complejo que los otros programas que hemos creado hasta el momento, y también es más difícil de probar, ya que no da lugar a ningún movimiento, sonidos, o mostrar algo en la pantalla del robot. Para probar el programa, es necesario ser capaz de ver el valor de la variable de Result al final. La figura 48 muestra algunos bloques adicionales que pueden ser utilizados para esta prueba. La variable Result se convierte a texto y se muestra en la pantalla NXT, y luego un bucle infinito vacío hace la espera hasta que se aborte el programa (de modo que el resultado no se borrará de la pantalla cuando el programa termina).
Figura 48: Bloques adicionales utilizados para la prueba antes de crear el Mi Bloque LimitNumber.
Los bloques de prueba en la figura 48 deben añadirse al final del programa de la figura 47 antes de crear el Mi Bloque, y entonces el programa se puede probar (antes de que se cree Mi Bloque) ejecutándolo varias veces, modificando cada vez los valores para las constantes Number, Min, y Max al comienzo del programa y observando que el valor de Result que se muestra para asegurarse de que se comporta como se espera. Lo mejor es hacer la prueba antes de crear el Mi Bloque, porque algunas cosas no se pueden cambiar (o no se pueden cambiar fácilmente) después. La figura 49 muestra el programa completo para probar y crear el Mi Bloque LimitNumber con los bloques de prueba adicional.
Figura 49: Selección de los bloques que van dentro del Mi Bloque LimitNumber ( clic para ampliar ).
Nota: Antes de crear un Mi Bloque, es importante guardar una copia del programa (aparte de con la que se está trabajando, y que también se debe guardar) en caso de que el Mi Bloque no salga como esperas es necesario volver al programa original para realizar los cambios. Puede guardar una copia con el comando de menú Archivo - Guardar como.
Por ejemplo, puede utilizar Guardar como para guardar una copia del programa que se muestra en la Figura 49 con nombre LimitNumberProg1 y luego en Guardar como otra copia nombrada LimitNumberProg2, y luego crear el Mi Bloque desde LimitNumberProg2.
|
Para crear el Mi Bloque LimitNumber desde el programa completo, seleccione los bloques después de los bloques de Constantes al principio y antes del bloque que escribe el resultado en la variable de salida Result (Figura 49). Esta selección presenta tres fuentes de datos de entrada fuera de la selección al comienzo, que se convertirán en los tres parámetros de entrada, y una ruta de datos fuera de la selección en el extremo, lo que resultará en el puerto de salida de datos. El programa resultante con la selección sustituida por el Mi Bloque se muestra en la Figura 50. Tenga en cuenta que los bloques de pruebas todavía están allí después del bloque LimitNumber. Puede probar de nuevo el programa en este momento si lo desea, pero debe comportarse igual que lo hacía el programa completo antes de crear el Mi Bloque.
Figura 50: El programa de pruebas después de crear el Mi Bloque LimitNumber.
El contenido del Mi Bloque LimitNumber se muestra en la Figura 51. Aquí los parámetros se han cambiado de nombre, se ha añadido un comentario de encabezado del bloque, y los cables y los comentarios fueron reordenados. Tenga en cuenta que los resultados de los puertos de salida crean un bloque de conexión similar a los parámetros de entrada y también se pueden cambiar.
Como prueba final del bloque LimitNumber, puede crear un nuevo programa que tiene una nueva copia del bloque LimitNumber conectado directamente a los bloques de prueba (Figura 52), y probar las diferentes combinaciones de los parámetros de entrada introduciéndolos directamente en el panel de configuración del bloque LimitNumber.
Figura 52: Prueba final con una nueva copia del Mi Bloque LimitNumber.
Un proceso paso a paso para crear y probar un Mi Bloque complejo
Como vimos en el Mi Bloque LimitNumber de la sección anterior, hay varios pasos que realizar en la creación de un Mi Bloque complejo, y momentos estratégicos durante el proceso en el que debe guardar y poner a prueba su trabajo. En esta sección se resume el proceso paso a paso que puede utilizar para guiarse en este proceso.
Un proceso paso a paso para crear y probar un Mi Bloque complejo:
Decida qué parámetros de entrada, puertos de salida de datos y variables utilizará Mi Bloque para comunicarse con los programas que lo utilizan. No se puede cambiar el número o tipo de parámetros o puertos después de la creación de un mi bloque, por lo que es una buena idea tratar de pensar en esto antes.
Crear un nuevo programa que se usará para probar y crear el Mi Bloque. Llamemos a este el programa de pruebas.
En el programa de pruebas, insertar un bloque constante para cada parámetro de entrada en el inicio del programa, y un bloque de escritura variable para cada puerto de salida de datos al final del programa ( Figura 45 ).
Definir las variables temporales para el uso dentro del Mi Bloque utilizando una convención de nomenclatura que evita conflictos de nombres con otras variables. Se sugiere que las variables temporales empiecen con una letra minúscula y se añada el nombre del Mi Bloque al final después de un guión bajo ("_") y las variables normales comienzan con una letra mayúscula ( Figura 46 ).
Crear el contenido del Mi Bloque en el programa de pruebas como una secuencia contigua de bloques entre los bloques de parámetro de entrada constante y los bloques de variables de salida ( Figura 47 ).
Asegúrese de que si un parámetro de entrada se utiliza varias veces todos los accesos están conectados a la misma ruta de datos que conduce al bloque constante original para ese parámetro de entrada. Si una ruta de datos se hace demasiado larga o compleja de gestionar, se puede introducir una variable temporal para almacenar el valor de un parámetro de entrada y acceder a ella a partir de la variable temporal en su lugar.
Añadir bloques de prueba al principio y/o al final del programa de pruebas para ayudarle a comprobar que funciona como se espera ( Figura 48 ).
Ejecutar varios casos de prueba, modificando los valores de los parámetros de entrada en los bloques de constantes entre ejecuciones para poner a prueba todas los casos posibles. Haga los cambios necesarios en el programa de pruebas.
Guarde dos copias del programa de prueba utilizando Guardar como, para que siempre tenga una copia de seguridad antes de que se creara el Mi Bloque.
Seleccione la secuencia de los bloques que conforman el contenido del Mi Bloque. Esto debería incluir todos los bloques después de los bloques constantes de parámetros de entrada y antes de cualquier bloque de salida Escribir variable, y no debe incluir los bloques añadidos para la prueba ( Figura 49 ).
Haga clic en el botón Crear mi Bloquear de la barra de herramientas y utilice el Mi Generador de Bloques para especificar el nombre y el icono de Mi Bloque ( figuras 3 a 5 ).
Compruebe que el programa de prueba modificado todavía parece correcto después de Mi Bloque haya sido sustituido, en especial las rutas de datos para los parámetros de entrada y los puertos de salida. Realice hacer más ejecuciones de prueba en este momento si lo desea ( Figura 50 ).
Haga doble clic en el Mi Bloque en el programa de pruebas para abrir su contenido. Cambie el nombre de los parámetros de entrada y puertos de salida a nombres descriptivos, añada un comentario de encabezado de bloque y otros comentarios sobre los contenidos, y coloque la posición de las rutas de cables como se desee. Todos los trazados de cables que sean demasiado difícil de gestionar se pueden borrar y volver a crear cuando sea necesario ( Figura 51 ).
Guardar el contenido de mi bloque con Archivo - Guardar.
Crear un nuevo programa para probar la última versión de Mi Bloque. Inserte una nueva copia del Mi Bloque de la paleta personalizada y añada cualquier código de prueba necesario para probarlo, y luego realice una serie completa de pruebas de funcionamiento de nuevo (Figura 52 ).
|