Desarrollar un proyecto con microcontrolador puede ser hecho de muchas formas o maneras. Cada programador o grupo de programadores usara probablemente la forma mas adecua a su manera de trabajar. En los ultimos años, esta tomando popularidad el lenguaje UML o Lenguaje Unificado de Modelage, como metodo de programacion para proyectos basados en microcontroladores. Algunos compiladores, ya ofrecen herramientas para este lenguje, como el compilador de la empresa iar, ofreciendo soporte a los diagramas y maquinas de estado, que son uno de los diagramas usados en la lenguaje uml.

 Para tener una idea general de lo que puede ser un proyecto con microcontrolador, sin usar el lenguaje UML (Unified Modeling Lenguage) o un método similar, es comparable a quien quiere construir un edificio y no hace uso de un arquitecto para dar forma al edificio. También es comparable, a quien quiere hacer una pieza mecánica y no hace antes un plano, dibujo o diagrama de esa pieza. Se puede decir que el lenguaje UML es como la arquitectura o plano de un proyecto con microcontrolador. Inicialmente el lenguaje fue creado para poder desarrollar programas y proyectos de software para computadores, pero en los días de hoy, está siendo usada para el desarrollo de programas o proyectos con microcontrolador. Como la lenguaje UML fue desarrollada para lenguajes orientados a objeto (clases) como C++/C# y la mayoría de proyectos con microcontroladores está escrita en lenguaje C, es necesario hacer algunas adaptaciones para soportar UML en la lenguaje C. y la mayoría de proyectos con microcontroladores está escrita en lenguaje C, es necesario hacer algunas adaptaciones para soportar UML en la lenguaje C.

La lenguaje UML es formada por una serie de diagramas para poder describir, organizar, formatear, clasificar, etc, el proyecto que se pretende desarrollar. Para el caso de proyectos con microcontrolador, los diagramas más usados son:

Diagramas de Casos de Uso.

Diagramas de Clases.

Diagramas de Estado.

En este este artículo, explicaremos como usar estos diagramas en el desarrollo de un proyecto o idea que use microcontroladores.

 

DIAGRAMAS DE CASO DE USO (USE CASE DIAGRAM)

 

Los diagramas de caso de uso, indica los usos que el proyecto permite utilizar, es decir, para qué sirve el proyecto y quienes lo van usar. Por este motivo este diagrama tiene 2 componentes importantes.

 

 

1 – Los Usuarios.
1 – Los Usuarios.

 

 

2 – Los Casos de Uso.
2 – Los Casos de Uso.

 

 

Los Usuarios son representados en el diagrama por un símbolo similar al de la Figura 1. Los Casos de Uso son representados en el diagrama por un símbolo similar al de la Figura 2. Al lado de los símbolos Usuarios, se coloca un texto describiendo su papel (rol) y dentro de los símbolos Casos de Uso, se coloca un texto describiendo su función.

 

 

3 – Diagrama de Casos
3 – Diagrama de Casos

 

 

La Figura 3 muestra un ejemplo de un diagrama de Casos de Uso para un proyecto de una alarma básica para carro. En este diagrama, la línea con fecha indica que Usuario (actor) hace uso del proyecto.

 

DIAGRAMA DE CLASES (CLASS DIAGRAM).

Los Diagramas de Clases describen las funciones y datos (variables) del proyecto. Este diagrama se encarga de clasificar las funciones (rutinas) en módulos o bloques para una mejor organización de software. A estos módulos o bloques se les da el nombre de Clases.

Cada Clase en el diagrama es formada por 3 partes principales:

 

1- Nombre de la clase.

2- Propiedades o variables.

3- Funciones o Rutinas.

 

 

4 – Las partes de una Clase
4 – Las partes de una Clase

 

 

La Figura 4 describe donde van ubicados cada una de las partes de una clase. El Nombre de la Clase debe indicar a quien están orientadas las variables y las funciones. Por ejemplo en una alarma, esta clase puede llamarse Alarm. Las Variables son los datos necesarios para que el modulo o clase trabaje. Estas variables se pueden organizar en una estructura. Para la clase Alarm esta estructura se codifica en el archivo cabecera (Alarm.h) y seria asi:

 

typedef struct
 {
   uint32_t state;
 }Alarm;

 

Figura 5. Diagrama de Clases
Figura 5. Diagrama de Clases

 

 

Las Funciones son código organizado por rutinas. La Figura 5 muestra un ejemplo de un diagrama de clase para una alarma de carro. De este diagrama podemos generar el código para cada clase. Por ejemplo para la clase Alarm, el código seria asi:

 

#include "Alarm.h"
Alarm a;
void Alarm_StateMachine(Event event)
{
}
void Alarm_Init(void)
{
}

 

 

Figura 6. Diagrama en bloque de alarma de carro
Figura 6. Diagrama en bloque de alarma de carro

 

 

Para las demás clase se generan códigos similares. La Figura 6 muestra el diagrama en bloques para una alarma de carro básica. Se puede notar que hay una relación entre los bloques y las clases en los diagramas. Esto es una guía, mas dependiendo del proyecto, pueden resultar más clases.

 

DIAGRAMA DE ESTADO DE MAQUINA (STATE MACHINE DIAGRAM).

Este diagrama describe el funcionamiento dinámico del proyecto, es decir como el proyecto debe funcionar. Este diagrama es formado por los siguientes símbolos:

1- Estados.

2- Transiciones.

3- Eventos.

4- Acciones.

 

 

7 - Figura 7. Simbolo para los Estados
Figura 7. Simbolo para los Estados

 

 

 

Figura 8. Simbolo para los Eventos
Figura 8. Simbolo para los Eventos

 

 

 

Figura 9. Simbolo para las Transiciones
Figura 9. Simbolo para las Transiciones

 

 

 

10 - Figura 10. Simbolo para las Acciones
10 - Figura 10. Simbolo para las Acciones

 

 

En la Figura 7 muestra el símbolo para los Estados. La Figura 8 muestra el símbolo para las Transiciones. La Figura 9 muestra los Eventos, siendo nombres (texto) que se colocan al lado de las transiciones. La Figura 10 muestra las Acciones, las cuales son rutinas o funciones del diagrama de clases.

La Figura 11 muestra un diagrama de estado para la alarma de carro.

Una vez diseñado el diagrama de estado, es necesario codificarlo. Para esto, a cada estado, se le asigna un case en una instrucción switch. El código para el diagrama de estado de la Figura 11, seria así:

 

Figura 11. Diagrama de Estado
Figura 11. Diagrama de Estado

 

 

switch(a.state)
 {
   case Alarm_Disarmed:
   break;
 
   case Alarm_Armed:
   break;
 
   case Alarm_Triggered:
   break;
 }

 

Ahora dentro de cada case correspondiente a cada estado, es necesario tratar los eventos que ese estado puede manejar. Por ejemplo, para el estado Alarm_Disarmed, los eventos que se manejan serian:

 

case Alarm_Disarmed:
switch(event)
 {
   case BUTTON:
   a.state = Alarm_Armed;
   break;
 }
 break;

 

Para el estado Alarm_Armed, los eventos que se manejan serian:

case Alarm_Armed:
switch(event)
 {
   case BUTTON:
   a.state = Alarm_Disarmed;
   break;
 }
break;

 

Para el estado Alarm_Triggered, los eventos que se manejan serian:

 

case Alarm_Triggered: 
switch(event)
 {
   case DOOR_OPEN:
   Siren_On();
   a.state = Alarm_Triggered;
   break;

 

   case ULTRASONIC:
   Siren_On();
   a.state = Alarm_Triggered;
   break;

   case BUTTON:
   a.state = Alarm_Disarmed;
   break;
 }
break;

 

A este forma de codificación se le da el nombre de Maquina de Estado. Ahora, es necesario unir todo este código en una sola función, para crear la máquina de estado del proyecto. La función seria así:

 

void Alarm_StateMachine(Event event)
 {
   switch(a.state)
   {
        case Alarm_Disarmed:
        switch(event)
           {
              case BUTTON:
              a.state = Alarm_Armed;
              break;
           }
           break;
 
       case Alarm_Armed:
       switch(event)
         {
            case BUTTON:
            a.state = Alarm_Disarmed;
            break;
         }
         break;
 
      case Alarm_Triggered:
      switch(event)
        {
            case DOOR_OPEN:
            Siren_On();
            a.state = Alarm_Triggered;
            break;
 
            case ULTRASONIC:
            Siren_On();
            a.state = Alarm_Triggered;
            break;
 
            case BUTTON:
            a.state = Alarm_Disarmed;
            break;
        }
        break;
   }
}

 

Tanto para los estados, como para los eventos, es necesario crear enumeradores (enum) para que el código en el archivo Alarm.c reconozca esos nombres. Esto se hace en el archivo cabecera (head), es decir en Alarm.h y el código seria así:

 

enum ALARM_EVENTS
{
   BUTTON,
   DOOR_OPEN,
   ULTRASONIC
};

 

enum Alarm_State
{
   Alarm_Disarmed,
   Alarm_Armed,
   Alarm_Triggered
};

 

El archivo main.c para el proyecto de alarma de carro, seria así:

#include "Alarm.h"
#include "RemoteControl.h"
#include "Ignition.h"
#include "Door.h"
#include "UltraSonic.h"
#include "Siren.h"

 

int main()
{
   Init_IO();
   Alarm_Init();
   RemoteControl_Init();
   UltraSonic_Init();

 

   while(1)
   {
      RemoteControl_Events();
      Ignition_Events();
      Door_Events();
      UltraSonic_Events():
   }
}

 

Notemos en el loop principal, las llamadas a las funciones Events() de cada clase. Es en esta función o rutina, donde se codifican los eventos para el proyecto. El siguiente código muestra un ejemplo para la clase Door.

 

void Door_Events(void)
  {
   if( Door_IsOpen() )
     {
        Alarm_StateMachine( DOOR_OPEN );
     }
  }

 

Así, si cualquier puerta del carro se abre, es enviado a la función Alarm_StateMachine() el evento DOOR_OPEN y la máquina de estado se encarga de procesar el evento de acuerdo al estado en que se encuentre.

El ejemplo de este artículo es sencillo, pero demuestra cómo usar los diagramas UML para crear un proyecto con microcontrolador. En un proyecto real, normalmente se tienen más funciones, como por ejemplo bloquear las puertas del carro, elevar los vidrios de las puertas, caso estos estén abiertos, o bloquear el carro, caso se detecte que ha sido robado.

Existen programas para editar los diagramas UML. Algunos ejemplos son: Visual Paradigm, Enterprise Architect, Visual Studio de Microsoft y muchos mas. La Figura 12 muestra el editor de diagrama de clases del programa Visual Paradigma. Estos programas son de fácil uso y muy intuitivos en su manejo.

 

Figura 12. Editor de Clases en Visual Paradigm
Figura 12. Editor de Clases en Visual Paradigm

 

 

19.045MBMemory Usage42.43msRequest Duration
Joomla! Version5.2.3
PHP Version8.3.16
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.5.22-MariaDB
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
[]
$_SERVER
array:51 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "SCRIPT_NAME" => "/index.php" "RE...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1741909264 "last" => 1741909264...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.73KB) (302μs)
  • afterInitialise (1.14MB) (3.75ms)
  • afterRoute (179.16KB) (1ms)
  • beforeRenderComponent com_content (100.65KB) (508μs)
  • Before Access::preloadComponents (all components) (33.5KB) (208μs)
  • After Access::preloadComponents (all components) (107.06KB) (409μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (9μs)
  • After Access::preloadPermissions (com_content) (16.19MB) (21.17ms)
  • Before Access::getAssetRules (id:8 name:com_content) (480.16KB) (1.82ms)
  • After Access::getAssetRules (id:8 name:com_content) (7.36KB) (34μs)
  • afterRenderComponent com_content (464.41KB) (5.76ms)
  • afterDispatch (2.25KB) (51μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (423.33KB) (1.56ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (293μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (91μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (63.1KB) (1.1ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (10.1KB) (551μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.39KB) (67μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (184μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (54μs)
  • afterRender (312.8KB) (3.37ms)
  • 1 x After Access::preloadPermissions (com_content) (16.19MB) (49.89%)
    21.17ms
    1 x afterRenderComponent com_content (464.41KB) (13.58%)
    5.76ms
    1 x afterInitialise (1.14MB) (8.83%)
    3.75ms
    1 x afterRender (312.8KB) (7.94%)
    3.37ms
    1 x Before Access::getAssetRules (id:8 name:com_content) (480.16KB) (4.3%)
    1.82ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (423.33KB) (3.69%)
    1.56ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (63.1KB) (2.6%)
    1.10ms
    1 x afterRoute (179.16KB) (2.37%)
    1.00ms
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (10.1KB) (1.3%)
    551μs
    1 x beforeRenderComponent com_content (100.65KB) (1.2%)
    508μs
    1 x After Access::preloadComponents (all components) (107.06KB) (0.96%)
    409μs
    1 x afterLoad (85.73KB) (0.71%)
    302μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (0.69%)
    293μs
    1 x Before Access::preloadComponents (all components) (33.5KB) (0.49%)
    208μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (0.43%)
    184μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.21%)
    91μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.39KB) (0.16%)
    67μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (0.13%)
    54μs
    1 x afterDispatch (2.25KB) (0.12%)
    51μs
    1 x After Access::getAssetRules (id:8 name:com_content) (7.36KB) (0.08%)
    34μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.02%)
    9μs
23 statements were executed, 5 of which were duplicates, 18 unique11.59ms1.61MB
  • SELECT @@SESSION.sql_mode;32μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 177μs1.3KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • INSERT INTO `incbmx_session` (`session_id`,`guest`,`time`,`userid`,`username`,`client_id`) VALUES (:session_id, :guest, :time, :user_id, :username, :client_id)166μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`54μs656B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `incbmx_usergroups` AS `a` LEFT JOIN `incbmx_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest82μs1.64KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`224μs20.2KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39)238μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 08.15ms1.46MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_assets`285μs2.02KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • SELECT * FROM `incbmx_assets` WHERE `name` = 'com_content.article.1619'67μs912B/libraries/src/Table/Table.php:780Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`257μs1.77KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '1619'133μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)153μs46.13KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`180μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `incbmx_contentitem_tag_map` AS `m` INNER JOIN `incbmx_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)220μs3.97KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`171μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM incbmx_fields AS a LEFT JOIN `incbmx_languages` AS l ON l.lang_code = a.language LEFT JOIN incbmx_users AS uc ON uc.id=a.checked_out LEFT JOIN incbmx_viewlevels AS ag ON ag.id = a.access LEFT JOIN incbmx_users AS ua ON ua.id = a.created_user_id LEFT JOIN incbmx_fields_groups AS g ON g.id = a.group_id LEFT JOIN `incbmx_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2,:preparedArray3)) AND `a`.`access` IN (:preparedArray4,:preparedArray5)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray6,:preparedArray7)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC404μs6.06KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`173μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1143μs656B/administrator/components/com_finder/src/Helper/LanguageHelper.php:135Copy
  • SELECT `title` FROM `incbmx_finder_taxonomy` WHERE `parent_id` = 1 AND `state` = 1 AND `access` IN (1,5)86μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context59μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)169μs46.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `incbmx_scheduler_tasks` AS `a` WHERE `a`.`state` = 174μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content
  • warningassets - No asset found for com_content.article.1619, falling back to com_content