Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 25

Тема: Вопрос про ST от новичка (Codesys 3.5)

  1. #11

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    disconnect555
    А вот что за адрес MWxxx? Это откуда взято? Я с такими не работал ни фига.
    Насколько я понимаю - это значит, что во внутренней памяти (не связанной со входами и выходами) по такому-то адресу находится WORD.
    В моем случае ПЛК - Beckhoff.
    Да, про то что переменные могут быть однобайтовыми, а строки - нуль-терминированными, я понял, спасибо.

  2. #12
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,276

    По умолчанию

    Цитата Сообщение от disconnect555 Посмотреть сообщение
    ..
    Гарантировано ли, что адрес:
    Expl.First будет MW2000?
    Expl.Second будет MW2001?
    Expl.Third будет MW2003?
    Expl.Fourth будет MW2013?

    Если гарантировано, то насколько связыванием через структуры считается хорошим/дурным тоном?
    Привязка нужна для...
    С конца.
    Для чего нужна - это Ваше. Какой это тон - а вам не...? Вам же с этим работать. Размещение по абсолютным адресам иногда удобно, но сдуру можно... сломать.

    Ключевое слово "выравнивание". Безотносительно ПЛК. Сами гуглим.
    Локальная особенность при авторазмещении :
    -байтовое пофиг //byte, sint, using, string и их производные в виде array
    -2х байтное адрес кратный 2 //word, int, uint и их производные из array
    -4х байтное адрес кратный 4 //real, dword, dint и структуры и их производные из array/struct в любом сочетании.
    +(местное) размер struct автодобивается под кратность 4.

    Отсюда
    1. Да т. к. 2000, struct и first
    2. Нет. т. к. real с +2(т.к. MW) . Перед ним будет неявный word
    3. Нет, но из за 2-ого, а так stringу пофиг. Итог +4(MW!)
    4. Нет, но из за 2-ого. А так, в сочетании того что sizeof 3-ого четный пофиг
    Ну и т.к. 2й +2(MW!), а sizeof(2й) + sizeof(3й) кратен 4, в конце struct НЕ будет ничего автодобавлено.
    Последний раз редактировалось Валенок; 21.02.2023 в 09:27.

  3. #13

    По умолчанию

    Валенок, спасибо большое.

  4. #14

    По умолчанию

    Прошу прощения, что вклинился. Так переменные START в Main и в Prg1 - это же разные переменные. Так и надо?

  5. #15
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Цитата Сообщение от saii Посмотреть сообщение
    Как раз лучше начинать с TRUE, зачем Вам на каждом цикле делать операцию NOT?
    И назвать ее можно что-то вида FirstCycle.
    Лучше начинать не с TRUE, ни с FALSE, а с условия начала работы.

    PROGRAM MAIN
    VAR
    END_VAR

    PRG1(Start:= ButtonStart AND PowerOk AND StartEnabled);
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  6. #16
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Цитата Сообщение от disconnect555 Посмотреть сообщение
    Спасибо всем за ответы.

    Если позволите, то ещё один вопрос.

    У меня структура
    TYPE Example :
    STRUCT
    First:INT;
    Second:REAL;
    Third:STRING[9];
    Fourth:WORD;
    END_STRUCT
    END_TYPE

    Затем объявляется экземпляр этой структурой с привязкой к адресу.
    Expl: AT %MW2000:Example;

    Гарантировано ли, что адрес:
    Expl.First будет MW2000?
    Expl.Second будет MW2001?
    Expl.Third будет MW2003?
    Expl.Fourth будет MW2013?

    Если гарантировано, то насколько связыванием через структуры считается хорошим/дурным тоном?
    Привязка нужна для соединения с панелью оператора.

    Вам нужен указатель на элемент структуры? Так и используйте указатели.
    ST - это высокоуровневый язык. Я не помню, как в Codesys они реализуются, но, например, в B&R - Вот Так:
    VAR
    MyInt: REFERENCE TO Int;
    MyReal: REFERENCE TO Real;

    MyInt:= ADDR(Example.First);
    MyReal:- ADDR(Examlpe.Second);
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  7. #17
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Цитата Сообщение от Boyko Посмотреть сообщение
    Прошу прощения, что вклинился. Так переменные START в Main и в Prg1 - это же разные переменные. Так и надо?
    Разные, но понятно, что имелось ввиду, думаю )
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  8. #18
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Вообще, мое мнение - вызовы FB - должны выполняться всегда.
    В смысле, что вот такое:
    IF START THEN
    PRG1();
    START := FALSE;
    END_IF
    это жуть!

    Начинает прыгать среднее время выполнения цикла, возникают вопросы, а что произойдет с FB, когда его снова вызовут (с учетом того, как его вызывали последний раз). Для оптимизации времени выполнения - тоже не подходит. 3-4 "тяжелых" блока однажды начнут выполняться одновременно - замучаетесь ловить, почему Watchdog стал срабатывать.
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  9. #19
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,276

    По умолчанию

    если есть такие "тяжёлые" блоки то сначала с ними разбирайтесь, с чего они такие "тяжёлые"
    А вызывать что либо нужно только тогда, когда оно - нужно.

  10. #20
    Пользователь
    Регистрация
    28.03.2007
    Адрес
    г. Донецк
    Сообщений
    123

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    С конца.
    Для чего нужна - это Ваше. Какой это тон - а вам не...? Вам же с этим работать. Размещение по абсолютным адресам иногда удобно, но сдуру можно... сломать.

    Ключевое слово "выравнивание". Безотносительно ПЛК. Сами гуглим.
    Локальная особенность при авторазмещении :
    -байтовое пофиг //byte, sint, using, string и их производные в виде array
    -2х байтное адрес кратный 2 //word, int, uint и их производные из array
    -4х байтное адрес кратный 4 //real, dword, dint и структуры и их производные из array/struct в любом сочетании.
    +(местное) размер struct автодобивается под кратность 4.

    Отсюда
    1. Да т. к. 2000, struct и first
    2. Нет. т. к. real с +2(т.к. MW) . Перед ним будет неявный word
    3. Нет, но из за 2-ого, а так stringу пофиг. Итог +4(MW!)
    4. Нет, но из за 2-ого. А так, в сочетании того что sizeof 3-ого четный пофиг
    Ну и т.к. 2й +2(MW!), а sizeof(2й) + sizeof(3й) кратен 4, в конце struct НЕ будет ничего автодобавлено.
    {attribute 'pack_mode':='0'}
    TYPE ...

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. Вопрос от Новичка
    от valizo в разделе Среда программирования OWEN Logic
    Ответов: 6
    Последнее сообщение: 29.12.2017, 17:20
  2. Вопрос новичка
    от Dmitro в разделе Мх110
    Ответов: 2
    Последнее сообщение: 21.02.2017, 09:47
  3. Вопрос от новичка))
    от Володя28 в разделе Master SCADA 3
    Ответов: 3
    Последнее сообщение: 25.09.2015, 22:22
  4. Вопрос новичка.
    от Georgiy в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 20.02.2011, 15:45
  5. вопрос новичка
    от Антонн в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 09.02.2010, 10:48

Ваши права

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