Para Apaga :numerosalida Si (:numerosalida>8) [Alto] Si (:numerosalida<0) [Alto] Local "Numero Haz "SalidaTemporal :salidas Haz "Numero :numerosalida-1 Haz "SalidaTemporal (Bity (:SalidaTemporal) (255-Entero(potencia 2 :Numero))) Enviar :SalidaTemporal fin para Arranca ; intenta comunicarse con la placa tres veces antes de decidir que no hay posibilidad de ; comunicación con la tarjeta controladora. repite 3 [ si :canal=-1 [ si :opcion=1 [(Haz "canal Arrancar?) ] si :opcion=2 [(Haz "canal Arrancar1) ] si :opcion=3 [(haz "canal Arrancar2) ] ] ] fin Para Arrancar1 ;************* Abrimos y configuramos el Puerto de comunicaciones COM 1 **** Si O (:canal=1) (:canal=2)[cierrapuerto] abrepuerto "com1 modopuerto "com1:9600,n,8,1 limpiapuerto 1 limpiapuerto 0 Local "control Haz "control escribecaracterpuerto 255 Haz "contador 0 Haz "control leecaracterpuerto Mientras [(:control=-1)] [Haz "contador :contador + 1 Haz "control leecaracterpuerto Si ( :contador = 50 ) [Haz "canal -1 cierrapuerto Devuelve :canal Alto]] si (:control<0) [Haz "control :control+256] Si ( :control = 240 ) [Haz "canal 1 Devuelve :canal Alto] Haz "canal -1 cierrapuerto Devuelve :canal Fin Para Arrancar2 ;************* Abrimos y configuramos el Puerto de comunicaciones COM 2 **** Si O (:canal=1) (:canal=2)[cierrapuerto] abrepuerto "com2 modopuerto "com2:9600,n,8,1 limpiapuerto 1 limpiapuerto 0 Local "control Haz "control escribecaracterpuerto 255 Haz "contador 0 Haz "control leecaracterpuerto Mientras [(:control=-1)] [Haz "contador :contador + 1 Haz "control leecaracterpuerto Si ( :contador = 50 ) [Haz "canal -1 cierrapuerto Devuelve :canal Alto]] si (:control<0) [Haz "control :control+256] Si ( :control = 240 ) [Haz "canal 2 Devuelve :canal Alto] Haz "canal -1 cierrapuerto Devuelve :canal Fin Para Arrancar? Si ( Arrancar1 = 1 ) [Devuelve 1 Alto] Si ( Arrancar2 = 2 ) [Devuelve 2 Alto] Devuelve -1 Fin Para BUSCAPUERTO ;************************************************************************ ; CREA LA VENTANA DE SELECCION DE PUERTO DE COMUNICACIONES ; ; Creamos la Ventana Inicial **************************** borraventana "BUSCAPUERTO creaventana "BUSCAPUERTO "ENCONOR [Controladora Educativa ENCONOR] 50 30 300 60 [] creaboton "ENCONOR "OP1 [Seleccion Automática del Puerto de comunicaciones] 25 5 250 10 [Haz "opcion 1 Arranca Buscapuerto1] creaboton "ENCONOR "OP2 [Seleccion del puerto de comunicaciones COM 1] 25 18 250 10 [Haz "opcion 2 Arranca Buscapuerto1] creaboton "ENCONOR "OP3 [Seleccion del Puerto de comunicaciones COM 2] 25 31 250 10 [Haz "opcion 3 Arranca Buscapuerto1] fin Para BuscaPuerto1 prueba (:canal)=-1 Sicierto [borraboton "OP1 borraboton "OP2 borraboton "OP3 creaestatico "ENCONOR "ES1 [NO CONSIGO LA COMUNICACION CON LA TARJETA ENCONOR] 45 5 250 15 creaboton "ENCONOR "OP1 [INTENTAR DE NUEVO] 100 25 85 20 [BORRABOTON "OP1 borraestatico "ES1 BUSCAPUERTO] ] Sifalso [borraboton "OP1 Enviar 0 Haz "Primera 1 borraboton "OP2 borraboton "OP3 creaestatico "ENCONOR "ES1 [COMUNICACIÓN ESTABLECIDA POR EL CANAL COM] 55 5 250 15 si (:canal)=1 [creaestatico "ENCONOR "ES2 [1] 225 5 30 10] si (:canal)=2 [creaestatico "ENCONOR "ES2 [2] 225 5 30 10] creaboton "ENCONOR "OP2 [COMENZAR A TRABAJAR] 87 25 100 20 [ borraventana "ENCONOR GRAFICOS] ] BT fin Para Conecta :numerosalida Si (:numerosalida>8) [Alto] Si (:numerosalida<0) [Alto] Local "Numero Haz "SalidaTemporal :salidas Haz "Numero :numerosalida-1 Haz "SalidaTemporal (Bito (:SalidaTemporal) (Entero(potencia 2 :Numero))) Enviar :SalidaTemporal fin Para Entorno ;********************************************************************************************* ;****** Rutina principal (cuerpo del programa ) ; BT ; Borra pantalla de texto BP ; borra pantalla de gráficos ocultatortuga ; se inicalizan las variables Haz "RBR 0 ; Buffer de Recepcion (lectura) DLAB=0 Haz "THR 0 ; Buffer de Transmision(Escritura) DLAB=0 Haz "DLL 0 ; Divisor parte baja DLAB=1 Haz "DLM 0 ; Divisor parte Alta DLAB=1 Haz "IER 0 ; Validacion de Interupciones DLAB=0 Haz "LCR 0 ; Formato de Datos Haz "LSR 0 ; Estado de la linea Haz "MSR 0 ; Estado del Modem conectado al Puerto Haz "error -1 ;Controla el estado de la comunicación con la placa Haz "salidas 0 Haz "SalidaTemporal 0 Haz "canal -1 ; No hay establecido ningún canal de comunicaciones Haz "Primera 0 ; verifica que es la primera ejecución (Testeo) Haz "S8 0 Haz "S7 0 Haz "S6 0 Haz "S5 0 Haz "S4 0 Haz "S3 0 Haz "S2 0 Haz "S1 0 Haz "ST 0 tapa [apaga arranca arrancar? arrancar1 arrancar2 buscapuerto Buscapuerto1 conecta entorno entrada] tapa [enviaocteto enviar enviar1 esperaoff esperaon graficos pintaentradas pintasalidas] tapa [recibir recibir1 segundos] buscapuerto BP ;ponemos las Salidas a cero Fin Para Entrada :entrada Recibir Si :entrada = 1 [Si ((Bito :entradas 254) = 255) [Devuelve "VERDADERO] Devuelve "FALSO Alto] Si :entrada = 2 [Si ((Bito :entradas 253) = 255) [Devuelve "VERDADERO] devuelve "FALSO] Si :entrada = 3 [Si ((Bito :entradas 251) = 255) [Devuelve "VERDADERO] devuelve "FALSO] Si :entrada = 4 [Si ((Bito :entradas 247) = 255) [devuelve "VERDADERO] devuelve "FALSO] Si :entrada = 5 [Si ((Bito :entradas 239) = 255) [devuelve "VERDADERO] devuelve "FALSO] Si :entrada = 6 [Si ((Bito :entradas 223) = 255) [devuelve "VERDADERO] devuelve "FALSO] Si :entrada = 7 [Si ((Bito :entradas 191) = 255) [devuelve "VERDADERO] devuelve "FALSO] Si :entrada = 8 [Si ((Bito :entradas 127) = 255) [devuelve "VERDADERO] devuelve "FALSO] Escribe [NO ES UN VALOR ADECUADO DE ENTRADA] Alto Fin Para EnviaOcteto :dato Si (:dato>255) [Alto] Si (:dato<0) [Alto] Enviar :dato Fin Para Enviar :dato Si (:dato>255) [Alto] Si (:dato<0) [Alto] Repite 5 [Si ((Enviar1 :dato)="CIERTO ) [ Si (:error=1) ; se ha producido error en la comunicación [ Haz "error -1 ; borrar indicador de error Borraestatico "COM si (:canal)=1 [creaestatico "enconor "COM [COM 1] 32 105 30 8] si (:canal)=2 [creaestatico "enconor "COM [COM 2] 32 105 30 8] ] Haz "salidas :dato ; El dato ha llegado correctamente hasta la placa. Alto ] es "1 ] Haz "error 1 ; activar indicador de error de comunicación si :primera=1 [Borraestatico "COM creaestatico "enconor "COM [ERROR de Comunicación] 2 105 120 8 ] Fin Para Enviar1 :dato ;******* Limpiamos el Buffer del Puerto ******************** limpiapuerto 0 limpiapuerto 1 ;******* Definimos variables Locales *********************** local "control local "control1 ;*********************************************************** ;*** Enviamos el Comando Enviar (170) ;*********************************************************** haz "control escribecaracterpuerto 170 Haz "contador 0 Mientras [:control =0] [Haz "contador :contador+1 Haz "control escribecaracterpuerto 170 Si (:contador)=200 [Devuelve "FALSO Alto]] ;*********************************************************** Haz "contador 0 Haz "control leecaracterpuerto Mientras [:control =-1] [Haz "contador :contador+1 Haz "control leecaracterpuerto Si (:contador)=200 [Devuelve "FALSO Alto]] Si (:control<0)[Haz "control :control+256] Si (:control = 240) [ haz "control1 escribecaracterpuerto :dato Haz "contador 0 Mientras [:control1 =0] [Haz "contador :contador+1 Haz "control1 escribecaracterpuerto :dato Si (:contador)=200 [Devuelve "FALSO Alto]] Si (:dato=255) [Espera 1 Haz "control1 leecaracterpuerto] Si No (:dato=255)[haz "control1 leecaracterpuerto Haz "contador 0 Mientras [:control1 =-1] [Haz "contador :contador+1 Haz "control1 leecaracterpuerto Si (:contador)=200 [Devuelve "FALSO Alto]] ] Si (:control1<0)[Haz "control1 :control1+256] Si (:dato=:control1) [ haz "control1 escribecaracterpuerto 240 Haz "contador 0 Mientras [:control1 =0] [Haz "contador :contador+1 Haz "control1 escribecaracterpuerto 240 Si (:contador)=200 [Devuelve "FALSO Alto]] Haz "salidas :control Devuelve "CIERTO Alto] Si No (:dato=:control1) [ Haz "control escribecaracterpuerto 15 Haz "contador 0 Haz "control1 leecaracterpuerto Mientras [:control1 = -1] [Haz "contador :contador+1 Haz ""control1 leecaracterpuerto Si (:contador)=200 [Devuelve "FALSO Alto]] Haz "control leecaracterpuerto Devuelve "FALSO Alto] ] es "2 es :control Devuelve "FALSO Fin Para EsperaOff :entrada Si (entrada :entrada) [esperaoff :entrada] Fin Para EsperaOn :entrada Local "dato Haz "dato entrada :entrada Si (:dato="FALSO)[esperaon :entrada] Fin para graficos borraventana "enconor creaventana "trabajo "enconor [Control entradas y salidas ] 280 1 90 127 [] creagroupbox "enconor "salidas 5 2 78 43 creaestatico "enconor "ES1 [SALIDAS] 28 4 28 10 creaestatico "enconor "SAL8 [8] 10 12 10 10 creaestatico "enconor "SAL7 [7] 19 12 10 10 creaestatico "enconor "SAL6 [6] 28 12 10 10 creaestatico "enconor "SAL5 [5] 37 12 10 10 creaestatico "enconor "SAL4 [4] 46 12 10 10 creaestatico "enconor "SAL3 [3] 55 12 10 10 creaestatico "enconor "SAL2 [2] 64 12 10 10 creaestatico "enconor "SAL1 [1] 73 12 8 10 creaboton "enconor "S8 "0 8 20 8 10 [sisino :S8=0 [conecta 8][apaga 8] pintasalidas] creaboton "enconor "S7 "0 17 20 8 10 [sisino :S7=0 [conecta 7][apaga 7] pintasalidas] creaboton "enconor "S6 "0 26 20 8 10 [sisino :S6=0 [conecta 6][apaga 6] pintasalidas] creaboton "enconor "S5 "0 35 20 8 10 [sisino :S5=0 [conecta 5][apaga 5] pintasalidas] creaboton "enconor "S4 "0 44 20 8 10 [sisino :S4=0 [conecta 4][apaga 4] pintasalidas] creaboton "enconor "S3 "0 53 20 8 10 [sisino :S3=0 [conecta 3][apaga 3] pintasalidas] creaboton "enconor "S2 "0 62 20 8 10 [sisino :S2=0 [conecta 2][apaga 2] pintasalidas] creaboton "enconor "S1 "0 71 20 8 10 [sisino :S1=0 [conecta 1][apaga 1] pintasalidas] creaboton "enconor "SAT [Todas] 8 31 71 11 [sisino :ST=0 [enviaocteto 255 haz "ST 1][enviaocteto 0 haz "ST 0] pintasalidas] creaboton "enconor "CERR [Cerrar ventana] 8 49 71 11 [borraventana "enconor] ; EMPIEZAN LAS ENTRADAS ******************************************** creagroupbox "enconor "entradas 5 61 78 43 creaestatico "enconor "ES2 [ENTRADAS] 24 63 37 10 creaestatico "enconor "ENT8 [8] 10 73 10 10 creaestatico "enconor "ENT7 [7] 19 73 10 10 creaestatico "enconor "ENT6 [6] 28 73 10 10 creaestatico "enconor "ENT5 [5] 37 73 10 10 creaestatico "enconor "ENT4 [4] 46 73 10 10 creaestatico "enconor "ENT3 [3] 55 73 10 10 creaestatico "enconor "ENT2 [2] 64 73 10 10 creaestatico "enconor "ENT1 [1] 73 73 8 10 ; EL valor de cada una de las entradas ************************************ creaestatico "enconor "EN8 [] 10 80 10 10 creaestatico "enconor "EN7 [] 19 80 10 10 creaestatico "enconor "EN6 [] 28 80 10 10 creaestatico "enconor "EN5 [] 37 80 10 10 creaestatico "enconor "EN4 [] 46 80 10 10 creaestatico "enconor "EN3 [] 55 80 10 10 creaestatico "enconor "EN2 [] 64 80 10 10 creaestatico "enconor "EN1 [] 73 80 8 10 creaboton "enconor "ENT [Leer Entradas] 8 90 71 11 [pintaentradas] si (:canal)=1 [creaestatico "enconor "COM [COM 1] 32 105 30 8] si (:canal)=2 [creaestatico "enconor "COM [COM 2] 32 105 30 8] fin para pintaentradas recibir haz "dato :entradas ; se actualizan los indicadores de las entradas ************** sisino ((bity :dato 128) =128) [actualizaestatico "EN8 [1]][actualizaestatico "EN8 [Ĝ]] sisino ((bity :dato 64) =64) [actualizaestatico "EN7 [1]][actualizaestatico "EN7 [Ĝ]] sisino ((bity :dato 32) =32) [actualizaestatico "EN6 [1]][actualizaestatico "EN6 [Ĝ]] sisino ((bity :dato 16) =16) [actualizaestatico "EN5 [1]][actualizaestatico "EN5 [Ĝ]] sisino ((bity :dato 8) =8) [actualizaestatico "EN4 [1]][actualizaestatico "EN4 [Ĝ]] sisino ((bity :dato 4) =4) [actualizaestatico "EN3 [1]][actualizaestatico "EN3 [Ĝ]] sisino ((bity :dato 2) =2) [actualizaestatico "EN2 [1]][actualizaestatico "EN2 [Ĝ]] sisino ((bity :dato 1) =1) [actualizaestatico "EN1 [1]][actualizaestatico "EN1 [Ĝ]] fin para pintasalidas ; se actualizan los indicadores de las salidas ************** haz "dato :salidas sisino ((bity :dato 128) =128) [actualizaboton "S8 [1] haz "S8 1][actualizaboton "S8 [Ĝ] haz "S8 0] sisino ((bity :dato 64) =64) [actualizaboton "S7 [1] haz "S7 1][actualizaboton "S7 [Ĝ] haz "S7 0] sisino ((bity :dato 32) =32) [actualizaboton "S6 [1] haz "S6 1][actualizaboton "S6 [Ĝ] haz "S6 0] sisino ((bity :dato 16) =16) [actualizaboton "S5 [1] haz "S5 1][actualizaboton "S5 [Ĝ] haz "S5 0] sisino ((bity :dato 8) =8) [actualizaboton "S4 [1] haz "S4 1][actualizaboton "S4 [Ĝ] haz "S4 0] sisino ((bity :dato 4) =4) [actualizaboton "S3 [1] haz "S3 1][actualizaboton "S3 [Ĝ] haz "S3 0] sisino ((bity :dato 2) =2) [actualizaboton "S2 [1] haz "S2 1][actualizaboton "S2 [Ĝ] haz "S2 0] sisino ((bity :dato 1) =1) [actualizaboton "S1 [1] haz "S1 1][actualizaboton "S1 [Ĝ] haz "S1 0] fin Para Recibir Si :canal = -1 [Alto] Repite 3 [ Si Recibir1 = "CIERTO [ Si (:error=1) [ Haz "error -1 ; borrar indicador de error Borraestatico "COM si (:canal)=1 [creaestatico "enconor "COM [COM 1] 32 105 30 8] si (:canal)=2 [creaestatico "enconor "COM [COM 2] 32 105 30 8] ] Alto ] ] BT Haz "error 1 ;indicador de error puesto a 1 Borraestatico "COM creaestatico "enconor "COM [ERROR de Comunicación] 2 105 120 8 Fin Para Recibir1 limpiapuerto 0 limpiapuerto 1 ;******* Definimos variables Locales *********************** local "control local "control1 ;*********************************************************** ;*** Enviamos el Comando Recibir (204) ;*********************************************************** haz "control escribecaracterpuerto 204 Haz "contador 0 Mientras [:control =0] [Haz "contador :contador+1 Haz "control escribecaracterpuerto 204 Si (:contador)=200 [Devuelve "FALSO Alto]] ;*********************************************************** Haz "contador 0 Haz "control leecaracterpuerto Mientras [:control =-1] [Haz "contador :contador+1 Haz "control leecaracterpuerto Si (:contador)=200 [Devuelve "FALSO Alto]] Si (:control<0)[Haz "control :control+256] Haz "control1 :control ;*********************************************************** ;*** Enviamos el dato recibido ;*********************************************************** haz "control escribecaracterpuerto :control1 Haz "contador 0 Mientras [:control =0] [Haz "contador :contador+1 Haz "control escribecaracterpuerto :control1 Si (:contador)=200 [Devuelve "FALSO Alto]] ;*********************************************************** Haz "contador 0 Haz "control leecaracterpuerto Mientras [:control =-1] [Haz "contador :contador+1 Haz "control leecaracterpuerto Si (:contador)=200 [Devuelve "FALSO Alto]] Si (:control<0)[Haz "control :control+256] Si (:control=240)[Haz "entradas :control1 Devuelve "CIERTO Alto] Devuelve "FALSO Fin Para Segundos :tiempo Espera :tiempo * 100 Fin Entorno