........................
Вид для печати
........................
это не гарантируется. но в конкретном проекте пройдет.
...................
чтобы была гарантия - сделайте структуру, содержащую нужные члены.
не забываем про выравнивание!
Подниму тему.
Насколько я понял из ответа Филоненко Владислава, члены структуры располагаются в памяти непрерывным блоком строго в том порядке, в котором они перечислены при объявлении структуры. Это верно?
И аналогичный вопрос по массивам. Элементы массива (пусть для определенности это будет ARRAY OF BYTE) расположены в памяти непрерывным блоком строго в порядке возрастания индекса. Это так?
И немного оффтопа:
Что значит "выравнивание"? Встретил этот совет в нескольких темах форума. А что это такое и зачем/как это делать не нашел ни в документации ни на форуме :D
В CoDeSys при выборе реализации решение всегда принимается в пользу быстродействия. Возьмем современный проц. 32 разряда. Машинное слово (два байта) он берет за 1 такт, а вот взять бит для него это подпрограмма - медленнее раз в 20. В таком случае, компилятор CoDeSys будет под BOOL выделять целое слово 2 байта! Байты он тоже может выравнивать по границам слов. В памяти получаются дырки, но быстродействие программы на ST получается равным приличному Си компилятору.
Здравствуйте
мне надо объявить 4 переменных типа real расположенных в памяти подряд. Обявляю так:
ругается:Цитата:
VAR_GLOBAL
realBuf1 AT %MD0:REAL;
realBuf2 AT %MD1:REAL;
realBuf3 AT %MD2:REAL;
realBuf4 AT %MD3:REAL;
...
END_VAR
"... Invalid type real at address %MD2"
"... Invalid type real at address %MD3"
вопрос:
как узнать по каким адресам можно разместить такие переменные?
или как освободить ячейки %MD2 и %MD3 чтобы объявить в них переменные real ?
заранее спасибо
Дак ведь на %MD0 и %MD1 не ругается.
Пробовал так же объявить в поле переменных главного ПОУ, эффект тот же.
Пробовал объявить по другим адресам - вообще на все адреса ругается.
Не знаю как определить свободную область, по каким адресам можно объявлять переменные, намекните хотябы где можно почитать про это
1. При размещении переменных порядок обычно правильный, но самым верным было бы создать массив требуемой суммарной длины, а затем указателям на переменные задать адреса в этом массиве - так гарантированно переменные будут подряд.
2. Память типа %M в ПЛК не используется - вот компилятор и ругается. Первые 2 элемента оставлены для совместимости. НЕ используйте их.
Понял, спасибо,
если кому из новичков понадобится, код:
индексация немного кривая.Цитата:
VAR
...
byteBuf:ARRAY [1..16] OF BYTE;
realBuf1,
realBuf2,
realBuf3,
realBuf4:POINTER TO REAL;
...
END_VAR
...
realbuf1:=ADR(bytebuf[1]);
realbuf2:=ADR(bytebuf[5]);
realbuf3:=ADR(bytebuf[9]);
realbuf4:=ADR(bytebuf[13]);
с самого начала так хотел сделать, но не нашел указатели и подумал что это делается через явное размещение переменных %M
:)
букву L то я и не заметил :)