Посмотрите здесь про это - интересная статья
Посмотрите здесь про это - интересная статья
Не понимаю как это связано. Ну предположим в структуре у меня нечетное кол-во BOOL (обзовем х1, х2, х3, х4, х5), ну выровняется у меня память в структуре. Будет под экземпляр структуры отведено какое-то количества байт неравное кол-ву BOOL-переменных.Если будет нечётное количество BOOL , то и байт будет не четное, соответственно, может залезть на следующую переменную, а точнее сдвинуть её адрес.
Я же могу обращаться к полям этой структуры - скажем, присвоить другой переменной хА значение переменной х1 из объявленной структуры. Не должно же при этом меняться значение какой-то третьей переменной.
Могу ответить невпопад. Есть ещё одна версия, которая может запутить и рассчитана на профессионалов.
Это когда из-за ошибокк в коде программы одна память налезает на другую. Например, если не проверяются границы массивов.
Условно, если ПЛК расположил в его памяти сначала массив на 10 элементов (например), а потом структуру - то если мы начнём записывать в элементами за границами массива (11, 12) - то будем портить память структуры.
Такие ошибки сложно ловятся (и поэтому стараются программировать так, чтобы границы массивов или проверялись, или задавались константами типа VAR arrData [1..MaxBufferSize]. MaxBufferSize - это наша константа, её можно потом и в циклах по массивам использовать), потому что если память за границами массива существует - то она просто затирается, а программа работает. До некоторых пор.
Если же это всё же выравнивание, то лучше протестировать структуру из нескольких WORD, чтобы проверить то, как выравнивание работает.
И ещё, если я не вру (пишу по памяти). Если поискать в справке по CodeSys 3.5, то там в разделе pragma была возможность включить режим выравнивания побайтно.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net
Я пробовал выравнивать побайтно через pragme pack_mode. Не помогло. Все стало работать нормально когда удалил из структуры все BOOL, оставил только WORD и объединения. Необходимые битовые маски из BOOL собрал в коде программы в WORD. И в полях узла ModbusTCP_Slave_Device привязывал уже WORD-переменные, а не битовые.
Регистры.jpg
Кстати, если кто не знал (я точно не знал, но подозревал), то на скриншоте выше область памяти под %QW48 и под %QX96.0 - одна и та же область. Но слово "BOOL" справа от адресов %QX96.n сбивала с толку. Я думал под каждый %QX96.n отводится по байту и %QX96.0 и %QX96.1 будут иметь два разных адреса. Однако если через POINTER взять адреса %QX96.0 и %QX96.1, то они будут одинаковыми и %QX96.0 по %QX96.7 занимают 1 байт. Таким образом логичнее было бы разработчикам Codesys в соотнесении входов-выходов писать тип переменной не BOOL, а BIT.