Показано с 1 по 10 из 22

Тема: Вопросы по языку ST

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    у меня был нестандартный протокол, где приходилось циклом перебирать все биты нескольких байт. Я для этого сделал функцию типа IsClear(Byte,Bit), где внутри функции bit через CASE заменил обычными цифрами. Всё компилировалось и внутри цикла for мог написать такую конструкцию
    ...
    IF IsClear(by,i) THEN
    ...
    По сути обращение к биту через переменную, хотя и смотрится по-индуски. Решения лучше пока не нашел.

  2. #2

    По умолчанию

    Цитата Сообщение от slonegd Посмотреть сообщение
    у меня был нестандартный протокол, где приходилось циклом перебирать все биты нескольких байт. Я для этого сделал функцию типа IsClear(Byte,Bit), где внутри функции bit через CASE заменил обычными цифрами. Всё компилировалось и внутри цикла for мог написать такую конструкцию
    ...
    IF IsClear(by,i) THEN
    ...
    По сути обращение к биту через переменную, хотя и смотрится по-индуски. Решения лучше пока не нашел.
    В библиотеке Util есть функция EXTRACT, которая позволяет получить доступ к биту по его номеру.
    Если я правильно понял - Вы можете ее использовать внутри Вашей функции IsClear вместо CASE'ов.

  3. #3

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Зачем внутри ? Вместо
    Исключительно ради того, чтобы не заменять в готовом проекте все вызовы "IsClear(x, y)" на "NOT EXTRACT (x, y)".

  4. #4

    По умолчанию

    И немного отходя от темы получения доступа к биту:
    Не рекомендуется использовать в условиях исполнимые выражения поскольку это усложняет отладку.
    В данном конкретном случае все предельно ясно
    Код:
    IF IsClear (x, y) THEN
    	....
    END_IF
    И если программа не заходит внутрь условия, то понятно, почему она этого не сделала

    но в случае
    Код:
    IF IsClear (x, y) OR IsClear (x, y + 1) THEN
    	....
    END_IF
    Уже сложнее понять какое же из условий не выполняется и почему программа не зашла внутрь условия.
    Поэтому рекомендуется ввести дополнительную переменную с "говорящим" именем, которую затем использовать в условии.

    Например:
    Код:
    VAR
    	// Признак того, что активна авария "ПОЖАР"
    	xIsFireAlarmActive	: BOOL;
    	// Признак того, что активна авария датчика
    	xIsSensorAlarmActive	: BOOL;
    END_VAR
    
    
    xIsFireAlarmActive := IsClear (x, y);
    xIsSensorAlarmActive := IsClear (x, y + 1);
    IF xIsFireAlarmActive OR xIsSensorAlarmActive THEN
    	....
    END_IF
    В таком случае при отладке всегда будет понятно, почему программа не зашла внутрь условия.

Похожие темы

  1. Вопросы о САУ-У
    от FPavel в разделе Эксплуатация
    Ответов: 7
    Последнее сообщение: 31.05.2022, 20:38
  2. Вопросы о СИ-8
    от Леонов Андрей в разделе Эксплуатация
    Ответов: 5
    Последнее сообщение: 27.11.2014, 18:00
  3. вопросы по рм1
    от nikita в разделе Эксплуатация
    Ответов: 5
    Последнее сообщение: 09.02.2010, 17:55
  4. Вопросы по трм-151-01
    от dag1975 в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 17.06.2009, 16:11
  5. Вопросы
    от Мурат в разделе Эксплуатация
    Ответов: 6
    Последнее сообщение: 27.01.2007, 03:24

Ваши права

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