PDA

Просмотр полной версии : переменные Modbus и STRUCT



dkkwrk
07.03.2025, 10:51
Добрый день!
подскажите пожалуйста, по созданию и опросу переменных по Modbus...
Пробую организовать обмен через структуры (STRUCT), то-есть в программе все/необходимые переменные ссылаются на переменные в STRUCT.
Вопрос в следующем - в самой STRUCT как необходимо организовать/создавать переменные, в каком порядке?
Я слышал, что необходимо сначала все REAL, DWORD, WORD, потом INT потом BOOL, BIT...
тогда адресация переменных для Modbus будет строиться на основе этого порядка все REAL, DWORD, WORD адреса так - 0, 2, 4, 6, итд. Далее все остальные по порядку например 127, 128, 129 ... и тд.
так ли это?
или я могу создавать переменные в любом порядке, как мне необходимо?
тогда вопрос - как и каким образом правильно будет выполнять вычисление и присваивание MB адреса переменной?
Допустим сначала идут 11 штук REAL - адреса 0-2-4...20, далее 4 шт INT, адреса у них 22-23-24-25, далее 4 шт BIT, адреса у них 416-417-418-419
А вот далее как? Допустим решил добавить еще 3 шт REAL... могули я их в конец списка добавить? Или необходимо их добавлять там же где и остальные REAL, и тогда остальная адресация смещается?

Евгений Кислов
07.03.2025, 11:05
Добрый день.

1. Используйте при создании структуры атрибут


{attribute 'pack_mode' := '0'}

чтобы отключить выравнивание памяти (которое в посте ниже упомянул 1exan).

2. После этого можете располагать переменные в любом удобном порядке с контролем того, что они корректно накладываются на регистры Modbus (регистр Modbus занимает 2 байта/16 бит).
Например, если используются типы BOOL/BYTE/USINT (которые занимают байт) - они должны объявляться пачками по два, чтобы занять весь регистр.
Если используете BIT - то объявляйте их пачками по 16.

1exan
07.03.2025, 11:10
Размер занятого пространства перед переменной должен нацело делиться на размер этой переменной, в противном случае перед этой переменной автоматически образуется отступ недостающего размера

dkkwrk
07.03.2025, 11:26
Евгений, благодарю за ответ.
Исходя из 2 пункта, я правильно понимаю, что мои переменные будут выстраиваться по следующему принципу:
допустим сначала 2 шт REAL для них регистры 0-2,
потом 2 шт INT для них 4-5,
потом 2 шт BIT с адресами 96-97,
потом допустим опять 2 шт REAL, с адресами 8-10,
потом например 2 шт BOOL с адресами 192-193
?

Евгений Кислов
07.03.2025, 11:45
потом 2 шт BIT с адресами 96-97,

См. выше - "если используете BIT - то объявляйте их пачками по 16."
Подробнее про биты в структурах: п. 1.1.3
https://ftp.owen.ru/CoDeSys3/98_Books/CodesysMemoryManipulation.pdf


потом например 2 шт BOOL с адресами 192-193

Два BOOL займут один регистр (потому что в CODESYS размер BOOL - это байт).
Но, вероятно, вам будет проще вообще отказаться от BOOL в структурах в пользу BIT.

dkkwrk
07.03.2025, 16:21
Евгений,
то есть если применяю переменные BIT, то например если у меня 4 переменных, то необходимо еще 12 добавить или сделать их резервными, или "пропустить" 12 шагов?

Евгений Кислов
07.03.2025, 16:37
Евгений,
то есть если применяю переменные BIT, то например если у меня 4 переменных, то необходимо еще 12 добавить или сделать их резервными, или "пропустить" 12 шагов?

Добавьте еще 12 резервных.