Introducción

El lenguaje Logo fue creado en la década de los 60 por Seymour Papert para que los niños aprendieran ideas matemáticas programando con este lenguaje. En las siguientes décadas él y su equipo continuaron con su desarrollo y tratando de crear un programa con un entorno gráfico que fuera a la vez potente y fácil de usar.

En 1994 MSWLogo fue modificado para permitir el control por ordenador a través de los puertos serie y paralelo.

Todas las versiones del software Logo para los sistemas operativos Unix, MS-Dos, Macintosh y Windows desarrolladas inicialmente por la Universidad de California (Berkeley), son gratuitas y pueden ser copiadas sin ningún tipo de restricción por instituciones educativas.

El símbolo de Logo es una tortuga robotizada que se mueve bajo el control de un ordenador dibujando a medida que se desplaza por la pantalla. En algunas versiones de este lenguaje la tortuga ha evolucionado hasta convertirse en otro tipo de objetos. Por ejemplo, en MSWLogo se ha convertido en un triángulo.

MSWLogo se puede utilizar para múltiples utilidades: para dibujar, para crear sonidos, para manipular una controladora a través del ordenador, etc.

La versión que se intentará explicar en esta documentación es la versión que presenta el Centro Nacional de Información y Comunicación Educativa (CNICE), que es una versión del MSWLogo 6.5a traducida al castellano.

Uso de primitivas en MSWLogo

MswLogo es un lenguaje interpretado, es decir, las órdenes introducidas por el usuario son interpretadas por el ordenador y ejecutadas inmediatamente por orden. En cambio, los programas "compilados" son convertidos primero a código máquina antes de que cualquier parte del programa pueda empezar a funcionar, como C o C++.

La pantalla de MSWLogo se divide en dos partes:

  1. La pantalla principal. En esta ventana es donde se encuentra la tortuga, mediante la ayuda de ésta se dibujan diferentes figuras, se cargan imágenes, etc. Esta ventana está etiquetada con el titulo de "Pantalla de MSWLogo".
    En la parte superior de esta ventana se encuentran diferentes menús para la realización de diversas tareas.



    A continuación se muestra una pequeña descripción de las tareas que pueden realizar cada uno de los menús que se muestran en la imagen superior.
  2. La ventana de trabajo o de comandos. La ventana de comandos se divide a su vez en 3 partes diferentes:

Algunas primitivas tienen abreviaturas y otras no, por ejemplo, la primitiva borratexto tiene la abreviatura bt. Se puede usar una u otra indistintamente y el resultado será el mismo.

Para salir de MSWLogo se pueden seguir tres caminos:

  1. Usar la primitiva adios.
  2. Seleccionar la opción Salir del menú Archivo.
  3. Pinchar en el aspa de la ventana.

Uso de primitivas en MSWLogo

Un procedimiento es una función que ejecuta una serie de lineas de instrucciones, define variables, asigna valor a variables, etc. Para poder crear un procedimiento en MSWLogo hay que utilizar la palabra reservada para seguida del nombre que se vaya a poner al procedimiento y de los parámetros que tenga éste, si es que los tiene. Después se pondrá la definición del procedimiento con toda la lista de instrucciones, para finalizar el procedimiento se utiliza la palabra reservada fin.

PARA nombre_del_procedimiento [lista de parámetros]
Lista de instrucciones
-
-
FIN

A la hora de crear procedimientos existen 3 maneras distintas de realizarlos. A continuación las exponemos:

  1. En la ventana de trabajo, hay que escribir en la caja de entrada de datos o primitivas la siguiente instrucción PARA nombre [lista de parámetros], luego se ha de pulsar la tecla ENTER o el botoón Ejecutar. Un vez se ha realizado la anterior acción aparecerá la siguiente ventana.



    En esta ventana se irán introduciendo una a una las sentencias o instrucciones de las que va a constar el procedimiento, según se se vaya poniendo cada instrucción se irá pulsando el botón OK para ir añadiéndolas al procedimiento. Para terminar con la definición del procedimiento se introducirá la primitiva FIN.

  2. Mediante la ventana de edición, que es una ventana en la que se irán poniendo las instrucciones, previamente tenemos que poner el nombre al procedimiento después de la palabra para. Para acceder a esta ventana se utiliza las primitivas editatodo o editaprocedimientos, también se puede acceder a esta ventana a través del menú Archivo - Editar. Además de definir procedimientos, en la ventana de Edición se pueden definir variables, asignar valor a a dichas variables, escribir comentarios, etc. Cuando se ha acabado de definir el procedimiento guardará en la opción del menú Archivo - Guardar.



  3. En un archivo con extensión "lgo", dentro de este archivo se pueden definir uno o varios procedimientos mediante las palabras reservadas para y fin. Posteriormente lo que se tiene que hacer es cargar en el MSWLogo el archivo "lgo", para lo cual iremos a la opción del menú Archivo - Cargar.

Una cosa bastante importante de los procedimientos en MSWLogo es la recursividad, es decir un procedimiento se puede llamar a si mismo. Esto es bastante importante ya que se utilizará bastante en la programación de los diferentes proyectos para poder crear bucles.

PARA nombre_del_procedimiento [lista de parámetros]
Lista de instrucciones
-
-
nombre_del_procedimiento
FIN

También como en otros entornos de programación, un procedimiento puede llamar a otro procedimiento, lo que hará esto es realizar las instrucciones que tiene definidas el procedimiento al que se llama.

PARA nombre_del_procedimiento1 [lista de parámetros]
Lista de instrucciones
-
-
FIN

PARA nombre_del_procedimiento2 [lista de parámetros]
Lista de instrucciones
-
-
nombre_del_procedimiento1
FIN

Definición de variables

Las variables son una parte fundamental del mundo de la programación, ya que nos sirven para guardar cualquier tipo de información en un área reservada de la memoria del ordenador. El área reservada puede tener una longitud variable o fija, a continuación explicamos los 2 conceptos:

Para definir una variable en MSWLogo se utiliz la palabra reservada haz seguida de la apertura de comillas ", tras las cuales se pone el nombre que se le vaya a dar a la variable.

Haz "nombre_variable_valor

A una variable se le puede asignar un valor, este valor puede ir cambiando a lo largo de la ejecución del programa. El valor depende de del tipo de dato que se quiera guardar en la variable. Ésta puede guardar los siguientes tipos de datos, son:

Para asignar un valor a una variable lo único que hay que hacer es poner tras el nombre de la variable el valor que se le quiera dar, ya sea un número o una cadena de texto. Así si por ejemplo se quiere asignar un valor de una letra o una palabra, éstas irán precedidad de comillas ", pero si se quiere asignar como valor una cadena de texto el valor se pone entre corchetes []. A continuación mostraremos varios ejemplos.

Haz "nombre_variable 5
Haz "nombre_variable "a
Haz "nombre_variable "verdadero
Haz "nombre_variable [Esto es un ejemplo]

Para poder acceder al valor de una variable se debe anteponer al nombre de la variable dos puntos ":". Así por ejemplo mediante el uso de otra primitiva nos muestra el valor en pantalla de la primitiva.

Haz "nombre_variable 5
muestra :nombre_variable

En pantalla aparecerá el número 5. Más adelante se explicará el uso de la primitiva "muestra".

También hay otra palabra reservada para poder crear variables y asignarles un valor, la palabra a utilizar es haz2, lo único que cambia con respecto a haz es el orden en que se declara la variable. Así una variable con un valor asignado se declararía de la siguiente forma.

Haz2 valor "nombre_variable
Ej: Haz2 5 "nombre_variable

 

Listado de primitivas seleccionado de MSWLogo

En este punto se van a comentar las primtivas más utilizadas en el entorno de programación de MSWLogo mediante una sencilla descripción de las funciones que realiza y un pequeño ejemplo de programación.

Primitivas para dibujar

PRIMITIVA
MÉTODO ABREVIADO
DESCRIPCIÓN
EJEMPLO
AVANZA unidades
AV ...
La tortuga avanza el número especificado de unidades.

AVANZA 100 ó
AV 100

RETROCEDE unidades
RE ...
La tortuga retrocede el número especificado de unidades.
RETROCEDE 100 ó RE 100
GIRADERECHA ángulo

GD...
VIRA

La tortuga gira en el sentido de las agujas del reloj el número de grados especificado.
GIRADERECHA 90 o
GD 90 ó VIRA 90
Gira la tortuga 90º hacia la derecha
GIRAIZQUIERDA ángulo
GI ...
La tortuga gira en sentido contrario a las agujas del reloj el ángulo especificado.
GIRAIZQUIERDA 90 ó GI 90
Gira la tortuga 90º hacia la izquierda
PONLAPIZ
PLA
Pone el lápiz BAJADO y el modo PINTA (PINTA es el modo normal de la tortuga para dibujar).
PONLAPIZ ó PLA
GOMA
GO
Pone el lápiz BAJADO y el modo a BORRA (la tortuga va borrando por donde se mueve).
GOMA ó GO
SUBELAPIZ
SL
Pone el lápiz LEVANTADO, sin cambiar su modo.
SUBELAPIZ o SL
BAJALAPIZ
BL
Pone el lápiz BAJADO, sin cambiar su modo.
BAJALAPIZ o BL
CENTRO
 
Devuelve a la tortuga al centro de la pantalla sin borrarla. Hay que utilizar la primitiva SUBELAPIZ para evitar que dibuje mientras va hacia el centro.
CENTRO
PONCOLORLAPIZ[... ... ... ]
PONCL[... ... ... ]
Pone el lápiz del color determinado de acuerdo con:
PONCOLORLAPIZ [255 000 000] es el Rojo
PONCOLORLAPIZ [000 255 000] es el Verde
PONCOLORLAPIZ [000 000 255] es el Azul
El color amarillo es:
PONCOLORLAPIZ [255 255 000] ó PNCL [255 255 000]
OCULTATORTUGA
OT
Oculta la tortuga (el triángulo) en la pantalla.
OT
MUESTRATORTUGA
MT
Muestra la tortuga (el triángulo) en la pantalla.
MT
HAZTORTUGA tortuga [PosX PosY ángulo [instrucciones]]  
Coloca la tortuga en la posición que le indicamos, indicándole la posición y el ángulo de ubicación, así como las instrucciones que va a realizar

HAZTORTUGA 0 [0 100 45 [av 100]]
Este ejempo coloca la tortiga nº 0 en la unidad 0 de eje "X" y 100 del eje "Y", después la rota en un ángulo de 45º, y por último avanza ésta 100 unidades en ese sentido

BORRAPANTALLA
BP
Borra la pantalla y coloca a la tortuga en el centro.
BORRAPANTALLA ó BP
LIMPIA
 
Borra la pantalla, pero mantiene a la tortuga en su posición actual en la pantalla.
LIMPIA
ROTULA [texto]
RO[...]
Escribe un texto en la dirección en que se encuentra la tortuga. Este texto se muestra en la pantalla de MSWLogo.
ROTULA [Texto de ejemplo] ó RO [Texto de ejemplo]
PONGROSOR[ancho alto]
PONG[.. ..]
Coloca el ancho del trazado del lápiz y la altura especificados. MSWLogo utiliza solamente el valor de la anchura. Por defecto el valor de la anchura es 1.
PONGROSOR [50 50] ó PONG [50 50]
Aumenta el grosor del lápiz 50 veces en tamaño
PONPOS [X Y]
 
Coloca la tortuga en las coordenadas que se indican, siendo el primer número las "X" y el segundo número las "Y".
PONPOS [100 100]
Coloca la tortuga en la unidad 100 del eje "X" y en la unidad 100 del eje "Y"
PERSPECTIVA
 
Se añade a la tortuga una tercera dimensión (eje Z) para que ésta se pueda mover por esta dimensión. Este comando precede a los comandos que vienen debajo de éste.
PERSPECTIVA
PONBALANCEO grados  
Rota la tortuga a una nueva posición absoluta según los grados que se indican. Ésta rota sobre el eje "Y". Este comando solo funciona en modo perspectiva
PONBALANCEO 90
Rota la tortuga 90º respecto al eje "Y"
PONCABECEO grados
 
Rota la tortuga a una nueva posición absoluta según los grados que se indican sobre el eje "X". Este comando solo funciona en modo perspectiva.
PONBCABECEO 90
Rota la tortuga 90º respecto al eje "X"
BALANCEA grados
BAL ...
Rota la tortuga hacia la derecha los grados que se indican. Este comando solo funciona en modo perspectiva.
BALANCEA 90 ó
BAL 90
Rota la tortuga 90º hacia la derecha
BALANCEAIZQUIERDA grados
CAI ...
Rota la tortuga hacia la izquierda los grados que se indican. Este comando solo funciona en modo perspectiva.

BALANCEAIZQUERDA 90 ó
CAI 90
Rota la tortuga 90º hacia la izquierda

BAJANARIZ grados
BAJAN ...
Desciende la nariz de la tortuga los grados que le indiquen. Este comando sólo funciona en modo perspectiva.
BAJANARIZ 90 ó
BAJAN 90
Descienden 90º el sentido de la tortuga

 

Primitivas para escribir, editar y trabajar con ficheros

PRIMITIVA
MÉTODO ABREVIADO
DESCRIPCIÓN
EJEMPLO
MUESTRA texto
Escribe la entrada o entradas en la salida de escritura que actualmente esté (inicialmente es el terminal). El texto, si es una sola palabra llevará comillas de apertura ", y si es una cadena de texto va entre corchetes [], mostrándose también los corchetes.
MUESTRA "ejemplo
ó
MUESTRA [Esto es un ejempo]
ESCRIBE texto
ES ...
Escribe la entrada o entradas en la salida de escritura que actualmente este (inicialmente es el terminal). Todas las entradas de texto se escriben en una sola línea. Si el texto es una única palabra llevará comillas de apertura ", y si es una cadena de texto va entre corchetes [], no mostrándose los corchetes.
ESCRIBE "ejemplo
ó
ESCRIBE [Esto es un ejemplo]
ó
ES "ejemplo
ó
ES [Esto es un ejemplo]
MUESTRAT texto
 
Muestra la entrada o entradas similar al comando “escribe”, excepto que no muestra el carácter de nueva línea al final, y las entradas múltiples no son separadas por líneas.
MUESTRAT"ejemplo
ó
MUESTRAT [Esto es un ejemplo]
EDITA CONTENIDO
EDITATODO
Comando que abre la ventana del editor y permite modifica las definiciones de los elementos (procedimientos, variables, etc.). Hace lo mismo que el botón Ed. Todo.
 
EDITA PROCEDIMIENTOS
EDITAPROCEDIMIENTOS
Comando que abre la ventana del editor y permite modifica las definiciones de los procedimientos.
 
EDITA nombre_proc
ED...
Abre la ventana del editor con el nombre de procedimiento que se le haya dado
 
EDITAFICHERO nombre_fich llamada
 
Abre un editor estándar con el fichero que se haya indicado. En llamada se pone un conjunto de instrucciones a ejecutar cuando se sale del editor.

EDITAFICHERO c:\\ejemplo.lgo rotula [Este el fichero a editar]

Abre el fichero “ejemplo.lgo” que se encuentra en C, y una vez abierto muestra en la pantalla de MSWLogo el texto del comando “rotula”

LISTA
 
Devuelve una lista cuyos componentes  son las entradas, que pueden ser palabras, listas  o  matrices.

LISTA  [a b  c]

Crea una lista de 3 elementos. Al ver el contenido de la lista con el comando:

MUESTRA  LISTA

[a b  c]

LISTA? objeto
 
Devuelve verdadero si el objeto de entrada es una lista, y devuelve falso si no lo es.
Con respecto a la lista del ejemplo anterior utilizamos este comando mediante laayuda del comando “muestra” para poder ver el resultado en pantalla.
MUESTRA LISTA? [a b c]
Nos devuelve verdadero
Ó

MUESTRA LISTA? [a b]
Nos devuelve falso
TAPA contenidos
TAPATODO
Oculta los procedimientos, variables, y lista de propiedades pasadas por la entrada. La lista de contenidos ha de ir entre corchetes  [ ].

TAPA  [[encender]  [] []]

Oculta  para el MSWLogo el procedimiento “encender

TAPADO
 
Devuelve una lista de contenidos con los elementos tapados del entorno de trabajo.
Mediante la ayuda del comando “muestra” nos dice los procedimientos que se han ocultado a MSWLogo. Con respecto al ejemplo anterior:
MUESTRA TAPADO
Devuelve encender
BORRA contenidos
BO...
Borra del entorno de trabajo los procedimientos, variables y listas de propiedades que se han pasado en la entrada.

BORRA [encender]

Elimina el procedimiento encender de MSWLogo

BORRARPROCEDIMIENTOS
 
Borra todos los procedimientos que hay en el entorno de trabajo sin tapar
BORRARPROCEDIMIENTOS
BORRATEXTO
 
Limpia el texto que hay en el Terminal
BORRARTEXTO
CARGA nombre_fichero
Lee las instrucciones del fichero “lgo” para a continuación realizarlas.
CARGA C:\\ejemplo.lgo Carga el fichero “ejemplo.lgo” que se encuentra en C
GUARDA nombre_fichero
 
Guarda en un fichero “lgo” las definiciones de todos los procedimientos,variables y listas de propiedades sin tapar.
GUARDA “C:\\ejemplo.lgo Guarda en el fichero “ejemplo.lgo” que se encuentra  en C
BOARCHIVO nombre_archivo
BA...
Borrar el fichero que se indica, para que funcione el comando, el fichero ha de estar cerrado
BOARCHIVO “C:\\ejemplo.lgo ó
BA “C:\\ejemplo.lgo

Borra el fichero “ejemplo.lgo”  que se encuentra  en C

 

Primitivas para trabajar con controladoras

Estas primitivas sirven para trabajar con las controladoras ENCONOR y CNICE.

Hay que tener en cuenta que estas controladoras no tienen el mismo número de entradas analógicas, por ello hay algunas primitivas que no se pueden utilizar. Además la controladora CNICE no tiene salidas analógicas y por tanto las primitivas que para este tipo de salidas no se podrán usar con ella.

PRIMITIVAS PARA TRABAJAR CON LAS SALIDAS DIGITALES
PRIMITIVA
DESCRIPCIÓN
EJEMPLO
M1 "D
Hace girar en un determinado sentido un motor conectado a dos de las salidas digitales (las salidas elegidas dependen del tipo de controladora). Si el actuador es una bombilla, relé o electroimán, simplemente lo activa.
M1 "I
M1 "I
Hace girar en sentido contrario a la primitiva anterior un motor conectado a dos de las salidas digitales. No se diferencia de la primitiva anterior si están conectados otros actuadotes (bombilla, relé, etc.)
M1 "D
M1 "P
Desactiva el actuador que esté conectado a dos de las salidas digitales (para conseguirlo se desactivan ambas salidas).
M1 "D

M2 "D, M2 "I, M2 "P

M3 "D, M3 "I, M3 "P

M4 "D, M4 "I, M4 "P

Lo mismo que las primitivas anteriores, aunque los actuadotes se conectan a los restantes pares de salidas digitales.

M2 - Salida 2 y 3
M3 - Salida 4 y 5
M4 - Salida 6 y 7

M2 “I, M2 “D, M2 “P M3 “I, M3 “D, M3 “P M4 “I, M4 “D, M4 “P
M?
Devuelve una lista con el estado de los 4 motores. Los estados son: I, D y P.
Esta primitiva se utiliza junto con la primitiva “muestra”, para ver el resultado en pantalla.
MUESTRA M?
nos devuelve: M [I P D I]
M [lista_motores]
Permite activar o desactivar los 4 motores de manera simultáneamente. En la lista de motores se pone el estado que se quiera por cada motor, separados éstos por un espacio. La lista ha de ir entre corchetes
M [I D P P]
Se pone entre corchetes el estado en que queremos que encuentren los 4 motores.
CONECTAR
Activa todas las salidas digitales de la controladora.
CONECTAR
DESCONECTAR
Desactiva todas las salidas digitales de la controladora.
DESCONECTAR
CONECTA :NUM
Activa la salida digital indicada, siendo :NUM 1, 2, 3, 4, 5, 6, 7 u 8.
CONECTA 1
Activa la salida digital 0
DESCONECTA :NUM
Desactiva la salida digital indicada, siendo :NUM 1, 2, 3, 4, 5, 6, 7 u 8.
DESCONECTA 8
Desactiva la salida digital 7
CONECTADO?
Devuelve una lista de 4 elementos (uno por cada motor) cuyos valores son 0 ó 1 según estén activos o no.
Esta primitiva se utiliza junto con la primitiva “muestra”, para ver el resultado en pantalla.
MUESTRA CONECTADO?
nos devuelve: M [1 0 1 1]
SALIDA dato
Controla en conjunto las ocho salidas digitales. Envía a las salidas digitales el dato en binario equivalente al decimal que se ponga en “dato”.

SALIDA 131

Activa las salidas digitales
0, 1 y 7 (1+2+128)

ENVIAOCTETO dato
Procedimiento para la compatibilidad con las primitivas ENCONOR (realiza la misma función que la primitiva SALIDA). Envía a las salidas el número decimal que seponga en “dato”.
ENVIAOCTETO 193
Activa las salidas digitales
0, 6 y 7 (1+64+128)
APAGA numero_salida
Procedimiento para la compatibilidad con las primitivas proporcionadas por ENCONOR.
Desconecta la salida digital que se le indique en :n, dejando el resto de salidas digitales como estén.
APAGA 4
Desactiva la salida digital número 4
SALIDA?
Devuelve una lista de ocho elementos con el estado de las ocho salidas digitales (1 si la salida está activada o 0 si está desactivada).
Se utiliza junto con la primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SALIDA?
nos devuelve:
[1 0 0 0 0 0 1 1]
VS?
Devuelve en un número decimalel valor en decimal delas salidas digitales que están activadas.
Se utiliza junto con la primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA VS?
nos devuelve:
193

 

PRIMITIVAS PARA TRABAJAR CON LAS ENTRADAS DIGITALES
PRIMITIVA
DESCRIPCIÓN
EJEMPLO
ENTRADA numero_entrada
Procedimiento para la compatibilidad con las primitivas proporcionadas por ENCONOR. Devuelve VERDADERO si la entrada digital indicada en “numero_entrada” está conectada y devuelve FALSO si no está conectada.
Se utiliza junto con la primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA ENTRADA 1 nos devuelve: FALSO
Esto ocurriría si la entrada digital 1 no estuviera conectada
VE?
Devuelve un número decimal que indica que entradas digitales están activadas.
Se utiliza junto con la primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA VE?
8
Nos indica que está activada la entrada digital nº 3
SD numero_entrada
Devuelve el valor del sensor digitalque se indica en “numero_entrada”, devuelve un 1 si la entrada está activa y 0 si la entrada no está activa.
Se utiliza junto con la primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SD1
0
Nos indica que la entrada digital 0 está desactivada
SD?
Devuelve el estado de todas las entradas digitales en forma delista de 0s o 1s.
Se utiliza junto con la primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SD?
[1 0 0 0 0 0 1 1]
Nos indica que están activadas las entradas digitales 0, 6 y 7.
ESPERAON numero_entrada
Deja el programa parado ala espera de que se active la entrada digital indicada en “numero_entrada”.
ESPERAON 1
Deja el programa detenido hasta que se active la entrada digital 0
ESPERAOFF numero_entrada
Deja el programa parado ala espera de que se desactive la entrada digital indicada en “numero_entrada”.
ESPERAOFF 1
Deja el programa detenido hasta que se desactive la entrada digital 0

 

PRIMITIVAS PARA TRABAJAR CON LAS ENTRADAS ANALÓGICAS
PRIMITIVA
DESCRIPCIÓN
EJEMPLO
LEEANALOGICA dato
Procedimiento para la compatibilidad con las primitivas proporcionadas por ENCONOR.
Lee y escribe en el puerto los datos necesarios para obtener el valor decimal (valor entre 0 y 255) que proporciona la entrada analógica indicada en :dato (que puede ser 1, 2, 3 ó 4. Si consigue leerlas, devuelve su valor. Para obtener el valor en voltios correspondiente al valor decimal devuelto por la primitiva se debe aplicar la siguiente fórmula:
Voltaje Entrada (V)= (Nº decimal * 5) / 256
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA LEEANALOGICA 1
240
Devuelve el valor en tensión en la entrada analógica 1. Para obtener el valor en voltios de esta entrada se aplica la formula anteriormente descrita.
El valor es: 4´68 Voltios
SAV
Primitiva valida para la controladora ENCONOR. Devuelve el valor en voltios del sensor analógico conectado a la entrada analógica 1.
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SAV
0
Nos indica que la entrada analógica 1 de Enconor está desactivada
SAW
Primitiva valida tanto para la controladora CNICE como la ENCONOR.
Devuelve el valor en voltios de la entrada, estaentrada depende de la controladora que se este utilizando. Será:
-CNICE: entrada analógica 1
-ENCONOR: entrada analógica 2
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SAW
0
Nos indica que la entrada analógica 2 de la controladora Enconor o la entrada 1 de la controladora CNICE está desactivada
SAX
Primitiva valida tanto para la controladora CNICE como la ENCONOR.
Devuelve el valor en voltios de la entrada, estaentrada depende de la controladora que se este utilizando. Será:
-CNICE: entrada analógica 2
-ENCONOR: entrada analógica 3
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SAX
0
Nos indica que la entrada analógica 3 de la controladora Enconor o la entrada 2 de la controladora CNICE está desactivada
SAY
Primitiva valida tanto para la controladora CNICE como la ENCONOR.
Devuelve el valor en voltios de la entrada, estaentrada depende de la controladora que se este utilizando. Será:
-CNICE: entrada analógica 3
-ENCONOR: entrada analógica 4
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SAY
0
Nos indica que la entrada analógica 4 de la controladora Enconor o la entrada 3 de la controladora CNICE está desactivada
SAZ
Primitiva valida tanto para la controladora CNICE como la ENCONOR.
Devuelve el valor en voltios de la entrada, estaentrada depende de la controladora que se este utilizando. Será:
-CNICE: entrada analógica 4
-ENCONOR: entrada analógica 5
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SAZ
0
Nos indica que la entrada analógica 5 de la controladora Enconor o la entrada 4 de la controladora CNICE está desactivada
SA?
Devuelve una lista con el valor en voltios de los todos sensores analógicos.
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA SA?
[0 4.6875 0.234375 0]
Nos muestra el valor en Voltios de las 4 entradas
analógicas

 

PRIMITIVAS PARA TRABAJAR CON LAS SALIDAS ANALÓGICAS
PRIMITIVA
DESCRIPCIÓN
EJEMPLO
SALIDAANALOGICA numero_salida valor_salida
Escribe los datos necesarios para poner en la salida analógica que se le indica en “numero_salida” el valor extensión indicado en “valor_salida” (varía entre 0 y
255). Para conocer el valor en tensión en la salida analógica se utiliza la siguiente fórmula:
Voltaje Salida (Voltios) = :VALOR / 23.8
SALIDAANALOGICA 1 100
A la salida analógica 1 se le asigna el valor de salida 100. Éste valor corresponde a un nivel de tensión que se calcula con la fórmula anteriormente descrita.
El valor es: 4´20 Voltios
VOLTAJE numero_salida valor_salida
Fija en la salida analógica indicada en “numero_salida” el valor en tensión especificado en “valor_salida” (varía entre 0 10,5).
VOLTAJE 2 2,5
A la salida analógica 2 se le asigna un valor de tensión de 2´5 voltios
VOLTAJE?
Devuelve una lista con el valor en voltios de todas las salidas analógicas.
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA VOLTAJE?
[0 4.5 0 0]
Nos muestra que la salida analógica 2 tiene un valor de 4,5 voltios

 

PRIMITIVAS PARA TRABAJAR EN EL ENTORNO GRÁFICO
PRIMITIVA
DESCRIPCIÓN
graficos
Crea las ventanas necesarias para manejar las entradas y salidas analógicas (primitiva graficosan) y digitales y la ventana para informar del estado de la comunicación entre el ordenador y la controladora (primitiva informa).
graficosan
Crea una ventana para controlar las entradas y salidas analógicas.
informa
Crea una ventana que informa de datos referentes a la comunicación con el puerto.

 

Primitivas de sonido

PRIMITIVA
DESCRIPCIÓN
EJEMPLO
TONO flujosonido

Emite un tono de sonido. La expresión “flujosonido” es una lista de pares compuesta por: [frecuencia duracion]
Frecuencia - Hertzios
Duración - Milésimas de segundo

El sonido solo se emite por el altavoz del PC

TONO [700 5000]
Emite un tono de sonido agudo durante un período de tiempo de 5 segundos.
SUENATONO frecuencia duracion
Función similar a la anterior, que se mantiene de versiones anteriores de MSWLogo.
SUENATONO [1000 5000]
Emite un tono de sonido más agudo que con el comando anterior durante un período de tiempo de 5 segundos.
ENCIENDESONIDO frecuencia
Emite un sonido cuya frecuencia coincide con el parámetro que se le pasa. Elsonido continuará hasta que sedetenga el comando “APAGASONIDO”.
Esta primitiva no funcionará en Sistemas Operativos con núcleos NT, ya que utiliza laprimitiva “escribepuerto”.
ENCIENDESONIDO 1000
Emite un tono agudo de manera continua. Este comando no funciona en sistemas operativos Windows 2000 y Windows XP.
APAGASONIDO
Quitará un sonido que se haya puesto con la primitiva “ENCIENDESONIDO frecuencia”.
Esta primitiva no funcionará en Sistemas Operativos con núcleos NT, ya que utiliza laprimitiva “escribepuerto”.
APAGASONIDO
Este comando no funciona en sistemas operativos Windows 2000 y Windows XP.
SUENAWAVE ficherowave opciones
Reproduce un fichero de tipo “.wav” según las opciones que se indiquen. Las opciones seindican con un número entero.
0-> Sincrono que no devuelve el control hasta que se haya terminado
1-> Asíncrono que devuelve el control inmediatamente mientras el sonido sigue sonando
2 -> No utiliza el sonidopor defecto si el indicado no puede oírse
8 -> Reproduce el sonido de manera continua hasta que se ejecuta otra primitiva de sonido
16 -> No para un sonido que ya estaba sonando
Las opciones anteriores se pueden combinar.
SUENAWAVE “C:\\ejemplo.wav
1+8
Reproduce el fichero “ejemplo.wav” que se encuentra ubicado en C, y lo reproduce de manera continuada dejando el control a MSWLogo

 

Primitivas para crear condicionales y bucles

PRIMITIVA
DESCRIPCIÓN
EJEMPLO
SI condicion [instrucciones]
Realiza una instrucción o un conjunto de instrucciones si se cumple la condición expresada.
La variable “entradas” se ha creado para guardar el valorde las entradas digitales.
SI (:entradas_digitales=1) [M1"P]
Se expresa que si la entrada digital 0 está activada, se desactivan las salidas digitales 0 y 1. Si no se cumple la condición, no se ejecuta nada.
SISINO condicion [instrucciones1] [instrucciones2]
Realiza las primeras instrucciones si la condición expresada se cumple, y realiza el otro grupo de instrucciones sino se cumple la condición.
La variable “entradas” se ha creado para guardar el valorde las entradas digitales.
SISINO (:entradas_digitales=1) [M1 "P] [salida 255]
Se expresa que si la entrada digital 0 está activada, se desactivan las salidas digitales 0 y 1, pero si no está activada, se encienden todas las salidas digitales.
HAZ.HASTA [instrucciones] [condicion]
Repite la lista de instrucciones tantas veces hasta que se cumpla la condicion. Primero lee el conjunto de instrucciones, de esta forma se asegura que las instrucciones se ejecutan al menos una vez antes de comprobar la condición.
La variable “entradas” se ha creado para guardar el valorde las entradas digitales.
HAZ.HASTA [
SI [:entradas_digitales=3] [salida 1]
SI [:entradas_digitales=5] [salida 0]]
[:bucle=1]
Lo primero que hace es chequear las instrucciones, que son 2 condiciones de los “SI”, y después comprueba si se cumple la condición del “HAZ.HASTA”, si ésta se cumple no realiza más veces las instrucciones del “HAZ.HASTA”.
HASTA [condicion] [instrucciones]
Repite la lista de instrucciones tanta veces hasta que se cumpla la condición. Si la condición expresada se cumple no se ejecutan las instrucciones ni una sola vez.
La variable “entradas” se ha creado para guardar el valorde las entradas digitales.
HASTA [:bucle=1]
[SI [:entradas_digitales=3] [salida 1]
SI [:entradas_digitales=5] [salida 0]]
Primero comprueba si se cumple la condición, si ésta no se cumple evalúa las instrucciones del “HASTA”.
HAZ.MIENTRAS [instrucciones] [condicion]
Repite la lista de instrucciones tantas veces como se de la condición expresada. Primero lee el conjunto de instrucciones, de esta forma se asegura que las instrucciones se ejecutan al menos una vez antes de comprobar la condición.
La variable “entradas” se ha creado para guardar el valorde las entradas digitales.
HAZ.MIENTRAS [
SI [:entradas_digitales=3] [salida 1]
SI [:entradas_digitales=5] [salida 0]]
[:bucle=1]
Lo primero que hace es chequear las instrucciones, que son 2 condiciones de los “SI”, y después comprueba si se cumple la condición del “HAZ.MIENTRAS”, si ésta no se cumple no realiza más veces las instrucciones del "HAZ.MIENTRAS"
MIENTRAS [condicion] [instrucciones]
Repite la lista de instrucciones tantas veces como se de la condición. Si la condición expresada no se cumple no se ejecutan las instrucciones ni una sola vez.
La variable “entradas” se ha creado para guardar el valor de las entradas digitales.
MIENTRAS [:bucle=1] [SI [:entradas_digitales=3] [salida 1]
SI [:entradas_digitales=5] [salida 0]]
Primero comprueba si se cumple la condición, si ésta se cumple evalúa las instrucciones del “MIENTRAS”.
SIEMPRE [instrucciones]
Repite la lista de instrucciones de forma repetida.
SIEMPRE[ escribe [Esto es un ejemplo]]
Esto es un ejemplo
Esto es un ejemplo
Esto es un ejemplo
Esto es un ejemplo
.
.
.
Escribirá de manera continua estas frases, hasta que sedetenga el proceso mediante la ayuda del botón “ALTO”.
REPITE numero [instrucciones]
Repite la lista de instrucciones tantas veces como se indica en el número.
REPITE 3 [escribe [Esto es un ejemplo]]
Esto es un ejemplo
Esto es un ejemplo
Esto es un ejemplo
Nos muestra el texto 3 veces, que es el número de repeticiones que hemos indicado.

 

Primitivas para dibujar ventanas

PRIMITIVA
DESCRIPCIÓN
EJEMPLO
CREAVENTANA padre “nombre [titulo] pox poxy ancho alto [configuración]
Crea una ventana en la pantalla de MSWLogo.
-“padre” es el nombre principal de la ventana.
-“nombre” se utiliza para identificar la ventana, y este nombre ha de ser único, ya que quizás sea padre de otra ventana.
-“pox poxy” son las posiciones de las X y las Y respectivamente de la esquina superior izquierda de la nueva ventana.
-“ancho alto” de la nueva ventana.
-“configuración” es una lista de instrucciones, esta lista puede estar vacía y añadir los controles más tarde.
CREAVENTANA “principal “ej
[Ejemplo de ventana] 120
150 287 100 []
Esto creará una ventana con el nombre de “ej” en la cual se muestra la etiqueta de “Ejemplo de ventana”.
El nombre del proceso padre de esta ventanase llama “principal”, si esta ventana se pusiera dentro de otra ventana se pondría en nombre del “padre” de la ventana de la cuelga.
BORRAVENTANA “nombre
Borra la ventana que se indica en “nombre”.
BORRAVENTANA “principal
Borra la ventana padre de todas las ventanas, borraría también las ventanas que colgarán de esta ventana padre.
BORRAVENTANA “ej
Borra solamente la ventana etiquetada con el nombre “ej”.
CREAGROUPBOX “padre “nombre posx posy ancho alto
Crea unacaja dentro de una ventana en la que se pueden agrupar botones, botones de radio, botones de selección.
-“padre” es el nombre de la ventana en la que crea el “groupbox”.
-“nombre” se utiliza para identificar el “groupbox” y ha de ser único.
-“pox posy” son las posiciones de las X y las Y respectivamente de la esquina superior izquierda de izquierda del nuevo “groupbox.
-“ancho alto” del nuevo
CREAGROUPBOX “ej
“ej_groupbox 5 0 274 85
Crea una caja dentro de la ventana con la etiqueta “ej” a la cual se llama “ej_groupbox”.
BORRAGROUPBOX “nombre
Borra el groupbox que se indica en “nombre”.
BORRAGROUPBOX “ej_groupbox Borra la caja etiquetada como “ej_groupbox”.
CREABOTON “padre “nombre posx posy ancho alto [llamada]
Crea un botón dentro de una ventana.
-“padre” es el nombre de la ventana en la que crea el botón.
-“nombre” se utiliza para identificar el botón y ha de ser único.
-“pox posy” son las posiciones de las X y las Y respectivamente de la esquina superior izquierda del nuevo botón.
-“ancho alto” del nuevo botón creado.
- “llamada” es una pequeña lista de instrucciones o un nombre de un procedimiento a llamar cuandose pulsa el botón.
CREABOTON “ej “ej_boton
[Botón] 25 10 110 35 []
Se crea un botón dentro de la ventana etiquetada con “ej” alcual se etiqueta con el nombre de “ej_boton”, y muestra el texto de “Botón”.
ACTUALIZABOTON “nombre [texto]
Sustituye el texto que aparece dentro del botón.
-“nombre” se utiliza para saber que “ventana” cuelga.
ACTUALIZABOTON “ej_boton
[Botón actualizado]
Cambia el texto del botón etiquetado con “ej_boton” por la palabra “Escribe” en vez de por la palabra “Botón actualizado”.
BORRABOTON “nombre
Borra el botón que se indica en
nombre”.
BORRABOTON “ ej_boton
Borra el botón etiquetado como “ej_boton”.
CREABOTONRADIO “padre “grupo “nombre [etiqueta] posx posy ancho alto
Crea un botón que da al usuario la posibilidad de selección de un elemento de 2 estados (verdadero o falso). Este tipo de botón tiene que estar asociado con un “groupbox”.
-“padre” es el nombre de la ventana en la que creaeste botón.
-“grupo” es el nombre del “groupbox” al que está asociado.
-“nombre” se utiliza para identificar el botón y ha de ser único.
-“etiqueta” se utiliza como etiqueta que aparece en el nuevo botón.
-“pox posy” son las posiciones de las X y las Y respectivamente de la esquina superior izquierda del nuevo botón.
-“ancho alto” del nuevo
CREABOTONRADIO “ej “ej_groupbox “ej_botonradio [Esto es otro ejemplo] 25 50 120 30
Crea un botón de selección dentro del groupbox al que se etiqueta con “ej_botonradio”, el cual tendrá el texto “Esto es un ejemplo”.
BORRABOTONRADIO “nombre
Borra el botón que se indica en
“nombre”.
BORRABOTONRADIO “ej_botonradio
Borra el botón etiquetado como “ej_botonradio”.
CREACHECKBOX “padre “grupo “nombre [etiqueta] posx posy ancho alto
Crea un botón que da al usuario la posibilidad de selección de un elemento. Este tipo de botón tiene que estar asociado con un “groupbox”.
-“padre” es el nombre de la ventana en la que creaeste botón.
-“grupo” es el nombre del “groupbox” al que está asociado.
-“nombre” se utiliza para identificar el botón y ha de ser único.
-“etiqueta” se utiliza como etiqueta que aparece en el nuevo botón.
-“pox posy” son las posiciones de las X y respectivamente de la esquina superior izquierda del nuevo botón.
-“ancho alto” del nuevo botón creado.
CREACHECKBOX “ej “ej_groupbox “ej_checkbox [Texto de ejemplo] 155 10
110 35
Crea el botón “checkbox” dentro del “groupbox” con nombre de “ej_checkbox” en el cual se muestra “Texto de ejemplo”.
BORRACHECKBOX “nombre
Borra el botón que se en “nombre”.
BORREACHECKBOX “ej_checkbox
Borra el botón etiquetado como “ej_checkbox”.
CREALISTBOX “padre “nombre posx posy ancho alto
Crea una lista de selección de diferentes elementos.
-“padre” es el nombre de la ventana en la que creaeste botón.
-“nombre” se utiliza para identificar la lista y ha de ser único.
-“pox posy” son las posiciones de las X y las Y respectivamente de la esquina superior izquierda de la lista.
CREALISTBOX “ej “ej_listbox
155 45 90 20
Crea una lista de selección dentro de la ventana etiquetada como “ej”, a esta lista se la etiqueta como “ej_listbox”.
BORRALISTBOX “nombre
Borra la lista de selección que se indica en “nombre”.
BORRALISTBOX “ej_listbox
Borra la lista de selección etiquetada como “ej_listbox”.
CREACOMBOBOX “padre “nombre posx posy ancho alto
Crea una caja que se utiliza para dar al usuario una selección de múltiples elementos.
-“padre” es el nombre de la ventana en la que se crea.
-“nombre” se utiliza para identificar el botón y ha de ser único.
-“pox posy” son las posiciones de las X y las Y respectivamente de la esquina superior izquierda del nuevo botón.
-“ancho alto” del nuevo
CREACOMBOBOX “ej
“ej_combobox 155 55 90 20
Crea una caja de múltiples elementos dentro de la ventana “ej”, a la cual se llamará “ejcombobox”.
BORRACOMBOBOX “nombre
Borra la caja de selección de múltiples elementos que se indica en “nombre”.
BORRACOMBOBOX “ejcombobox Borra la caja de selección etiquetada como “ej_combobox”.
CREAESTATICO “padre “nombre [texto] posx posy ancho alto
Permite mostrar dentro de una ventana un texto. Este texto se puede actualizar con la primitiva “actualizaestatico”.
-“padre” es el nombre de la ventana en la que se crea.
-“nombre” se utiliza para identificar el texto que se va a introducir en la ventana y ha de ser único.
-“pox posy” son las posiciones de las X y las Y respectivamente de la esquina superior izquierda de donde se va a ubicar el texto.
-“ancho alto” del texto
CREAESTATICO "ej
"ej_estatico [ESTATICO] 35
70 50 10
Crea una ventana de texto dentro de la ventana “ej” a la cual se llama “ej_estatico”. Esta ventana contiene el texto “ESTATICO”.
ACTUALIZAESTATICO “nombre [texto]
Sustituye el texto que se crea con “creaestatico”.
-“nombre” se utiliza para saber de que “creaestatico” cuelga.
ACTUALIZAESTATICO “ej_estatico [ACTUALIZADO]
Actualiza eltexto dela ventana detexto estática de “ESTATICO” a “ACTUALIZADO”.
BORRAESTATICO “nombre
Borra el botón estático que se indica en “nombre”.
BORRAESTATICO “ej_estatico Borra la ventana de texto etiquetada como “ej_estatico”.

A continuación vamos a mostrar el resultado en pantalla de los comandos explicados anteriormente en orden progresivo en la creación de ventanas. Dentro de un marco rojo estarán los resultados de los comandos utilizados.

 

Primitivas para trabajar con imágenes

PRIMITIVA
DESCRIPCIÓN
EJEMPLO
CARGADIB “ruta_imagen.bmp
Carga una imagen “.bmp” que se encuentra donde indica “ruta_imagen.bmp”.
CARGADIB “C:\\ejemplo.bmp
CARGADIBTAMAÑO “ruta_imagen.bmp
Devuelve el tamaño de la imagen quese indica en “ruta_imagen.bmp”. El tamaño lo devuelve en una lista de 2 números enteros [Ancho Alto].
Se utiliza junto conla primitiva “muestra” para mostrar el resultado en pantalla.
MUESTRA “CARGADIBTAMAÑO
“C:\\ejemplo.bmp
Nos devuelve: [256 256]
GUARDADIB “ruta\nombre_bitmap
Guarda una imagen en formato “.bmp” en la ubicación del ordenador que se especifique.
GUARDADIB “C:\\ejemplo.bmp
CARGAGIF “ruta_imagen.gif
Carga una imagen “.gif” que se encuentra donde indica “ruta_imagen.gif”.
CARGAGIF “C:\\ejemplo.gif
GUARDAGIF “ruta\nombre_gif
Guarda una imagen en formato “.gif” en la ubicación del ordenador que se especifique.
GUARDAGIF “C:\\ejemplo.gif

 

Primitiva para salir de MSWLogo

PRIMITIVA
DESCRIPCIÓN
EJEMPLO
ADIOS
Comando que sale de Logo, devolviendo el control al sistema operativo.
ADIOS

 

Entorno gráfico de MSWLogo

Como se ha visto al principio del manual de MSWLogo el entorno gráfico de
MSWLogo se divide en 2 partes:
• Pantalla de MSWLogo
• Pantalla de Trabajo
En este punto se van a explicar lo que hacen cada uno de los botones que aparecen en la parte derecha de la ventana de Trabajo de MSWLogo.

- Alto: detiene la ejecución del programa que se esta ejecutando sobre MSWLogo.
- Trazar: permite ver en el historial de la pantalla de Trabajo las sentencias del programa de MSWLogo que se están ejecutando tiempo real. Se muestra en la imagen de abajo el historial de las sentencias que se están ejecutando.

- Pausa: establece una pausa en la ejecución del programa que se esta ejecutando sobre MSWLogo. Nos mostrará una ventana en pantalla en la tendremos que darle a continuar para que siga el desarrollo del programa.

- Estado: muestra en una tabla información sobre el estado del lápiz, la orientación de éste, el color del lápiz, la posición de la tortuga y el estado del nñcleo de MSWLogo.

- Paso: ejecuta el programa de MSWLogo paso a paso, es decir, línea a línea del archivo de programación, teniendo que dar consentimiento para que se ejecute la siguiente línea de programación. Nos muestra una ventana similar de la que se muestra a continuación.

- Reiniciar: reinicia la ejecución del programa de MSWLogo que se esta ejecutando.

- Ejecutar: ejecuta las sentencias de programación de MSWLogo que se escriben en la ventana blanca de la pantalla de Trabajo.

- Editar: abre el cuadro de edición de MSWLogo.

 

Comentarios

Los comentarios en el lenguaje de MSWLogo han de ir precedidos por un punto y coma “;”. A continuación se muestra un ejemplo.


; Esto es un comentario de MSWLogo

 

Guardar un fichero de programación

Hay 2 maneras diferentes de guardar todo el trabajo que se ha realizado en un sesión de MSWLogo, los procedimientos que hayamos creado con sus variables, sus funciones, etc. A continuación se muestran las 2 maneras diferentes:

- Desde el menú de Archivo- Guardar o Archivo- Guardar como podemos guardar lo trabajado con un nombre con extensión “lgo”.

- Se utiliza la primitiva guarda “nombfichero.lgo en el que se guarda las definiciones de todos los procedimientos, variables y listas de propiedades sin tapar.

En ambos casos hay que destacar que no se guarda cada procedimiento en un archivo, sino que todo el trabajo definido durante una sesión de MSWLogo se guarda junto en el mismo archivo, excepto aquellas variables o procedimientos que se hayan tapado.

 

Cargar un fichero de programación

Hay 2 maneras diferentes de cargar un fichero de programación de MSWLogo. A continuación se muestran las 2 maneras diferentes:

- Desde el menñ de Archivo- Cargar se abre una ventana desde donde podemos cargar un archivo de programación de MSWLogo. En esta ventana solo aparecen los archivos con extensión “.lgo”. Para que aparezcan todos los archivos se debe seleccionar en Tipo de archivos: todos los archivos “*.*”.

- Se utiliza la primitiva carga “nombfichero.lgo para que cargue el archivo de programación de MSWLogo especificado. Si el archivo no está dentro de la
carpeta “bc5”, se tendrá que poner la ruta de acceso a ese fichero.

Es importante destacar que cuando se carga un fichero “lgo” se cargan todos sus procedimientos en el entorno de MSWLogo.
Si no se han guardado el entorno de trabajo de la sesión actual en disco o si en el archivo existen procedimientos ya definidos en la sesión actual, se sobrescribirá. Pero antes de eso MSWLogo emite una ventana de aviso:

 

Bibliografía

• Guía Didáctica del Lenguaje Logo en español:

http://www.quadernsdigitals.net/datos_web/biblioteca/l_8/enLinea/0.htm

• Manual de MSWLogo en español:

http://platea.pntic.mec.es/~lgonzale/tic/programar/manual.html

http://www.softronix.com/logo.html

 

 

Abrir archivo pdf: manual_mswlogo.pdf