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

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

  1. #11

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Разъясняю скриншотами. Тезисы такие:
    1. Создаём в Slave нужное число регистров.
    2. Присваиваем переменную первому из них.
    3. Открываем Эксель и делаем таблицу из номеров регистров и их значений. Она же потом поможет программировать панель оператора и вообще в документацию пойдёт.
    4. Набиваем тип-структуру для удобства работы.
    5. Объявляем переменную-УКАЗАТЕЛЬ на этот тип.
    6. В задаче где-то в самом начале присваиваем адрес первого элемента Slave этому указателю.
    7. Дальше в коде обращаемся к указателю и через точку получаем все нужные регистры и поля.
    8. Для того, чтобы первый раз загрузить настройки по умолчанию, объявляем нашу же структуру константой с нужными значениями.
    В структуре делаем какой-нить флаг типа "SettingsOK" и, если он False - загружаем настройки по умолчанию.

    Вложение 71311 Вложение 71312 Вложение 71313 Вложение 71314 Вложение 71315 Вложение 71316 Вложение 71317

    Просьба ВНИМАТЕЛЬНО изучить все скриншоты. И потом думать =)
    "Фантики" - это хорошо, структурированно и красиво, но с ними ("фантиками") потом копаться в чужом коде то еще "удовольствие"...

    Такие больше всего нравятся:

    Clip_2.gif

    Последний раз редактировалось Spawn; 07.11.2023 в 10:35.

  2. #12

    По умолчанию

    Цитата Сообщение от Spawn Посмотреть сообщение
    "Фантики" - это хорошо, структурированно и красиво, но с ними ("фантиками") потом копаться в чужом коде то еще "удовольствие"...
    Не понял юмора. То есть, местным гопникам вместо того, чтобы открыть ОДИН список переменных VarsOP, прочитать там описания, нумерацию и назначение всех полей и битов, удобнее видеть что-то типа
    * word1.14
    * ipa7.12
    * zzbq
    * ton1
    * rtrig1
    Я понимаю, что я эээ.. со свиным рылом в калашный ряд, и что в программировании ПЛК вообще очень мало людей с культурой и стандартами кода (только я и Евгений Кислов, ахаха), но всё же реакции вида "Высмеять всё, что не понятно вместо того, чтобы спросить", я не ожидал.
    Ну, дополняю скриншотами.
    OP-Links-1.gif OP-Links-2.gif OP-Links-3.gif OP-Links-4.gif
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  3. #13

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Не понял юмора. То есть, местным гопникам вместо того, чтобы открыть ОДИН список переменных VarsOP, прочитать там описания, нумерацию и назначение всех полей и битов, удобнее видеть что-то типа
    * word1.14
    * ipa7.12
    * zzbq
    * ton1
    * rtrig1
    Я понимаю, что я эээ.. со свиным рылом в калашный ряд, и что в программировании ПЛК вообще очень мало людей с культурой и стандартами кода (только я и Евгений Кислов, ахаха), но всё же реакции вида "Высмеять всё, что не понятно вместо того, чтобы спросить", я не ожидал.
    Ну, дополняю скриншотами.
    OP-Links-1.gif OP-Links-2.gif OP-Links-3.gif OP-Links-4.gif
    Cs-Cs, Вы что, "не с той ноги встали?"

    Никто ваш код и не высмеивал, лишь поделился своим мнением.

    Я на самом деле считаю, что это хорошо, структурированно и красиво, только читается не просто. Зря Вы так...

  4. #14

    По умолчанию

    Цитата Сообщение от Spawn Посмотреть сообщение
    Cs-Cs, Вы что, "не с той ноги встали?"
    Никто ваш код и не высмеивал, лишь поделился своим мнением.
    Я на самом деле считаю, что это хорошо, структурированно и красиво, только читается не просто. Зря Вы так...
    Я барабанщик с карданом. У меня две ноги одинаково нагружены. Встать могу с любой.
    Я же сказал, не понял юмора:
    а) Что значит, копаться в чужом коде, если он структурирован?
    б) Что за прикол по поводу обращения к именованному битовому полю? Что тут не так?
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  5. #15

    По умолчанию

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

  6. #16

    По умолчанию

    Цитата Сообщение от 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

  7. #17

    По умолчанию

    Образно, вот написали мы что-то там типа BlaBla.27, а потом почему-то нам надо 27 поменять на 24, которое тоже было использовано в коде в разных местах. Ну, например, какую-то тревогу (для которой был бит), надо вставить именно вот в это место. И дальше нам надо поискать в коде все места с 27, замменить их на 24, но не перепутать эти "новые" 24 со "старыми" 24, которые относятся не к тому. В таких задачах даже полнотекстовый поиск по всему проекту может не помочь.
    Так а имена, разве, не придется менять во всем коде, если у вас что-либо, где-либо "съехало"? Например, Vhod, который был нулевым, на Vihod, который им стал, а иначе всё поименование теряет смысл...

    По мне так "те же яйца, только в профиль", да, опрятнее ну и смысла в имени больше (если оно адекватное, а не SB1, SB2, SB3 и т.д.) чем в числе (том же нуле) и не более того.

    Чтобы такого не было, правильная практика программирования предлагает выносить всё в константы.
    Возможно, не спорю. Я самоучка (в плане программирования, только не нужно в меня "помидорами кидать", жрать варить у домашней плиты тоже в университете не обучаются...), частенько "копаюсь" в чужих кодах, понравившиеся и логически обоснованные практики беру "на вооружение".
    Последний раз редактировалось Spawn; 09.11.2023 в 09:28.

  8. #18

    По умолчанию

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

  9. #19

    По умолчанию

    Spawn
    Так а имена, разве, не придется менять во всем коде, если у вас что-либо, где-либо "съехало"?
    Хм. Смотри. Ежели речь идёт о случае, когда битов нам хватит, но надо в середину что-то воткнуть - то мы меняем константы.
    Например, БЫЛО:
    AlarmKotel = 9;
    AlarmDrainVanna = 10;
    AlarmDrainTualet = 11;
    СТАЛО:
    AlarmKotel = 9;
    AlarmDrainKuhna = 10;
    AlarmDrainVanna = 11;
    AlarmDrainTualet = 12;
    ...то в этом плане код мы НЕ трогаем: поименованные константы нам в этом помогут.
    Это как раз то, чего мне не хватало в программее 2003 года, которую я ща исправляю. У меня там всталялись элементы в дерево (как папки), и надо было указывать номера значков этих элементов: выбранный и обычный. Элементы вставлялись в разных местах дерева: в диалоге Импорта, в Добавлении, в Свойствах, в Перетаскивании элемента.
    Сейчас мне надо сделать изменяемые значки. И надо найти все места кода, где я их вставляю. Если бы я тогда сделал бы константы типа IconTreeNormal, IconTreeSelected - то сейчас я бы их просто заменил на переменные (или по их именам нашёл места кода) - а ща надо всё вспоминать вручную.

    Если же у нас сдвинутся все биты - то тогда да, придётся и DWORD тоже изменять.
    Но опять же, если у нас используются поименованные константы, то нам проще сделать везде в коде поиск по слову AlarmDrainVanna и найти, где оно используется.

    Если говорить о Входах и Выходах - то я тут использую концепт создания IO-переменных. Вот, погляди у меня тут, я про это писал: https://cs-cs.net/technologii-testir...a-plk#4_____io

    1exan Идея КРУТАЯ! Мне не надо (я не люблю прямую адресацию), но прям респектище!
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  10. #20

    По умолчанию

    Ну, размещение структуры в Slave-переменных - тоже по сути, прямая адресация.
    Для структуры кстати тоже можно организовать такой файл - чтобы следил за выравниванием и автоматически считал адреса регистров для мастера.

    В CDS2.3 есть ещё такая штука как "bitaccess". Но мне это показалось несколько замороченным способом обращения с битами

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

Похожие темы

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

Ваши права

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