#include #include #include #include #include #include #include #include #include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON #include "PLC.H" //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ struct Make_Boton { unsigned int Up, Left, Down, Right; unsigned char Cdf, Cb1, Cb2; unsigned char Ab, Pb; unsigned char Isc, Sc; }; extern struct Make_Boton far *Botones; // Puntero a estructura extern void Imprime_Boton_i(struct Make_Boton Bot_Imp); extern int P_Sec(int numero); extern int lee_objeto(FILE *); extern void Deprime_Image(struct Make_Boton Bot_Imp); extern void Imprime_Boton(int D_Bord, struct Make_Boton Bot_Imp); extern char True_Push, // Parametros para el TRUE_PUSH Push; // PRESION REAL !!! extern void far *arrow; // YA !!! extern int Secuencias, *n_Botones_Secuencia; extern char memoria_asignada, vez; extern struct Make_Boton far *Botones; // Puntero a estructura void Anclar_Raton_PLC(void); //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //#define Comprueba_Secuencia_PLC(2) Comprueba_Secuencia(2) //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß extern int Muestra_Mensaje(int Mensaje, char *file) ; extern Puertas DebugCode ; extern void UpRow(void) ; extern void DownRow(void) ; extern void PrintCurrLine ( char Oculta_Mark, char Ultima ) ; extern void PrintVisorLCD ( char Ultima ) ; extern void MuestraLCD( char *texto1, char *texto2) ; extern void redefine_cursor_raton(int r_e) ; int Comprueba_Secuencia_PLC(char Sec_num ) ; extern int CurrRow , CurrTopLine ; extern char CurrCol ; extern MemoriaRam *Ram; extern FirmWare far *Programa; extern char CurrCh_In , CurrCh_Out ; extern Configuracion CFG; char Running = 0; void Run(void); void Instala_Int8(void); void DesInstala_Int8(void); void Ejecuta_Programa(void); void Ejecuta_Programa_BETA(void); void remapea_relojes(void); void Ejecuta_Programa(void) { } void Instala_Int8(void){ } void DesInstala_Int8(void){ } void Run(void) { char ok = 0, Boton_Pulsado/*, Tipo_Run = 0*/; Running = 1; //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ CFG.Int8.Bit = 0; //ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Imprime_Estaticos( 3, "PLC.dat"); // Fichero_bot(3); redefine_cursor_raton(1); // Modo RUN remapea_relojes(); if ( CFG.Int8.Bit ) Instala_Int8(); /* else Tipo_Run = 1; */ activa_raton(); do{ if ( CFG.Int8.Bit == 0 ) Ejecuta_Programa_BETA(); Boton_Pulsado = ( CFG.Int8.Bit ? Comprueba_Secuencia( 2 ) : Comprueba_Secuencia_PLC( 2 ) ); 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; case R_In0 : case R_In1 : case R_In2 : case R_In3 : case R_In4 : case R_In5 : case R_In6 : case R_In7 : case R_In8 : case R_In9 : case R_In10 : case R_In11 : case R_In12 : case R_In13 : case R_In14 : case R_In15 : if ( CurrCh_In != (5) ) { if ( Ram -> In[Boton_Pulsado - R_In0][CurrCh_In].Bit == 1 ) { // Ram -> CoIn[Boton_Pulsado - R_In0 ][CurrCh_In].Bit = Ram -> In[Boton_Pulsado - R_In0 ][CurrCh_In].Bit; Ram -> In[Boton_Pulsado - R_In0 ][CurrCh_In].Bit = 0; desactiva_raton(); Imprime_Bordes(2, Boton_Pulsado, -1); activa_raton(); } else { // Ram -> CoIn[Boton_Pulsado - R_In0 ][CurrCh_In].Bit = Ram -> In[Boton_Pulsado - R_In0 ][CurrCh_In].Bit; Ram -> In[Boton_Pulsado - R_In0 ][CurrCh_In].Bit = 1; desactiva_raton(); Imprime_Bordes(2, Boton_Pulsado, 2); activa_raton(); } } break; case R_Ch00_In : case R_Ch01_In : case R_Ch02_In : case R_Ch03_In : case R_Ch04_In : case R_Ch19_In : desactiva_raton(); Imprime_Bordes(2, (CurrCh_In + R_Ch00_In ), -1); CurrCh_In = ( Boton_Pulsado - R_Ch00_In ); Imprime_Bordes(2, Boton_Pulsado, 4); ReImprimeCanal_In(CurrCh_In); activa_raton(); break; case R_Ch00_Out : case R_Ch01_Out : case R_Ch02_Out : case R_Ch03_Out : case R_Ch04_Out : case R_Ch19_Out : desactiva_raton(); Imprime_Bordes(2, (CurrCh_Out + R_Ch00_Out ), -1); CurrCh_Out = ( Boton_Pulsado - R_Ch00_Out ); Imprime_Bordes(2, Boton_Pulsado, 4); ReImprimeCanal_Out(CurrCh_Out); activa_raton(); break; case R_Stop : desactiva_raton(); Running = 0; ok = 1; break; case R_Up : desactiva_raton(); PrintCurrLine ( 0, 0 ); // Ocultamos linea anterior UpRow(); Programa[10000] = Programa[CurrRow + CurrTopLine ]; PrintCurrLine( 1, 1 ); PrintVisorLCD ( 1 ); activa_raton(); break; case R_Down : desactiva_raton(); PrintCurrLine ( 0, 0 ); // Ocultamos linea anterior DownRow(); Programa[10000] = Programa[ CurrRow + CurrTopLine ]; PrintCurrLine( 1, 1 ); PrintVisorLCD ( 1 ); activa_raton(); break; default: break; } if ( !Running ) ok = 1; }while(!ok); if ( CFG.Int8.Bit ) DesInstala_Int8(); Imprime_Estaticos( 4, "PLC.dat"); // Fichero_bot(4); redefine_cursor_raton(2); // Modo Edit } void Ejecuta_Programa_BETA(void){ int pq_LD=0; // ¨ por cual LD va ? // Hemos considerado cada LD un bloque de // resultados l¢gicos entre las operaciones // a realizar... int i = 0; // Variable que ha de avanzar en el contador. int Cpar; Puertas ch; for( i ; (Programa[i].Comando != End && i != 9999); i++ ) { // Primero comprobamos el comando y ejecutamos el subcomando asociado. switch( Programa[i].Comando) { //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case 0 : /*READ NOP ­­­­ Tambien es una funci¢n !!!! */ break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Ld : if( i > 0 && Programa[i-1].Comando == _Out ) pq_LD = 0; pq_LD++; switch ( Cpar = Programa[i].Parametros ) { case 0 : // Sin Parametros case P_Not : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Entrada... case 0: case 1: case 2: case 3: case 4: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit : !Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit ); break; // Canales de Salida... case 5: case 6: case 7: case 8: case 9: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit : !Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ); break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit : !Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit ); break; } break; case P_Tr : case P_Not_Tr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Tmp ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tr ) ? Ram ->Tr[ Programa[i].Dato ].Bit : !Ram ->Tr[ Programa[i].Dato ].Bit ); break; case P_Hr : case P_Not_Hr : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) <= 9 ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Hr ) ? Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit : !Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit ); break; case P_Cnt : case P_Not_Cnt : if ( ( Programa[i].Dato ) < Numero_Tim ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Cnt ) ? Ram ->_Tim [Programa[i].Dato].Bit : !Ram ->_Tim [Programa[i].Dato].Bit ); break; case P_Tim : case P_Not_Tim : if ( ( Programa[i].Dato ) < Numero_Tim ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tim ) ? Ram ->_Tim [Programa[i].Dato].Bit : !Ram ->_Tim [Programa[i].Dato].Bit ); break; } break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Or : switch ( Cpar = Programa[i].Parametros ) { case 0 : case P_Not : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Entrada... case 0: case 1: case 2: case 3: case 4: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit : !Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit ) || Ram ->_Ld[pq_LD].Bit; break; // Canales de Salida... case 5: case 6: case 7: case 8: case 9: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit : !Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) || Ram ->_Ld[pq_LD].Bit; break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit : !Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit ) || Ram ->_Ld[pq_LD].Bit; break; } break; case P_Ld : Ram ->_Ld[1].Bit = ( Ram ->_Ld[1].Bit || Ram ->_Ld[2].Bit ); for(Cpar=2; Cpar<=pq_LD; Cpar++) Ram ->_Ld[Cpar].Bit = Ram ->_Ld[ Cpar + 1 ].Bit; pq_LD--; break; case P_Tr : case P_Not_Tr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Tmp ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tr ) ? Ram ->Tr[ Programa[i].Dato ].Bit : !Ram ->Tr[ Programa[i].Dato ].Bit ) || Ram ->_Ld[pq_LD].Bit; break; case P_Hr : case P_Not_Hr : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) <= 9 ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Hr ) ? Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit : !Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit ) || Ram ->_Ld[pq_LD].Bit; break; case P_Cnt : case P_Not_Cnt : if ( ( Programa[i].Dato ) < Numero_Tim ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Cnt ) ? Ram ->_Tim [Programa[i].Dato].Bit : !Ram ->_Tim [Programa[i].Dato].Bit ) || Ram ->_Ld[pq_LD].Bit; break; case P_Tim : case P_Not_Tim : if ( ( Programa[i].Dato ) < Numero_Tim ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tim ) ? Ram ->_Tim [Programa[i].Dato].Bit : !Ram ->_Tim [Programa[i].Dato].Bit ) || Ram ->_Ld[pq_LD].Bit; break; } break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case And : switch ( Cpar = Programa[i].Parametros ) { case 0 : case P_Not : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Entrada... case 0: case 1: case 2: case 3: case 4: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit : !Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit ) && Ram ->_Ld[pq_LD].Bit; break; // Canales de Salida... case 5: case 6: case 7: case 8: case 9: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit : !Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) && Ram ->_Ld[pq_LD].Bit; break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit : !Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit ) && Ram ->_Ld[pq_LD].Bit; break; } break; case P_Ld : Ram ->_Ld[1].Bit = ( Ram ->_Ld[1].Bit && Ram ->_Ld[2].Bit ); for(Cpar=2; Cpar<=pq_LD; Cpar++) Ram ->_Ld[Cpar].Bit = Ram ->_Ld[ Cpar + 1 ].Bit; pq_LD--; break; case P_Tr : case P_Not_Tr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Tmp ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tr ) ? Ram ->Tr[ Programa[i].Dato ].Bit : !Ram ->Tr[ Programa[i].Dato ].Bit ) && Ram ->_Ld[pq_LD].Bit; break; case P_Hr : case P_Not_Hr : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) <= 9 ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Hr ) ? Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit : !Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit ) && Ram ->_Ld[pq_LD].Bit; break; case P_Cnt : case P_Not_Cnt : if ( ( Programa[i].Dato ) < Numero_Tim ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Cnt ) ? Ram ->_Tim [Programa[i].Dato].Bit : !Ram ->_Tim [Programa[i].Dato].Bit ) && Ram ->_Ld[pq_LD].Bit; break; case P_Tim : case P_Not_Tim : if ( ( Programa[i].Dato ) < Numero_Tim ) Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tim ) ? Ram ->_Tim [Programa[i].Dato].Bit : !Ram ->_Tim [Programa[i].Dato].Bit ) && Ram ->_Ld[pq_LD].Bit; break; } break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case _Out : switch ( Cpar = Programa[i].Parametros ) { case 0 : case P_Not : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Salida... case 5: case 6: case 7: case 8: case 9: if ( Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit != ( ( Cpar == 0 ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ) ) { Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = ( ( Cpar == 0 ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ); if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); if ( ( ( Cpar == 0 ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ) ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); activa_raton(); } } break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: // case 19: if ( Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit != ( ( Cpar == 0 ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ) ) { // Ram ->CoRi[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit; Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = ( ( Cpar == 0 ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ); if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); if ( ( ( Cpar == 0 ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ) && ( Programa[i].Dato / 100) == 10 ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); activa_raton(); } } break; } break; case P_Tr : case P_Not_Tr : if ( Programa[i].Dato < Numero_Tmp ) { if ( Ram ->Tr [Programa[i].Dato].Bit != ( ( Cpar == P_Tr ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ) ) Ram ->Tr [Programa[i].Dato].Bit = ( ( Cpar == P_Tr ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ); } break; case P_Hr : case P_Not_Hr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) if ( Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit != ( ( Cpar == P_Hr ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ) ) { // Ram ->CoHr[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit; Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = ( ( Cpar == P_Hr ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ); } break; } break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Tim : if ( Programa[i].Dato < Numero_Tim ) if ( Ram -> _Ld[1].Bit == 0 ) { Ram -> _Tim[ Programa[i].Dato ].Bit = 0; Ram -> Tim_Cnt[ Programa[i].Dato ] = -1; } else { if ( Ram -> Tim_Cnt[ Programa[i].Dato ] < 0 ) Ram -> Tim_Cnt[ Programa[i].Dato ] = clock(); if ( ( ( ( clock() - Ram -> Tim_Cnt[ Programa[i].Dato ] ) / CLK_TCK ) * 10 ) >= Programa[i].SubDato ) Ram -> _Tim[ Programa[i].Dato ].Bit = 1; } pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Cnt : if ( pq_LD >= 2 && Programa[i].Dato < Numero_Tim ) { if ( Ram -> _Ld[1].Bit && !Ram -> _Ld[2].Bit ) { if ( Ram -> _Cnt[ Programa[i].Dato ].Bit != Ram -> _Ld[1].Bit ) if ( Ram -> Tim_Cnt[ Programa[i].Dato ] >= (Programa[i].SubDato - 1) ) Ram -> _Tim[ Programa[i].Dato ].Bit = 1; else { Ram -> Tim_Cnt[ Programa[i].Dato ]++; Ram -> _Tim[ Programa[i].Dato ].Bit = 0; } } if ( Ram -> _Ld[2].Bit ) { Ram -> Tim_Cnt[ Programa[i].Dato ] = 0; Ram -> _Tim[ Programa[i].Dato ].Bit = 0; } Ram -> _Cnt[ Programa[i].Dato ].Bit = Ram -> _Ld[1].Bit; } pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Sft : // Registro de desplazamiento vú2.0 if ( pq_LD >= 3 ) { // Entrada de Reposici¢n if ( Ram -> _Ld[3].Bit ) { switch ( Programa[i].Parametros ) { case 0 : if ( (Programa[i].Dato - 5) <= 4 && (Programa[i].SubDato - 5) <= 4 ) for ( Cpar = (Programa[i].Dato - 5); Cpar <= (Programa[i].SubDato - 5); Cpar ++ ) for ( auto char Prop = 0; Prop < 16; Prop ++ ) if( Ram ->Out[ Prop ] [ Cpar ].Bit ) { desactiva_raton(); Ram ->Out[ Prop ] [ Cpar ].Bit = 0; if ( CurrCh_Out == Cpar ) // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( Prop + B_Out0), -1); activa_raton(); } else if ( (Programa[i].Dato - 10) <= 8 && (Programa[i].SubDato - 10) <= 8 ) for ( Cpar = (Programa[i].Dato - 10); Cpar <= (Programa[i].SubDato - 10); Cpar ++ ) for ( auto char Prop = 0; Prop < 16; Prop ++ ) if ( Ram ->Ri [ Prop ] [ Cpar ].Bit ) { Ram ->Ri [ Prop ] [ Cpar ].Bit = 0; if ( CurrCh_Out == Cpar ) // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( Prop + B_Out0), -1); } break; case P_Hr: if ( Programa[i].Dato <= 9 ) for ( Cpar = (Programa[i].Dato - 5); Cpar <= (Programa[i].SubDato - 5); Cpar ++ ) for ( auto char Prop = 0; Prop < 16; Prop ++ ) { Ram ->Hr [ Prop ] [ Cpar ].Bit = 0; if ( CurrCh_Out == Cpar ) // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( Prop + B_Out0), -1); } break; } } else { if ( !Ram -> Pre_Ld[i].Bit && Ram -> _Ld[2].Bit ) { auto char Prop; switch ( Programa[i].Parametros ) { case 0 : // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato) { // Canales de Salida... case 5: case 6: case 7: case 8: case 9: // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( (Programa[i].SubDato-5) < (Numero_Out - 1) ) { for ( Cpar = (Programa[i].SubDato - 5); Cpar >=(signed int)(Programa[i].Dato - 5); Cpar -- ) for ( Prop = 15; Prop >= 0; Prop-- ) { if ( Prop != 0 ) { if(Ram ->Out[ Prop ] [ Cpar ].Bit != Ram -> Out[Prop - 1][Cpar].Bit) { Ram ->Out[ Prop ] [ Cpar ].Bit = Ram -> Out[Prop - 1][Cpar].Bit; if ( CurrCh_Out == Cpar ) { desactiva_raton(); if ( Ram ->Out[ Prop ] [ Cpar ].Bit ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ( Prop + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( Prop + B_Out0), -1); activa_raton(); } } } else if( Cpar != 0 ) if(Ram ->Out[ Prop ] [ Cpar ].Bit != Ram -> Out[15][Cpar-1].Bit) { Ram ->Out[ Prop ] [ Cpar ].Bit = Ram -> Out[15][Cpar-1].Bit; if ( CurrCh_Out == Cpar ) { desactiva_raton(); if ( Ram ->Out[ Prop ] [ Cpar ].Bit ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ( Prop + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( Prop + B_Out0), -1); activa_raton(); } } } if (Ram ->Out[ 0 ] [ (signed int)(Programa[i].Dato - 5) ].Bit != Ram -> _Ld[1].Bit ) { Ram ->Out[ 0 ] [ (signed int)(Programa[i].Dato - 5) ].Bit = Ram -> _Ld[1].Bit; if ( CurrCh_Out == (signed int)(Programa[i].Dato - 5) ) { desactiva_raton(); if ( Ram ->Out[ 0 ] [ (signed int)(Programa[i].Dato - 5) ].Bit ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ( B_Out0 ), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( B_Out0 ), -1); activa_raton(); } } } break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: // case 19: if ( (Programa[i].SubDato-10) <= 8 ) { for ( Cpar = (Programa[i].SubDato - 10); Cpar >= (signed int)(Programa[i].Dato - 10); Cpar -- ) for ( Prop = 8; Prop >= 0; Prop-- ) { if ( Prop != 0 ) if ( Ram ->Ri [ Prop ] [ Cpar ].Bit != Ram -> Ri [Prop - 1][Cpar].Bit ) { Ram ->Ri [ Prop ] [ Cpar ].Bit = Ram -> Ri [Prop - 1][Cpar].Bit; if ( CurrCh_Out == 5 ) { desactiva_raton(); if ( Ram ->Out[ Prop ] [ Cpar ].Bit ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ( Prop + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( Prop + B_Out0), -1); activa_raton(); } } else if( Cpar != 0 ) if ( Ram ->Ri [ Prop ] [ Cpar ].Bit != Ram -> Ri [16][Cpar-1].Bit ) { Ram ->Ri [ Prop ] [ Cpar ].Bit = Ram -> Ri [16][Cpar-1].Bit; if ( CurrCh_Out == 5 ) { desactiva_raton(); if ( Ram ->Out[ Prop ] [ Cpar ].Bit ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ( Prop + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( Prop + B_Out0), -1); activa_raton(); } } } if(Ram ->Ri [ 0 ] [ (signed int)(Programa[i].Dato-10) ].Bit != Ram -> _Ld[1].Bit) { desactiva_raton(); Ram ->Ri [ 0 ] [ (signed int)(Programa[i].Dato-10) ].Bit = Ram -> _Ld[1].Bit; if ( CurrCh_Out == 5 ) if ( Ram ->Out[ 0 ] [ (signed int)(Programa[i].Dato-10) ].Bit ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ( Prop + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ( Prop + B_Out0), -1); activa_raton(); } } break; } break; case P_Hr : // Canales de Internos no volatiles. ( HR ). if ( (Programa[i].SubDato) <= 9 && (Programa[i].SubDato-9) <= 9 ) { for ( Cpar = (Programa[i].SubDato - 9); Cpar >= (signed int)(Programa[i].Dato - 9); Cpar -- ) for ( Prop = 8; Prop >= 0; Prop-- ) { if ( Prop != 0 ) Ram ->Hr [ Prop ] [ Cpar ].Bit = Ram -> Hr [Prop - 1][Cpar].Bit; else if( Cpar != 0 ) Ram ->Hr [ Prop ] [ Cpar ].Bit = Ram -> Hr [16][Cpar-1].Bit; } Ram ->Hr [ 0 ] [ (signed int)(Programa[i].Dato-9) ].Bit = Ram -> _Ld[1].Bit; } break; } } } pq_LD = 0; } { Ram -> Pre_Ld[i].Bit = Ram -> _Ld[2].Bit; ch.Bit = 0; } break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Keep : if ( pq_LD >= 2 ) { char ok; switch ( Programa[i].Parametros ) { case 0 : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Salida... case 5: case 6: case 7: case 8: case 9: ok = Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit; if( Ram -> _Ld[ 1 ].Bit && !Ram -> _Ld[ 2 ].Bit ) Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 1; if( Ram -> _Ld[ 2 ].Bit ) Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 0; if( ok != Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) { if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); if ( Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); activa_raton(); } } break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: // case 19: ok = Ram -> Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )].Bit; if( Ram -> _Ld[ 1 ].Bit && !Ram -> _Ld[ 2 ].Bit ) Ram -> Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-10].Bit = 1; if( Ram -> _Ld[ 2 ].Bit ) Ram -> Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-10].Bit = 0; if( ok != Ram -> Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-10].Bit ) { if ( CurrCh_Out == ( (Programa[i].Dato / 100 )) ) { desactiva_raton(); if ( ( Ram ->_Ld[ 1 ].Bit ) && ( Programa[i].Dato / 100) == 10 ) // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); else // Ponemos el borde correspondiente a OFF Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); activa_raton(); } } break; } break; case P_Hr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) { if( Ram -> _Ld[1].Bit && !Ram -> _Ld[2].Bit ) Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 1; if( Ram -> _Ld[2].Bit ) Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 1; } break; } } pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case DifU : // printf("%d %d\n",Ram -> Pre_Ld[i].Bit, Ram -> _Ld[1].Bit); if ( !Ram -> Pre_Ld[i].Bit && Ram -> _Ld[1].Bit ) { switch ( Programa[i].Parametros ) { case 0 : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Salida... case 5: case 6: case 7: case 8: case 9: Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 1; if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); activa_raton(); } break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: // case 19: Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100) - 10].Bit = 1; if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); activa_raton(); } break; } case P_Hr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 1; break; } } else // Si el Dato esta activo se desactiva... switch ( Programa[i].Parametros ) { case 0 : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Salida... case 5: case 6: case 7: case 8: case 9: if ( Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) { Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 0; if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); activa_raton(); } } break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: // case 19: if ( Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100) - 10].Bit ) { Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100) - 10].Bit = 0; if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); activa_raton(); } } break; } case P_Hr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 0; break; } pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case DifD : if ( Ram -> Pre_Ld[i].Bit && !Ram -> _Ld[1].Bit ) { switch ( Programa[i].Parametros ) { case 0 : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Salida... case 5: case 6: case 7: case 8: case 9: Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 1; if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); activa_raton(); } break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: // case 19: Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100)-10 ].Bit = 1; if ( CurrCh_Out == 5 ) { desactiva_raton(); // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); activa_raton(); } break; } case P_Hr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 1; break; } } else // Si el Dato esta activo se desactiva... switch ( Programa[i].Parametros ) { case 0 : // Miro si esta en el rango de Ch(xx00-15) [N§ IO's] if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) // Miro que canal esta usando para canalizarlo correctamente switch ( Programa[i].Dato / 100) { // Canales de Salida... case 5: case 6: case 7: case 8: case 9: if ( Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) { Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 0; if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) { desactiva_raton(); // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); activa_raton(); } } break; // Canales de Internos ( Reles Internos ). case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: // case 19: if ( Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100)-10 ].Bit ) { Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100)-10 ].Bit = 0; if ( CurrCh_Out == 5 ) { desactiva_raton(); // Ponemos el borde correspondiente a ON Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); activa_raton(); } } break; } case P_Hr : if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 0; break; } pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case TimH : if ( Programa[i].Dato < Numero_Tim ) if ( Ram -> _Ld[1].Bit == 0 ) { Ram -> _Tim[ Programa[i].Dato ].Bit = 0; Ram -> Tim_Cnt[ Programa[i].Dato ] = -1; } else { if ( Ram -> Tim_Cnt[ Programa[i].Dato ] < 0 ) Ram -> Tim_Cnt[ Programa[i].Dato ] = clock(); if ( ( ( ( clock() - Ram -> Tim_Cnt[ Programa[i].Dato ] ) / CLK_TCK ) * 100 ) >= Programa[i].SubDato ) Ram -> _Tim[ Programa[i].Dato ].Bit = 1; } pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Cmp : pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Mov : pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Mvn : pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Add : pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Sub : pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Stc : pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Clc : pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case End : pq_LD = 0; break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Il : break; //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ //ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß case Ilc : break; default: Muestra_Mensaje(501, "PLC.DAT"); Running = 0; break; } ////// Mantiene los relojes de TIEMPO ///////////////////////////////////////////////////////////////////// /////////////////// Contadores internos 1900 a 1902 ///////////////// ///////////////////////////////////////////////////////////////////// /* 1900 0'1s 0'05s */ /* 1901 0'2s 0'1 s */ /* 1902 1 s 0'5 */ ////////////////////////////////////// // 1900 if ( ( ( (clock() - Ram ->Contador_de_Tiempo[0] ) / CLK_TCK) ) >= 0.05 ) if ( Ram ->Ri [ 0 ] [ 9 ].Bit == 0 ) { Ram ->Ri [ 0 ] [ 9 ].Bit = 1; Ram ->Contador_de_Tiempo[0] = clock(); if ( CurrCh_In == 5 ) { desactiva_raton(); Imprime_Bordes(2, (R_In0 + 0), -1); activa_raton(); } } else { Ram ->Ri [ 0 ] [ 9 ].Bit = 0; Ram ->Contador_de_Tiempo[0] = clock(); if ( CurrCh_In == 5 ) { desactiva_raton(); Imprime_Bordes(2, (R_In0 + 0), 2); activa_raton(); } } // 1901 if ( ( ( (clock() - Ram ->Contador_de_Tiempo[1] ) / CLK_TCK) ) >= 0.1 ) if ( Ram ->Ri [ 1 ] [ 9 ].Bit == 0 ) { Ram ->Ri [ 1 ] [ 9 ].Bit = 1; Ram ->Contador_de_Tiempo[1] = clock(); if ( CurrCh_In == 5 ) { desactiva_raton(); Imprime_Bordes(2, (R_In0 + 1), -1); activa_raton(); } } else { Ram ->Ri [ 1 ] [ 9 ].Bit = 0; Ram ->Contador_de_Tiempo[1] = clock(); if ( CurrCh_In == 5 ) { desactiva_raton(); Imprime_Bordes(2, (R_In0 + 1), 2); activa_raton(); } } // 1902 if ( ( ( (clock() - Ram ->Contador_de_Tiempo[2] ) / CLK_TCK) ) >= 0.5 ) if ( Ram ->Ri [ 2 ] [ 9 ].Bit == 0 ) { Ram ->Ri [ 2 ] [ 9 ].Bit = 1; Ram ->Contador_de_Tiempo[2] = clock(); if ( CurrCh_In == 5 ) { desactiva_raton(); Imprime_Bordes(2, (R_In0 + 2), -1); activa_raton(); } } else { Ram ->Ri [ 2 ] [ 9 ].Bit = 0; Ram ->Contador_de_Tiempo[2] = clock(); if ( CurrCh_In == 5 ) { desactiva_raton(); Imprime_Bordes(2, (R_In0 + 2), 2); activa_raton(); } } ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// if ( ch.Bit ) Ram -> Pre_Ld[i].Bit = Ram -> _Ld[1].Bit; else ch.Bit = 1; } if ( i == 9999 ) { Muestra_Mensaje(500, "PLC.DAT"); Running = 0; return; } } // Esta funci¢n se diferencia de la original, en no ser fija: es decir que // tras cada llamada vuelve, se pulse o no un boton, para poder continuar // utilizando MB y otras cosas a la vez.... int Comprueba_Secuencia_PLC(char Sec_num ) { // char boton_izq=0, boton_der=0; char key, key2=0; char i, Pulso = 0; int psec = P_Sec(Sec_num-1); union REGS io; io.x.ax = 3; if ( kbhit() ) { if ( (key = getch())==0) key2 = getch(); for(i=0; i> 1) & 1; x_raton = io.x.cx; y_raton = io.x.dx; for(i = 0; i < n_Botones_Secuencia[Sec_num-1]; i++) if( (x_raton >= Botones[psec+i].Left) && (x_raton <= Botones[psec+i].Right) && (y_raton >= Botones[psec+i].Up) && (y_raton <= Botones[psec+i].Down) ) { Pulso = i + 1; Push = ON; desactiva_raton(); Imprime_Boton_i(Botones[psec+Pulso-1]); Anclar_Raton_PLC(); // delay(10); if( Push == ON && True_Push == ON ) Deprime_Image(Botones[psec+Pulso-1]); Push = OFF; Imprime_Boton(0, Botones[psec+Pulso-1]); activa_raton(); return Pulso; } } return (0); } void Anclar_Raton_PLC(void){ union REGS io; io.x.ax = 3; do { int86(0x33, &io, &io); Ejecuta_Programa_BETA(); } while( (io.x.bx & 1)==1 || ((io.x.bx >> 1) & 1)==1); } void remapea_relojes(void) { int i, ch; for( i=0; i<200; i++ ) Ram -> _Ld[i].Bit = 0; for( i=0; i<9999; i++ ) Ram -> Pre_Ld[i].Bit = 0; for(ch=0;ch<10;ch++ ) for( i=0; iHr[i][ch].Bit; for(ch=0;ch<10;ch++ ) for( i=0; iRi[i][ch].Bit; for(ch=0;chTr[ch].Bit; for(ch=0;ch_Cnt[ch].Bit; for(ch=0;ch_Tim[ch].Bit; /* for(ch=0;ch<3;ch++ ) Ram ->Bt[i].Bit = 1; */ for(ch=0;chTim_Cnt[ch] = 0; for(ch=0;ch<3;ch++ ) Ram ->Contador_de_Tiempo[ch] = clock(); }