Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 15 из 15

Тема: ПЛК210 Глюки опроса

  1. #11

    По умолчанию

    Цитата Сообщение от Stanislav_Y Посмотреть сообщение
    Да, я подозревал выравнивание памяти в структуре, читал про это.
    Была структура данных для чтения панелью СП310. В структуре были вперемешку и WORD, и BOOL, плюс еще объединения. Убрал все BOOL и упаковал в прорамме их все в WORD'ды. Проблема решилась.
    Все равно не очень понимаю сути, как влияет привязка булевской переменной к полю bit в регистре ModbusTCP_Slave_Device на другой регистр. Для чего тогда эти поля бит нужны в регистрах?
    Я ведь когда читаю из модуля ввода битовую маску, я присваиваю битовым полям булевские переменные, которые в свою очередь также упакованы в структуры. Так тоже получается нехорошо делать?
    Посмотрите здесь про это - интересная статья

  2. #12

    По умолчанию

    Если будет нечётное количество BOOL , то и байт будет не четное, соответственно, может залезть на следующую переменную, а точнее сдвинуть её адрес.
    Не понимаю как это связано. Ну предположим в структуре у меня нечетное кол-во BOOL (обзовем х1, х2, х3, х4, х5), ну выровняется у меня память в структуре. Будет под экземпляр структуры отведено какое-то количества байт неравное кол-ву BOOL-переменных.
    Я же могу обращаться к полям этой структуры - скажем, присвоить другой переменной хА значение переменной х1 из объявленной структуры. Не должно же при этом меняться значение какой-то третьей переменной.

  3. #13

    По умолчанию

    Могу ответить невпопад. Есть ещё одна версия, которая может запутить и рассчитана на профессионалов.
    Это когда из-за ошибокк в коде программы одна память налезает на другую. Например, если не проверяются границы массивов.
    Условно, если ПЛК расположил в его памяти сначала массив на 10 элементов (например), а потом структуру - то если мы начнём записывать в элементами за границами массива (11, 12) - то будем портить память структуры.
    Такие ошибки сложно ловятся (и поэтому стараются программировать так, чтобы границы массивов или проверялись, или задавались константами типа VAR arrData [1..MaxBufferSize]. MaxBufferSize - это наша константа, её можно потом и в циклах по массивам использовать), потому что если память за границами массива существует - то она просто затирается, а программа работает. До некоторых пор.

    Если же это всё же выравнивание, то лучше протестировать структуру из нескольких WORD, чтобы проверить то, как выравнивание работает.
    И ещё, если я не вру (пишу по памяти). Если поискать в справке по CodeSys 3.5, то там в разделе pragma была возможность включить режим выравнивания побайтно.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  4. #14

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Если же это всё же выравнивание, то лучше протестировать структуру из нескольких WORD, чтобы проверить то, как выравнивание работает.
    И ещё, если я не вру (пишу по памяти). Если поискать в справке по CodeSys 3.5, то там в разделе pragma была возможность включить режим выравнивания побайтно.
    Я пробовал выравнивать побайтно через 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.

  5. #15

    По умолчанию

    Цитата Сообщение от Задумкин Сергей Посмотреть сообщение
    Я пробовал выравнивать побайтно через 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.
    Ну надписи в столбце слева "bit0...bit15" тоже как-бы намекают... А BOOL наверное говорит о том, что можно к каждому из битов %QX... привязать отдельную переменную типа BOOL

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. Ответов: 7
    Последнее сообщение: 08.12.2023, 08:54
  2. Ответов: 1
    Последнее сообщение: 05.03.2020, 08:38
  3. Глюки в 1.3.22b
    от Андрей555 в разделе Программируемые реле
    Ответов: 20
    Последнее сообщение: 21.10.2011, 16:25
  4. глюки плк
    от bango в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 24.05.2010, 23:44
  5. Глюки
    от Milchuk в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 29.11.2007, 12:08

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •