Ошибка распределения памяти проекта segnetics
Концепция памяти в CoDeSys
Не могу найти хорошего описания по модели памяти в CoDeSys.
Конкретно вопрос можно поставить следующим образом.
На прикрепленной картинке выделена область памяти, которую автоматически сформировал
CoDeSys при добавлении Modbus Masterа. В этой области появились переменные "Last adress" и "Last error", которые как будто
перекрывают друг друга, так как у одной адрес QD8.0 и тип данных DWord, а у другой адрес QW8.1 и тип данных Word. Хотя, видимо, не перекрывают. Просто я не понимаю концепцию памяти. Видимо, области 8.0 и 8.1 - это разные области?
Тоже не понятно, что делается с адресами вставленного Modbus Universal Devicа?
Получается, что под него выделаяется область памяти QB8.1.0 и подобласти IW8.1.0.0 - IW8.1.3.0.
Получается, что адреса QD8.0, QW8.1, QB8.1.0 - это разные адреса.
Зачем для области I так увеличивать количество точек (вложенности, что ли)? Почему нельзя было обозвать их IW8.0 - IW8.3, например? Ведь здесь другой идентификатор в начале - I вместо Q.
Как разобраться со всеми этими точками в адресах?
Не могу найти хорошего описания по модели памяти в CoDeSys.
Конкретно вопрос можно поставить следующим образом.
На прикрепленной картинке выделена область памяти, которую автоматически сформировал
CoDeSys при добавлении Modbus Masterа. В этой области появились переменные "Last adress" и "Last error", которые как будто
перекрывают друг друга, так как у одной адрес QD8.0 и тип данных DWord, а у другой адрес QW8.1 и тип данных Word. Хотя, видимо, не перекрывают. Просто я не понимаю концепцию памяти. Видимо, области 8.0 и 8.1 - это разные области?
Тоже не понятно, что делается с адресами вставленного Modbus Universal Devicа?
Получается, что под него выделаяется область памяти QB8.1.0 и подобласти IW8.1.0.0 - IW8.1.3.0.
Получается, что адреса QD8.0, QW8.1, QB8.1.0 - это разные адреса.
Зачем для области I так увеличивать количество точек (вложенности, что ли)? Почему нельзя было обозвать их IW8.0 - IW8.3, например? Ведь здесь другой идентификатор в начале - I вместо Q.
Segnetics – российский разработчик и производитель контрольно-измерительных приборов и средств автоматизации для различных отраслей промышленности.
Компания работает с 2003 года.
Компания «Сегнетикс» - российский производитель компонентов автоматизации.
Основным направлением деятельности компании является производство контроллеров и модулей ввода/вывода для управления вентиляцией, отоплением и другими инженерными системами зданий и сооружений.
Программирование контроллеров осуществляется с помощью собственной среды разработки прикладных программ – SMLogix, поддерживающей язык FBD стандарта МЭК 61131/3. Для ускорения разработки проектов по управлению вентиляцией, отоплением и ИТП разработано программное обеспечение SM Constructor, которое позволяет создавать рабочие проекты в несколько кликов. Продукт генерирует открытый код, который клиенты могут изменять по своему усмотрению.
Компания Segnetics производит ПЛК Pixel, Matrix, SMLogix, SMH2G(i), SMH4, TRIM5.
Вы можете заказать у нас разработку программ для контроллеров Segnetics Pixel, Matrix, SMH, Trim5.
Руководства по эксплуатации программируемых контроллеров Segnetics
Руководства по эксплуатации модулей расширения Segnetics
Конструкторы программ для ПЛК Segnetics
Полезная информация
- Запускаем SMLogix, дважды нажимаем на контроллер в дереве слева;
- Во вкладке "Настройка связи" нажимаем "Поиск и диагностика";
- Подключаем контроллер через USB кабель, нажимаем "Поиск", выбираем наш найденный контроллер в окне ниже;
- В правой части окна нажимаем "Обновить ядро", выбираем файлы прошивки и DEB-пакет для нее, нажимаем "Обновить ПО";
Разработали программу, наладили связь с контроллером, но в процессе прошивки выдает ошибку о невозможности определения конфигурации контроллера - попробуйте обновить прошивку контроллера, как описано выше. Перезагрузите контроллер и среду разработки. Если не помогло - установите более раннюю версию среды разработки и попробуйте залить пустой проект.
После установки сетевой платы ethernet в контроллер Matrix ее необходимо инициализировать и настроить. Для этого на экране контроллера одновременно нажимаем клавиши вправо и влево, заходим в раздел "Сеть" - "Ethernet" - "LAN1", включаем передачу данных тумблером состояния и вводим необходимые настройки ниже.
Авторам необходимо ознакомиться с правилами сайта, и постараться не допускать их нарушений. Нарушение правил может стать причиной блокировки вашего аккаунта.
Новинка: современный отладчик для контроллеров Сегнетикс
Сегнетикс, российский производитель контроллёров, обновил программное обеспечение SMLogix. Теперь пользователям доступен новый отладчик SMDebug. Благодаря ему инженеры АСУ ТП выходят на новый уровень производительности.
Проекты, разрабатываемые в SMLogix, впрочем, как и в других системах программирования, далеко не всегда работают, как задумано. Если проблемы не носят концептуального характера, то в большинстве случаев требуется анализировать процесс выполнение кода, чтобы добраться до причин ошибок. Без специальных средств, отладка превращается в многочасовое изучение кода, поглощая львиную долю ресурсов разработчика. Но все изменилось с новым отладчики SMDebug.
SMDebug имеет 4 современных инструмента: функция паузы, наблюдение, точка останова и блокировка.
Новое поколение ПЛК: российский контроллер Segnetics на высокоскоростной системной шине MTBus
SMH4 Segnetics © Фото из открытых источников
Российский производитель свободно программируемых контроллеров компания «Segnetics» объявляет о выпуске новой модификации свободно программируемого контроллера SMH4 — 1011-00-0
ПЛК серии SMH4 — это отечественный ПЛК, который популярен благодаря своим характеристикам.
Новинка среди модулей расширения — MRL от SEGNETICS
MRL— это новый модуль расширения, представленный в линейке оборудования Segnetics, российского производителя ПЛК.
Низкая цена канала — вот одно из отличительных особенностей модуля MRL, при этом экономия не отразилась на качестве самого модуля. Производителю Segnetics удалось снизить стоимость благодаря двум характеристикам:
Контроллеры Segnetics с технологией работы в дистанционном режиме
В 21 веке всё чаще — на предприятиях и дома — мы используем технологии, не требующего непосредственного присутствия. В сфере управления контроллерами так же разрабатывались различные технологии, но большинство имели серьёзный недостаток: односторонняя связь с ПЛК, когда есть возможность удаленно запустить программу, заменить уставку, но нет возможности увидеть, что ПЛК отображает на своём экране.
Чтобы полноценно работать с ПЛК дистанционно, Segnetics рекомендует технологию VNC. С помощью VNC удалённо подключиться можно к контроллёрам Segnetics, которые работают на Linux: Matrix, TRIM5, SMH4.
VNC © Фото из открытых источников
Российский контроллер нового поколения
© Фото из открытых источников
Российская компания Segnetics представила на рынок новинку — отечественный программируемый логический контроллер Matriх — универсальное устройство нового поколения для автоматизации технологических процессов во всех секторах промышленности.
В практике построения АСУТП повсеместно используются распределенные системы управления. Общеизвестная проблема таких систем — задержки в связи и ошибки, которые они могут транслировать. Matrix поддерживает впечатляющий набор физических протоколов, позволяющий построить распределенную систему глобального масштаба.
Универсальный солдат автоматизации — модуль расширения Segnetics FMR
Нередко по ходу эксплуатации уже настроенные и успешно работающие системы автоматизации требуют модернизации. Чаще всего это связано с необходимостью добавления новых датчиков и исполнительных устройств. Для их подключения к контроллерам требуются свободные разъемы входов и выходов. Хорошо, если их запроектированный запас не был исчерпан, тогда проблема подключения решается просто. Но если все доступные разъемы уже заняты, то необходимо нарастить их количество с помощью модулей расширения. Прежде, в этом случае остро вставал вопрос выбора качественных и надежных модулей. Теперь эта задача получила легкое решение в виде новых универсальных модулей ввода/вывода — Segnetics FMR. По сравнению с предшественниками функционал новых модулей значительно вырос. С учетом возросших возможностей их можно было бы назвать «Контроллер ввода/вывода».
Несмотря на то, что у МК STM32 имеется множество внутренних шин, адресное пространство для программиста предлагается как линейное размером 4 Гбайт. Поскольку МК STM32 выполнены на основе Cortex, то у них используется стандартное распределение памяти. Память программ начинается с адреса 0x00000000. Встроенное статическое ОЗУ стартует с адреса 0x20000000. Все ячейки статического ОЗУ расположены в области хранения бит. Регистры УВВ представлены в карте памяти, начиная с адреса 0x40000000, и также расположены в области хранения бит УВВ. Наконец, регистры Cortex находятся в их стандартном месте, начиная с адреса 0xE0000000.
Карта памяти STM32 выполнена по стандарту Cortex. Первые 2 кбайт памяти могут быть связаны с Flash памятью, системной памятью или статическим ОЗУ, в зависимости от состояния выводов управления загрузкой
Область Flash памяти разделена на три секции. Первая - Flash память пользователя - начинается с адреса 0x0000000. Далее следует системная память, которая также называется большим информационным блоком. Она представляет собой Flash память размером 4 кбайт, которая запрограммирована производителем кодом программы загрузчика. Последняя секция, которая стартует с адреса 0x1FFFF800, называется малым информационным блоком. В ней находится группа опциональных байт, с помощью которых можно повлиять на некоторые системные настройки микроконтроллера STM32. Программа загрузчика позволяет посредством интерфейса USART1 загрузить код программы и запрограммировать его во Flash память пользователя. Чтобы перевести МК STM32 в режим загрузчика, нужно на внешних выводах BOOT0 и BOOT1 установить низкий и высокий уровни, соответственно. Если установить именно такие состояния на выводах управления загрузкой, то блок системной памяти начнется с адреса 0x00000000. После сброса, МК STM32, вместо выполнения прикладного кода из Flash памяти пользователя, начнет выполнение программы загрузчика. Чтобы пользователь имел возможность стирать и перепрограммировать Flash память на компьютере необходимо запустить еще одну программу загрузчика, которую можно скачать с сайта компании ST. Программа для ПК также доступна в виде DLL-файла, что позволяет создавать собственное ПО для программирования микроконтроллеров на фазах производства или эксплуатации продукции.
С помощью выводов управления загрузкой адрес 0x00000000 вместо Flash памяти пользователя может быть также связан со статическим ОЗУ. Поскольку загрузка статического ОЗУ осуществляется более быстро, то эта возможность может оказаться полезной на фазе проектирования для исполнения кода программы из статического ОЗУ. Кроме того, появляется возможность сократить частоту перепрограммирования Flash памяти.
Разбираемся как устроена память микроконтроллера на примере STM32F205VGT6.
Так же мы используем CubeMX для подготовки проекта.
Где хранятся данные , где стек, где код программы?
Генерим сначала пустой проект оставляет только пустой main().
читаем ld файл
Linker script for STM32F205VG Device with ** 1024KByte FLASH, 128KByte RAM.
ld файл это основа, здесь CubeMx прописывает все исходные параметры памяти, стека, кода. Именно его надо спокойно/внимательно изучить, здесь все очевидно на самом деле.
Стек в микроконтроллерах на ядрах ARM растёт сверху вниз.
RAM по даташиту Up to 128 + 4 Kbytes of SRAM. То есть есть еще какие-то 4Kb SRAM в конце.
Стек располагается отдельно от остальных блоков памяти, в конце ОЗУ. Конец ОЗУ по мнению CubeMX это 0x20020000=..131072 примерно (128+4Kb).
Для контроля минимальных запасов стека и кучи в CubeMX есть такие установки
(_user_heap_stack = _Min_Heap_Size + _Min_Stack_Size )
list полезный по информации файл на выходе сборки
.text — /* The program code and other data goes into FLASH */ , это скомпилированный машинный код - помещается во FLASH;
.data — /* Initialized data sections goes into RAM, load LMA copy after code */ - Переменные, это помещается в RAM; и зачем-то копия помещается еще во FLASH.
.rodata — /* Constant data goes into FLASH */ - аналог .data для неизменяемых данных, но помещается во FLASH;
.bss — /* Uninitialized data section */ , глобальные и статические переменные, которые при старте содержат нулевое значение - помещаются в RAM.
Момент истины
Как вдруг я понял это безобразие : FLASH может содержать только неизменяемые данные , т.е. их нельзя в процессе исполнения перезаписать. (FLASH (rx) ) rx = read +execute . Отсюда и идет весь этот винигред.
ld файл все прописывает где и куда какие данные сохранить
>RAM - это помещается в RAM !
файл startup_stm32f205xx.s
Этот файл генерируется CubeMX. Он на ассемблере.
Смысл его в том, чтобы начать выполнение программы : для этого надо сначала установить указатель стека на начало стека :
Теперь для закрепления понимания поэкспериментируем
Эффекта изменения распределения памяти не произойдет
Сделаем так : char buf[10000]=; - ничего не меняется
Теперь в main сделаем так :
И .bss увеличивается с 00000020 до 00002730 (10032!) . То есть ушло в RAM!
Теперь делаем так :
И .rodata увеличивается с 10 до 00002784 (10116) ! То есть ушло во FLASH (кстати только при условии явной инициализации=).
Выводы такие :
Побольше const
Если RAM памяти не хватает или не хватает стека (он всегда есть часть RAM), то можно попробовать все что не меняется обозвать const , инициализировать обязательно и тогда это попадет не в RAM , а в FLASH.
section `._user_heap_stack' will not fit in region `RAM'
Вот такая бяка появляется, когда RAM не хватает, например добавили нового кода , сторонние библиотеки .
У меня (на самом деле) эта ошибки ушла после удаления файла startupxxx.s и перегенерации заново проекта(и файла startup) из CubeMx.
Файлы для скачивания
* STM32F205VGT6_MemoryUsed [zip]
пустышка для изучения распределения памяти в контроллере STM32
Читайте также: