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

Тема: Как разместить адресное пространство MODBUS в энергонезависимой области ПЛК?

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

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

    По умолчанию

    Cs-Cs, не обращайте внимания на мои "фломастеры", мне красные "вкуснее"...

  2. #2

    По умолчанию

    Цитата Сообщение от Spawn Посмотреть сообщение
    Для меня лично в правом. Читая код и доходя до "SysOPLink^.BitsStatus2.3", сразу становится очевидным (как минимум), что BitsStatus2 - это "конец"(нет более никаких "A : stuct1 : struct2 : struct3" и не нужно их искать), дальше (после точки) только её (BitsStatus2) "внутренности". Как бы парадоксально это не выглядело, но, на мой взгляд, именование, порой (и в данном конкретном случае, как примере), привносит обезличивание (если можно так выразиться). Нужно будет "иметь под рукой" (и далее по коду держать в голове, ну или "скакать" постоянно в) "OP-Links-2.gif", чтобы понимать - это те самые "внутренности" (искомые) или же нет.
    А с магическими числами в программировании ты(вы) знаком? Это - убийственно плохая практика программирования, когда вместо понятных констант используются сразу подставленные числа, а потом, когда надо это число поменять, его надо везде искать по коду и исправлять, но не перепутать с другим.
    Образно, вот написали мы что-то там типа BlaBla.27, а потом почему-то нам надо 27 поменять на 24, которое тоже было использовано в коде в разных местах. Ну, например, какую-то тревогу (для которой был бит), надо вставить именно вот в это место. И дальше нам надо поискать в коде все места с 27, замменить их на 24, но не перепутать эти "новые" 24 со "старыми" 24, которые относятся не к тому. В таких задачах даже полнтекстовый поиск по всему проекту может не помочь.
    Чтобы такого не было, правильная практика программирования предлагает выносить всё в константы. Сейчас, к примеру, я достал исходники одного своего проекта на СИ++ из 2003 года (да, 20 лет прошло!), кое-чего там исправляю, и мучаюсь в некоторых местах из-за магических чисел.

    Как мудрый камрад, я бы предложил перевести обсуждение вот к чему: как корректно и красиво адресовать битовые маски, если их много. Ведь я сам не нашёл ничего умнее (и это сарказм), чем их просто поименовать и наплодить цифры.
    Варианты:
    а) Обозвать маски по именам типа BitsAlarmsMain, BitsAlarmsDevices. Но тогда есть риск, что их всё равно не хватит, или что биты тревог будут идти оп последовательно (и панель их не прочитает групповым запросом). Я его отмёл.
    б) Накатать вообще какую-то хbтромутную функцию вида GetBit/SetBit, которая будет обращаться к глобальной переменной структуры панели оператора целиком и принимать на входе описание нужного бита в виде адресации НомерDWORD/НомерБИТА, закрученной в структуру и константу. Вот это я бы попробовал.
    Тогда код выглядел бы как SetOPBit(AlarmsILCStatusUPS, TRUE), а в "AlarmsILCStatusUPS" было бы описано, что на деле это DWORD номер 4, бит 18ый.
    Надо так попробовать, хаха! =)
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  3. #3

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Как мудрый камрад, я бы предложил перевести обсуждение вот к чему: как корректно и красиво адресовать битовые маски, если их много. Ведь я сам не нашёл ничего умнее (и это сарказм), чем их просто поименовать и наплодить цифры.
    Варианты:
    а) Обозвать маски по именам типа BitsAlarmsMain, BitsAlarmsDevices. Но тогда есть риск, что их всё равно не хватит, или что биты тревог будут идти оп последовательно (и панель их не прочитает групповым запросом). Я его отмёл.
    б) Накатать вообще какую-то хbтромутную функцию вида GetBit/SetBit, которая будет обращаться к глобальной переменной структуры панели оператора целиком и принимать на входе описание нужного бита в виде адресации НомерDWORD/НомерБИТА, закрученной в структуру и константу. Вот это я бы попробовал.
    Тогда код выглядел бы как SetOPBit(AlarmsILCStatusUPS, TRUE), а в "AlarmsILCStatusUPS" было бы описано, что на деле это DWORD номер 4, бит 18ый.
    Надо так попробовать, хаха! =)
    С формированием прямой адресации области памяти Slave-переменных вполне справляется Excel с несложными формулами, потом достаточно вводить тип, имя и при необходимости начальное значение и комментарий.
    изображение_2023-11-09_131153339.png
    После остаётся только скопировать полученный список в глобальные переменные.
    Если устройство-мастер поддерживает какой-либо импорт переменных, то на основе этого файла можно подготовить и список для импорта, не говоря уж о простой карте регистров
    Изображения Изображения

Похожие темы

  1. Ответов: 9
    Последнее сообщение: 04.06.2019, 09:38
  2. Ответов: 9
    Последнее сообщение: 19.07.2016, 13:00
  3. адресное простраество OPM
    от lis471 в разделе OWEN Proces Manager
    Ответов: 3
    Последнее сообщение: 23.04.2014, 12:02
  4. Ответов: 4
    Последнее сообщение: 15.02.2010, 06:55

Ваши права

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