cmorris
Usuario (Argentina)
Como hacer que nuestro programa hecho en Visual Basic se ejecute en cualquier windows, tenga o no instalado Visual Basic y solucionar el problema del certificado: Que se ejecute en cualquier windows nos dice que es un programa, quiere decir que vamos a tener un instalador, un setup. 1) Crear un formulario en Vsual Basic: Elegimos "Archivo/ Nuevo proyecto". 2) Elegimos "Aplicación de Windows Forms" y le ponemos un nombre. 3) El nombre que le puse es "programa1" y aceptamos para que Visual Basic cree nuestra aplicación. 4) El programa será muy sencillo porque la idea es mostrar como poder ejecutarlo en cualquier windows. Por tal motivo solo voy a colocar un botón. El botón se selecciona del "cuadro de herramientas" que se encuentra oculto a un costado de la pantalla. 5) Arrastramos el botón al formulario y aparecerá como se muestra a continuación. 6) Hacemos doble click en el botón que colocamos para poder agregarle la aplicación que deseamos, en este caso solo va a mostrar un mensaje. El la página que aparece colocamos el siguiente renglón: MsgBox( "Funciona" ) MsgBox() es una función que muestra una ventana con el texto que le agregamos entre las comillas. 7) Ejecutamos nuestro programa, dentro de Visual Basic, y cuando funciona podemos convertirlo para que funcione en cualquier windows. Para ejecutarlo hay que presionar el botón "Iniciar Depuración" que es el típico botón de play en cualquier reproductor. Una vez ejecutado aparece el cuadro de nuestro formulario. Presionamos el botón que tiene el formulario y aparece el mensaje. 8) Como lo mencioné ahora podemos convertir nuestro programa para ejecutarlo en cualquier windows. Para hacerlo lo que voy a hacer es publicar nuestra aplicación, lo cual se hace marcando la opción "Generar" y después "Publicar programa1" En el asistente, la ventana que se abre, indicamos donde se guardará nuestro programa. Hay que presionar la opción "Examinar". En la carpeta que elegimos habrá un setup el cual luego ejecutaremos. 9) Una vez elegida la carpeta presionamos "Finalizar" y esperamos unos segundos. Si presionan "siguiente" en lugar de "Finalizar" tiene acceso a opciones de conexión a internet, para buscar actualizaciones. Posteriormente buscamos en la carpeta que indicamos si fue guardado el instalador de nuestra aplicación, el cual después ejecutamos. 10) Una vez finalizada la instalación nuestro programa es uno más de los que tenemos, el cual se ejecuta al hacerle doble click al ícono que dice "programa1" que es el nombre de nuestra aplicación. Como nuestro programa es uno más como por ejemplo winrar, nero, etc. Lo podemos desinstalar desde panel de control. ------------------------------------------------------------------------------------------------------------------------------------------------------------------ Me había olvidado de un detallito chiquito chiquito pero muy importantito y es !!!!COMO CORREGIR EL PROBLEMA DEL CERTIFICADO!!! Es decir que cuando construyen su programa para que corra en cualquier windows sale un error que dice certificado inválido con un error: 0x2208.... El número sigue pero no me acuerdo. Para solucionarlo hay que hacer; 1) Crear certificado, uno válido. Para ello hay que ir a "Proyecto" y elegir "Propiedades de el nombre de nuestro programa" que sería "Propiedades de programa1" Dentro de las propiedades elegimos la que dice "Firma" y seleccionamos el botón que dice "Crear certificado de prueba" cuando lo hacemos nos pedirá que escribamos una contraseña, la inventamos, y luego la volvemos a copiar. Al finalizar aparecerá una imagen con una llave en el explorador de soluciones. 2) Ahora sí podemos de nuevo intentar crear nuestro programa para que corra en cualquier windows. Los pasos son los que ya explique más arriba así que sólo coloco las imágenes. Espero que les sirva. Saludos.
En este Post voy a describir como leer archivos de excel, ya sean la versión 97-2003 que son los "xls" o la versión moderna correspondientes a los "xlsx". A demás mostraré como escribir en archivo excel lo que conlleva a crear uno en primer lugar. 1) Leer archivo excel "xls" El archivo de excel que muestro es el siguiente; Calibracion_H.xls Como pueden observar hay números en las columnas A y B a partir de la fila 3. El objetivo es leer el archivo y tomar esas dos columnas. Primero voy a escribir una función, el famoso archivo .m, y en su interior le indico que archivo leer. function []=hern(w) %----------- Leer archivo Excel ------------------ a= xlsread('C:/Users/cristian/Downloads/postt/Calibracion_H.xls'); En este post puse la barra que usamos para dividir porque no aparece la barra inclinada para el otro lado. La función xlsread como su nombre lo indica lee el archivo. En su interior directamente coloqué el archivo y su ubicación, el mismo se encuentra dentro de la carpeta postt la cual está en descargas. Una vez que tenemos los números de todas las columnas del archivo excel en la matriz "a" solo queda como utilizar esos datos. Cada columna del archivo excel es una columna de la variable "a". Entonces para tomar la columna A del archivo excel simplemente elegimos la columna 1 de la matriz "a". En resumen, leer columna A; a( :, 1) Para leer la columna B del archivo excel, que ahora es la segunda columna de la matriz "a" simplemente; a( :, 2) En la función .m de Matlab voy a dibujar las dos columnas como si fueran los ejes X e Y. plot(a(:, 1), a(:, 2)) Hasta el momento el archivo de matlab, que lee al archivo excel, queda. function []=hern(w) %----------- Leer archivo Excel ------------------ a= xlsread('C:/Users/cristian/Downloads/postt/Calibracion_H.xls'); plot(a(:,1), a(:,2)); 2) Leer archivo excel "xlsx" El procedimiento es exactamente el mismo la única diferencia es que aclaramos su tipo como "xlsx". El archivo excel xlsx que voy a leer es Monte Carlo. xlsx a la función en matlab se le agrega el siguiente renglón; W1= xlsread('C:/Users/cristian/Downloads/postt/Monte Carlo.xlsx'); Y leo la columna I del archivo excel. Recuerden que hay que contar las columnas, en consecuencia la columna I corresponde a la novena columna de la matriz W1. W1(:, 9) La función en matlab resulta hasta el momento; function []=hern(w) %----------- Leer archivo Excel ------------------ a= xlsread('C:/Users/cristian/Downloads/postt/Calibracion_H.xls'); plot(a(:,1), a(:,2)); x0=length(a(:,1)); figure, plot(a(83:1:x0, 1), a(83:1:x0, 2)); W1= xlsread('C:/Users/cristian/Downloads/postt/Monte Carlo.xlsx'); figure, plot(W1(:, 9)); En el último renglón dibujo la columna I, siendo la misma la novena columna de la matriz a. 3) Como escribir archivos excel "xls" o "xlsx" Hasta el momento tenemos los dos archivos excel que leíamos. Para escribir archivos "xls" usamos la función xlswrite(); Desde luego primero se decide que poner en el archivo excel, en este caso utilizo la función "rand()" para generar algunos datos aleatoreos. El nombre del archivo xls será; Escribir_xls.xls A demás le indico donde colocar estos datos, los cuales son un vector de mil filas y una columna. Entonces pongo dicho vector en la columna B de excel. r=rand(1000, 1); [q, e]= xlswrite('C:UserscristianDownloadsposttEscribir_xls.xls', r, 'B','B1'); Dentro de la función para escribir la famosa xlswrite() especifico en qué columna y a partir de qué fila comienza a poner los datos. La primer letra B indica la columna. La segunda, donde dice 'B1' indica la fila. Si quisiera escribir en la columna D a partir de la fila 4 sería; [q, e]= xlswrite('C:/Users/cristian/Downloads/postt/Escribir_xls.xls', r, 'D','D4'); Archivos xlsx; Para escribir archivos excel "xlsx" se procede igual, con la salvedad de aclarar que va a ser xlsx. [q2, e2]= xlswrite('C:/Users/cristian/Downloads/postt/Escribir_xlsx.xlsx', r, 'B','B1'); Acotando escribo dos archivos uno xls y otro xlsx la función en matlab resulta ser; function []=hern(w) %----------- Leer archivo Excel ------------------ a= xlsread('C:/Users/cristian/Downloads/postt/Calibracion_H.xls'); plot(a(:,1), a(:,2)); x0=length(a(:,1)); figure, plot(a(83:1:x0, 1), a(83:1:x0, 2)); W1= xlsread('C:/Users/cristian/Downloads/postt/Monte Carlo.xlsx'); figure, plot(W1(:, 9)); %----------- Escribir Archivo Excel---------------- r=rand(1000, 1); [q, e]= xlswrite('C:/Users/cristian/Downloads/postt/Escribir_xls.xls', r, 'B','B1'); [q2, e2]= xlswrite('C:/Users/cristian/Downloads/postt/Escribir_xlsx.xlsx', r, 'B','B1'); No todo el mundo se destaca por su premio nobel, no?. Algunos usamos otras cosas. XD Saludos;
Es un problema común con los servidores en nuestra PC, lo bueno que es fácil de solucionar. Hay que ir a "Inicio" y tipear "msconfig". si tienen windows XP primero van a ejecutar y en él escriben "msconfig". Lo importante es llegar al programa msconfig y en él vamos a la parte de "Servicios". Donde buscamos; wampapache wampmysqld Los mismos aparecen destildados y naturalmente hay que tirdarlos como sigue. Al final aplicamos los cambios y reiniciamos. Espero que les sirva. Saludossss. XD Post data: No toquen el programa, nada de modificar el puerto de enlace 80.
Crear, mover y escribir en archivo ".txt" en visual Basic durante la ejecución del programa. Se lo puede usar para realizar una adquisición de datos en tiempo real. Por el momento no voy a cambiar de nombre el archivo en este post. 1) Crear un formulario en Visual Basic en "Archivo" luego "Nuevo proyecto" y cuando se abre el asistente elegir "Aplicación de Windows Forms". 2) Para poder crear, mover y escribir un archivo voy a usar funciones de visual las cuales se encuentran en librerías y hay que declararlas. Sino no funciona y son: "System" "System.IO" "System.IO.StreamWriter" Cuando se abre la aplicación hay que hacer doble click en el formulario y aparece una página donde se escribe el código de las librerías y va fuera de "Public Class Form1" 3) Antes de crear el archivo, donde se guardan los datos, primero hay que crear una carpeta para almacenar en ella el archivo así queda ordenado. Una carpeta es en realidad un directorio. Voy a crear la carpeta dentro de "Mys Documentos" la carpeta principal. Para hacerlo primero hay que saber la dirección de la misma y se usa la función; "My.Computer.FileSystem.SpecialDirectories.MyDocuments" Que devuelve la dirección de la carpeta Mys documentos y se la asignamos a una variable String la cual llamo "Datos" Para crear una carpeta usamos la función "My.Computer.FileSystem.CreateDirectory()" dentro de la función anterior colocamos donde se creará la carpeta. La carpeta la llamo "Libros" y se crea dentro de Mys documentos. Por lo que hay que anexar el contenido de "Datos" y el nombre de la carpeta a crear para eso uso "&". El nombre de la carpeta lleva primero " " que es el signo de división pero inclinada para el otro lado. Quedando como sigue; My.Computer.FileSystem.CreateDirectory( Datos & " Libros" ) En la imagen siguiente de ve el signo de división que falta. Hasta ahora solo hice una carpeta dentro de Mys Documentos. Lo que sigue es realmente crear el archivo dentro de la carpeta "Libros" que se llama "Notas". Para crear un archivo uso la función; File.CreateText() Dentro del paréntesis va la dirección donde crear el archivo y es; Datos & " Libros Notas" Para no estar copiando cada rato la dirección del archivo defino la variable "ruta" la cual contiene dicha dirección como un String. Antes de crear el archivo hay que hacer unas definiciones y son: Dim ruta As String = Datos & "LibrosNotas.txt" Dim fi As FileInfo = New FileInfo(ruta) Dim sw As StreamWriter "fi": contiene la dirección de nuestro archivo a crear. "sw": Lo vamos a usar para escribir en el archivo. Crear el archivo; If File.Exists(ruta) = False Then sw = File.CreateText(ruta) sw.WriteLine( "Tiempo: valor:" ) sw.Flush() sw.Close() End If El if es para preguntar si existe el archivo a crear, si ya existe no se vuelve a crear. El "WriteLine()" es para escribir en el archivo. La programación que va dentro del formulario es; Si ejecutan el archivo verán que dentro de Mys Documentos se crean la carpeta llamada "Libros" y en su interior se encuentra el archivo "Notas" Hasta ahora se creó una carpeta y un archivo llamados "Libros" y "Notas". 4) Escribir y guardar en el archivo durante la ejecución: Supongamos que queremos hacer una adquisición de datos en tiempo real y para ello necesitamos una rutina que se ejecute cada cierto tiempo, lo cual hacemos con la función Timer de visual basic. Para agregar un Timer al formulario lo elegimos del "Cuadro de Herramientas" y lo arrastramos al formulario, donde se pega en la parte inferior del cuadro y fuera del mismo. Hacemos doble click en el ícono del reloj y aparece la ventana de programación con la rutina " Timer1_Tick " y la que dice " InitializeTimer() " uno la tiene que tipear. Dentro de la segunda se colocan los parámetros del Timer que son; El intervalo de tiempo(Cada cuanto se ejecuta) " Timer1.Interval " Y que no se ejecute al iniciar el programa al depurarlo. " Timer1.Enabled = True " Dentro de " Timer1_Tick " colocamos la rutina que queremos realizar la cual será escribir dos columnas una que lleve el tiempo y otra que tenga una valor que simula la adquisición de datos. Para empezar llevar el tiempo de la ejecución implica utilizar una variable que no se borre al terminar la rutina "Timer" y se logra utilizando variables globales. Se declaran fuera de las subrutinas y dentro de " Public Class Form1 " como se muestra; Public i As Integer = 0 Public t As Double = 0 Una vez declaradas las variables globales es hora de hacer la sub rutina Timer. Lo primero es buscar el archivo a escribir que se encuentra dentro de la carpeta "Libros" lo hacemos con; Dim Datos As String = _ My.Computer.FileSystem.SpecialDirectories.MyDocuments Dim ruta As String = Datos & "LibrosNotas.txt" ' El archivo notas se guarda dentro de Libros. Dim fi As FileInfo = New FileInfo(ruta) Dim sw As StreamWriter Con la variable " i " vamos incrementando el tiempo y con " t " ajustamos el valor para que quede en segundos. Dado que el tiempo de reiteración de la rutina Timer es de 100mseg. t = i / 10 i = i + 1 Con la función " Convert.ToString( ) " convertimos el número en String así lo podemos escribir en el archivo con la función " WriteLine() ". Convert.ToString(t) Con la variable "g" pasamos los datos que se escribirán en el archivo. g = j & " " & k Con " Label1.Text " mostramos en el formulario el tiempo transcurrido. Donde primero pegamos un " Label " en el formulario desde la caja de herramientas. Label1.Text = j dentro de la rutina Timer en lugar de asignarle a la variable " r " un valor constante se le puede asignar el valor leído del puerto paralelo lo cual funciona sin problemas. Primero tienen que abrir el puerto al iniciar el programa, dentro de la rutina " Form1_Load ". Lo único que falta es iniciar y detener la ejecución de la rutina repetitiva con dos botones, uno inicia y el otro detiene. Para eso agregamos dos botones al formulario. Al ejecutar el programa aparece el formulario; Una vez que detenemos y cerramos la aplicación buscamos si realmente quedó guardado el archivo con las dos columnas. Otro método es utilizar Base de datos, pero deben tener bien instalado el Visual Basic o les puede negar su uso, lo cual me sucedió. Espero que les sirva. Saludos.

Como solucionar el problema por el cual uno no puede conectarse con la base de datos creada en nuestro servidor local, localhost. El servidor es: Wampserver. El diseñador de páginas: Dreamweaver CS5. En primer lugar muestro el problema con imágenes. La solución es mucho más sencilla de lo que parece. Sin embargo no aparece por ningún lado, en internet, porque los tutoriales presuponen que somos personas muy honestas e instalamos los programas como debe ser Ahora uno que es lo que quiere hacer, en realidad, CONECTARSE con la base de datos y eso no suena a internet ?. Pues nuestro bonito antivirus, por "alguuuuuunaaaa misteriosa razón" bloquea el acceso a internet a dreamweaver. ¿Será para que no se conecte con adobe?. En consecuencia no puede "conectarse" con la base de datos. Para solucionarlo simplemente hay que permitirle el acceso a internet, firewall, desde luego que tiene que estar funcionando el servidor wampserver. No es el error que cometen pero por las dudas coloco como configurar el servidor de pruebas, la carpeta raíz de ambos, etc. En el disco "C" hay una carpeta llamada "wamp" en su interior hay otro de nombre "www" Dentro de la carpeta "www" es donde creamos otra con el nombre que nos recuerde el sitio que contendrá, es decir dentro de la carpeta que creamos va estar es sitio. Dicha carpeta la llamo "slayers2" Es momento de dirigirnos a dreamweaver y crear un sito, el cual va estar dentro de la carpeta slayers2. En mi caso yo la tengo de antes por eso solo muestro modificar el sitio, ustedes colocan la opción nuevo sitio y siguen los pasos. Colocan el nombre del sitio y buscan la cartepa que se creó dentro de "www" la que llamé "slayers2" Despues van a servidores, se encuentra en la columna de la izquierda, marcan la opción servidor de prueba. En la imagen es la columna que dice "De pru..". A demás deben asignarle una carpeta raíz y un URL, eso se hace haciendo click sobre el dibujo del lápiz teniendo seleccionado el servidor llamado localhost. Buscan una vez más la carpeta slayers2, dentro de "www" y la seleccionan para que sea la carpeta del servidor, la cual es la misma carpeta que el sitio local. Quedando; C:/wamp/www/slayers2/ Falta colocar la URL siendo, la cual lo deben escribir; http://localhost/slayers2/ En opciones avanzadas marcan sobre servidor de prueba la tecnología que van a utilizar "PHP MySQL" y listo Esto fue todo me despido temporalmente Felices vacaciones.

Cuando uno utiliza alguno de los exploradores la resolución y los colores varían de tal manera que empeora la imagen de una forma terrible. Desde luego que voy a explicar como solucionarlo. XD Las dos imágenes que siguen muestran el antes y el después. Antes de usar, por ejemplo, Google Chrome: Al ejecutarlo: Para solucionarlo es muy sencillo. Primero vamos a inicio y buscamos el navegador, en mi caso lo muestro con google chrome, le hacemos click con el botón derecho y elegimos propiedades. Una vez abierta la ventana vamos a Compatibilidad donde aparecen tildadas las opciones; "Ejecutar con 256 colores" "Ejecutar con una resolución de pantalla de 640 x 480" Dichas opciones hay que destildarlar y simplemente hacer click en el botón aplicar y listo. Para teminar muestro como se ve el explorador. El problema no tiene nada que ver con el windows. Saludooooooooooooooossssssss.
Como armar un bloque programado en lenguaje C para que funcione en tiempo real:Voy a hacer solamente un controlador PI para no complicarme la vida. Va a tener una entrada de ancho dos, como si tuviera dos entradas pero es un vector. Va a integrar la diferencia entre las señales de entrada y las multiplica por la ganacia posteriormente las suma. Sigue ma siguiente ecuación;Salida = Kp.(entrada1 - entrada2) + Ki. ( integral(entrada1 - entrada2) )Una vez que abren Matlab, el mio es el 2010 en windows 7, tiene que crear un modelo en simulink para colocar los bloques que necesitan. Los bloques que coloco son; Una s-function, Una fuente constante y un osciloscopio. En la imagen sólo aparece la s-function.Para escribir lo que tiene que hacer la s-function uso el programa DEV C++. Cuando programen el bloque s-function en lenguaje C deben escribir lo siguiente:# define S_FUNCTION_NAME taringa# define S_FUNCTION_LEVEL 2# include "simstruc.h"# include "conio.h"# define MDL_INITIALIZE_CONDITIONS# define MDL_UPDATE# define U(element) (*uPtrs)/* Aquí va el programa. */#ifdef MATLAB_MEX_FILE#include "simulink.c"#else#include "cg_sfun.h"#endifAhora hago algunos comentarios al respecto.---El primer renglón dice # define S_FUNCTION_NAME taringa y "taringa" es el nombre del archivo que guardan, también es el nombre del bloque s-function, pero no es el nombre del archivo del modelo en simulink, si lo hacen les tira error.---El quinto renglón dice # define MDL_INITIALIZE_CONDITIONS "MDL_INITIALIZE_CONDITIONS" declara que van a darle condiciones iniciales a la simulación que realizarán.---El sexto renglón dice # define MDL_UPDATE "MDL_UPDATE" es para usar veriables de estado.---El renglón que dice # define U(element) (*uPtrs) es muy importante les vá a servir para cuando hagan cuentas con vectores. Cada componente de la matriz "U" tiene almacenada el valor cada una de las entradas. Mucho más importante es para que no se les cuelgue la compu cuando ejecuten el programa.Los últimos renglones son para usar uno de los archivos que están entre comillas. Dentro del espacio libre, en el medio, se escribe el programa.Ahora hay que declarar todo lo necesario para que funcione el programa en simulink.static void mdlInitializeSizes(SimStruct *S){ }static void mdlInitializeSampleTimes(SimStruct *S){ }static void mdlInitializeConditions(SimStruct *S) { }static void mdlUpdate(SimStruct *S, int_T tid) { }static void mdlOutputs(SimStruct *S, int_T tid){ }static void mdlTerminate(SimStruct *S){ }Quedando en el programa DEV C++.Comentarios;---mdlInitializeSizes ---------- Es para especificar las entradas, salidas, declarar veriables de estado y cuantas, etc.---mdlInitializeSampleTimes ---------- Es para el tiempo de muestreo si lo usan o indicarle que lo herede del programa en simulink.---mdlInitializeConditions ------------ Es para las condiciones iniciales. ---mdlUpdate ------------- Es para escribir la matriz de las variables de estado. Xdev = A.x + B.u---mdlOutputs ------------- Es para escribir la fórmula que calcula la salida. Y = C.x + D.u---mdlTerminate -------------- Es para cuando cierran el programa como quieren que termine el sistema, ejemplo que la salida sea nula.Ahora hay que llenar cada uno, empiezo con la especificación de entradas, salidas, etc del bloque. Entre /*--- */ escribo algunos comentarios para darle las dimensiones al bloque que usaremos en la s-function.static void mdlInitializeSizes(SimStruct *S){ ssSetNumSFcnParams(S, 0); /* Sin parámetros. */ ssSetNumContStates (S, 0); /* Sin estados contínuos. */ ssSetNumDiscStates (S, 1); /* Un estado discreto. */ ssSetNumInputPorts(S, 1); /* Con un puerto de entrada.*/ ssSetInputPortWidth(S, 0, 2); /* Ancho del puerto 2.*/ ssSetInputPortDirectFeedThrough(S, 0, 1); ssSetInputPortDirectFeedThrough(S, 0, 2); ssSetNumOutputPorts(S, 1); /* Un puerto de salida.*/ ssSetOutputPortWidth(S, 0, 1); /* Ancho del puerto 1.*/ ssSetNumSampleTimes(S, 1); ssSetNumRWork (S, 0); ssSetNumIWork (S, 0); ssSetNumPWork (S, 0); ssSetNumModes (S, 0); ssSetNumNonsampledZCs (S, 0); ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);}Hay que usar tiempo discreto, elijo un periodo de muestreo de 4ms. El valor mínimo que pueden poner depende de la capacidad de su compu.static void mdlInitializeSampleTimes(SimStruct *S){ ssSetSampleTime(S, 0, 0.004); //INHERITED_SAMPLE_TIME); ssSetOffsetTime(S, 0, 0.0);} Lo que dice "INHERITED_SAMPLE_TIME" es si quieren que el bloque s-function use el tiempo de muestreo de simulink.Lo que sigue son las condiciones iniciales, por lo general son nulas. Es una condición inicial por cada variable de estado.static void mdlInitializeConditions(SimStruct *S) { real_T *x0 = ssGetRealDiscStates(S); *x0 = 0.0; }Comentarios;--- ssGetRealDiscStates --------- tiene acceso a las variables de estado discretas. Se trabaja con punteros por eso el asterisco. Sigo con el cálculo de la variable de estado.static void mdlUpdate(SimStruct *S, int_T tid) { real_T w=0; real_T *x = ssGetRealDiscStates(S); InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S, 0); int_T g = 1; w = x[0] + 0.01 * g*(U(0) - U(1)); x[0] = w; }En primer lugar el cálculo se hace en una variable auxiliar, llamada "w", y después se pasa a la variable de estado. Todo es para que no se les cuelgue la compu. En realidad les saldría la famosa pantalla azul.En segundo la variable "U()" es la que declaramos en un principio tiene acceso a cada entrada para hacer las cuentas. Por ejemplo si queremos que la variable de estado sea tres veces la primer entrada escribimos "w = 3* U(0)" luego copiamos a "w" en "x".Después " U(0)-U(1) " es simplemente la resta de la primer entrada con la segunda. "g" es sólo un número. "x[0]" es el valor anterior de la variable de estado la cual vamos a actualizar con la fórmula.Lo que sigue es calcular la salida;static void mdlOutputs(SimStruct *S, int_T tid){ real_T *y0 = ssGetOutputPortRealSignal(S, 0); /* Puntero para la salida.*/ InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S, 0); /* Puntero para la entrada.*/ real_T *x = ssGetRealDiscStates(S); /* Acceso a la variable de estado. */ int_T kp = 1; y0[0] = x[0]+ kp*(U(0)-U(1)); }---ssGetOutputPortRealSignal ----- tiene acceso a la salida, escribe en ella a través del puntero " *y0 ".---InputRealPtrsType uPtrs ----- es la clásica declaración del puntero a la entrada la cual es necesaria porque uso a "U".--- real_T --- en vez de declarar la variable como entera, int, se la declara como "real_T" es sólo para que el programa declare la variable como más le guste.Por último es la terminación la pueden dejar vacía o no.Ahora hay que regresar a Matlab. Como había dicho anteriormente el archivo de simulink no debe tener el mismo nombre que el bloque s-function.Antes de hacer simulaciones tenemos que indicarle a Matlab donde se encuentra el archivo que describe al bloque s-function. En mi caso puse dicho archivo dentro de una carpeta llamada "post". Para buscarla hay que hacer un click al botón que tiene los tres puntos.Ahora lo que sigue es la preparación para compilar el archivo en lenguaje C que llamamos "taringa" el cual realiza las operaciones del bloque s-function. Para compilarlo primero tenemos que decirle a Matlab que compilador usar puede ser Watcom, Lcc, etc. En mi caso uso el Lcc y lo hago con la instrucción;>>mex -setupEligen la opción "y" y presionan enter luego escriben un "1" y de nuevo enter. Si eligen "n" les aparece una lista de todos los compiladores compatibles con su matlab, pero no indica cuales están instalados.Después les pide confirmar donde está instalado el compilador le dicen que si y listo. Una vez elegido el compilador lo utilizan como lo hago a continuación, si está todo bien no les tira los mensajes en rojo;>> mex taringa.c>>Cuando guardan el archivo en lenguaje C háganlo como ".c" no como ".cpp"Lo siguiente es activar el sistema para usar a Matlab en tiempo real y es como sigue;>>rtwintgt -setupy Matlab hace el resto.Continuo asignando al bloque s-function el archivo C llamado "taringa.c" para hacerlo hay que darle doble click al bloque y aparece una ventana donde escriben el nombre del archivo C y le dan ok.Hay que realizan una prueba en tiempo normal para ver si funciona y después lo ejecutan en tiempo real. En la ventana del modelo en simulink llamado "taringa_no" vamos a;Simulation -> Configuration Parameters... le damos click y aparece la siguiente ventana.Donde seleccionan el modo "Fixed-Step" y colocan el tiempo de muetreo de 4ms, está escrito en segundos 0,004. Le dan play y después hacen doble click en el osciloscopio.Una vez que realiza lo que quieren podemos hacerlo correr en tiempo real.En la ventana del modelo en simulink vamos a;tools ->Real-Time WorkShop -> Build Model y hacemos click. Para construir lo que necesita el modelo.Por último falta la configuración del real time. Vamos a; Simulation -> Configuration Parameters... y en la ventana que aparece elegimos "Real-Time WorkShop" en la lista que aparece al costado seleccionamos el target, el cual ejecuta el programa en tiempo real. Elijo el famoso "Real Time Windos Target" presionando el botón que dice "Browse.." y en la ventana que aparece lo busco.Le damos OK y esperamos un poquito.Cada vez que modifiquen el archivo .c, el llamado "taringa.c", hay que reconstruir todo. Desde el "mex taringa.c" y todo lo que sigue. Ahora si lo ejecutamos en tiempo real, primero hay que conectarlo, presionando el botón que parece un enchufe y luego le dan play.Post data: El principal problema que tiene es que los punteros escriben en una zona ajena a la que tiene el programa habilitada y les aparece la pantalla azul, para solucionarlo tiene que hacer los cálculos en variables auxiliares y luego lo copian a la salida o a la variable de estado.Les dejo algo nada que ver con esto............. Chau. En un archivo ".m" hay que escribir el programa, donde uno lo coloca en casos: case 1:case 2:......Cada uno de estos casos corresponde a los bloques de programa en lenguaje ".c", que es el post.Los bloques son:static void mdlInitializeSizes(SimStruct *S) { } static void mdlInitializeSampleTimes(SimStruct *S) { } static void mdlInitializeConditions(SimStruct *S) { } static void mdlUpdate(SimStruct *S, int_T tid) { } static void mdlOutputs(SimStruct *S, int_T tid) { } static void mdlTerminate(SimStruct *S) { } Comienzo con una breve explicación:function [sys, x0, str, ts] = taringa (t, x, u, flag)switch flag,case 0, // Es para inicializar la s-function, no funciona en tiempo real al ser un ".m" sizes = simsizes; sizes.NumContStates = 0; // Sin estados continuos. sizes.NumDiscStates = 1; // Un estado discreto. sizes.NumOutputs = 1; // Una salida. sizes.NumInputs = 1; // Una salida. sizes.DirFeedthrough = 1; // Es de paso directo. sizes.NumSampleTimes = 1; // Tiempo de muestreo = 1. sys = simsizes(sizes); // Se crea una estructura de datos para la s-function. x0 = [0]; // Condición inicial. str = []; ts = [0];case 1, // Es para calcular las derivadas continuas. sys = []; // Se pone la fórmula para la derivada.case 2, sys = []; // Para calcular derivadas discretas.case 3, // Calcula la salida. sys = [];case 4, // Llamada para calcular la próxima iteración. sys = [];case 9, // Es para finalizar, cuando uno cierra el programa se ejecuta este caso. sys = [];otherwise, // Cuando hay un error, no se reconoce el flag. error(['flag no conocido =', num2str(flag)]); endUna vez que están todos los casos hay que pasarlos al archivo ".c" de la siguiente manera;Coloco en columnas al caso que se relaciona con el bloque del archivo ".c"Y así sigue no??????????.Con esto podes empezar.

En primer lugar utilizando visual c++2008 express edition no se puede ejecutar en tiempo real, para hacerlo hay que tener visual c++ 2010 professional. La ejecución del programa es en tiempo normal. Tienen que tener, desde luego, Matlan 2010 y visual c++ 2008. Voy a poner los accesos directos en el escritorio para que los vean. Primero hay que abrir visual c++ 2008 y hacer un archivo nuevo como muestro a continuación. Eligen "Aplicación de Consola Win32" y escriben el nombre del archivo. El mio lo llamo "visual_y_matlab". Cuando aparece el asistente colocan "siguiente" y les aparece la ventana "Configuración de la Aplicación" donde seleccionan la "Biblioteca de Vínculos", que corresponde a los archivos (.dll) A continuación hay que crear un archivo ".def" y eso se hace en la carpeta "Archivo de Encabezados" con un click en el botón derecho y seleccionan un nuevo elemento. En la ventana que aparece eligen "Archivo de encabezado(.h)" y cuando escriben el nombre del archivo literalmente hay que tipearlo con el punto def, es decir escriben explícitamente "visual_y_matlab.def". Si no escriben el nombre del archivo con el ".def" visual c++ lo guarda como si fuera un ".h", lo cual no sirve. Dentro del archivo ".def" hay que escribir; LIBRARY visual_y_matlab EXPORTS mexFunction Después de LIBRARY va el nombre del archivo. Y eso sería todo. Ahora hay que agregar un nuevo elemento, un archivo código fuente. El procedimiento es igual a lo anterior nada más que ahora el archivo es ".cpp", lo cual se muestra en las dos imágenes siguientes. Una vez que crearon los dos archivos recien se puede ir a las propiedades del archivo y es como lo muestra la imagen que sigue. En la ventana que surge se elige "Propiedades de configuración" y se despliega la columna que aparece en la segunda imagen. Es importante destacar que no aparece la fila "C/C++" si no está el archivo de código fuente ".cpp". Dentro de la fila "C/C++" hay que elegir "general--->Directorios de inclusión adicionales" y hacer un click en el cuadrito con los tres puntos. Aparece una ventana donde se crea una carpeta, hay que hacer click en la carpetita, y precionar el cuadrito con los tres puntos. Luego se busca la carpeta "include" que se encuentra en; C/Archivos de programa/MATLAB/R2010a/extern Una vez que la encuentrar solo hay que aceptar y aceptar. Dentro de "C/C++" ahora se selecciona "Procesador" para llegar a "Definiciones del procesador" En la ventana que surge se escribe "MATLAB_MEX_FUNCTION". Después solo hay que aceptar. Después vamos a "Vinculador" y en su interior seleccionamos "General" para llegar a "Archivo de resultados". Hacemos click en la fila que indica $(OutDir)/$(ProjectName).dll Borramos la parte que dice (ProjectName).dll y escribimos el nombre de nuestro archivo con ".mexw32" como se muestra en la imagen. Dentro de "Vinculador" y "General", en el mismo lugar, ahora elegimos la fila que dice "Directorios de Bibliotecas Adicionales" y hacemos click en el cuadrito con los tres puntos. En la ventana que surge buscamos la carpeta "microsoft" dentro de matlab su ubicación es; C/Archivos de programa/MATLAB/R2010a/extern/lib/win32 Después solo queda aceptar. Debajo de "General" seleccionamos la opción que dice "Entrada" y vamos a "Dependencias Adicionales". Luego hacemos click en el cuadrito con los tres puntos. En la ventana que surge escribimos las tres librerías necesarias, las cuales son; libmat.lib libmex.lib libmx.lib Y solo queda aceptar. Ahora vamos a "Archivos de definición de módulos" con el objeto de indicar que se incluya el archivo de definición, ".def". Siempre es lo mismo, hacer click en el cuadrito con los tres puntos. En la ventana que aparece escribimos el nombre del archivo de definición que habíamos llamado "visual_y_matlab.def". después aceptamos. Es momento de entrar en Matlab. Hay que indicarle la ubicación del archivo hecho en visual C++ 2008. Su ubicación es; Documentos/Visual Studio 2008/Projects/visual_y_matlab/visual_y_matlab La carpeta visual_y_matlab va dos veces. Seleccionamos el compilador Visual C++ 2008 de la siguiente manera. >>mex -setup Y elegimos el número dos. Creamos un archivo para simulink como sigue. También falta compilar el archivo "visual_y_matlab.cpp" donde se escribe en Matlab mex seguido del nombre del archivo hecho en visual C++ 2008 con la extensión ".cpp" y se hace como sigue; >>mex visual_y_matlab.cpp >> Colocamos una s-function y dos generadores de valor constante. En la s-function hacemos doble click y escribimos el nombre del archivo de visual C++ 2008 no es necesario el ".cpp" Hay que ajustar el tiempo de simulación, el cual puse 200ms. En Matlab se escribe en segundos, es decir 0,2. Hasta el momento no coloqué el contenido del archivo de visual C++ 2008 porque el objetivo de este post es explicar como simular archivos del Visual en Matlab. Lo que está escrito en el archivo de visual C++ es lo siguente; # define S_FUNCTION_NAME visual_y_matlab # define S_FUNCTION_LEVEL 2 # include "simstruc.h" # include "conio.h" # define MDL_INITIALIZE_CONDITIONS # define MDL_UPDATE # define U(element) (*uPtrs) static void mdlInitializeSizes(SimStruct *S) { ssSetNumSFcnParams(S, 0); /* Sin parámetros. */ ssSetNumContStates (S, 0); /* Sin estados contínuos. */ ssSetNumDiscStates (S, 1); /* Un estado discreto. */ ssSetNumInputPorts (S, 1); /* Con puerto de entrada.*/ ssSetInputPortWidth (S, 0, 2); /* Ancho del puerto 2.*/ ssSetInputPortDirectFeedThrough (S, 0, 1); ssSetInputPortDirectFeedThrough (S, 0, 2); ssSetNumOutputPorts (S, 1); /* Un puerto de salida.*/ ssSetOutputPortWidth (S, 0, 1); /* Ancho del puerto 1.*/ ssSetNumSampleTimes(S, 1); ssSetNumRWork (S, 0); ssSetNumIWork (S, 0); ssSetNumPWork (S, 0); ssSetNumModes (S, 0); ssSetNumNonsampledZCs (S, 0); ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE); } static void mdlInitializeSampleTimes(SimStruct *S) { ssSetSampleTime(S, 0, 0.2); ssSetOffsetTime(S, 0, 0.0); } static void mdlInitializeConditions(SimStruct *S) { real_T *x0 = ssGetRealDiscStates(S); *x0 = 0.0; } static void mdlUpdate(SimStruct *S, int_T tid) { real_T w=0; real_T *x = ssGetRealDiscStates (S); InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs (S, 0); int_T g = 1; w = x[0] + 0.01 * g*(U(0) - U(1)); x[0] = w; } static void mdlOutputs(SimStruct *S, int_T tid) { real_T *y0 = ssGetOutputPortRealSignal (S, 0); /* Puntero para la salida.*/ InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs (S, 0); /* Puntero para la entrada.*/ real_T *x = ssGetRealDiscStates (S); /* Acceso a la variable de estado. */ int_T kp = 1; y0[0] = x[0]+ kp*(U(0)-U(1)); } static void mdlTerminate(SimStruct *S) { } #ifdef MATLAB_MEX_FILE #include "simulink.c" #else #include "cg_sfun.h" #endif Seguramente se dieron cuenta que copié el archivo del post donde explicaba como simular archivos en tiempo real en lenguaje c. Que puedo decir fui seducido por el copiar y pegar. La explicación de lo que está en el archivo de visual C++ está en otro post que había hecho. No hice muchos así no les va costará encontrarlo. Para mantener la costumbre. Saludos.
El analizador de redes vectorial proporciona información sobre el comportamiento de un dispositivo cuando este recibe, por alguna de sus entradas, una señal eléctrica. En otras palabras indica cuanto de esta señal logra salir por las otras entradas o salidas y cuanto simplemente es reflejado por la misma entrada que recibió la señal. La cantidad de señal reflejada por la misma entrada que recibió la señal va a depender de cada frecuencia y puede tener un defasaje. La cantidad de señal que logra salir por una entrada o salida diferente a la que entró la señal también depende de la frecuencia en particular. Para describir cuanto y con qué fase se obtiene en cada entrada o salida del dispositivo se utilizan los parámetros "s". Dichos parámetros s tienen un valor de magnitud y fase para cada frecuencia en cuestión. El caso típico es el cuatripolos, dos entradas y dos salidas. En la figura anterior se muestran los cuatros parámetros S correpondientes al cuatripolos. Como lo he dicho cada uno tiene su módulo y fase en las distintas frecuencias, como un espectro. 1) Cómo medir con el analizador de redes: En primer lugar el analizador de redes por lo menos tiene, como mínimo, dos puertos para realizar las mediciones. Sin embargo hay que destacar cuando se refieren a un analizador de un puerto se refieren a la calibración, sólo se puede calibrar un puerto, mientras que con un analizador de dos puerto se indica que se le puede calibrar los dos puertos. En resumen para medir hay que conectar los dos puertos de analizador utilizando los cables correspondientes. Para que la medición sea válida es necesario calibrar el instrumento. Lo cual explico al final al ser la parte más larga. a) Cómo conectar el instrumento; Supongamos que se tiene un dispositivo de una entrada y dos salidas, como los que se utilizan para enviar la señal de la televisión por cable a dos televisores, por ejemplo. Entonces conectamos los dos puertos del analizador de redes a la entrada del dispositivo que vamos a medir y a una de sus salidas, como sigue. Se puede observar en la figura anterior el signo de interrogación lo que indica es que debe hacerse con la salida libre. Si decidimos dejarla libre perjudicaría la medición la misma situación sucede si la corto-circuitamos. La solución es colocar una impedancia con el mismo valor que la impedancia característica de la salida libre, el motivo es evitar las reflexiones. Cuando se deja una salida en circuito abierto, es decir libre, la señal que llega desde la entrada por donde ingresa la señal se encuentra con el circuito abierto y rebota "tenemos una reflexión de la señal" y cuando regresa perjudica la medición. La misma situación sucede cuando corto-circuitamos la salida, la única diferencia entre dejar la salida abierta o en corto es el valor de la fase con la que regresa la señal. Para evitar la reflexión de la señal que el analizador de redes inyecta es necesario adapta la salida libre, en otras palabras colocar una impedancia del mismo valor que la característica de dicha salida como sigue. De esta manera se obtiene una medición confiable, siempre y cuando esté correctamente calibrado el instrumento. Se procede de la misma manera cuando se quiere medir la entrada con la otra salida nada más hay que colocar en la nueva salida libre una impedancia con el mismo valor que su impedancia característica. 2) Calibración del Analizador de Redes: El tipo de calibración a realizar depende de el tipo de entradas que posea el dispositivo a medir. La calibración SOLT es para dispositivos con entrada para cables coaxiles. a) Calibración SOLT; Consta de cuatro tipos de calibraciones y son: Calibración Thru, Open, Short y Load. Calibración Thru: Esta calibración es la primera a realizar, lo cual quedará entendido al final de la explicación de las calibraciones. La idea es conectar los dos puertos del analizador, sin el dispositivo de prueba. El inconveniente es que tienen los dos cables coaxiles fichas macho y hay que unirlos con un adaptador hembra hembra. Dicho adaptador introduce un retardo en la señal que mide el analizador durante la calibración thru, lo que se plasma en un corrimiento de fase. No obstante se puede corregir. Calibración Open: La calibración open se realiza solamente en el puerto 1 si el analizador de redes es de un puerto. Si en cambio se trata de un analizador de dos puertos, más caro, la calibración se realiza en los dos puertos. El kit de calibración trae una ficha que tiene un circuito abierto y se conecta como en la figura siguiente. Notarán que el adaptador hembra-hembra no se quitó y es necesario dejarlo. Calibración Short: Al igual que la calibración Open se realiza en los dos puertos si lo permite el tipo de analizador de redes que tengan. Se procede igual que con la calibración open con el detalle de cambiar la ficha del kit de calibración por una de tenga un corto-circuito. Una vez más se deja el adaptador hembra-hembra. Calibración Load: Como en las calibraciones open y short se debe realizar en los dos puertos para un analizador de redes de dos puertos y solamente en el primer puerto para un analizador de un puerto. El procedimiento es el de siempre se coloca una ficha del kit de calibración que simula una carga y se realiza la calibración. Com antes se deja el adaptador hembra-hembra. Una vez realizada los cuatro tipos de calibraciones, "Short, Open, load y Thru" es momento de aclarar la razón de haber empezado con la calibración Thru y es la posibilidad que ofrece el instrumento para quitar el retardo que introduce el adaptador hembra-hembra. Para ser más preciso el instrumento nos muestra tres opciones y son: ------- Ext. Port 1 ------- Ext. Port 2 ------- Delay Thru. Nosotros elegimos "Delay Thru" e introducimos el tiempo de retardo que agrega el adaptador hembra-hembra el cual es conocido al ser un adaptador del kit de calibración y tiene marcado dicho parámetro. Con esto el instrumento elimina el retardo agregado por el adaptador de todas las calibraciones. Aquí ha terminado la calibración del analizador de redes. Sin embargo las opciones "Ext. Port 1" y "Ext. Port 2" son para corregir retardos introducidos cuando los cables coaxiles que utilizamos para la medición no son de la misma longitud, los que se conectan a cada puerto del analizador. 3) La razón de calibrar: La calibración corrige uno de los tres tipos de errores presentes en toda medición. --- Error aleatorio. --- Error sistemático. --- Error derivado. El primero corresponde por ejemplo al ruido, mientras que el segundo es por defectos en el sistema de medición y el tercero puede ser variaciones en la temperatura. La calibración atenúa el error sistemático. Error Sistemático; Corresponde a inperfecciones en todo el sistema de medición, desde problemas de adaptaciones de impedancia así como malas respuestas en frecuencia del propio analizador de redes. Hay seis errores sistemáticos entre un puerto del analizador de redes y el dispositivo de prueba "DUT" que se transforman en doce considerando el segundo puerto que también se conecta al DUT. Seis errores sistemáticos; a) Imperfecciones en el aislamiento "Directividad". Parte de la señal emitida por el propio analizador se introduce directamente por donde se mide la señal reflejada. Se cuenta como 1 error. b) Acople entre la entrada y la salidad "crosstalk o diafonía". Parte de la señal emitida por el analizador desde un puerto se introduce directamente en el otro puerto. Se cuenta como 1 error. c) Desadaptaciciones en el puerto del analizador de redes y en la entrada o salida del dispositivo de prueba que se encuentra conectado a dicho puerto. Son 2 errores, un del analizador y el otro del DUT. d) Por una respuesta en frecuencia no constante en los receptores del analizador de redes. Son 2 errores, el primero es el seguimiento de la señal reflejada y el segundo corresponde al seguimiento de la señal transmitida. Hay que recordar que el analizador de redes mide la señal que transmite para poder comparar con lo que recibe. Espero que les sirva y disculpen que no había destildado la opción de "Nadie puede comentar" XD. Saludos y suerte.