#include #include #include #include #include #include #include #include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON #include "PLC.h" extern void Acerca_de( void ); extern MemoriaRam *Ram; extern FirmWare far *Programa; extern void Run(void); extern char Optar( char *texto1, char *texto2, char *texto3 ); char file_browser( char *comodin_name, char *texto1, char Cargar_Salvar ); int Muestra_Mensaje(int Mensaje, char *file); void BEEP(void) ; void UpRow(void) ; void DownRow(void) ; void Configurar(void) ; void BuscarItem(void) ; void GetProgram(void) ; void SendProgram(void) ; void LoadProgram(void) ; void WriteProgram(void) ; void PrintWholeScreen (void) ; int Select_Columna_Up(void) ; int Select_Columna_Down(void) ; void Numero_Pulsado(char numero) ; void DelRow( void ) ; void AddRow( char Arriba_Abajo ) ; void PrintCurrLine ( char Oculta_Mark, char Ultima ) ; void PrintVisorLCD ( char Ultima ) ; void MuestraLCD( char *texto1, char *texto2) ; Configuracion CFG; void CFG_File( char Cargar_Salvar ); #define Salvar 1 #define Cargar 2 char Buffer_Teclado[16], BT = 0; Puertas DebugCode; int CurrRow = 0, CurrTopLine = 0; char CurrCol = 0; char CurrCh_In = 0, CurrCh_Out = 0; int Menu_Edicion(void){ int Boton_Pulsado, ok = 0; PrintWholeScreen (); CurrRow = 0; CurrTopLine = 0; PrintCurrLine(1, 0); PrintVisorLCD ( 0 ); do{ Boton_Pulsado = Comprueba_Secuencia( 1 ); switch( Boton_Pulsado ) { // Iniciamos comprobacion case 0: // No se pulso ningun BOTON while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER Anclar_Raton(); break; case -1: // Hay una tecla especial en BUFFER getch(); // La eliminamos break; case -2: // Hay una tecla especial en BUFFER getch(); // La eliminamos break; case B_In0 : case B_In1 : case B_In2 : case B_In3 : case B_In4 : case B_In5 : case B_In6 : case B_In7 : case B_In8 : case B_In9 : case B_In10 : case B_In11 : case B_In12 : case B_In13 : case B_In14 : case B_In15 : if ( CurrCh_In != (5) ) { if ( Ram -> In[Boton_Pulsado - B_In0][CurrCh_In].Bit == 1 ) { // Ram -> CoIn[Boton_Pulsado - B_In0 ][CurrCh_In].Bit = Ram -> In[Boton_Pulsado - B_In0 ][CurrCh_In].Bit; Ram -> In[Boton_Pulsado - B_In0 ][CurrCh_In].Bit = 0; Imprime_Bordes(1, Boton_Pulsado, -1); } else { // Ram -> CoIn[Boton_Pulsado - B_In0 ][CurrCh_In].Bit = Ram -> In[Boton_Pulsado - B_In0 ][CurrCh_In].Bit; Ram -> In[Boton_Pulsado - B_In0 ][CurrCh_In].Bit = 1; Imprime_Bordes(1, Boton_Pulsado, 2); } } break; case B_Ch00_In : case B_Ch01_In : case B_Ch02_In : case B_Ch03_In : case B_Ch04_In : case B_Ch19_In : Imprime_Bordes(1, (CurrCh_In + B_Ch00_In ), -1); CurrCh_In = ( Boton_Pulsado - B_Ch00_In ); Imprime_Bordes(1, Boton_Pulsado, 4); ReImprimeCanal_In(CurrCh_In); break; case B_Ch00_Out : case B_Ch01_Out : case B_Ch02_Out : case B_Ch03_Out : case B_Ch04_Out : case B_Ch19_Out : Imprime_Bordes(1, (CurrCh_Out + B_Ch00_Out ), -1); CurrCh_Out = ( Boton_Pulsado - B_Ch00_Out ); Imprime_Bordes(1, Boton_Pulsado, 4); ReImprimeCanal_Out(CurrCh_Out); break; case B_AcercaDe : Acerca_de(); break; case B_Fun : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; Programa[10000].Comando = Fun; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; } break; case B_Sft : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; Programa[10000].Comando = Sft; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; CurrCol = 1; } break; case B_Not : // gotoxy(1,1); printf("Not %3d", Boton_Pulsado); if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; // Funciones que admiten un NOT switch( Programa[10000].Comando ) { case Ld : case And : case Or : case _Out : Programa[10000].Parametros = P_Not; break; default: break; } } break; case B_Run : BT = 0; Run(); // gotoxy(1,1); printf("Run %3d", Boton_Pulsado); break; case B_And : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; Programa[10000].Comando = And; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; } break; case B_Or : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; Programa[10000].Comando = Or; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; } break; case B_Cnt : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; // Funciones que admiten un Cnt switch( Programa[10000].Comando ) { case Ld : case And : case Or : if ( Programa[10000].Parametros == P_Not ) Programa[10000].Parametros = P_Not_Cnt; else if ( Programa[10000].Parametros == 0 ) Programa[10000].Parametros = P_Cnt; else { Programa[10000].Comando = Cnt; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; CurrCol = 1; } break; default: Programa[10000].Comando = Cnt; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; CurrCol = 1; break; } } break; case B_Tr : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; // Funciones que admiten un Tr switch( Programa[10000].Comando ) { case Ld : case And : case Or : case _Out : if ( Programa[10000].Parametros == P_Not ) Programa[10000].Parametros = P_Not_Tr; else if ( Programa[10000].Parametros == 0 ) Programa[10000].Parametros = P_Tr; /* else { Programa[10000].Comando = _Tr; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; } */ break; default: break; } } break; case B_Lr : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; //ÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛ } break; case B_Hr : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; // gotoxy(1,1); printf("Hr %3d", Boton_Pulsado); // Funciones que admiten un Hr switch( Programa[10000].Comando ) { case Ld : case And : case Or : case _Out : case Keep : case DifU : case DifD : case Sft : case Cmp : case Mov : case Mvn : case Add : case Sub : if ( Programa[10000].Parametros == P_Not ) Programa[10000].Parametros = P_Not_Hr; else Programa[10000].Parametros = P_Hr; break; default: break; } } break; case B_Ld : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; // Funciones que admiten un Ld switch( Programa[10000].Comando ) { case And : case Or : if( Programa[10000].Parametros == 0 ) Programa[10000].Parametros = P_Ld; else { Programa[10000].Comando = Ld; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; } break; default: Programa[10000].Comando = Ld; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; break; } } break; case B_Out : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; Programa[10000].Comando =_Out; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; } break; case B_Tim : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; // Funciones que admiten un Tim switch( Programa[10000].Comando ) { case Ld : case And : case Or : if ( Programa[10000].Parametros == P_Not ) Programa[10000].Parametros = P_Not_Tim; else if ( Programa[10000].Parametros == 0 ) Programa[10000].Parametros = P_Tim; else { Programa[10000].Comando = Tim; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; CurrCol = 1; } break; default: Programa[10000].Comando = Tim; Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; CurrCol = 1; break; } } break; case B_Dm : if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; //ÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛ } break; case B_Ch : /* if ( CurrCol == 0 || CurrCol == 1 ) { BT = 0; // Funciones que admiten un Tim switch( Programa[10000].Comando ) { case Ld : case And : case Or : if ( Programa[10000].Parametros == P_Not ) Programa[10000].Parametros = P_Not_Tim; else Programa[10000].Parametros = P_Tim; break; default: break; } } */ break; case B_Cont : BT = 0; //ÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛ break; case B_Ext : BT = 0; //ÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛ break; case B_Chg : BT = 0; //ÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛ break; case B_Scrh : BT = 0; BuscarItem(); break; case B_Play : BT = 0; GetProgram(); break; case B_Del : Buffer_Teclado[BT] = B_Del; BT++; break; case B_Mont : BT = 0; //ÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛ break; case B_Rec : BT = 0; SendProgram(); break; case B_Ins : Buffer_Teclado[BT] = B_Ins; BT++; break; case B_Up : if ( Buffer_Teclado[0] == B_Ins ) { BT = 0; MuestraLCD( "", " Insert Line ?"); if ( Comprueba_Secuencia( 1 ) == B_Up ) AddRow( 0 ); } else if ( Buffer_Teclado[0] == B_Del ) { BT = 0; MuestraLCD( "", " Delete Line ?"); if ( Comprueba_Secuencia( 1 ) == B_Up ) DelRow( ); } else { BT = 0; PrintCurrLine ( 0, 0 ); // Ocultamos linea anterior UpRow(); Programa[10000] = Programa[CurrRow + CurrTopLine ]; } break; case B_Clr : BT = 0; Programa[10000] = Programa[CurrRow + CurrTopLine ]; break; case B_Ver : BT = 0; //ÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛßßÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ //Û ±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û±±Û± Û //ÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛÜÜÛ break; case B_Write : BT = 0; if ( Programa[ 10000 ].Comando == Fun ) { switch ( Programa[ 10000 ].Dato + 100) { case Sft : // Registro de desplazamiento case Add : // Add (Suma en BCD) case Sub : // Subtract ( Resta en BCD ) case TimH : // Temporizador de alta velocidad case Cmp : // Comparador case Mov : // Move case Mvn : // Move Not Programa[ 10000 ].Comando = 100 + Programa[ 10000 ].Dato; Programa[ 10000 ].Dato = 0; CurrCol = 1; break; case End : // Final de programa case Il : // Instrucci¢n de condici¢n case Ilc : // Instrucci¢n fin de condici¢n case Keep : // Switch biestable ( Rel‚ Latch ) case DifU : // Activador en el flanco de subida case DifD : // Activador en el flanco de bajada case Stc : // Introduce un 1 en el flag de acarreo case Clc : // Borra el flag de acarreo Programa[ 10000 ].Comando = 100 + Programa[ 10000 ].Dato; Programa[ 10000 ].Dato = 0; break; default: break; } Programa[10000].Parametros = 0; Programa[10000].Dato = 0; Programa[10000].SubDato = 0; // // Confirma linea editada y la copia en la DIRECCION REAL // Programa[ CurrRow + CurrTopLine ] = Programa[ 10000 ]; } else { // Confirma linea editada y la copia en la DIRECCION REAL Programa[ CurrRow + CurrTopLine ] = Programa[ 10000 ]; PrintCurrLine ( 0, 1 ); // Ocultamos linea anterior DownRow(); Programa[10000] = Programa[ CurrRow + CurrTopLine ]; } break; case B_Down : if ( Buffer_Teclado[0] == B_Ins ) { BT = 0; MuestraLCD( "", " Insert Line ?"); if ( Comprueba_Secuencia( 1 ) == B_Down ) AddRow( 1 ); } else if ( Buffer_Teclado[0] == B_Del ) { BT = 0; MuestraLCD( "", " Delete Line ?"); if ( Comprueba_Secuencia( 1 ) == B_Down ) DelRow( ); } else { PrintCurrLine ( 0, 0 ); // Ocultamos linea anterior DownRow(); Programa[10000] = Programa[ CurrRow + CurrTopLine ]; } break; case B_DebugCode : DebugCode.Bit = ( DebugCode.Bit ? 0 : 1 ) ; break; case B_ResetValores : Resetea_Memoria(); ReImprimeCanal_In (CurrCh_In ); ReImprimeCanal_Out(CurrCh_Out); break; case B_Configurar : Configurar(); break; case B_Reset : if ( Optar( "Confirme borrado", "total de DATOS","" ) == 1 ) { Resetea_Memoria(); ReImprimeCanal_In (CurrCh_In ); ReImprimeCanal_Out(CurrCh_Out); Reset_Programa(); CurrRow = 0; CurrTopLine = 0; PrintWholeScreen(); PrintCurrLine( 1, 0 ); } break; case B_Salvar : WriteProgram(); break; case B_Cargar : LoadProgram(); break; case B_Salir : ok = 1; break; case B_0 : BT = 0; Numero_Pulsado( 0 ); break; case B_1 : BT = 0; Numero_Pulsado( 1 ); break; case B_2 : BT = 0; Numero_Pulsado( 2 ); break; case B_3 : BT = 0; Numero_Pulsado( 3 ); break; case B_4 : BT = 0; Numero_Pulsado( 4 ); break; case B_5 : BT = 0; Numero_Pulsado( 5 ); break; case B_6 : BT = 0; Numero_Pulsado( 6 ); break; case B_7 : BT = 0; Numero_Pulsado( 7 ); break; case B_8 : BT = 0; Numero_Pulsado( 8 ); break; case B_9 : BT = 0; Numero_Pulsado( 9 ); break; default: break; } PrintCurrLine( 1, 1 ); PrintVisorLCD ( 1 ); if ( BT == 0 ) { for ( BT = 0; BT < 16; BT ++ ) Buffer_Teclado[BT] = 0; BT = 0; } }while(!ok); return ok; } void Resetea_Memoria(void){ int i, ch; // Resetea Salidas for( ch = 0;ch < 6 ;ch++ ) for( i = 0; i < Numero_Out ; i++ ) Ram -> Out [i][ch].Bit = 0; // Resetea Entradas for( ch = 0;ch < 6 ;ch++ ) for( i = 0; i < Numero_Out ; i++ ) Ram -> In [i][ch].Bit = 0; /* // Resetea Salidas Internas for( ch = 0;ch < 9 ;ch++ ) for( i = 0; i < Numero_Out ; i++ ) Ram -> Out2 [i][ch].Bit = 0; */ // Resetea Salidas no volatiles for( ch = 0;ch < 9 ;ch++ ) for( i = 0; i < Numero_Out ; i++ ) Ram -> Hr [i][ch].Bit = 0; for( i = 0; i < Numero_Tmp ; i++ ) Ram -> Tr [i] .Bit = 0; for( i = 0; i < Numero_Tim ; i++ ) Ram -> Tim_Cnt [i] = 0; } void Reset_Programa(void){ int i=0; for ( i; i<10001; i++ ) { Programa[i].Comando = 0; Programa[i].Parametros = 0; Programa[i].Dato = 0; Programa[i].SubDato = 0; } } void Abandona_Programa(char *texto, long valor){ // Comprobar donde estamos. ( Texto / Gr fico ) closegraph(); cprintf("\n%s <%ld>", texto, valor ); exit(valor); } void ReImprimeCanal_In(int Canal){ int i; for ( i = 0; i < Numero_In; i++ ) if ( Ram -> In[i][Canal].Bit == 1 ) { Imprime_Bordes(1, (i+B_In0), 2); } else { Imprime_Bordes(1, (i+B_In0), -1); } } void ReImprimeCanal_Out(int Canal){ int i; for ( i = 0; i < Numero_Out; i++ ) if ( Ram -> Out[i][Canal].Bit == 1 ) { Imprime_Bordes(1, (i+B_Out0), 2); } else { Imprime_Bordes(1, (i+B_Out0), -1); } } void PrintWholeScreen (void) { int OldCurrRow = CurrRow ; char Contador; PrintCurrLine ( 0, 0 ); for ( Contador = 0; Contador < 10; Contador++ ) DownRow(); CurrRow = OldCurrRow; } void PrintCurrLine ( char Oculta_Mark, char Ultima ) { char Buffer[80] ; int Buff_int ; settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); // Solo 11 Lineas de 5 puntos if ( Oculta_Mark == 0 ) { setfillstyle( SOLID_FILL, 0 ); bar( 7, (176 + ( ( CurrRow ) * 15 ) ), 84, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); bar( 102, (176 + ( ( CurrRow ) * 15 ) ), 225, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); bar( 242, (176 + ( ( CurrRow ) * 15 ) ), 419, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); setcolor(CFG.Colores.Texto ); Buff_int = (CurrRow + CurrTopLine); }else{ setfillstyle( SOLID_FILL, 0 ); bar( 242, (176 + ( ( CurrRow ) * 15 ) ), 419, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); setfillstyle( SOLID_FILL, CFG.Colores.F_Texto ); bar( 7, (176 + ( ( CurrRow ) * 15 ) ), 84, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); bar( 102, (176 + ( ( CurrRow ) * 15 ) ), 225, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); switch( CurrCol ) { case 1: // Primera Zona bar( 242, (176 + ( ( CurrRow ) * 15 ) ), 301, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); break; case 2: // Segunda Zona bar( 301, (176 + ( ( CurrRow ) * 15 ) ), 360, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); break; case 3: // Tercera Zona bar( 360, (176 + ( ( CurrRow ) * 15 ) ), 419, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); break; default: bar( 242, (176 + ( ( CurrRow ) * 15 ) ), 419, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); break; } setcolor(0); Buff_int = (CurrRow + CurrTopLine); } if ( Ultima == 1 ) Buff_int = 10000; sprintf( Buffer, " %04d", ( CurrRow + CurrTopLine ) ); outtextxy( 10, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); switch ( Programa[Buff_int].Comando ) { case ReadNop : sprintf( Buffer, "ReadNop" ); break; case Fun : sprintf( Buffer, "FUN " ); break; case Ld : sprintf( Buffer, "Ld " ); break; case Or : sprintf( Buffer, "Or " ); break; case And : sprintf( Buffer, "And " ); break; case _Out : sprintf( Buffer, "Out " ); break; case Tim : sprintf( Buffer, "Tim " ); break; case Cnt : sprintf( Buffer, "Cnt " ); break; /* case _Tr : sprintf( Buffer, "Tr " ); break; */ case End : sprintf( Buffer, "End (01)" ); break; case Il : sprintf( Buffer, "Il (02)" ); break; case Ilc : sprintf( Buffer, "Ilc (03)" ); break; case Sft : sprintf( Buffer, "Sft (10)" ); break; case Keep : sprintf( Buffer, "Keep (11)" ); break; case DifU : sprintf( Buffer, "DifU (13)" ); break; case DifD : sprintf( Buffer, "DifD (14)" ); break; case TimH : sprintf( Buffer, "TimH (15)" ); break; case Cmp : sprintf( Buffer, "Cmp (15)" ); break; case Mov : sprintf( Buffer, "Mov (21)" ); break; case Mvn : sprintf( Buffer, "Mvn (22)" ); break; case Add : sprintf( Buffer, "Add (30)" ); break; case Sub : sprintf( Buffer, "Sub (31)" ); break; case Stc : sprintf( Buffer, "Stc (40)" ); break; case Clc : sprintf( Buffer, "Clc (41)" ); break; default : sprintf( Buffer, "Error " ); break; } if ( Programa[Buff_int].Comando != Add && Programa[Buff_int].Comando != Sub ) switch ( Programa[Buff_int].Parametros ) { case 0 : break; case P_Ld : strcat( Buffer, "Ld " ); break; case P_Tr : strcat( Buffer, "Tr " ); break; case P_Hr : strcat( Buffer, "Hr " ); break; case P_Cnt : strcat( Buffer, "Cnt " ); break; case P_Tim : strcat( Buffer, "Tim " ); break; case P_Keep : strcat( Buffer, "Keep " ); break; case P_Not : strcat( Buffer, "Not " ); break; case P_Not_Tr : strcat( Buffer, "Not Tr" ); break; case P_Not_Hr : strcat( Buffer, "Not Hr" ); break; case P_Not_Cnt : strcat( Buffer, "Not Cnt" ); break; case P_Not_Tim : strcat( Buffer, "Not Tim" ); break; case P_Keep_Hr : strcat( Buffer, "Keep Hr" ); break; case P_Tim_Data : strcat( Buffer, "Tim Data" ); break; case P_Out : strcat( Buffer, "Out " ); break; default : strcat( Buffer, "Error " ); break; } outtextxy( 105, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); switch( Programa[Buff_int].Comando ) { case ReadNop : case End : case Il : case Ilc : break; case Tim : case TimH: case Cnt : case Cmp : case Sft : case Mov : case Mvn : switch( CurrCol ) { case 1: sprintf( Buffer, " %02d", Programa[Buff_int].Dato ); outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); setcolor(CFG.Colores.Texto ); // sprintf( Buffer, "# % 4d", Programa[Buff_int].SubDato ); // outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); sprintf( Buffer, " #% 5d", Programa[Buff_int].SubDato ); outtextxy( /*334*/331, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); break; case 3: // sprintf( Buffer, "# % 4d", Programa[Buff_int].SubDato ); sprintf( Buffer, " #% 5d", Programa[Buff_int].SubDato ); outtextxy( /*334*/331, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); // outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); setcolor(CFG.Colores.Texto ); sprintf( Buffer, " %02d", Programa[Buff_int].Dato ); outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); break; default: break; } break; case Add : case Sub : switch( CurrCol ) { case 1: sprintf( Buffer, "# %04d", Programa[Buff_int].Dato ); outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); setcolor(CFG.Colores.Texto ); sprintf( Buffer, "# %04d", Programa[Buff_int].SubDato ); outtextxy( /*334*/301, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); sprintf( Buffer, "Ch %02d", Programa[Buff_int].Parametros ); outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); break; case 2: sprintf( Buffer, "# %04d", Programa[Buff_int].SubDato ); outtextxy( /*334*/301, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); setcolor(CFG.Colores.Texto ); sprintf( Buffer, "# %04d", Programa[Buff_int].Dato ); outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); sprintf( Buffer, "Ch %02d", Programa[Buff_int].Parametros ); outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); break; case 3: sprintf( Buffer, "Ch %02d", Programa[Buff_int].Parametros ); outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); setcolor(CFG.Colores.Texto ); sprintf( Buffer, "# %04d", Programa[Buff_int].Dato ); outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); sprintf( Buffer, "# %04d", Programa[Buff_int].SubDato ); outtextxy( /*334*/301, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); break; default: break; } break; default: sprintf( Buffer, " %04d", Programa[Buff_int].Dato ); outtextxy( /*334*/331, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); break; } } void PrintVisorLCD ( char Ultima ) { char Buffer[80] ; int Buff_int ; settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); // Solo 11 Lineas de 5 puntos setfillstyle( SOLID_FILL, 0 ); bar( 242, 101, 419, 129 ); setcolor(CFG.Colores.VisorLCD ); if ( Ultima == 1 ) Buff_int = 10000; else Buff_int = (CurrRow + CurrTopLine); // Direcci¢n sprintf( Buffer, "%04d", ( CurrRow + CurrTopLine ) ); outtextxy( 243, 100, Buffer ); switch ( Programa[Buff_int].Comando ) { case ReadNop : outtextxy( 243, 100, " Read" ); sprintf( Buffer, " Nop (00)" ); break; case Fun : sprintf( Buffer, " FUN" ); break; case Ld : sprintf( Buffer, " Ld " ); break; case Or : sprintf( Buffer, " Or " ); break; case And : sprintf( Buffer, " And " ); break; case _Out : sprintf( Buffer, " Out " ); break; case Tim : if ( CurrCol == 1 ) sprintf( Buffer, " Tim " ); else sprintf( Buffer, " Tim Data" ); break; case Cnt : if ( CurrCol == 1 ) sprintf( Buffer, " Cnt " ); else sprintf( Buffer, " Cnt Data" ); break; /* case _Tr : sprintf( Buffer, " Tr " ); break; */ case End : sprintf( Buffer, " End (01)" ); break; case Il : sprintf( Buffer, " Il (02)" ); break; case Ilc : sprintf( Buffer, " Ilc (03)" ); break; case Sft : if ( CurrCol == 1 ) sprintf( Buffer, " Sft (10)" ); else sprintf( Buffer, " Sft ]Ch" ); break; case Keep : sprintf( Buffer, " Keep (11)" ); break; case DifU : sprintf( Buffer, " DifU (13)" ); break; case DifD : sprintf( Buffer, " DifD (14)" ); break; case TimH : if ( CurrCol == 1 ) sprintf( Buffer, " TimH (15)" ); else sprintf( Buffer, " TimH Data" ); break; case Cmp : if ( CurrCol == 1 ) sprintf( Buffer, " Cmp (15)" ); else sprintf( Buffer, " Cmp Data" ); break; case Mov : if ( CurrCol == 1 ) sprintf( Buffer, " Mov (21)" ); else sprintf( Buffer, " Mov Data" ); break; case Mvn : if ( CurrCol == 1 ) sprintf( Buffer, " Mvn (22)" ); else sprintf( Buffer, " Mvn Data" ); break; case Add : if ( CurrCol == 1 ) sprintf( Buffer, " Add (30)" ); else if ( CurrCol == 2 ) sprintf( Buffer, " Add Data" ); else sprintf( Buffer, " Add to Channel" ); break; case Sub : if ( CurrCol == 1 ) sprintf( Buffer, " Sub (31)" ); else if ( CurrCol == 2 ) sprintf( Buffer, " Sub Data" ); else sprintf( Buffer, " Sub to Channel" ); break; case Stc : sprintf( Buffer, " Stc (40)" ); break; case Clc : sprintf( Buffer, " Clc (41)" ); break; default : sprintf( Buffer, " Error " ); break; } if ( Programa[Buff_int].Comando != Add && Programa[Buff_int].Comando != Sub ) { switch ( Programa[Buff_int].Parametros ) { case 0 : break; case P_Ld : strcat( Buffer, "Ld" ); break; case P_Tr : strcat( Buffer, "Tr" ); break; case P_Hr : strcat( Buffer, "Hr" ); break; case P_Cnt : strcat( Buffer, "Cnt" ); break; case P_Tim : strcat( Buffer, "Tim" ); break; case P_Keep : strcat( Buffer, "Keep" ); break; case P_Not : strcat( Buffer, "Not" ); break; case P_Not_Tr : strcat( Buffer, "Not Tr" ); break; case P_Not_Hr : strcat( Buffer, "Not Hr" ); break; case P_Not_Cnt : strcat( Buffer, "Not Cnt" ); break; case P_Not_Tim : strcat( Buffer, "Not Tim" ); break; case P_Keep_Hr : strcat( Buffer, "Keep Hr" ); break; case P_Tim_Data : strcat( Buffer, "Tim Data" ); break; case P_Out : strcat( Buffer, "Out" ); break; default : strcat( Buffer, "Error" ); break; } } outtextxy( 243, 115, Buffer ); switch( Programa[Buff_int].Comando ) { case ReadNop : case End : case Il : case Ilc : sprintf( Buffer, " "); break; case Tim : case TimH : case Cnt : case Cmp : case Sft : case Mov : case Mvn : switch( CurrCol ) { case 1: sprintf( Buffer, " %02d", Programa[Buff_int].Dato ); break; case 3: sprintf( Buffer, "#% 5d", Programa[Buff_int].SubDato ); break; default: break; } break; case Add : case Sub : switch( CurrCol ) { case 1: sprintf( Buffer, "# %04d", Programa[Buff_int].Dato ); break; case 2: sprintf( Buffer, "# %04d", Programa[Buff_int].SubDato ); break; case 3: sprintf( Buffer, " Ch %02d", Programa[Buff_int].Parametros ); break; default: break; } break; default : sprintf( Buffer, " %04d", Programa[Buff_int].Dato ); break; } outtextxy( 373, 115, Buffer ); } void BuscarItem(void) { } void GetProgram(void) { } void SendProgram(void) { } void AddRow( char Arriba_Abajo ) { int avance, Stop; if ( Arriba_Abajo == 0 && (CurrRow+CurrTopLine) == 0 ) return; if ( Arriba_Abajo == 1 && (CurrRow+CurrTopLine) == 9999 ) return; if ( Arriba_Abajo == 0 ) Stop = CurrRow + CurrTopLine - 1; else Stop = CurrRow + CurrTopLine + 1; // Comienza proceso de eliminaci¢n avance = 9999; do{ Programa[avance + 1] = Programa[avance]; avance--; }while(avance >= Stop ); if ( Arriba_Abajo == 0 ) Stop++; Programa[Stop].Comando = 0; Programa[Stop].Parametros = 0; Programa[Stop].Dato = 0; Programa[Stop].SubDato = 0; avance = CurrRow; CurrRow = 0; PrintWholeScreen(); if ( (CurrRow = avance + ( (Arriba_Abajo==0) ? (0) : (1) )) <0 ) { CurrRow = 0; UpRow(); } if ( CurrRow > 10 ) { CurrRow = 10; DownRow(); } Programa[10000] = Programa[CurrRow + CurrTopLine ]; } void DelRow(void) { int avance; // Comienza proceso de eliminaci¢n avance = CurrRow + CurrTopLine; do{ Programa[avance] = Programa[avance+1]; avance++; }while(avance < 10000 ); Programa[9999].Comando = 0; Programa[9999].Parametros = 0; Programa[9999].Dato = 0; Programa[9999].SubDato = 0; avance = CurrRow; CurrRow = 0; PrintWholeScreen(); CurrRow = avance; Programa[10000] = Programa[CurrRow + CurrTopLine ]; } void UpRow(void) { if( CurrCol > 1 ) Select_Columna_Up(); else if ( ( CurrRow + CurrTopLine ) <= 0 ) BEEP(); // Rebasado n§ de lineas else { if ( Select_Columna_Up() == 1 ) { if ( ( CurrRow ) <= 0 ) { CurrTopLine -= 11; if ( CurrTopLine < 0 ) CurrTopLine = 0; CurrRow = 0; PrintWholeScreen(); CurrRow = 10; Select_Columna_Up(); PrintCurrLine ( 1, 0 ); }else{ CurrRow--; Select_Columna_Up(); PrintCurrLine ( 0, 0 ); } } else PrintCurrLine ( 0, 0 ); } } void DownRow(void) { if ( ( CurrRow + CurrTopLine ) >= 9999 ) BEEP(); // Rebasado n§ de lineas else { if ( Select_Columna_Down() == 1 ) { if ( ( CurrRow ) >= 10 ) { CurrRow = 0; CurrTopLine += 11; if ( CurrTopLine + CurrRow > 9999 ) CurrTopLine = ( 9999 - 10 ); PrintWholeScreen(); Select_Columna_Down(); PrintCurrLine ( 1, 0 ); }else{ CurrRow++; Select_Columna_Down(); PrintCurrLine ( 0, 0 ); } } else { PrintCurrLine ( 0, 0 ); } } } void LoadProgram(void) { char Buffer[500] = "*.PLC"; struct Cabecera { char Nombre_del_Programa[70]; char Comentario_Inicial[70]; char VerHi, VerLow; char Register; long Records; }; Cabecera C_PLC; if ( file_browser( Buffer, "Cargar Programa PLC", 0 ) ) { FILE *handle_Load; if ( (handle_Load = fopen( Buffer, "rb") ) == NULL ) Muestra_Mensaje(200, "PLC.DAT"); fread ( &C_PLC, sizeof( struct Cabecera ), 1, handle_Load ); if ( C_PLC.VerHi == 2 && C_PLC.VerLow == 0 ) { fread ( Programa, sizeof(FirmWare), 10000, handle_Load ); fread ( Ram, sizeof(MemoriaRam), 1, handle_Load ); } fclose(handle_Load); CurrRow = 0; CurrTopLine = 0; PrintWholeScreen(); PrintCurrLine( 1, 0 ); Programa[10000] = Programa[CurrRow + CurrTopLine ]; ReImprimeCanal_Out(CurrCh_Out); ReImprimeCanal_In(CurrCh_In); } /* char drive[MAXDRIVE]; char dir[MAXDIR]; char file[MAXFILE]; char ext[MAXEXT]; int flags; flags=fnsplit(Buffer,drive,dir,file,ext); if( !strcmpi( file, "SFT" ) || !strcmpi( file, "CNT" ) ||!strcmpi( file, "KEEP(11)") || !strcmpi( file, "DIFD(14)" ) ||!strcmpi( file, "DIFU(13)") ) Run(); */ } void WriteProgram(void) { char Buffer[500] = "*.PLC"; char Buffer2[13]; struct Cabecera { char Nombre_del_Programa[70]; char Comentario_Inicial[70]; char VerHi, VerLow; char Register; long Records; }; Cabecera C_PLC; sprintf( C_PLC.Nombre_del_Programa, "P.L.C\nJ¢se David Guill‚n\n%c", 26 ); C_PLC.VerHi = 2; C_PLC.VerLow = 0; C_PLC.Register = 1; C_PLC.Records = 1; if ( file_browser( Buffer, "Salvar Programa PLC", 1 ) ) { char drive[MAXDRIVE]; char dir[MAXDIR]; char file[MAXFILE]; char ext[MAXEXT]; int flags; flags=fnsplit(Buffer,drive,dir,file,ext); if( !(flags & EXTENSION) ) strcpy( ext, ".PLC" ); fnmerge(Buffer ,drive,dir,file,ext); FILE *handle_Save; if ( (handle_Save = fopen( Buffer, "wb") ) == NULL ) Muestra_Mensaje(200, "PLC.DAT"); fwrite( &C_PLC, sizeof( struct Cabecera ), 1, handle_Save ); fwrite( Programa, sizeof(FirmWare), 10000, handle_Save ); fwrite( Ram, sizeof(MemoriaRam), 1, handle_Save ); fclose(handle_Save); CurrRow = 0; CurrTopLine = 0; PrintWholeScreen(); PrintCurrLine( 1, 0 ); Programa[10000] = Programa[CurrRow + CurrTopLine ]; } } void Configurar(void) { /* struct Colores { char Texto; char F_Texto; char VisorLCD; }; typedef struct { struct Colores Colores; char PcOut.Bit; char TimeFlow.Bit; char Int8.Bit; } Configuracion; Configuracion CFG; */ char Boton_Pulsado, ok = 0, C_Texto = 5; setfillstyle(SOLID_FILL, 0); bar( 9, 372, 542, 471); Imprime_Secuencia(5); // Fichero_bot(20); Imprime_Estaticos(20, "PLC.dat"); Imprime_Bordes(5, 5, CFG.Colores.Texto); if ( CFG.Int8.Bit ) Imprime_Bordes(5, 2, 4); if ( CFG.PcOut.Bit ) Imprime_Bordes(5, 3, 4); if ( CFG.TimeFlow.Bit ) Imprime_Bordes(5, 4, 4); do{ Boton_Pulsado = Comprueba_Secuencia( 5 ); switch(Boton_Pulsado ) { // Iniciamos comprobacion case 0: // No se pulso ningun BOTON while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER break; case -1: // Hay una tecla especial en BUFFER getch(); // La eliminamos break; case -2: // Hay una tecla especial en BUFFER getch(); // La eliminamos break; // Retroceder case 1 : ok = 1; break; // Usar Int8.Bit case 2 : if ( CFG.Int8.Bit ) { CFG.Int8.Bit = 0; Imprime_Bordes(5, 2, -1); } else { CFG.Int8.Bit = 1; Imprime_Bordes(5, 2, 4); } break; // Usar Pc_Out case 3 : if ( CFG.PcOut.Bit ) { CFG.PcOut.Bit = 0; Imprime_Bordes(5, 3, -1); } else { CFG.PcOut.Bit = 1; Imprime_Bordes(5, 3, 4); } break; // Usar TimeFlow.Bit case 4 : if ( CFG.TimeFlow.Bit ) { CFG.TimeFlow.Bit = 0; Imprime_Bordes(5, 4, -1); } else { CFG.TimeFlow.Bit = 1; Imprime_Bordes(5, 4, 4); } break; // Texto case 5 : C_Texto = 5; Imprime_Bordes(5, 5, CFG.Colores.Texto); Imprime_Bordes(5, 6, -1); Imprime_Bordes(5, 7, -1); break; // Texto Se¤alado case 6 : C_Texto = 6; Imprime_Bordes(5, 5, -1); Imprime_Bordes(5, 6, CFG.Colores.F_Texto); Imprime_Bordes(5, 7, -1); break; // Visor LCD case 7 : C_Texto = 7; Imprime_Bordes(5, 5, -1); Imprime_Bordes(5, 6, -1); Imprime_Bordes(5, 7, CFG.Colores.VisorLCD); break; case 8 : case 9 : case 10 : case 11 : case 12 : case 13 : case 14 : case 15 : case 16 : case 17 : case 18 : case 19 : case 20 : case 21 : case 22 : switch ( C_Texto ) { case 5: CFG.Colores.Texto = ( Boton_Pulsado - 7); Imprime_Bordes(5, 5, CFG.Colores.Texto); break; case 6: CFG.Colores.F_Texto = ( Boton_Pulsado - 7 ); Imprime_Bordes(5, 6, CFG.Colores.F_Texto); break; case 7: CFG.Colores.VisorLCD = ( Boton_Pulsado - 7 ); Imprime_Bordes(5, 7, CFG.Colores.VisorLCD); break; } break; default: break; } }while(!ok); if ( Optar( "Cambios en la configuraci¢n.", "¨ SALVAR ?", "") == 1 ) CFG_File( Salvar ); else CFG_File( Cargar ); setfillstyle(SOLID_FILL, 0); bar( 9, 372, 542, 471); } void BEEP(void) { } int Select_Columna_Up(void){ int back = 0; // Antes de Bajar una linea, mira si se ha de bajar una linea REAL // o una linea VIRTUAL switch( Programa[CurrRow + CurrTopLine].Comando ){ case Tim: case Cnt: case Sft: case Cmp: case Mov: case Mvn: case TimH: if ( CurrCol == 3 ) { CurrCol = 1; } else if ( CurrCol == 1 ) { CurrCol = 0; back = 1; } else if ( CurrCol == 0 ) { CurrCol = 3; } break; case Add: case Sub: if ( CurrCol == 3 ) { CurrCol = 2; } else if ( CurrCol == 2 ) { CurrCol = 1; } else if ( CurrCol == 1 ) { CurrCol = 0; back = 1; } else if ( CurrCol == 0 ) { CurrCol = 3; } break; default: CurrCol = 0; back = 1; break; } return back; } int Select_Columna_Down(void){ int back = 0; // Antes de Bajar una linea, mira si se ha de bajar una linea REAL // o una linea VIRTUAL switch( Programa[CurrRow + CurrTopLine].Comando ){ case Tim: case Cnt: case Sft: case Cmp: case Mov: case Mvn: case TimH: if ( CurrCol == 0 ) { CurrCol = 1; } else if ( CurrCol == 1 ) { CurrCol = 3; } else if ( CurrCol == 3 ) { CurrCol = 0; back = 1; } break; case Add: case Sub: if ( CurrCol == 0 ) { CurrCol = 1; } else if ( CurrCol == 1 ) { CurrCol = 2; } else if ( CurrCol == 2 ) { CurrCol = 3; } else if ( CurrCol == 3 ) { CurrCol = 0; back = 1; } break; default: CurrCol = 0; back = 1; break; } return back; } void Numero_Pulsado(char numero) { // Vemos si posee dato secundario... // y lo canalizamos a su posici¢n correcta switch( Programa[10000].Comando ) { case Tim : case TimH: case Cnt : case Cmp : case Sft : case Mov : case Mvn : if ( CurrCol == 1 ) Programa[10000].Dato = ( ( ( Programa[10000].Dato - ( ( Programa[10000].Dato / 10 ) * 10 ) ) * 10 ) + numero ); else if ( CurrCol == 3 ) Programa[10000].SubDato = ( ( ( Programa[10000].SubDato - ( ( Programa[10000].SubDato / 1000 ) * 1000 ) ) * 10 ) + numero ); break; case Add : case Sub : if ( CurrCol == 1 ) Programa[10000].Dato = ( ( ( Programa[10000].Dato - ( ( Programa[10000].Dato / 1000 ) * 1000 ) ) * 10 ) + numero ); else if ( CurrCol == 2 ) Programa[10000].SubDato = ( ( ( Programa[10000].SubDato - ( ( Programa[10000].SubDato / 1000 ) * 1000 ) ) * 10 ) + numero ); else if ( CurrCol == 3 ) Programa[10000].Parametros = ( ( ( Programa[10000].Parametros - ( ( Programa[10000].Parametros / 10 ) * 10 ) ) * 10 ) + numero ); break; default: CurrCol = 0; Programa[10000].Dato = ( ( ( Programa[10000].Dato - ( ( Programa[10000].Dato / 1000 ) * 1000 ) ) * 10 ) + numero ); break; } } void MuestraLCD( char *texto1, char *texto2) { char Buffer[20]; setfillstyle( SOLID_FILL, 0 ); bar( 242, 101, 419, 129 ); setcolor(CFG.Colores.VisorLCD ); sprintf( Buffer, "%04d", ( CurrRow + CurrTopLine ) ); outtextxy( 243, 100, Buffer ); outtextxy( 243, 100, texto1 ); outtextxy( 243, 115, texto2 ); } void CFG_File( char Cargar_Salvar ) { FILE *handle_CFG; if ( Cargar_Salvar == Cargar ) { if ( ( handle_CFG = fopen( "PLC.CFG", "rb") ) == NULL ) { ( handle_CFG = fopen( "PLC.CFG", "wb") ); CFG.Colores.Texto = 2; CFG.Colores.F_Texto =14; CFG.Colores.VisorLCD= 6; CFG.PcOut.Bit = 0; CFG.TimeFlow.Bit = 0; CFG.Int8.Bit = 0; fwrite( &CFG, sizeof(Configuracion), 1, handle_CFG ); fclose( handle_CFG ); } else { fread( &CFG, sizeof(Configuracion), 1, handle_CFG ); fclose( handle_CFG ); } } else { if ( ( handle_CFG = fopen( "PLC.CFG", "wb") ) == NULL ) { CFG.Colores.Texto = 2; CFG.Colores.F_Texto =14; CFG.Colores.VisorLCD= 6; CFG.PcOut.Bit = 0; CFG.TimeFlow.Bit = 0; CFG.Int8.Bit = 0; } else { fwrite( &CFG, sizeof(Configuracion), 1, handle_CFG ); fclose( handle_CFG ); } } }