<?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>Brandon Engineer</title>
	<atom:link href="https://brandon-engineer.com/en/feed/" rel="self" type="application/rss+xml" />
	<link>https://brandon-engineer.com/en/</link>
	<description>Blog para compartir sobre programación y tecnología industrial</description>
	<lastbuilddate>Fri, 28 Nov 2025 22:48:02 +0000</lastbuilddate>
	<language>en-US</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>Brandon Engineer</title>
	<link>https://brandon-engineer.com/en/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Plantillas de generación automática de paginas en QElectroTech</title>
		<link>https://brandon-engineer.com/en/plantillas-de-generacion-automatica-de-paginas-en-qelectrotech/</link>
					<comments>https://brandon-engineer.com/en/plantillas-de-generacion-automatica-de-paginas-en-qelectrotech/#respond</comments>
		
		<dc:creator><![CDATA[Brandon]]></dc:creator>
		<pubdate>Fri, 28 Nov 2025 22:39:07 +0000</pubdate>
				<category><![CDATA[Esquemas Electricos]]></category>
		<guid ispermalink="false">https://brandon-engineer.com/?p=3748</guid>

					<description><![CDATA[<p>Introducción QElectrotech es un software de diseño de esquemas eléctricos de código abierto realizado por Laurent Trinques Primero de todo agradecimiento a Laurent por un software tan grande y a todos los que han aportado a este proyecto aquí tenéis el software por si os apetece hacerle un intento. No es mas potente que Eplan...</p>
<p>La entrada <a href="https://brandon-engineer.com/en/plantillas-de-generacion-automatica-de-paginas-en-qelectrotech/">Plantillas de generación automática de paginas en QElectroTech</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3748" class="elementor elementor-3748" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-5765033 e-flex e-con-boxed e-con e-parent" data-id="5765033" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b12fa69 elementor-widget elementor-widget-text-editor" data-id="b12fa69" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.19.0 - 28-02-2024 */
.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}</style>				<h2>Introduction</h2>
<p>QElectroTech is an open-source electrical schematic design software created by <a href="http://www.linkedin.com/in/laurent-trinques-b81baa84?originalSubdomain=fr">Laurent Trinques</a></p>
<p>First of all, my thanks to Laurent for such an amazing piece of software, and to everyone who has contributed to this project. Here you have the software in case you feel like giving it a try. It’s not more powerful than Eplan, but it rivals it like a true champion!</p>
<p><a href="https://qelectrotech.org">https://qelectrotech.org</a></p>
<h2>How to generate an automatic table?</h2>
<p>First of all, we need to know how to generate automatic tables in QElectroTech. For this, there are two cases: if we want to add automation based on project data or on elements in the schematic: Project &gt; Add a summary and Project &gt; Add a nomenclature.</p>
<p><img fetchpriority="high" decoding="async" class="wp-image-3752 aligncenter" src="https://brandon-engineer.com/wp-content/uploads/2025/11/Agregar-tablas-a-QElectroTech.jpg" alt="" width="392" height="307" srcset="https://brandon-engineer.com/wp-content/uploads/2025/11/Agregar-tablas-a-QElectroTech.jpg 712w, https://brandon-engineer.com/wp-content/uploads/2025/11/Agregar-tablas-a-QElectroTech-300x235.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2025/11/Agregar-tablas-a-QElectroTech-15x12.jpg 15w, https://brandon-engineer.com/wp-content/uploads/2025/11/Agregar-tablas-a-QElectroTech-600x470.jpg 600w" sizes="(max-width: 392px) 100vw, 392px" /></p>
<p>Once inside, we will be able to make custom SQL queries:</p>
<p><img decoding="async" class="wp-image-3753 aligncenter" src="https://brandon-engineer.com/wp-content/uploads/2025/11/Hacer-consulta-SQL-personalizada-1024x973.jpg" alt="" width="486" height="462" srcset="https://brandon-engineer.com/wp-content/uploads/2025/11/Hacer-consulta-SQL-personalizada-1024x973.jpg 1024w, https://brandon-engineer.com/wp-content/uploads/2025/11/Hacer-consulta-SQL-personalizada-300x285.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2025/11/Hacer-consulta-SQL-personalizada-768x729.jpg 768w, https://brandon-engineer.com/wp-content/uploads/2025/11/Hacer-consulta-SQL-personalizada-13x12.jpg 13w, https://brandon-engineer.com/wp-content/uploads/2025/11/Hacer-consulta-SQL-personalizada-600x570.jpg 600w, https://brandon-engineer.com/wp-content/uploads/2025/11/Hacer-consulta-SQL-personalizada.jpg 1195w" sizes="(max-width: 486px) 100vw, 486px" /></p>
<h2>Page Index</h2>
<p>To automate the page index, we will do it from ‘Add a summary,’ and I recommend the following SQL:</p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-f3cf97b e-flex e-con-boxed e-con e-parent" data-id="f3cf97b" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-615a20e e-flex e-con-boxed e-con e-child" data-id="615a20e" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c649b4e elementor-widget elementor-widget-code-highlight" data-id="c649b4e" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-sql line-numbers">
				<code readonly="true" class="language-sql">
					<xmp>SELECT
    pos,
    title,
    author,
    date,
    indexrev
FROM
    project_summary_view
ORDER BY
    pos,
    title,
    author,
    date,
    indexrev;
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-2e9230c e-flex e-con-boxed e-con e-parent" data-id="2e9230c" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b44b28b elementor-widget elementor-widget-text-editor" data-id="b44b28b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>With this query, we will automatically obtain the following table:<img decoding="async" class="wp-image-3754 aligncenter" src="https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-indice-qelectrotech-1024x717.png" alt="" width="521" height="365" srcset="https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-indice-qelectrotech-1024x717.png 1024w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-indice-qelectrotech-300x210.png 300w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-indice-qelectrotech-768x538.png 768w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-indice-qelectrotech-18x12.png 18w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-indice-qelectrotech-600x420.png 600w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-indice-qelectrotech.png 1322w" sizes="(max-width: 521px) 100vw, 521px" /></p>
<h2>List of elements</h2>
<p>To automate the list of elements, we will do it from ‘Add a nomenclature,’ and I recommend the following SQL: </p>						</div>
				</div>
				<div class="elementor-element elementor-element-103c584 elementor-widget elementor-widget-code-highlight" data-id="103c584" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-sql line-numbers">
				<code readonly="true" class="language-sql">
					<xmp>SELECT
    label,
    diagram_position,
    position,
    designation
FROM
    element_nomenclature_view
WHERE
    (
        element_type = 'terminal'
        OR element_type = 'thumbnail'
        OR element_type = 'simple'
        OR element_sub_type = 'commutator'
        OR element_sub_type = 'coil'
        OR element_sub_type = 'protection'
    )
    AND designation IS NOT NULL
    AND designation <> ''
    AND label IS NOT NULL
    AND label <> ''
ORDER BY
    diagram_position;
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-3466514 e-flex e-con-boxed e-con e-parent" data-id="3466514" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-0ef3c0b elementor-widget elementor-widget-text-editor" data-id="0ef3c0b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>With this query, we will automatically obtain the following table:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-3755" src="https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-qelectrotech-1024x750.png" alt="" width="751" height="550" srcset="https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-qelectrotech-1024x750.png 1024w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-qelectrotech-300x220.png 300w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-qelectrotech-768x562.png 768w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-qelectrotech-16x12.png 16w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-qelectrotech-600x439.png 600w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-qelectrotech.png 1195w" sizes="(max-width: 751px) 100vw, 751px" /></p>
<p>As an alternative, instead of using position and diagram position, we can use the page so that it’s easier to read.</p>
<p>The SQL query would look like this:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-bf2b2e7 elementor-widget elementor-widget-code-highlight" data-id="bf2b2e7" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-sql line-numbers">
				<code readonly="true" class="language-sql">
					<xmp>SELECT
    label,
    title,
    diagram_position,
    position,
    designation
FROM
    element_nomenclature_view
WHERE
    (
        element_type = 'terminal'
        OR element_type = 'thumbnail'
        OR element_type = 'simple'
        OR element_sub_type = 'commutator'
        OR element_sub_type = 'coil'
        OR element_sub_type = 'protection'
    )
    AND designation IS NOT NULL
    AND designation <> ''
    AND label IS NOT NULL
    AND label <> ''
ORDER BY
    diagram_position;
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-eab14ec e-flex e-con-boxed e-con e-parent" data-id="eab14ec" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6cfa3a1 elementor-widget elementor-widget-text-editor" data-id="6cfa3a1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>With this query, we will automatically obtain the following table:<img loading="lazy" decoding="async" class="alignnone size-large wp-image-3756" src="https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-alternativo-qelectrotech-1024x750.png" alt="" width="751" height="550" srcset="https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-alternativo-qelectrotech-1024x750.png 1024w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-alternativo-qelectrotech-300x220.png 300w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-alternativo-qelectrotech-768x563.png 768w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-alternativo-qelectrotech-16x12.png 16w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-alternativo-qelectrotech-600x440.png 600w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-lista-elementos-alternativo-qelectrotech.png 1190w" sizes="(max-width: 751px) 100vw, 751px" /></p>
<h2>Summary of elements</h2>
<p>To automate the summary of elements, we will do it from ‘Add a nomenclature,’ and I recommend the following SQL: </p>						</div>
				</div>
				<div class="elementor-element elementor-element-517941a elementor-widget elementor-widget-code-highlight" data-id="517941a" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-sql line-numbers">
				<code readonly="true" class="language-sql">
					<xmp>SELECT 
    designation,
    COUNT(*) AS Total
FROM 
    element_nomenclature_view
WHERE 
    designation IS NOT NULL
GROUP BY 
    designation;
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-4d13443 e-flex e-con-boxed e-con e-parent" data-id="4d13443" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-270511d elementor-widget elementor-widget-text-editor" data-id="270511d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>With this query, we will obtain an automatic table of all the references we have placed in the elements under the concept ‘Article number.’</p>
<p><img loading="lazy" decoding="async" class="wp-image-3757 aligncenter" src="https://brandon-engineer.com/wp-content/uploads/2025/11/Como-nombrar-los-numeros-de-articulo.png" alt="" width="355" height="392" srcset="https://brandon-engineer.com/wp-content/uploads/2025/11/Como-nombrar-los-numeros-de-articulo.png 596w, https://brandon-engineer.com/wp-content/uploads/2025/11/Como-nombrar-los-numeros-de-articulo-271x300.png 271w, https://brandon-engineer.com/wp-content/uploads/2025/11/Como-nombrar-los-numeros-de-articulo-11x12.png 11w" sizes="(max-width: 355px) 100vw, 355px" /></p>
<p>With this, we will get a pretty good list to give to our purchasing colleague, saving them a few hours of counting and, most importantly, reducing human error ^^.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-3758" src="https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-sumatorio-elementos-qelectrotech-1024x752.png" alt="" width="751" height="552" srcset="https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-sumatorio-elementos-qelectrotech-1024x752.png 1024w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-sumatorio-elementos-qelectrotech-300x220.png 300w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-sumatorio-elementos-qelectrotech-768x564.png 768w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-sumatorio-elementos-qelectrotech-16x12.png 16w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-sumatorio-elementos-qelectrotech-600x441.png 600w, https://brandon-engineer.com/wp-content/uploads/2025/11/Ejemplo-tabla-sumatorio-elementos-qelectrotech.png 1221w" sizes="(max-width: 751px) 100vw, 751px" /></p>
<p>I hope I’ve saved you many hours of engineering work, since a good engineer doesn’t charge by the hour but by knowledge.</p>						</div>
				</div>
					</div>
				</div>
				</div><p>La entrada <a href="https://brandon-engineer.com/en/plantillas-de-generacion-automatica-de-paginas-en-qelectrotech/">Plantillas de generación automática de paginas en QElectroTech</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></content:encoded>
					
					<wfw:commentrss>https://brandon-engineer.com/en/plantillas-de-generacion-automatica-de-paginas-en-qelectrotech/feed/</wfw:commentrss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como guardar y visualizar datos en base de datos GRATIS</title>
		<link>https://brandon-engineer.com/en/como-guardar-y-visualizar-datos-en-base-de-datos-gratis/</link>
					<comments>https://brandon-engineer.com/en/como-guardar-y-visualizar-datos-en-base-de-datos-gratis/#respond</comments>
		
		<dc:creator><![CDATA[Brandon]]></dc:creator>
		<pubdate>Tue, 12 Nov 2024 18:16:10 +0000</pubdate>
				<category><![CDATA[Dashboard]]></category>
		<category><![CDATA[Fuxa]]></category>
		<category><![CDATA[HMI]]></category>
		<category><![CDATA[SCADA]]></category>
		<guid ispermalink="false">https://brandon-engineer.com/?p=3723</guid>

					<description><![CDATA[<p>Introducción Hace poco una persona tenia dudas de como almacenar datos del consumo de la red en una base de datos y yo le comentaba que se puede hacer con costes muy reducidos o incluso gratuitos Hardware Para este ejercicio práctico se usará un dispositivo de domótica por su reducido coste https://amzn.to/3CjvGMA Si necesitas varios...</p>
<p>La entrada <a href="https://brandon-engineer.com/en/como-guardar-y-visualizar-datos-en-base-de-datos-gratis/">Como guardar y visualizar datos en base de datos GRATIS</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3723" class="elementor elementor-3723" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-5765033 e-flex e-con-boxed e-con e-parent" data-id="5765033" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b12fa69 elementor-widget elementor-widget-text-editor" data-id="b12fa69" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>Introduction</h2>
<p>Hace poco una persona tenia dudas de como almacenar datos del consumo de la red en una base de datos y yo le comentaba que se puede hacer con costes muy reducidos o incluso gratuitos</p>
<h2>Hardware</h2>
<p>Para este ejercicio práctico se usará un dispositivo de domótica por su reducido coste</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-3728" src="https://brandon-engineer.com/wp-content/uploads/2024/11/tasmota-enchufe-inteligente-1024x480.gif" alt="" width="751" height="352" srcset="https://brandon-engineer.com/wp-content/uploads/2024/11/tasmota-enchufe-inteligente-1024x480.gif 1024w, https://brandon-engineer.com/wp-content/uploads/2024/11/tasmota-enchufe-inteligente-300x141.gif 300w, https://brandon-engineer.com/wp-content/uploads/2024/11/tasmota-enchufe-inteligente-768x360.gif 768w, https://brandon-engineer.com/wp-content/uploads/2024/11/tasmota-enchufe-inteligente-1536x721.gif 1536w, https://brandon-engineer.com/wp-content/uploads/2024/11/tasmota-enchufe-inteligente-18x8.gif 18w, https://brandon-engineer.com/wp-content/uploads/2024/11/tasmota-enchufe-inteligente-600x281.gif 600w" sizes="(max-width: 751px) 100vw, 751px" /></p>
<p><a href="https://amzn.to/3CjvGMA">https://amzn.to/3CjvGMA</a></p>
<p>Si necesitas varios siempre puedes comprar un pack para ahorrar dinero:</p>
<p><a href="https://amzn.to/3Oq3VoF">https://amzn.to/3Oq3VoF</a></p>
<p>Para la inserción en base de datos usaremos un servidor en red con linux aunque yo recomiendo un IPC con procesador ARM por tener diversificado las funciones de cada dispositivo</p>
<h2>Software</h2>
<h3>Como instalar Docker en ubuntu</h3>
<p>Para la instalación del software empezaremos por instalar el gestor de contenedores de Docker en servidor linux basado en ubuntu</p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-f3cf97b e-flex e-con-boxed e-con e-parent" data-id="f3cf97b" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-615a20e e-flex e-con-boxed e-con e-child" data-id="615a20e" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c649b4e elementor-widget elementor-widget-code-highlight" data-id="c649b4e" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>sudo apt update
sudo apt upgrade
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt upgrade
sudo apt install docker-ce docker-ce-cli containerd.io
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-2e9230c e-flex e-con-boxed e-con e-parent" data-id="2e9230c" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b44b28b elementor-widget elementor-widget-text-editor" data-id="b44b28b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Por ultimo verificamos que esta instalado correctamente</p>						</div>
				</div>
				<div class="elementor-element elementor-element-103c584 elementor-widget elementor-widget-code-highlight" data-id="103c584" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>sudo docker --version</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-3466514 e-flex e-con-boxed e-con e-parent" data-id="3466514" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-0ef3c0b elementor-widget elementor-widget-text-editor" data-id="0ef3c0b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h3>Como instalar Node Red en Docker</h3>
<p>Para el software de inserción en base de datos instalaremos Node Red que es un software de open source que nos permitiré conectar con infinidad de protocolos de comunicación e insertar en base de datos</p>						</div>
				</div>
				<div class="elementor-element elementor-element-bf2b2e7 elementor-widget elementor-widget-code-highlight" data-id="bf2b2e7" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>docker run -d --name mynodered -p 1880:1880 --restart unless-stopped nodered/node-red
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-eab14ec e-flex e-con-boxed e-con e-parent" data-id="eab14ec" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6cfa3a1 elementor-widget elementor-widget-text-editor" data-id="6cfa3a1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Una vez ya instalado podemos proceder a acceder a los datos que nos comparte el dispositivo de Tasmota con su servidor web en mi caso esta almacenada en esta dirección IP (se recomienda usar la guía de configuración de la conexión por wifi del dispositivo para configurarlo correctamente):</p>
<p><a href="http://192.168.0.34/">http://192.168.0.34</a></p>
<p>El cual nos dará la información sobre el enchufe:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3731" src="https://brandon-engineer.com/wp-content/uploads/2024/11/tasmota-interfaz-web.gif" alt="" width="679" height="643" /></p>
<p>Para obtener los datos nos podemos dirigir a la siguiente:</p>
<p><a href="http://192.168.0.34/cm?cmnd=STATUS%200">http://192.168.0.34/cm?cmnd=STATUS%200</a></p>
<p>El cual podemos ver que esta toda la información en un JSON</p>						</div>
				</div>
				<div class="elementor-element elementor-element-517941a elementor-widget elementor-widget-code-highlight" data-id="517941a" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-json line-numbers">
				<code readonly="true" class="language-json">
					<xmp>   "ENERGY": {
      "TotalStartTime": "2024-11-06T09:10:05",
      "Total": 1.058,
      "Yesterday": 0.268,
      "Today": 0.206,
      "Power": 0,
      "ApparentPower": 0,
      "ReactivePower": 0,
      "Factor": 0,
      "Voltage": 208,
      "Current": 0
    },</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-4d13443 e-flex e-con-boxed e-con e-parent" data-id="4d13443" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-270511d elementor-widget elementor-widget-text-editor" data-id="270511d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ahora procederemos a programar la función ciclica que recopilará la información para insertarla en la base de datos para ello haremos lo siguiente:</p>
<p>-Añadimos nodo que se ejecuta cada 3 segundos</p>
<p>-Normalizamos la hora para poder insertarla en la base de datos</p>
<p>-Obtenemos los datos mediante una petición HTTP mediante el método &#8220;GET&#8221;</p>
<p>-Extraemos los datos que nos interesa del JSON</p>
<p>-Creamos la consulta con los datos extraídos</p>
<p>-Insertamos en nuestro servidor</p>
<p>-Mostramos en consola para comprobar que todo funciona correctamente</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3732" src="https://brandon-engineer.com/wp-content/uploads/2024/11/flujo-tasmota.gif" alt="" width="1022" height="242" /></p>						</div>
				</div>
				<div class="elementor-element elementor-element-bd2e25a elementor-widget elementor-widget-code-highlight" data-id="bd2e25a" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-json line-numbers">
				<code readonly="true" class="language-json">
					<xmp>[
    {
        "id": "72594c6cf3e187c5",
        "type": "debug",
        "z": "a7cda68e269cad0e",
        "name": "debug 25",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 720,
        "y": 940,
        "wires": []
    },
    {
        "id": "e49938d64834e868",
        "type": "http request",
        "z": "a7cda68e269cad0e",
        "name": "",
        "method": "GET",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "http://192.168.0.34/cm?cmnd=STATUS%200",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [],
        "x": 530,
        "y": 880,
        "wires": [
            [
                "273d22936082a16a"
            ]
        ]
    },
    {
        "id": "7957f9fe99d9eee6",
        "type": "inject",
        "z": "a7cda68e269cad0e",
        "name": "",
        "props": [
            {
                "p": "date",
                "v": "iso",
                "vt": "date"
            }
        ],
        "repeat": "3",
        "crontab": "",
        "once": true,
        "onceDelay": "3",
        "topic": "",
        "x": 200,
        "y": 880,
        "wires": [
            [
                "23d3e98baab1ce6a"
            ]
        ]
    },
    {
        "id": "273d22936082a16a",
        "type": "function",
        "z": "a7cda68e269cad0e",
        "name": "Extraer datos del JSON",
        "func": "// Convierte msg.payload a string si no lo es\nvar payloadStr = msg.payload.toString();\n\n// Elimina espacios en blanco al inicio y al final\npayloadStr = payloadStr.trim();\n\n// Si el payload comienza y termina con comillas dobles, las elimina\nif (payloadStr.startsWith('\"') && payloadStr.endsWith('\"')) {\n    payloadStr = payloadStr.substring(1, payloadStr.length - 1);\n}\n\n// Reemplaza las comillas dobles escapadas por comillas dobles reales\npayloadStr = payloadStr.replace(/\\\\\"/g, '\"');\n\ntry {\n    // Parsea el string a objeto JSON\n    var payloadObj = JSON.parse(payloadStr);\n\n    // Verifica si existen los datos de ENERGY\n    if (payloadObj.StatusSNS && payloadObj.StatusSNS.ENERGY) {\n        // Asigna los valores de ENERGY al payload\n        msg.payload = payloadObj.StatusSNS.ENERGY;\n    } else {\n        node.error(\"No se encontró 'StatusSNS.ENERGY' en el payload\", msg);\n        return null;\n    }\n} catch (e) {\n    // Maneja errores de parseo\n    node.error(\"Error al parsear JSON: \" + e.message, msg);\n    return null;\n}\n\nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 250,
        "y": 940,
        "wires": [
            [
                "456e7462c5d896e9"
            ]
        ]
    },
    {
        "id": "4086d7eafeeaf2bd",
        "type": "mysql-r2",
        "z": "a7cda68e269cad0e",
        "name": "",
        "host": "192.168.0.125",
        "database": "****",
        "username": "****",
        "password": "****",
        "sql": "",
        "port": "****",
        "pooling": false,
        "waitForConnections": true,
        "connectionLimit": "10",
        "queueTimeout": "10000",
        "x": 580,
        "y": 940,
        "wires": [
            [
                "72594c6cf3e187c5"
            ]
        ]
    },
    {
        "id": "456e7462c5d896e9",
        "type": "template",
        "z": "a7cda68e269cad0e",
        "name": "",
        "field": "sql",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "INSERT INTO `Grafana`.`Consume` (`con_date`, `con_voltage`, `con_current`, `con_power`, `con_AppPower`, `con_ReactPower`, `con_PowerFactor`, `con_EnergyToday`) VALUES ('{{date}}', '{{payload.Voltage}}', {{payload.Current}}, {{payload.Power}}, {{payload.ApparentPower}}, {{payload.ReactivePower}}, {{payload.Factor}}, {{payload.Today}});",
        "output": "str",
        "x": 440,
        "y": 940,
        "wires": [
            [
                "4086d7eafeeaf2bd"
            ]
        ]
    },
    {
        "id": "23d3e98baab1ce6a",
        "type": "function",
        "z": "a7cda68e269cad0e",
        "name": "Normalizar hora",
        "func": "// Obtiene la fecha original de msg.date\nvar originalDate = msg.date;\n\n// Verifica si msg.date está definido\nif (!originalDate) {\n    node.error(\"msg.date no está definido.\", msg);\n    return null;\n}\n\n// Convierte la cadena de fecha a un objeto Date\nvar dateObj = new Date(originalDate);\n\n// Verifica si la fecha es válida\nif (isNaN(dateObj.getTime())) {\n    node.error(\"La fecha proporcionada no es válida: \" + originalDate, msg);\n    return null;\n}\n\n// Extrae los componentes de la fecha y hora en UTC\nvar year = dateObj.getUTCFullYear();\nvar month = ('0' + (dateObj.getUTCMonth() + 1)).slice(-2);\nvar day = ('0' + dateObj.getUTCDate()).slice(-2);\nvar hours = ('0' + dateObj.getUTCHours()).slice(-2);\nvar minutes = ('0' + dateObj.getUTCMinutes()).slice(-2);\nvar seconds = ('0' + dateObj.getUTCSeconds()).slice(-2);\n\n// Formatea la fecha al formato deseado\nmsg.date = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n\nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 360,
        "y": 880,
        "wires": [
            [
                "e49938d64834e868"
            ]
        ]
    }
]</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-f21ee3f e-flex e-con-boxed e-con e-parent" data-id="f21ee3f" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-5acf0be elementor-widget elementor-widget-text-editor" data-id="5acf0be" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h3>Como instalar Grafana</h3>
<p>Para la visualización utilizaremos Grafana el cual tiene una gran variedad de herramientas de visualización en mi caso hare que sea accesible por el puerto 1882</p>						</div>
				</div>
				<div class="elementor-element elementor-element-23f7571 elementor-widget elementor-widget-code-highlight" data-id="23f7571" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>docker run -d --name mygrafana -p 1882:3000 --restart unless-stopped grafana/grafana</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-784305b e-flex e-con-boxed e-con e-parent" data-id="784305b" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-3d04157 elementor-widget elementor-widget-text-editor" data-id="3d04157" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Una vez listo yo recomiendo realizar las siguientes configuraciones para poder acceder a los gráficos sin tener que iniciar sesión cada vez que se arranque el visualizador</p>						</div>
				</div>
				<div class="elementor-element elementor-element-9ceb8fb elementor-widget elementor-widget-code-highlight" data-id="9ceb8fb" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>docker exec -it -u root mygrafana /bin/sh
vi /etc/grafana/grafana.ini</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-4eb9428 e-flex e-con-boxed e-con e-parent" data-id="4eb9428" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-2a5c1ed elementor-widget elementor-widget-text-editor" data-id="2a5c1ed" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ahora habilitaremos la visualización de forma anonima modificando estas lineas:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6f30881 elementor-widget elementor-widget-code-highlight" data-id="6f30881" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>[auth.anonymous]
enabled = true
org_role = Viewer</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0c50920 e-flex e-con-boxed e-con e-parent" data-id="0c50920" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-1b32d09 elementor-widget elementor-widget-text-editor" data-id="1b32d09" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Por último habilitaremos el uso de graficas en iframes</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0526fec elementor-widget elementor-widget-code-highlight" data-id="0526fec" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>[security]
allow_embedding = true</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-d77b6f8 e-flex e-con-boxed e-con e-parent" data-id="d77b6f8" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-e36de2f elementor-widget elementor-widget-text-editor" data-id="e36de2f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Una vez listo configuraremos nuestras gráficas como deseemos en mi caso tengo estas gráficas</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-3733" src="https://brandon-engineer.com/wp-content/uploads/2024/11/graficas-tasmota-1024x470.gif" alt="" width="751" height="345" srcset="https://brandon-engineer.com/wp-content/uploads/2024/11/graficas-tasmota-1024x470.gif 1024w, https://brandon-engineer.com/wp-content/uploads/2024/11/graficas-tasmota-300x138.gif 300w, https://brandon-engineer.com/wp-content/uploads/2024/11/graficas-tasmota-768x353.gif 768w, https://brandon-engineer.com/wp-content/uploads/2024/11/graficas-tasmota-18x8.gif 18w, https://brandon-engineer.com/wp-content/uploads/2024/11/graficas-tasmota-600x276.gif 600w" sizes="(max-width: 751px) 100vw, 751px" /></p>
<h3>Como instalar FUXA</h3>
<p>Para la instalación de Fuxa como SCADA de código abierto al tener ya instalado docker es tan sencillo como hacer una pull del repositorio de github y hacer que se autoarranque al iniciar el servidor</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4160b0e elementor-widget elementor-widget-code-highlight" data-id="4160b0e" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>docker run -d \
  --name fuxa \
  -p 1881:1881 \
  -v fuxa_appdata:/usr/src/app/FUXA/server/_appdata \
  -v fuxa_db:/usr/src/app/FUXA/server/_db \
  -v fuxa_logs:/usr/src/app/FUXA/server/_logs \
  -v fuxa_shapes:/usr/src/app/FUXA/client/assets/lib/svgeditor/shapes \
  -v fuxa_images:/usr/src/app/FUXA/server/_images \
  --restart unless-stopped \
  frangoteam/fuxa:latest
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-a7974db e-flex e-con-boxed e-con e-parent" data-id="a7974db" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-0020442 elementor-widget elementor-widget-text-editor" data-id="0020442" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ya tenemos listo ahora es tan facil como crear un proyecto usar el objeto &#8220;iFrame&#8221; de Fuxa y ya podemos empezar a visualizar los datos</p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-5ea2259 e-flex e-con-boxed e-con e-parent" data-id="5ea2259" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-7cb7810 elementor-widget elementor-widget-video" data-id="7cb7810" data-element_type="widget" data-settings="{&quot;video_type&quot;:&quot;hosted&quot;,&quot;controls&quot;:&quot;yes&quot;}" data-widget_type="video.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.19.0 - 28-02-2024 */
.elementor-widget-video .elementor-widget-container{overflow:hidden;transform:translateZ(0)}.elementor-widget-video .elementor-wrapper{aspect-ratio:var(--video-aspect-ratio)}.elementor-widget-video .elementor-wrapper iframe,.elementor-widget-video .elementor-wrapper video{height:100%;width:100%;display:flex;border:none;background-color:#000}@supports not (aspect-ratio:1/1){.elementor-widget-video .elementor-wrapper{position:relative;overflow:hidden;height:0;padding-bottom:calc(100% / var(--video-aspect-ratio))}.elementor-widget-video .elementor-wrapper iframe,.elementor-widget-video .elementor-wrapper video{position:absolute;top:0;right:0;bottom:0;left:0}}.elementor-widget-video .elementor-open-inline .elementor-custom-embed-image-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:50%}.elementor-widget-video .elementor-custom-embed-image-overlay{cursor:pointer;text-align:center}.elementor-widget-video .elementor-custom-embed-image-overlay:hover .elementor-custom-embed-play i{opacity:1}.elementor-widget-video .elementor-custom-embed-image-overlay img{display:block;width:100%;aspect-ratio:var(--video-aspect-ratio);-o-object-fit:cover;object-fit:cover;-o-object-position:center center;object-position:center center}@supports not (aspect-ratio:1/1){.elementor-widget-video .elementor-custom-embed-image-overlay{position:relative;overflow:hidden;height:0;padding-bottom:calc(100% / var(--video-aspect-ratio))}.elementor-widget-video .elementor-custom-embed-image-overlay img{position:absolute;top:0;right:0;bottom:0;left:0}}.elementor-widget-video .e-hosted-video .elementor-video{-o-object-fit:cover;object-fit:cover}.e-con-inner>.elementor-widget-video,.e-con>.elementor-widget-video{width:var(--container-widget-width);--flex-grow:var(--container-widget-flex-grow)}</style>		<div class="e-hosted-video elementor-wrapper elementor-open-inline">
					<video class="elementor-video" src="https://brandon-engineer.com/wp-content/uploads/2024/11/fuxa-tasmota.mkv" controls="" preload="metadata"></video>
				</div>
				</div>
				</div>
					</div>
				</div>
				</div><p>La entrada <a href="https://brandon-engineer.com/en/como-guardar-y-visualizar-datos-en-base-de-datos-gratis/">Como guardar y visualizar datos en base de datos GRATIS</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></content:encoded>
					
					<wfw:commentrss>https://brandon-engineer.com/en/como-guardar-y-visualizar-datos-en-base-de-datos-gratis/feed/</wfw:commentrss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://brandon-engineer.com/wp-content/uploads/2024/11/fuxa-tasmota.mkv" length="2417836" type="video/x-matroska" />

			</item>
		<item>
		<title>Instalar Fuxa en Raspberry pi</title>
		<link>https://brandon-engineer.com/en/instalar-fuxa-en-raspberry-pi/</link>
					<comments>https://brandon-engineer.com/en/instalar-fuxa-en-raspberry-pi/#respond</comments>
		
		<dc:creator><![CDATA[Brandon]]></dc:creator>
		<pubdate>Sun, 20 Oct 2024 16:39:43 +0000</pubdate>
				<category><![CDATA[Dashboard]]></category>
		<category><![CDATA[Fuxa]]></category>
		<category><![CDATA[HMI]]></category>
		<category><![CDATA[SCADA]]></category>
		<guid ispermalink="false">https://brandon-engineer.com/?p=3690</guid>

					<description><![CDATA[<p>En este post voy a publicar una guia paso a paso de como instalar Fuxa y configurarlo para su optimo rendimiento. Introducción FUXA es un proyecto de openSource liderado por Fangoteam el cual tiene un repositorio en github con el que consigue un SCADA con software OpenSource con la opción de hacer un pago para...</p>
<p>La entrada <a href="https://brandon-engineer.com/en/instalar-fuxa-en-raspberry-pi/">Instalar Fuxa en Raspberry pi</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3690" class="elementor elementor-3690" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-e644a50 e-flex e-con-boxed e-con e-parent" data-id="e644a50" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-e33aa8b elementor-widget elementor-widget-code-highlight" data-id="e33aa8b" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>sudo apt-get update
sudo apt-get upgrade</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-5765033 e-flex e-con-boxed e-con e-parent" data-id="5765033" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b12fa69 elementor-widget elementor-widget-text-editor" data-id="b12fa69" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h3>Instalar docker en raspberry pi</h3>
<p>Para la instalación de docker deberemos seguir los siguientes pasos</p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-f3cf97b e-flex e-con-boxed e-con e-parent" data-id="f3cf97b" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-615a20e e-flex e-con-boxed e-con e-child" data-id="615a20e" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c649b4e elementor-widget elementor-widget-code-highlight" data-id="c649b4e" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/raspbian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/raspbian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-2e9230c e-flex e-con-boxed e-con e-parent" data-id="2e9230c" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b44b28b elementor-widget elementor-widget-text-editor" data-id="b44b28b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>Instalar y configurar Fuxa en Raspberry pi</h2>
<p>Para la instalación de Fuxa he seguido el manual que tienen en la <a href="https://github.com/frangoteam/FUXA/wiki/Installing-and-Running">wiki</a></p>						</div>
				</div>
				<div class="elementor-element elementor-element-103c584 elementor-widget elementor-widget-code-highlight" data-id="103c584" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>sudo docker pull frangoteam/fuxa:latest</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-3466514 e-flex e-con-boxed e-con e-parent" data-id="3466514" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-0ef3c0b elementor-widget elementor-widget-text-editor" data-id="0ef3c0b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Si leemos la wiki veremos que nos recomiendan para que al volver a arrancar se mantengan los datos guardados usar este comando:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-bf2b2e7 elementor-widget elementor-widget-code-highlight" data-id="bf2b2e7" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>sudo docker run -d -p 1881:1881 -v fuxa_appdata:/usr/src/app/FUXA/server/_appdata -v fuxa_db:/usr/src/app/FUXA/server/_db -v fuxa_logs:/usr/src/app/FUXA/server/_logs -v fuxa_shapes:/usr/src/app/FUXA/client/assets/lib/svgeditor/shapes -v fuxa_images:/usr/src/app/FUXA/server/_images frangoteam/fuxa:latest
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-eab14ec e-flex e-con-boxed e-con e-parent" data-id="eab14ec" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6cfa3a1 elementor-widget elementor-widget-text-editor" data-id="6cfa3a1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Pero como yo quiero que el SCADA se ejecute automáticamente al arrancar el sistema operativo he decidido añadirlo como servicio que se auto ejecute al inicio. Para ello deberemos teclear</p>						</div>
				</div>
				<div class="elementor-element elementor-element-517941a elementor-widget elementor-widget-code-highlight" data-id="517941a" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>sudo nano /etc/rc.local</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-4d13443 e-flex e-con-boxed e-con e-parent" data-id="4d13443" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-270511d elementor-widget elementor-widget-text-editor" data-id="270511d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Y agregaremos el comando el fichero por ejemplo a mi se me queda el archivo así:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-bd2e25a elementor-widget elementor-widget-code-highlight" data-id="bd2e25a" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard">
			<pre data-line="" class="highlight-height language-bash line-numbers">
				<code readonly="true" class="language-bash">
					<xmp>#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Your command here
sudo docker run -d -p 1881:1881 -v fuxa_appdata:/usr/src/app/FUXA/server/_appdata -v fuxa_db:/usr/src/app/FUXA/server/_db -v fuxa_logs:/usr/src/app/FUXA/server/_logs -v fuxa_shapes:/usr/src/app/FUXA/client/assets/lib/svgeditor/shapes -v fuxa_images:/usr/src/app/FUXA/server/_images frangoteam/fuxa:latest


exit 0</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
					</div>
				</div>
				</div><p>La entrada <a href="https://brandon-engineer.com/en/instalar-fuxa-en-raspberry-pi/">Instalar Fuxa en Raspberry pi</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></content:encoded>
					
					<wfw:commentrss>https://brandon-engineer.com/en/instalar-fuxa-en-raspberry-pi/feed/</wfw:commentrss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>No me detecta el PLC de Beckhoff</title>
		<link>https://brandon-engineer.com/en/no-me-detecta-el-plc-de-beckhoff/</link>
					<comments>https://brandon-engineer.com/en/no-me-detecta-el-plc-de-beckhoff/#respond</comments>
		
		<dc:creator><![CDATA[Brandon]]></dc:creator>
		<pubdate>Sun, 07 Apr 2024 11:39:34 +0000</pubdate>
				<category><![CDATA[Beckhoff]]></category>
		<category><![CDATA[PLC]]></category>
		<guid ispermalink="false">https://brandon-engineer.com/?p=3597</guid>

					<description><![CDATA[<p>Introducción Con windows 11 estoy detectando algunos problemas con twincat a la hora de detectar los IPC de beckhoff y quería compartir con vosotros como lo he solucionado: Comprobar si lo detecta twincat Al buscar el adaptador de red no me sale el adaptador de red por cable. El problema es que no tenemos una...</p>
<p>La entrada <a href="https://brandon-engineer.com/en/no-me-detecta-el-plc-de-beckhoff/">No me detecta el PLC de Beckhoff</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading" id="h-introduccion">Introduction</h2>



<p>Con windows 11 estoy detectando algunos problemas con twincat a la hora de detectar los IPC de beckhoff y quería compartir con vosotros como lo he solucionado:</p>



<p>Comprobar si lo detecta twincat</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 loading="lazy" decoding="async" width="616" height="244" data-id="3599" src="https://brandon-engineer.com/wp-content/uploads/2024/04/comprobar-el-puerto-red.jpg" alt="" class="wp-image-3599" srcset="https://brandon-engineer.com/wp-content/uploads/2024/04/comprobar-el-puerto-red.jpg 616w, https://brandon-engineer.com/wp-content/uploads/2024/04/comprobar-el-puerto-red-300x119.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2024/04/comprobar-el-puerto-red-600x238.jpg 600w" sizes="(max-width: 616px) 100vw, 616px" /></figure>
</figure>



<p>Al buscar el adaptador de red no me sale el adaptador de red por cable.</p>



<p>El problema es que no tenemos una ip en el adaptador de red de nuestro portátil para poner una ip en el rango lo que hice fue meterme en el PLC y ver en que rango esta con el comando ipconfig en el cmd de windows:</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="640" height="177" data-id="3600" src="https://brandon-engineer.com/wp-content/uploads/2024/04/ip-plc-beckhoff.jpg" alt="" class="wp-image-3600" srcset="https://brandon-engineer.com/wp-content/uploads/2024/04/ip-plc-beckhoff.jpg 640w, https://brandon-engineer.com/wp-content/uploads/2024/04/ip-plc-beckhoff-300x83.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2024/04/ip-plc-beckhoff-600x166.jpg 600w" sizes="(max-width: 640px) 100vw, 640px" /></figure>
</figure>



<p>Como ya tengo la ip del adaptador de red en el que estoy conectado ya puedo configurar mi adaptador de red:</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="589" height="797" data-id="3601" src="https://brandon-engineer.com/wp-content/uploads/2024/04/configurar-ip-ordenador.jpg" alt="" class="wp-image-3601" srcset="https://brandon-engineer.com/wp-content/uploads/2024/04/configurar-ip-ordenador.jpg 589w, https://brandon-engineer.com/wp-content/uploads/2024/04/configurar-ip-ordenador-222x300.jpg 222w" sizes="(max-width: 589px) 100vw, 589px" /></figure>
</figure>



<p>Una vez ya hecho volvéis a buscar la red y os mostrará el adaptador correctamente</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="612" height="249" data-id="3602" src="https://brandon-engineer.com/wp-content/uploads/2024/04/puerto-de-red-correcto.jpg" alt="" class="wp-image-3602" srcset="https://brandon-engineer.com/wp-content/uploads/2024/04/puerto-de-red-correcto.jpg 612w, https://brandon-engineer.com/wp-content/uploads/2024/04/puerto-de-red-correcto-300x122.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2024/04/puerto-de-red-correcto-600x244.jpg 600w" sizes="(max-width: 612px) 100vw, 612px" /></figure>
</figure><p>La entrada <a href="https://brandon-engineer.com/en/no-me-detecta-el-plc-de-beckhoff/">No me detecta el PLC de Beckhoff</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></content:encoded>
					
					<wfw:commentrss>https://brandon-engineer.com/en/no-me-detecta-el-plc-de-beckhoff/feed/</wfw:commentrss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como optimizar tu código en SCL</title>
		<link>https://brandon-engineer.com/en/como-optimizar-tu-codigo-en-scl/</link>
					<comments>https://brandon-engineer.com/en/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/en/como-optimizar-tu-codigo-en-scl/">Como optimizar tu código en SCL</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading" id="h-introduccion">Introduction</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-5">
<figure class="wp-block-image size-large"><img loading="lazy" 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/en/como-optimizar-tu-codigo-en-scl/">Como optimizar tu código en SCL</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></content:encoded>
					
					<wfw:commentrss>https://brandon-engineer.com/en/como-optimizar-tu-codigo-en-scl/feed/</wfw:commentrss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SCL VS KOP ¿Cuál tiene mayor rendimiento?</title>
		<link>https://brandon-engineer.com/en/scl-vs-kop-cual-tiene-mayor-rendimiento/</link>
					<comments>https://brandon-engineer.com/en/scl-vs-kop-cual-tiene-mayor-rendimiento/#respond</comments>
		
		<dc:creator><![CDATA[Brandon]]></dc:creator>
		<pubdate>Tue, 19 Mar 2024 21:30:22 +0000</pubdate>
				<category><![CDATA[Programacion]]></category>
		<guid ispermalink="false">https://brandon-engineer.com/?p=3500</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;¿El mismo código tiene mejor rendimiento en KOP o en SCL?&#8221; Al final, KOP tiene equivalente en todas sus funciones en SCL y quería poner a prueba si las funciones consumen los mismos recursos en SCL...</p>
<p>La entrada <a href="https://brandon-engineer.com/en/scl-vs-kop-cual-tiene-mayor-rendimiento/">SCL VS KOP ¿Cuál tiene mayor rendimiento?</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading" id="h-introduccion">Introduction</h2>



<p>Esta tarde estaba aburrido en casa y puse a prueba una idea que lleva tiempo rondándome la cabeza: &#8220;¿El mismo código tiene mejor rendimiento en KOP o en SCL?&#8221; Al final, KOP tiene equivalente en todas sus funciones en SCL y quería poner a prueba si las funciones consumen los mismos recursos en SCL que en KOP. Yo, la verdad, es que imaginaba que eran iguales, pero como dice un compañero de trabajo a quien aprecio mucho, &#8220;los imagino, los espero y supongo son un cuchillo envenenado&#8221;, así que me arremangué las mangas de la camiseta y decidí hacer un pequeño temporizador tonto que no hace nada, pero la idea es que active una salida continuamente cada 1 segundo y comprobar si consume recursos.</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 Beckhoff Automation, 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 21 FB por cada una de las tareas con un tiempo de ejecución de 0.05ms y comparé los rendimientos.</p>



<h2 class="wp-block-heading" id="h-scl">SCL</h2>



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



<pre class="wp-block-code"><code>FUNCTION_BLOCK FB_WaitAndWriteSCL
VAR_INPUT
END_VAR
VAR_OUTPUT
	bStart: BOOL;
END_VAR
VAR

	temp1: TOF;
	temp2: TON;
END_VAR


	temp1(IN:= temp2.Q, PT:= T#1S,);
	
	temp2(IN:= NOT temp1.Q, PT:= T#1S,Q=>bStart);
	</code></pre>



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



<pre class="wp-block-code"><code>PROGRAM MainSCL
VAR
	fbwait0 : FB_WaitAndWriteSCL;
	fbwait1 : FB_WaitAndWriteSCL;
	fbwait2 : FB_WaitAndWriteSCL;
	fbwait3 : FB_WaitAndWriteSCL;
	fbwait4 : FB_WaitAndWriteSCL;
	fbwait5 : FB_WaitAndWriteSCL;
	fbwait6 : FB_WaitAndWriteSCL;
	fbwait7 : FB_WaitAndWriteSCL;
	fbwait8 : FB_WaitAndWriteSCL;
	fbwait9 : FB_WaitAndWriteSCL;
	fbwait10 : FB_WaitAndWriteSCL;
	fbwait11 : FB_WaitAndWriteSCL;
	fbwait12 : FB_WaitAndWriteSCL;
	fbwait13 : FB_WaitAndWriteSCL;
	fbwait14 : FB_WaitAndWriteSCL;
	fbwait15 : FB_WaitAndWriteSCL;
	fbwait16 : FB_WaitAndWriteSCL;
	fbwait17 : FB_WaitAndWriteSCL;
	fbwait18 : FB_WaitAndWriteSCL;
	fbwait19 : FB_WaitAndWriteSCL;
	fbwait20 : FB_WaitAndWriteSCL;
	bStart: BOOL;
END_VAR


	fbwait0();
	fbwait1();
	fbwait2();
	fbwait3();
	fbwait4();
	fbwait5();
	fbwait6();
	fbwait7();
	fbwait8();
	fbwait9();
	fbwait10();
	fbwait11();
	fbwait12();
	fbwait13();
	fbwait14();
	fbwait15();
	fbwait16();
	fbwait17();
	fbwait18();
	fbwait19();
	fbwait20();</code></pre>



<h2 class="wp-block-heading" id="h-kop">KOP</h2>



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-1024x1024.jpg" alt="" class="wp-image-3503" srcset="https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-1024x1024.jpg 1024w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-300x300.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-150x150.jpg 150w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-768x768.jpg 768w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-80x80.jpg 80w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-140x140.jpg 140w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-600x600.jpg 600w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-100x100.jpg 100w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP-460x460.jpg 460w, https://brandon-engineer.com/wp-content/uploads/2024/03/FB_KOP.jpg 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-1024x1024.jpg" alt="" class="wp-image-3502" srcset="https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-1024x1024.jpg 1024w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-300x300.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-150x150.jpg 150w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-768x768.jpg 768w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-80x80.jpg 80w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-140x140.jpg 140w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-600x600.jpg 600w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-100x100.jpg 100w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP-460x460.jpg 460w, https://brandon-engineer.com/wp-content/uploads/2024/03/TAREA_KOP.jpg 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



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



<p>Y para sorpresa de nadie, funcionan exactamente igual en rendimiento. </p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-6">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" data-id="3505" src="https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-1024x1024.jpg" alt="" class="wp-image-3505" srcset="https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-1024x1024.jpg 1024w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-300x300.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-150x150.jpg 150w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-768x768.jpg 768w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-80x80.jpg 80w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-140x140.jpg 140w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-600x600.jpg 600w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-100x100.jpg 100w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO-460x460.jpg 460w, https://brandon-engineer.com/wp-content/uploads/2024/03/RENDIMIENTO.jpg 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p>Por otro lado, esta es una prueba. Pronto haré lo mismo para poner a prueba una FB hecha con una máquina de estados contra un software que se ejecute todas las líneas y comprobaré los resultados de los rendimientos. Aquí sí que espero una mejora de rendimiento, ya que al saltarse una gran parte del código, podré obtener rendimientos mucho más altos.</p>



<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>Espero sus comentarios, chicos.</p><p>La entrada <a href="https://brandon-engineer.com/en/scl-vs-kop-cual-tiene-mayor-rendimiento/">SCL VS KOP ¿Cuál tiene mayor rendimiento?</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></content:encoded>
					
					<wfw:commentrss>https://brandon-engineer.com/en/scl-vs-kop-cual-tiene-mayor-rendimiento/feed/</wfw:commentrss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Crear interlocks de temporizador</title>
		<link>https://brandon-engineer.com/en/crear-interlocks/</link>
					<comments>https://brandon-engineer.com/en/crear-interlocks/#respond</comments>
		
		<dc:creator><![CDATA[Brandon]]></dc:creator>
		<pubdate>Wed, 13 Mar 2024 21:22:24 +0000</pubdate>
				<category><![CDATA[Programacion]]></category>
		<guid ispermalink="false">https://brandon-engineer.com/?p=3376</guid>

					<description><![CDATA[<p>Introducción Hoy trabajando un compañero de trabajo me enseño una forma de crear interlocks para evitar que se activen 2 salidas al mismo tiempo. El problema que estábamos viendo era activar un motor que tiene 2 sentidos de giro y a demás de la parada queríamos dar un pequeño retardo de activación hasta encender el...</p>
<p>La entrada <a href="https://brandon-engineer.com/en/crear-interlocks/">Crear interlocks de temporizador</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading" id="h-introduccion">Introduction</h2>



<p>Hoy trabajando un compañero de trabajo me enseño una forma de crear interlocks para evitar que se activen 2 salidas al mismo tiempo. </p>



<p>El problema que estábamos viendo era activar un motor que tiene 2 sentidos de giro y a demás de la parada queríamos dar un pequeño retardo de activación hasta encender el motor en sentido contrario.</p>



<h2 class="wp-block-heading" id="h-para-que-sirve-los-interlocks">¿Para que sirve los interlocks?</h2>



<p>Los interlocks nos permiten hacer una activación segura tanto para las maquinas como para las personas asegurándonos que no haya ningún disgusto ni económico ni humanitario</p>



<h2 class="wp-block-heading" id="h-como-crear-los-interlocks">¿Cómo crear los interlocks?</h2>



<p>Para empezar quería agradecer a Jose Juan esta enseñanza y querría compartir con vosotros 2 formas de hacerlo, por un lado la de Jose Juan programado con KOP y la mía hecha con una maquina de estados en SCL.</p>



<p>La verdad es que me ha parecido muy intuitiva la forma de programarlo mi compañero y que queda muy elegante</p>



<h3 class="wp-block-heading" id="h-kop">KOP</h3>



<p>Para empezar aprovecharemos el uso de la evaluación de flancos descendentes y activaremos un retardo de activación</p>



<h3 class="wp-block-heading" id="h-scl">SCL</h3>



<p>Yo para hacerlo en SCL aunque puedo hacerlo como en KOP yo optaba por un funcionamiento con una maquina de estados, no tengo tanta experiencia como mi compañero Jose Juan y decidí hacer una maquina de estados muy sencillita que permite un entendimiento relativamente intuitivo</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="437" src="https://brandon-engineer.com/wp-content/uploads/2024/03/Maquina-de-estados-interlock-e1710369562108.jpg" alt="" class="wp-image-3383" srcset="https://brandon-engineer.com/wp-content/uploads/2024/03/Maquina-de-estados-interlock-e1710369562108.jpg 800w, https://brandon-engineer.com/wp-content/uploads/2024/03/Maquina-de-estados-interlock-e1710369562108-300x164.jpg 300w, https://brandon-engineer.com/wp-content/uploads/2024/03/Maquina-de-estados-interlock-e1710369562108-768x420.jpg 768w, https://brandon-engineer.com/wp-content/uploads/2024/03/Maquina-de-estados-interlock-e1710369562108-600x328.jpg 600w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p class="has-text-align-center"><em>1.Diagrama máquina de estados</em></p>



<p>Para la ejecución he usado este codigo</p>



<pre class="wp-block-code"><code>&lt;Declaration>
FUNCTION_BLOCK Interlocks
VAR_INPUT
	bStartFirst: BOOL;
	bStartSecond: BOOL;
END_VAR
VAR_OUTPUT
	bFirstActivation: BOOL;
	bSecondActivation: BOOL;
END_VAR
VAR
	state: INT;
	TON: Tc2_Standard.TON;

	IDDLE: INT := 0;
	FIRST: INT := 10;
	SECOND: INT := 20;
	WAITING: INT := 30;
END_VAR
&lt;/Declaration>
&lt;Implementation>
CASE state OF
	
	IDDLE:		//IDLE STATE WAITING FOR OPERATION
	
	IF bStartFirst THEN
		state:=FIRST;
		
	END_IF;
	IF bStartSecond THEN
		state:=SECOND;

	END_IF;
	
	FIRST:		//ACTIVATION OF FIRST OUTPUT
	
	bSecondActivation:=FALSE; //SECURE DISABLE OUTPUT	
	IF bStartFirst THEN
		bFirstActivation:=TRUE;
	ELSE
		state:=30;
	END_IF;
	
	SECOND:		//ACTIVATION OF SECOND OUTPUT
	
	bFirstActivation:=FALSE; //SECURE DISABLE OUTPUT
	IF bStartSecond THEN
		bSecondActivation:=TRUE;
	ELSE
		state:=WAITING;
	END_IF;	
	
	WAITING:		// WAITING FOR SECURITY
	
	TON(IN:=TRUE,PT:=T#1S,Q=>,ET=>);
	IF TON.Q THEN
		TON(IN:=FALSE);
		state:=IDDLE;
	END_IF
	
	
END_CASE;
&lt;/Implementation></code></pre><p>La entrada <a href="https://brandon-engineer.com/en/crear-interlocks/">Crear interlocks de temporizador</a> se publicó primero en <a href="https://brandon-engineer.com/en">Brandon Engineer</a>.</p>
]]></content:encoded>
					
					<wfw:commentrss>https://brandon-engineer.com/en/crear-interlocks/feed/</wfw:commentrss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>