С конца.
Для чего нужна - это Ваше. Какой это тон - а вам не...? Вам же с этим работать. Размещение по абсолютным адресам иногда удобно, но сдуру можно... сломать.
Ключевое слово "выравнивание". Безотносительно ПЛК. Сами гуглим.
Локальная особенность при авторазмещении :
-байтовое пофиг //byte, sint, using, string и их производные в виде array
-2х байтное адрес кратный 2 //word, int, uint и их производные из array
-4х байтное адрес кратный 4 //real, dword, dint и структуры и их производные из array/struct в любом сочетании.
+(местное) размер struct автодобивается под кратность 4.
Отсюда
1. Да т. к. 2000, struct и first
2. Нет. т. к. real с +2(т.к. MW) . Перед ним будет неявный word
3. Нет, но из за 2-ого, а так stringу пофиг. Итог +4(MW!)
4. Нет, но из за 2-ого. А так, в сочетании того что sizeof 3-ого четный пофиг
Ну и т.к. 2й +2(MW!), а sizeof(2й) + sizeof(3й) кратен 4, в конце struct НЕ будет ничего автодобавлено.
Последний раз редактировалось Валенок; 21.02.2023 в 09:27.
Валенок, спасибо большое.
Прошу прощения, что вклинился. Так переменные START в Main и в Prg1 - это же разные переменные. Так и надо?
Вам нужен указатель на элемент структуры? Так и используйте указатели.
ST - это высокоуровневый язык. Я не помню, как в Codesys они реализуются, но, например, в B&R - Вот Так:
VAR
MyInt: REFERENCE TO Int;
MyReal: REFERENCE TO Real;
MyInt:= ADDR(Example.First);
MyReal:- ADDR(Examlpe.Second);
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
Вообще, мое мнение - вызовы FB - должны выполняться всегда.
В смысле, что вот такое:
IF START THEN
PRG1();
START := FALSE;
END_IF
это жуть!
Начинает прыгать среднее время выполнения цикла, возникают вопросы, а что произойдет с FB, когда его снова вызовут (с учетом того, как его вызывали последний раз). Для оптимизации времени выполнения - тоже не подходит. 3-4 "тяжелых" блока однажды начнут выполняться одновременно - замучаетесь ловить, почему Watchdog стал срабатывать.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
если есть такие "тяжёлые" блоки то сначала с ними разбирайтесь, с чего они такие "тяжёлые"
А вызывать что либо нужно только тогда, когда оно - нужно.