1.
Размер читаемой структуры 6 x 5 байт.
В подструктуре есть слово (val:int)
=> адреса этих слов - четный,нечетный, четный...
2.
Принимающая железка не может разместить слово по нечетному адресу. (Не Овен и даже не КДС, а именно железка) => будет выравнивание.
3.
Почему спросил - кто слейв ?
В предположении что слейв - ПЛК и имеет структуру:
слейв{
h1 : byte
m1 : byte
val1 : int
rele1 : byte
h2 : byte
m2 : byte
val2 : int
rele2 : byte
...
}
В таком случае неявное выравнивание в самом слейве было бы таково :
слейв{
h1 : byte
m1 : byte
val1 : int
rele1 : byte
x1 : byte
h2 : byte
m2 : byte
val2 : int
rele2 : byte
x2 : byte
...
}
Не знаю что такое "захардкодить". Если объявить VAR как выше в слейве и попытаться прочитать туда - неполучицца. По факту будет как с неявным (выше). Вы просто не сможете разместить данные как в посылке. Разве только:
h1 : byte
m1 : byte
val1_lo : byte
val1_hi : byte
rele1 : byte
...
А если сделаете :
Код:
p : pointer to int;
p := adr(val?_lo)
то каждое второе p^ , в любую сторону, приведет к би-и-п. "Потеря связи.."
Тоже самое c
Код:
p : pointer to struct{h,m:byte; val:int; rele:byte}
p := adr(h?)
p^ туда/сюда целиком - нормуль.
Но p^.val - приведет к тому же что выше
+
если будет фрагмент типа
Код:
...
h6 : byte
m6 : byte
val6_lo : byte
val6_hi : byte
rele6 : byte
END_VAR
где-нить в глобал, то можно бибикнуть при любом обращении даже к p^ (:= ADR(h6)), т.к. присутствует выход за пределы доступной памяти.
4.
В КДС размер любой структуры/фб - кратен 4. Отсюда :
STRUCT A{
h : byte
m : byte
val : int
rele : byte
}
равносильно
STRUCT A{
h : byte
m : byte
val : int
rele : byte
x : array[1..3] of byte
}
=> ... выводы по адресации делаем сами. И с учетом массива структур
Нету никаких "как ему за хочется". Все рассчитываемо если есть понимание механизма выравнивания
PS
на море .. на море ... на море ...