<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Uncategorized archivos - Brandon Engineer</title>
	<atom:link href="https://brandon-engineer.com/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>https://brandon-engineer.com/category/uncategorized/</link>
	<description>Blog para compartir sobre programación y tecnología industrial</description>
	<lastBuildDate>Wed, 20 Mar 2024 22:02:39 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://brandon-engineer.com/wp-content/uploads/2024/03/favicon.ico</url>
	<title>Uncategorized archivos - Brandon Engineer</title>
	<link>https://brandon-engineer.com/category/uncategorized/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Como optimizar tu código en SCL</title>
		<link>https://brandon-engineer.com/como-optimizar-tu-codigo-en-scl/</link>
					<comments>https://brandon-engineer.com/como-optimizar-tu-codigo-en-scl/#respond</comments>
		
		<dc:creator><![CDATA[Brandon]]></dc:creator>
		<pubDate>Wed, 20 Mar 2024 21:49:59 +0000</pubDate>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://brandon-engineer.com/?p=3518</guid>

					<description><![CDATA[<p>Introducción Esta tarde estaba aburrido en casa y puse a prueba una idea que lleva tiempo rondándome la cabeza: &#8220;¿Es más optimo usar una máquina de estados que un sistema tradicional?&#8221; Mi suposición es que al usar una máquina de estados esta saltará el código que no se usa y permitirá ignorar el código que...</p>
<p>La entrada <a href="https://brandon-engineer.com/como-optimizar-tu-codigo-en-scl/">Como optimizar tu código en SCL</a> se publicó primero en <a href="https://brandon-engineer.com">Brandon Engineer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-introduccion">Introducción</h2>



<p>Esta tarde estaba aburrido en casa y puse a prueba una idea que lleva tiempo rondándome la cabeza: &#8220;¿Es más optimo usar una máquina de estados que un sistema tradicional?&#8221; Mi suposición es que al usar una máquina de estados esta saltará el código que no se usa y permitirá ignorar el código que no se utilizará por lo que podrías optimizarlo para no tener a tu maquina ahogándose.</p>



<h2 class="wp-block-heading" id="h-como-se-ha-realizado">¿Cómo se ha realizado?</h2>



<p>Para esta prueba decidí ejecutarla en el entorno de Twincat de <a href="http://beckhoff.com">Beckhoff Automation</a>, que me da control del conocimiento de cada núcleo y compararlo en el mismo instante de tiempo. Preparé los FB, al final llamé a 300 FB por cada una de las tareas con un tiempo de ejecución de 0.5ms y comparé los rendimientos.</p>



<h2 class="wp-block-heading" id="h-llamada-de-las-tareas">Llamada de las tareas</h2>



<p>Para hacer una carga grande de recursos se ha llamado a 300 FB para que sea apreciable los consumos</p>



<pre class="wp-block-code"><code>bSwitching(bStart=>bStart);

FOR counter:=1 TO 299 BY 1 DO

    fb&#91;counter](bInputDown:=bStart);

END_FOR;</code></pre>



<p>&#8220;bStart&#8221; es un booleano que cambia de true a false cada segundo</p>



<h2 class="wp-block-heading" id="h-con-estados">Con estados</h2>



<p>El código para la function block </p>



<pre class="wp-block-code"><code>FUNCTION_BLOCK FB_WaitandWriteState
VAR_INPUT
	bInputUp : BOOL; // Entrada para subir
    bInputDown : BOOL; // Entrada para bajar
END_VAR
VAR_OUTPUT
	bOutputUp : BOOL := FALSE; // Salida para subir
    bOutputDown : BOOL := FALSE; // Salida para bajar
END_VAR
VAR
    Temporizador : TON := (PT:= T#60S); // Temporizador de 60 segundos
    TemporizadorEspera : TON := (PT:= T#1S); // Temporizador de espera de 1 segundo
    EstadoMaquinaActual : INT:=0;
END_VAR
	</code></pre>



<p>El código usado para el programa ha sido:</p>



<pre class="wp-block-code"><code>CASE EstadoMaquinaActual OF
    // Estado inicial, esperando la entrada
    0:
        IF bInputUp THEN
            EstadoMaquinaActual := 10; // Cambiar al estado de subir
        ELSIF bInputDown THEN
            EstadoMaquinaActual := 20; // Cambiar al estado de bajar
        END_IF
    // Estado de subir
    10:
        bOutputUp := TRUE; // Activar la salida de subir
        Temporizador(IN:= TRUE); // Iniciar temporizador de 60 segundos
        IF Temporizador.Q THEN
            EstadoMaquinaActual := 30; // Cambiar al estado de espera
        END_IF
    // Estado de bajar
    20:
        bOutputDown := TRUE; // Activar la salida de bajar
        Temporizador(IN:= TRUE); // Iniciar temporizador de 60 segundos
        IF Temporizador.Q THEN
            EstadoMaquinaActual := 30; // Cambiar al estado de espera
        END_IF
    // Estado de espera
    30:
	TemporizadorEspera(IN:= TRUE);
        IF TemporizadorEspera.Q THEN
            // Reiniciar salidas y temporizadores
            bOutputUp := FALSE;
            bOutputDown := FALSE;
            Temporizador(IN:= FALSE);
            TemporizadorEspera(IN:= FALSE);
            // Volver al estado inicial
            EstadoMaquinaActual := 0;
        END_IF
END_CASE</code></pre>



<h2 class="wp-block-heading" id="h-sin-estados">Sin estados</h2>



<p>Este es el código de la tarea:</p>



<pre class="wp-block-code"><code>FUNCTION_BLOCK FB_Wait_andWrite_NON_State
VAR_INPUT
	bInputUp : BOOL; // Entrada para subir
    bInputDown : BOOL; // Entrada para bajar
END_VAR
VAR_OUTPUT
	bOutputUp : BOOL := FALSE; // Salida para subir
    bOutputDown : BOOL := FALSE; // Salida para bajar
END_VAR
VAR
    Temporizador : TOF := (PT:= T#60S); // Temporizador de 60 segundos
    TemporizadorEspera : TON := (PT:= T#1s); // Temporizador de espera de 1 segundo
	
	bBajando: BOOL;
	bSubiendo: BOOL;
END_VAR</code></pre>



<p>El código para la function block</p>



<pre class="wp-block-code"><code>Temporizador(IN:= bSubiendo OR bBajando); // Iniciar temporizador si se está subiendo o bajando

bSubiendo := bInputUp AND NOT bSubiendo; // Marcar subida si no estaba subiendo antes
bBajando := bInputDown AND NOT bBajando; // Marcar bajada si no estaba bajando antes

bOutputUp := bSubiendo AND NOT Temporizador.Q; // Activar salida de subir mientras no se exceda el temporizador
bOutputDown := bBajando AND NOT Temporizador.Q; // Activar salida de bajar mientras no se exceda el temporizador

IF Temporizador.Q THEN
    bSubiendo := FALSE; // Reiniciar flag de subir
    bBajando := FALSE; // Reiniciar flag de bajar
    TemporizadorEspera(IN:= TRUE); // Iniciar temporizador de espera de 1 segundo
END_IF

TemporizadorEspera(IN:= TemporizadorEspera.Q); // Reiniciar temporizador de espera si se completó</code></pre>



<h2 class="wp-block-heading" id="h-conclusion">Conclusión</h2>



<p>Como supuse es un aumento de rendimiento considerable (el software sin máquina de estados consume 3 veces más). Adjunto las fotos de los FB, el programa y las gráficas de los rendimientos.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1">
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="800" height="500" data-id="3523" src="https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-min-edited.jpg" alt="" class="wp-image-3523" srcset="https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-min-edited.jpg 800w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-min-edited-300x188.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-min-edited-768x480.jpg 768w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-min-edited-600x375.jpg 600w" sizes="(max-width: 800px) 100vw, 800px" /></figure>
</figure>



<p>¿Y ustedes? ¿Lo sabían ya? ¿Se imaginaban el resultado como yo? ¿Creéis que algo ha fallado en mi evaluación?</p>



<p>Yo la verdad es que me ha sorprendido los resultados, no me esperaba tanto y menos para una aplicación tan sencilla, son unos temporizadores y unos IF</p>



<p>Espero sus comentarios, chicos.</p>
<p>La entrada <a href="https://brandon-engineer.com/como-optimizar-tu-codigo-en-scl/">Como optimizar tu código en SCL</a> se publicó primero en <a href="https://brandon-engineer.com">Brandon Engineer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://brandon-engineer.com/como-optimizar-tu-codigo-en-scl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
