Bienvenido al blog del noroeste de Mesopotamia! Aquí hablamos de todo:
Política, Dios, ciencia y tecnología, fe, Linux, Latex, Fails,etc.
Siéntase libre de comentar los artículos!

lunes, 7 de octubre de 2013

Activar o desactivar múltiples switches (interruptores) en Simulink

En algunas ocasiones es necesario utilizar interruptores (switch) en los diagramas de bloques de Simulink. Ellos permiten conmutar entre bloques, activar o desactivar constantes, ruido, etc. El switch de Simulink es una herramienta útil cuando se desarrollan diagramas de bloques, puesto que evita que el diseñador tenga que modificar su diagrama entre varias simulaciones.





El problema se encuentra cuando existe una gran cantidad de interruptores presentes en el diagrama y se requiere un gran tiempo para buscar los interruptores y operarlos. Esta situación se vuelve aún peor cuando existen múltiples sub-sistemas que contienen múltiples interruptores en su interior.



Programando un sencillo script en Matlab es posible activar o desactivar un grupo, o todos los interruptores presentes en el diagrama, que se hace asignándole el valor 1 a la propiedad "sw" del control Manual Switch, utilizando la instrucción get_param. En la versión 2013 de MatLab, no está disponible la propiedad "sw" en el menú desplegable que aparece en la consola cuando se presiona tab, como se ve en la siguiente imagen:

Sin embargo, si leemos la propiedad "sw", existe y tiene valor, como se ve a continuación.


El valor 1 significa que el switch está cerrado, mientras que cero es lo contrario. Cambiando el valor de esta propiedad se cambia el estado del interruptor. Ahora, cuando existe una gran cantidad de interruptores presentes en el diagrama, costaría mucho tiempo activarlos todos manualmente, por lo que se requiere un mecanismo más rápido. Manos a la obra:

  1.  Confeccionar una lista con los bloques tipo Manual Switch: Esto se puede hacer mediante la instrucción find_system, con la cual es posible encontrar bloques específicos dentro del diagrama de bloques. Entonces, para buscar todos los interruptores en el diagrama, se debe hacer lo siguiente:

    lista_switches=find_system(gcs,'BlockType','ManualSwitch');
    Se pueden también encontrar otro tipo de bloques, cambiando la cadena que acompaña a 'BlockType'.

  2. Cambiar el estado de los interruptores encontrados: Hasta el momento no he encontrado una operación vectorial que resuelva esto en una sola instrucción, por lo que la solución será utilizando la instrucción for.

    for i=1:size(lista_switches,2)        
             set_param(lista_switches{i},'sw',1)  % O cero, dependiendo del caso.

    end
    Es importante mencionar que la instrucción en el punto 1 podría no encontrar interruptores que pertenecen a bloques con máscara. Para ello simplemente basta agregar una bandera a
    find_system, de manera que busque también en bloques enmascarados. Esto es:

    find_system(gcs,'LookUnderMasks','all','blocktype','ManualSwitch'
Espero que les sea de utilidad. Si es así no duden en dejar un comentario! Un abrazo!

0 Deja un comentario...:

Publicar un comentario

Ingresa un comentario