Наша цель: Эта библиотека разработана, чтобы помочь вам создать собственный ПЛК . Она призвана создать экосистему устройств, программируемых с помощью Fulmatic SOFT , обеспечивая максимальный контроль над вашим оборудованием . Вы можете использовать эту обширную библиотеку с любым чипом и IDE на ваш выбор. Вы можете самостоятельно определить принципиальную схему и все остальные характеристики оборудования.
Fulmatic SOFT: Добавьте библиотеку Fulmatic Core в код вашего микроконтроллера в соответствии с инструкциями, и теперь вы можете программировать свои встраиваемые системы с помощью Fulmatic SOFT , используя язык лестничной логики ( IEC 61131-3 ). Fulmatic SOFT предлагает вам больше, чем просто ПЛК, со всеми функциями современных ПЛК, а также командами TCP, UDP, Motion и SD Card. Fulmatic SOFT предоставляет вам огромное рабочее пространство с 771 блоком (255 DB, 256 PB, 256 FB и 4 OB) и 16384 входами/выходами.
Бесплатная прошивка ПЛК: Вы можете бесплатно использовать библиотеку ПЛК объемом до 2048 байт (1026 байт используется DB0). Если вам требуется больше памяти, необходимо приобрести лицензию (10 долларов США) . Без лицензии ПЛК будет работать 60 минут. Наша прозрачная модель лицензирования не предусматривает контрактов или сложных процессов. Вам необходимо добавить микросхему TSHA204A-SSHDA в вашу схему. При покупке лицензии вы получите ключ. Приложение для лицензирования подключится к нашему серверу с помощью этого ключа и загрузит код лицензии в микросхему через последовательный порт или Ethernet. Количество лицензий на сервере будет одновременно уменьшаться.
Github: Вы можете скачать наш пример проекта, подготовленный для STM32F407VGTx с помощью VS Code, с Github, чтобы протестировать библиотеку ПЛК . https://github.com/FultekPLC/Plc-Firmware
В этом проекте вы найдете полную прошивку ПЛК, использующую практически все возможности микросхемы, доступную в виде открытого исходного кода. Вы можете изменять аппаратные характеристики микросхемы с помощью программного обеспечения Cube MX и продолжать работу над тем же проектом. Вы также можете изменять аппаратные характеристики и программное обеспечение с помощью VS Code. Вы можете добавлять пользовательские функции в прошивку ПЛК и запускать их из кода ПЛК . Вы можете использовать любую марку и модель микросхемы ARM, указывая количество и типы входов/выходов. Вкратце, вы можете использовать библиотеку Fulmatic Core без каких-либо ограничений, в соответствии с условиями лицензии.
Обновление прошивки: Пользователи вашей продукции могут обновлять прошивку ПЛК с помощью Fulmatic SOFT. Код обновления прошивки ПЛК полностью открыт, и вы можете просмотреть и изменить код загрузчика в примере проекта. Помимо рекомендуемого нами кода, вы можете написать собственный код загрузчика.



Руководство по коду
Мы работаем над тем, чтобы сделать пример проекта размером 256 КБ простым в использовании. 256 КБ кода для микросхемы — это довольно большой проект. Понимание, модификация и реализация проекта такого размера будут непростой задачей. Мы постарались объяснить функции на этой странице и в коде. Мы также работаем над тем, чтобы объяснить их лучше. Мы постараемся ответить на ваши вопросы в разделе обсуждений нашего репозитория на Github. К сожалению, мы не предоставляем бесплатную поддержку для Fulmatic Core. Вы можете запросить у нас коммерческое предложение, чтобы мы взяли на себя все процессы от вашего имени, включая проектирование печатных плат.
Вы можете скачать пример проекта по ссылке на нашем Github: https://github.com/FultekPLC/Plc-Firmware. В примере проекта вы можете просмотреть и изменить все функции ПЛК, используя код с открытым исходным кодом. Вы можете удалять ненужные функции и добавлять новые.
Всю информацию об IDE и инструментах сборки вы найдете в нашем репозитории на GitHub. На этой странице мы расскажем о функциях, используемых для интеграции библиотек с вашим кодом для микроконтроллеров.
FulmaticConfig.h
В этом файле задаются параметры версии прошивки и размера строки.
FulmaticCore.h
Этот файл содержит заголовочные файлы функций библиотеки, которые вы будете вызывать из кода вашего микроконтроллера. В этом файле вы найдете описания всех функций. Библиотека работает со множеством переменных и строк. Вам необходимо создать эти строки и переменные в коде вашего микроконтроллера. Структура `variables_TypeDef` используется для передачи созданных вами переменных в библиотеку. Вы не можете изменять эту структуру.
FulmaticInit : Эту команду нужно выполнить только один раз при первом включении чипа. Возвращаемое значение 1 указывает на то, что лицензионный чип был корректно считан и работает по лицензии.
Функция FulmaticExecute вызывается в файле main.c для выполнения кода лестничной диаграммы ПЛК . Она вызывается во время блока Startup (при запуске ПЛК), блока Main (на каждом цикле), блока Shutdown (при остановке ПЛК), при возникновении прерывания от цифрового входа в файле Interrput.c, а также при возникновении прерывания по времени (таймера) в файле Fulmatic.c.
Фулматик.с
Все функции, необходимые для использования библиотеки в вашем коде, собраны в файле Fulmatic.c. Этот файл содержит разветвления на другие файлы. Мы группируем функции по четырем разделам. Описание функций находится в файле, где расположено тело функции.
- Функции, необходимые для примера проекта, но не используемые библиотекой.
- Функции, используемые библиотекой, которые необходимо включить в ваш код.
- Функции, используемые библиотекой в целях лицензирования. Функции, не требуемые для использования без лицензии.
- Функционал библиотеки зависит от используемых команд ПЛК. Например, если в вашем ПЛК не используются такие операции, как TCP, UDP, SPI, последовательный порт и SD-карта, библиотека будет работать без этих функций.
_DefaultEprom: Аппаратные настройки, выбираемые с помощью Fulmatic SOFT, хранятся в массивах PlcSetupEprom[STPMEMORYSIZE] и лестничном коде PlcEprom[PRGMEMORYSIZE]. Функция _DefaultEprom в этом файле содержит настройки ПЛК по умолчанию. Вы можете в определенной степени настроить конфигурацию, используя эти массивы в своем коде.
`_EachMilliSecond`: Эта функция, которая выполняется каждую миллисекунду, запускается из основного файла и библиотеки. В примере проекта флаги устанавливаются с помощью `TIM7_IRQHandler` в `Interrupt.c`, а не выполняются напрямую. Кроме того, значение `TIM7->ARR` калибруется с помощью RTC. Пожалуйста, изучите функцию `_RtcCalibration` в `Fulmatic.c`. Неправильная калибровка приведет к тому, что все операции, основанные на времени, в ПЛК будут выполняться с незначительными ошибками.
_DelayUs: Возможно, вам потребуется изменить код, чтобы обеспечить точную настройку в соответствии с частотой микросхемы. Вам следует протестировать и откалибровать его в течение длительного периода времени. Он откалиброван для частоты 168 МГц.
_SetOutputs: Обычно входные сигналы считываются, а выходные записываются в файле main.c. Однако при возникновении прерываний по времени или цифровых входных сигналов срабатывает блок прерываний OB2. Затем он вызывается из библиотеки для установки выходных сигналов без задержки.
_GetMsTimerCount : Используется для измерения длительности во многих операциях. Этот параметр должен присутствовать в вашем коде. Необходимо включить чтение значения таймера в миллисекундах.
_CrcCalculate: Используется для вычисления контрольных сумм с помощью аппаратных средств. Необходимо убедиться, что он работает корректно в зависимости от используемого чипа.
Communication.c
Этот файл содержит необходимый код для использования Ethernet, последовательного порта и SPI в ПЛК. В этом файле принимаются вызовы Modbus и Fulmatic SOFT. Согласованность данных обеспечивается за счет инициирования ответа с задержкой из файла main.c. Кроме того, в этом файле явно прописан код обновления прошивки и работы с SD-картой. Fulmatic SOFT выполняет обновления прошивки и операции с SD-картой, используя этот код. Вы можете модифицировать этот код для выполнения аналогичных операций с вашим собственным программным обеспечением вместо Fulmatic SOFT. Другие операции Fulmatic SOFT и Modbus отправляются в библиотеку и обрабатываются ею через этот код. Модифицировав код, вы также можете отвечать на вызовы Modbus, не отправляя их в библиотеку.
Flash.c
При выключении ПЛК код ПЛК и информация о постоянном таймере-счетчике сохраняются во флэш-памяти. При повторном включении ПЛК считывается последний сохраненный код из файла flash.h. Не забудьте установить информацию о секторах используемой микросхемы. Для определения момента выключения ПЛК можно использовать следующую схему.

Эта схема установит низкий уровень на выводе Shutdown Detect, когда напряжение упадет с 24 вольт до приблизительно 19 вольт. Конденсатор C1 позволяет микросхеме продолжать работу в течение короткого времени. В течение этого длительного периода стирание и перезапись флэш-памяти сопряжены с риском. Поэтому необходимо выполнить следующие шаги.
- При первом включении ПЛК мы копируем данные из сектора 10 в сектор 11. Если питание прерывается во время запуска, неповрежденные данные сохраняются в секторе 11.
- Для сохранения новых данных во флэш-память сначала необходимо её удалить. Удаление занимает гораздо больше времени, чем сохранение. Поэтому мы удаляем сектор 10 при запуске и ждём завершения работы.
- Схема обнаружения отключения дает нам чуть более 1 секунды времени. При обнаружении отключения данные сохраняются в сектор 10 в течение 100-200 мс. Поскольку блок отключения OB 1 будет выполняться до отключения, и в ПЛК может содержаться большой лестничный код, емкость конденсатора C1 должна составлять не менее 2200 мкФ. Для предотвращения скачков напряжения в цепи из-за большой емкости используется токоограничивающий резистор сопротивлением 100 Ом.
- При запуске ПЛК считывает все данные из сектора 10 и выполняет проверку контрольной суммы. Если во время запуска ПЛК произойдет прерывание питания, проверка контрольной суммы завершится неудачей. Не паникуйте, надежные данные всегда доступны в секторе 11. Запуск осуществляется автоматически из сектора 11.
Прерывание.c
В этом файле находятся прерывания для цифрового входа, АЦП, таймера и UART. Они включаются и выключаются в зависимости от режима работы ПЛК в функции _INTSetup внутри файла Fulmatic.c. Не забудьте адаптировать код _INTSetup к вашему оборудованию. Функции в этом файле должны выполняться быстро. В нашем примере кода мы использовали команду switch для повышения читаемости кода. Однако есть способы ускорить его выполнение. Например, операции внутри команды switch можно вывести в виде отдельных функций.
- void Handle_Encoder(void)
- void (*EXTI0_Handler_Ptr)(void);
- В зависимости от выбора, сделанного с помощью Fulmatic SOFT в INTSetup: EXTI0_Handler_Ptr = Handle_Encoder;
- При возникновении прерывания: запустите функцию EXTI0_Handler_Ptr() внутри функции EXTI0_IRQHandler.
Ещё один метод ускорения — преобразование байтов в 32-битные. Для серии STM можно использовать следующий код: *(int32_t *)&PlcIO[EncIAdr[0]] = __rev(ValueS32);
Не следует использовать библиотеку HAL для сброса флагов прерываний. Вместо этого следует предпочесть более быстрый метод прямого изменения значения регистра. TIM3->SR = 0; //__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
Цифровые входные прерывания: используются в высокоскоростных счетчиках, энкодерах и аналогичных устройствах.
АЦП: Мы не используем DMA; операции чтения с АЦП выполняются внутри прерывания. Это позволяет нам выполнять операции фильтрации.
Таймер: Мы используем его для таймера с интервалом в одну миллисекунду и выходов PTO. Недостаточно, чтобы таймер просто прерывал работу каждую миллисекунду; он также должен считать от 0 до 999.
USART: Прерывания последовательного порта используются для передачи и приема данных. Кроме того, в файле Fulmatic.c -> _EachMilliSecond описаны операции с выводом разрешения RS485.
SD-карта.c
В этом файле выполняются операции с SD-картой. Вы также можете сделать это иначе, чем в нашем примере проекта. Коды связи для загрузки или скачивания файлов на ПЛК написаны в открытом доступе в файле Communication.c. Вы можете загружать и скачивать файлы с помощью Fulmatic SOFT. Если в вашем проекте нет SD-карты, вы можете удалить все функции.
main.c
Этот файл будет изменяться каждый раз, когда вы сохраняете проект в Cube MX. Чтобы ваши команды оставались неизменными, необходимо писать код в областях, зарезервированных для вашего кода в Cube MX. /* НАЧАЛО ПОЛЬЗОВАТЕЛЬСКОГО КОДА 2 */ Напишите свой код здесь. /* КОНЕЦ ПОЛЬЗОВАТЕЛЬСКОГО КОДА 2 */
В этом файле можно создать все необходимые для библиотеки переменные. Возможно, вам потребуется создать большие массивы по определенному адресу. `uint8_t PlcEprom[PRGMEMORYSIZE] __attribute__((section(“.ccmram”))));`
Внимательно изучите операции внутри цикла while. Любые внесенные вами изменения не должны нарушать общую структуру. Код, написанный в других частях вашей программы, не должен замедлять этот цикл.
