Nuestro objetivo: Esta biblioteca está diseñada para ayudarte a construir tu propio PLC . Busca crear un ecosistema de dispositivos programables con Fulmatic SOFT , brindándote el máximo control sobre tu hardware . Puedes usar esta completa biblioteca con cualquier chip e IDE que elijas. Puedes definir tú mismo el diagrama del circuito y todas las demás especificaciones de hardware.
Fulmatic SOFT: Añada la biblioteca Fulmatic Core al código de su chip siguiendo las instrucciones y podrá programar sus sistemas embebidos con Fulmatic SOFT utilizando el lenguaje de escalera ( IEC 61131-3 ). Fulmatic SOFT le ofrece mucho más que un PLC, con todas las funciones de los PLC modernos, además de comandos TCP, UDP, de movimiento y de tarjeta SD. Fulmatic SOFT le proporciona un amplio espacio de trabajo con 771 bloques (255 DB, 256 PB, 256 FB y 4 OB) y 16384 E/S.
Firmware PLC gratuito: Puede usar la biblioteca PLC gratuitamente hasta 2048 bytes (1026 bytes utilizados por DB0). Si necesita más memoria, debe adquirir una licencia (10 USD) . Sin licencia, el PLC funcionará durante 60 minutos. Nuestro modelo de licencias transparente no tiene contratos ni procesos complicados. Debe agregar un chip TSHA204A-SSHDA a su circuito. Al adquirir una licencia, recibirá una clave. La aplicación de licencias se conectará a nuestro servidor con esta clave y cargará el código de licencia al chip a través del puerto serie o Ethernet. Su contador de licencias en el servidor disminuirá simultáneamente.
Github: Puedes descargar nuestro proyecto de ejemplo, preparado con VS Code para STM32F407VGTx, desde Github para probar la biblioteca del PLC . https://github.com/FultekPLC/Plc-Firmware
En este proyecto, encontrará el firmware completo del PLC, que utiliza prácticamente todas las funcionalidades del chip, disponible como código abierto. Puede modificar las especificaciones de hardware del chip con el software Cube MX y continuar trabajando en el mismo proyecto. También puede cambiar las especificaciones de hardware y software con VS Code. Puede agregar funciones personalizadas al firmware del PLC y ejecutarlas desde el código del PLC. Puede usar cualquier marca y modelo de chip ARM, especificando el número y tipo de E/S. En resumen, puede usar la biblioteca Fulmatic Core sin restricciones, de acuerdo con los términos de la licencia.
Actualización de firmware: Los clientes que utilizan su producto pueden actualizar el firmware del PLC con Fulmatic SOFT. El código de actualización del firmware del PLC es completamente de código abierto, y puede consultar y modificar el código del gestor de arranque en el proyecto de ejemplo. Además del código que recomendamos, puede escribir su propio código de gestor de arranque.



Guía de códigos
Estamos trabajando para que el proyecto de ejemplo de 256 KB sea fácil de usar. 256 KB de código para un chip es un proyecto bastante grande. Entender, modificar e implementar un proyecto de este tamaño no será sencillo. Hemos intentado explicar las funciones en esta página y en el código. También estamos trabajando para mejorar su explicación. Intentaremos responder a sus preguntas en la sección de discusiones de nuestro repositorio de GitHub. Lamentablemente, no ofrecemos soporte gratuito para Fulmatic Core. Puede solicitarnos un presupuesto para que gestionemos todos los procesos en su nombre, incluido el diseño de la placa de circuito impreso.
Puedes descargar el proyecto de ejemplo desde nuestro enlace de GitHub: https://github.com/FultekPLC/Plc-Firmware. En el proyecto de ejemplo, puedes ver y modificar todas las funciones del PLC utilizando código abierto. Puedes eliminar las funciones que no necesites y añadir otras nuevas.
Puedes encontrar toda la información sobre IDE y herramientas de compilación en nuestro repositorio de GitHub. En esta página, explicaremos las funciones utilizadas para la integración de la biblioteca con tu código MCU.
FulmaticConfig.h
En este archivo se definen la versión del firmware y el tamaño de las cadenas de caracteres.
FulmaticCore.h
Este archivo contiene los encabezados de las funciones de la biblioteca que llamarás desde tu código MCU. Encontrarás descripciones de todas las funciones en este archivo. La biblioteca trabaja con numerosas variables y cadenas de caracteres. Debes crear estas cadenas y variables en tu código MCU. La estructura `variables_TypeDef` se utiliza para pasar las variables que crees a la biblioteca. Esta estructura no se puede modificar.
FulmaticInit : Este comando solo debe ejecutarse una vez, al encender el chip por primera vez. Si el valor devuelto es 1, significa que el chip de licencia se ha leído correctamente y está funcionando bajo licencia.
FulmaticExecute es una función que se llama dentro de main.c para ejecutar el código de escalera del PLC . Se llama durante el bloque Startup (cuando el PLC arranca), el bloque Main (en cada ciclo), el bloque Shutdown (cuando el PLC se detiene), cuando se produce una interrupción de entrada digital en Interrput.c y cuando se produce una interrupción basada en tiempo (Timer) en Fulmatic.c.
Fulmatic.c
Todas las funciones necesarias para usar la biblioteca en tu código se encuentran en el archivo Fulmatic.c. Este archivo genera dependencias con otros archivos. Agrupamos las funciones bajo cuatro encabezados. Las descripciones de las funciones se encuentran en el archivo donde se ubica el cuerpo de cada función.
- Funciones necesarias para el proyecto de ejemplo que no son utilizadas por la biblioteca.
- Funciones utilizadas por la biblioteca que deben incluirse en su código.
- Funciones que la biblioteca utiliza para fines de licencia. Funciones que no son necesarias para el uso sin licencia.
- Las funciones de la biblioteca dependen de los comandos del PLC utilizados. Por ejemplo, si en su PLC no se utilizan operaciones como TCP, UDP, SPI, puerto serie y tarjeta SD, la biblioteca funcionará sin estas funciones.
_DefaultEprom: Los ajustes de hardware seleccionables con Fulmatic SOFT se almacenan en los arrays de código PlcSetupEprom[STPMEMORYSIZE] y PlcEprom [PRGMEMORYSIZE]. La función _DefaultEprom de este archivo contiene los ajustes predeterminados del PLC. Puede personalizar la configuración hasta cierto punto utilizando estos arrays en su código.
`_EachMilliSecond`: Esta función, que se ejecuta cada milisegundo, se ejecuta tanto en el archivo principal como en la biblioteca. En el proyecto de ejemplo, los indicadores se configuran mediante `TIM7_IRQHandler` en `Interrupt.c`, no se ejecutan directamente. Además, el valor `TIM7->ARR` se calibra con el RTC. Consulte la función `_RtcCalibration` en `Fulmatic.c`. Una calibración incorrecta provocará errores menores en todas las operaciones basadas en el tiempo del PLC.
_DelayUs: Es posible que necesite modificar el código para asegurar que esté configurado con precisión según la frecuencia del chip. Debe probarlo y calibrarlo durante un período prolongado. Está calibrado para 168 MHz.
_SetOutputs: Normalmente, las entradas se leen y las salidas se escriben en main.c. Sin embargo, cuando se producen interrupciones de entrada digitales o basadas en tiempo, se activa el bloque de interrupción OB2. Este se llama desde la biblioteca para configurar las salidas sin demora.
_GetMsTimerCount : Se utiliza para medir la duración en muchas operaciones. Debe estar presente en tu código. Necesitas habilitar la lectura del valor del temporizador en milisegundos.
_CrcCalculate: Se utiliza para calcular sumas de verificación mediante hardware. Debe asegurarse de que funcione correctamente según el chip que esté utilizando.
Comunicación.c
Este archivo contiene el código necesario para usar Ethernet, el puerto serie y SPI en el PLC. Las llamadas de Modbus y Fulmatic SOFT se reciben en este archivo. La consistencia de los datos se garantiza iniciando la respuesta con un retardo desde main.c. Además, el código para la actualización del firmware y la tarjeta SD está escrito explícitamente en este archivo. Fulmatic SOFT realiza las actualizaciones del firmware y las operaciones con la tarjeta SD mediante este código. Puede modificar este código para realizar operaciones similares con su propio software en lugar de Fulmatic SOFT. Otras operaciones de Fulmatic SOFT y de Modbus se envían a la biblioteca y esta responde a ellas a través de este código. Al modificar el código, también puede responder a las llamadas de Modbus sin enviarlas a la biblioteca.
Flash.c
El código del PLC y la información del temporizador persistente se guardan en la memoria flash cuando el PLC se apaga. Al encenderlo de nuevo, se lee el último código guardado del archivo flash.h. Recuerde configurar la información del sector del chip que esté utilizando. Puede usar el siguiente circuito para detectar cuándo se apaga el PLC.

Este circuito activará el pin de detección de apagado cuando la tensión baje de 24 voltios a aproximadamente 19 voltios. El condensador C1 permite que el chip siga funcionando durante un breve periodo. Durante este tiempo prolongado, borrar y reescribir la memoria flash es arriesgado. Por lo tanto, se deben seguir los siguientes pasos.
- Cuando se enciende el PLC por primera vez, copiamos el sector 10 al sector 11. Si se interrumpe la alimentación durante el arranque, los datos intactos se almacenan en el sector 11.
- Para guardar datos nuevos en la memoria Flash, primero hay que borrarlos. Borrar lleva mucho más tiempo que guardar. Por lo tanto, borramos el sector 10 al arrancar y esperamos a que se apague el sistema.
- El circuito de detección de apagado nos proporciona algo más de un segundo. Cuando se detecta el apagado, los datos se guardan en el sector 10 en un plazo de 100 a 200 ms. Dado que el bloque de apagado OB 1 se ejecutará antes del apagado y puede haber un código de escalera extenso en el PLC, el condensador C1 debe ser de al menos 2200 µF. Se utiliza una resistencia limitadora de corriente de 100 ohmios para evitar una sobrecarga en el circuito debido a la alta capacitancia.
- Cuando el PLC arranca, lee todos los datos del sector 10 y realiza una comprobación de suma de verificación. Si se interrumpe la alimentación durante el arranque, la comprobación de suma de verificación fallará. No se preocupe, siempre hay datos fiables disponibles en el sector 11. El arranque se realiza automáticamente desde el sector 11.
Interrupción.c
Las interrupciones de entrada digital, ADC, temporizador y UART se encuentran en este archivo. Se habilitan y deshabilitan según el modo de operación del PLC en la función _INTSetup dentro de Fulmatic.c. Recuerde adaptar el código de _INTSetup a su hardware. Las funciones en este archivo deben ejecutarse rápidamente. En nuestro código de ejemplo, usamos el comando switch para mejorar la legibilidad del código. Sin embargo, existen maneras de acelerar su ejecución. Por ejemplo, las operaciones dentro del comando switch se pueden escribir como funciones separadas.
- void Handle_Encoder(void)
- void (*EXTI0_Handler_Ptr)(void);
- Dependiendo de la selección realizada con Fulmatic SOFT en INTSetup: EXTI0_Handler_Ptr = Handle_Encoder;
- Cuando se produce una interrupción: Ejecute EXTI0_Handler_Ptr(); dentro de EXTI0_IRQHandler.
Otro método de aceleración es la conversión de byte a 32 bits. Puede usar este código para la serie STM: *(int32_t *)&PlcIO[EncIAdr[0]] = __rev(ValueS32);
No deberíamos usar la biblioteca HAL para borrar los indicadores de interrupción. En su lugar, deberíamos preferir el método más rápido de modificar directamente el valor del registro. TIM3->SR = 0; //__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
Interrupciones de entrada digital: Se utilizan para contadores de alta velocidad, codificadores y aplicaciones similares.
ADC: No utilizamos DMA; realizamos las operaciones de lectura del ADC dentro de la interrupción. Esto nos permite realizar operaciones de filtrado.
Temporizador: Lo usamos para un temporizador de un milisegundo y salidas PTO. No basta con que el temporizador simplemente interrumpa cada milisegundo; también debe contar de 0 a 999.
USART: Las interrupciones del puerto serie se utilizan para la transmisión y recepción de datos. Además, Fulmatic.c -> _EachMilliSecond contiene operaciones de habilitación del pin RS485.
Tarjeta SD.c
Las operaciones con la tarjeta SD se realizan en este archivo. También puede hacerlo de forma diferente a como se muestra en nuestro proyecto de ejemplo. Los códigos de comunicación para cargar o descargar archivos al PLC están escritos en código abierto dentro de Communication.c. Puede cargar y descargar archivos usando Fulmatic SOFT. Si su proyecto no tiene una tarjeta SD, puede eliminar todas las funciones.
C Principal
Este archivo cambiará cada vez que guardes el proyecto con Cube MX. Para asegurarte de que tus comandos permanezcan sin cambios, debes escribir tu código en las áreas reservadas para ello en Cube MX. /* USER CODE BEGIN 2 */ Escribe tu código aquí. /* USER CODE END 2 */
En este archivo puede crear todas las variables necesarias para la biblioteca. Es posible que necesite crear matrices grandes en una dirección específica. `uint8_t PlcEprom[PRGMEMORYSIZE] __attribute__((section(“.ccmram”))));`
Examine detenidamente las operaciones dentro del bucle while. Cualquier cambio que realice no debe alterar la estructura general. El código escrito en otras partes del programa no debe ralentizar este bucle.
