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 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 = 500 ) [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 = 500 ) [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 2] 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 2] 45 5 250 15 creaboton "ENCONOR "OP1 [INTENTAR DE NUEVO] 100 25 85 20 [BORRABOTON "OP1 borraestatico "ES1 BUSCAPUERTO] ] Sifalso [borraboton "OP1 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 enviar 0] ] 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 ot ; Oculta la tortuga ; 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 "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] tapa [entrada enviaocteto enviar enviar1 esperaoff esperaon graficos graficosan ] tapa [leeanalogica leeanalogico1 pintaentradas pintasalidas ] tapa [recibir recibir1 segundos informa] buscapuerto BP ;ponemos las Salidas a cero Haz "Primera 1 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 había producido error en la comunicación [ Haz "error -1 ; borrar indicador de error actualizaestatico "ERROR [Comunicación establecida] ] Haz "salidas :dato ; El dato ha llegado correctamente hasta la placa. Alto ] ] Haz "error 1 ; activar indicador de error de comunicación si :primera=1 [actualizaestatico "ERROR [ERROR de Comunicación]] Fin Para Enviar1 :dato ;******* Limpiamos el Buffer del Puerto ******************** limpiapuerto 0 limpiapuerto 1 ;******* Definimos variables Locales *********************** local "control local "control1 local "contador ;*********************************************************** ;*** 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)=500 [Devuelve "FALSO Alto]] ;*********************************************************** Haz "contador 0 Haz "control leecaracterpuerto Mientras [:control =-1] [Haz "contador :contador+1 Haz "control leecaracterpuerto Si (:contador)=500 [Devuelve "FALSO Alto]] Si (:control<0)[Haz "control :control+256] Si O ( :control < 240 ) ( :control>240 ) [ Devuelve "FALSO Alto] ;******* escribimos el dato de las salidas **************************************** haz "control1 escribecaracterpuerto :dato Haz "contador 0 Mientras [:control1 =0] [Haz "contador :contador+1 Haz "control1 escribecaracterpuerto :dato Si (:contador)=500 [Devuelve "FALSO Alto]] ;************************************************************************************* repite 100 [Haz "contador 0] Haz "control leecaracterpuerto Mientras [:control =-1] [Haz "contador :contador+1 Haz "control leecaracterpuerto Si (:contador)=500 [Devuelve "FALSO Alto]] Si (:control<0)[Haz "control :control+256] si (:control=240) [Haz "salidas :dato Devuelve "CIERTO Alto] 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 158 [] 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] ; EMPIEZAN LAS ENTRADAS DIGITALES ******************************************** creagroupbox "enconor "entradas 5 46 78 43 creaestatico "enconor "ES2 [ENTRADAS] 24 48 37 10 creaestatico "enconor "ENT8 [8] 10 58 10 10 creaestatico "enconor "ENT7 [7] 19 58 10 10 creaestatico "enconor "ENT6 [6] 28 58 10 10 creaestatico "enconor "ENT5 [5] 37 58 10 10 creaestatico "enconor "ENT4 [4] 46 58 10 10 creaestatico "enconor "ENT3 [3] 55 58 10 10 creaestatico "enconor "ENT2 [2] 64 58 10 10 creaestatico "enconor "ENT1 [1] 73 58 8 10 ; EL valor de cada una de las entradas ************************************ creaestatico "enconor "EN8 [] 10 65 10 10 creaestatico "enconor "EN7 [] 19 65 10 10 creaestatico "enconor "EN6 [] 28 65 10 10 creaestatico "enconor "EN5 [] 37 65 10 10 creaestatico "enconor "EN4 [] 46 65 10 10 creaestatico "enconor "EN3 [] 55 65 10 10 creaestatico "enconor "EN2 [] 64 65 10 10 creaestatico "enconor "EN1 [] 73 65 8 10 creaboton "enconor "ENT [Leer Entradas] 8 75 71 11 [pintaentradas] ; EMPIEZAN LAS ENTRADAS ANALOGICAS ******************************************** creagroupbox "enconor "anentradas 5 90 78 37 creaestatico "enconor "ANENTR [ENT. ANALOGICAS] 13 92 60 12 creaestatico "enconor "VAN [] 37 115 25 8 creaboton "enconor "EA5 "5 11 103 12 10 [actualizaestatico "VAN (leeanalogica 5)] creaboton "enconor "EA4 "4 24 103 12 10 [actualizaestatico "VAN (leeanalogica 4)] creaboton "enconor "EA3 "3 37 103 12 10 [actualizaestatico "VAN (leeanalogica 3)] creaboton "enconor "EA2 "2 50 103 12 10 [actualizaestatico "VAN (leeanalogica 2)] creaboton "enconor "EA1 "1 63 103 12 10 [actualizaestatico "VAN (leeanalogica 1)] creaboton "enconor "CERR [Cerrar ventana] 8 133 71 11 [borraventana "enconor] informa fin para informa creaventana "trabajo "informa [Comunicación Serie] 188 1 90 35 [] creaestatico "informa "IN1 [PUERTO: ] 15 2 35 10 creaestatico "informa "ERROR [Comunicación establecida] 1 12 90 10 si :canal=1 [creaestatico "informa "COMx [COM 1] 48 2 30 10] si :canal=2 [creaestatico "informa "COMx [COM 2] 48 2 30 10] fin Para leeanalogica :dato haz "aux 0 ; variable para controlar tres intentos de comunicación. (error del devuelve) Si :canal = -1 [Alto] Si :dato > 5 [Alto] Si :dato < 1 [Alto] repite 3[ Si :aux=0 [ Si ((leeanalogico1 :dato) = "CIERTO ) [ Si (:error=1) ; se había producido error en la comunicación [ Haz "error -1 ; borrar indicador de error actualizaestatico "ERROR [Comunicación establecida] ] haz "aux 1 ; Comunicación correcta. ] ] ] si :aux=0 [ ; Ha habido error en la comunicación después de tres intentos. Haz "error 1 ; activar indicador de error de comunicación si :primera=1 [actualizaestatico "ERROR [ERROR de Comunicación]] haz "devolver [Error] ] si :aux=1 [haz "devolver :analogico] devuelve :devolver fin para leeanalogico1 :dato limpiapuerto 0 limpiapuerto 1 ;******* Definimos variables Locales *********************** local "control local "control1 local "contador ;*********************************************************** ;*** Enviamos el Comando LeeAnalogica (195) ;*********************************************************** haz "control escribecaracterpuerto 195 Haz "contador 0 Mientras [:control =0] [Haz "contador :contador+1 Haz "control escribecaracterpuerto 195 Si (:contador)=500 [Devuelve "FALSO Alto]] ;*********************************************************** Haz "contador 0 Haz "control leecaracterpuerto Mientras [:control =-1] [Haz "contador :contador+1 Haz "control leecaracterpuerto Si (:contador)=500 [Devuelve "FALSO Alto]] Si (:control<0)[Haz "control :control+256] Si O ( :control < 240 ) ( :control > 240 ) [Devuelve "FALSO Alto] ;*********************************************************** ;*** Enviamos el Canal analogico a leer ;*********************************************************** haz "control escribecaracterpuerto :dato Haz "contador 0 Mientras [:control =0] [Haz "contador :contador+1 Haz "control escribecaracterpuerto :dato Si (:contador)=500 [Devuelve "FALSO Alto]] ;*********************************************************** ;****** Esperamos un Valor ************************************** Haz "contador 0 Haz "control1 leecaracterpuerto Mientras [:control1 =-1] [Haz "contador :contador+1 Haz "control1 leecaracterpuerto Si (:contador)=500 [Haz "control1 255]] ;******** Leemos el dato recibido ********* Si (:control1<0)[Haz "control1 :control1+256] ;*********************************************************** Haz "analogico :control1 Devuelve "CIERTO 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 actualizaestatico "ERROR [Comunicación establecida] ] Alto ] ] Haz "error 1 ;indicador de error puesto a 1 actualizaestatico "ERROR [ERROR de Comunicación] Fin Para Recibir1 ;******* Limpiamos el Buffer del Puerto ******************** limpiapuerto 0 limpiapuerto 1 ;******* Definimos variables Locales *********************** local "control local "control1 local "contador ;*********************************************************** ;*** 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)=500 [Devuelve "FALSO Alto]] ;*********************************************************** ;****** Esperamos un Valor ************************************** Haz "contador 0 Haz "control1 leecaracterpuerto Mientras [:control1 =-1] [Haz "contador :contador+1 Haz "control1 leecaracterpuerto Si (:contador)=500 [Haz "control1 255]] ;******** Leemos el dato recibido ********* Si (:control1<0)[Haz "control1 :control1+256] ;*********************************************************** ;*** Enviamos el Dato recibido ;*********************************************************** haz "control escribecaracterpuerto :control1 Haz "contador 0 Mientras [:control =0] [Haz "contador :contador+1 Haz "control escribecaracterpuerto :control1 Si (:contador)=500 [Devuelve "FALSO Alto]] ;*********************************************************** ;****** Esperamos un OK ************************************** Haz "contador 0 Haz "control leecaracterpuerto Mientras [:control =-1] [Haz "contador :contador+1 Haz "control leecaracterpuerto Si (:contador)=500 [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 Haz "canal -1 ; No hay establecido ningún canal de comunicaciones Entorno