Страница 1 из 6 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 55

Тема: Проблема с обнулением битов MODBUS

  1. #1

    По умолчанию Проблема с обнулением битов MODBUS

    Коллеги, добрый день!

    Столкнулся с проблемой. Читаю регистр с симулятора MODBUS, распаковываю биты. Меняю биты, запаковываю в регистр. Во время работы HMI всё работает хорошо. Но при старте HMI биты в симуляторе обнуляются, потому что значение WORD на выходе запаковщика равен нулю. Всё логично.

    Но я никак не могу заставить принимать значение запаковываемого бита равному значению распакованного бита, так как пустой WORD успевает записаться в устройство, соотвественно все биты в ноль.

    С вещественной переменной всё получается - value переменной на чтении (регистра) привязывается как вход поля ввода, и пустое поле ввода на старте HMI не успевает записаться, видимо, всё прекрасно работает.

    Возможно, в ФБ нужно выдерживать какую-то паузу, не знаю как. Но почему не получается так же, как с вещественной переменной?

  2. #2

    По умолчанию

    В скаде это проблематично, читаются и записываются все переменные в разные каналы. Поэтому лучше это делать в самом ПЛК, присваивать бит чтения биту записи.
    То что у вас получилось с Float, это самообман, так работать не будет. Присваивать нужно так же в ПЛК.

    Есть и третий вариант, написать программу на ST в самой Скаде, где чтение и запись будет из 2 мест.
    Сразу говорю, для маски бит это сделать довольно сложно, а вот для Float, целых и отдельных бит это не сложно.
    Последний раз редактировалось kondor3000; 20.10.2026 в 16:37.

  3. #3

    По умолчанию

    Так у меня один и тот же регистр в режиме ReadWrite. Я не хочу "множить сущности". На фига тогда вообще есть возможность двухсторонней записи регистра?
    Почему в ИзиБилдере я даже не задумываюсь об этом? Оно просто работает.

  4. #4
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,583

    По умолчанию

    в MS кажется это по жизни, Там вроде надо назначать разные переменные в самой Scada для чтения и для записи. Просто с одной переменной вроде так не получится.
    з.ы. вам надо изменить бит в считанном значение и потом записать все. А вы вероятно пишите просто бит в ноль и потом отправляете в ПЛК.

  5. #5

    По умолчанию

    Цитата Сообщение от BolshakovRV Посмотреть сообщение
    Так у меня один и тот же регистр в режиме ReadWrite. Я не хочу "множить сущности". На фига тогда вообще есть возможность двухсторонней записи регистра?
    Почему в ИзиБилдере я даже не задумываюсь об этом? Оно просто работает.
    Никто и не спорит, это так реализовано MS 4D, удивительно что куча народа до сих пор хотят перейти на это убожество.
    Последний раз редактировалось kondor3000; 20.10.2026 в 18:10.

  6. #6

    По умолчанию

    Уже год прошёл, как я такое в своём проекте делал, и не помню уже как. Мало того что по opc ua, так ещё и вот это. Но вроде делал как вам посоветовал kondor3000, мало того что 2 переменные на чтение и запись (хотя тут не помню, может и одну сделал) так ещё и скрипт в самой скаде на проверку принятого и отправленного слова. И в контроллере что-то такое же. Отправляю со скады изменённое слово, в контроллере это слово обрабатываю и посылаю ответ в скаду. В скаде проверяю что слово поменялось и сбрасываю командное слово в ноль. На словах вроде просто выглядит, на самом деле тот ещё квест. И да, весь мозг это контроллер, скада просто посылает слово и сбрасывает его в ноль когда видит, что команда дошла, чтобы повторно можно было этим битом пользоваться.

  7. #7

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Никто и не спорит, это так реализовано MS 4D, удивительно как куча народа до сих пор хотят перейти на это убожество.
    На самом деле сложно это когда в первый раз, а когда уже разработал механизм, то потом это не такая и проблема.

    А пришлось это делать из-за того, что заказчик не стал лицензию на много тэгов покупать, пришлось сжимать всё в dword и укладываться вместо 3200 в 100 тэгов, ну лицензия на 500, если что. Так я хотел в lword ужать, всё ужимается, но вот беда, в динамике этой скады хоть и можно использовать lword, но движок дальше 32 бита не видит. Задавал этот вопрос на вебинаре, но они не в курсе, а у меня руки не дошли проверить, исправили или нет...

  8. #8

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Уже год прошёл, как я такое в своём проекте делал, и не помню уже как. Мало того что по opc ua, так ещё и вот это. Но вроде делал как вам посоветовал kondor3000, мало того что 2 переменные на чтение и запись (хотя тут не помню, может и одну сделал) так ещё и скрипт в самой скаде на проверку принятого и отправленного слова. И в контроллере что-то такое же. Отправляю со скады изменённое слово, в контроллере это слово обрабатываю и посылаю ответ в скаду. В скаде проверяю что слово поменялось и сбрасываю командное слово в ноль. На словах вроде просто выглядит, на самом деле тот ещё квест. И да, весь мозг это контроллер, скада просто посылает слово и сбрасывает его в ноль когда видит, что команда дошла, чтобы повторно можно было этим битом пользоваться.
    На борту ПЛК можно извращаться, как в голову взбредёт. А если это готовая железка?

  9. #9

    По умолчанию

    Цитата Сообщение от BolshakovRV Посмотреть сообщение
    На борту ПЛК можно извращаться, как в голову взбредёт. А если это готовая железка?
    Вот именно, что всё зависит от того, как реализовано управление в самом плк. У меня плк принимает команду, и сразу её в ноль сбрасывает и делает что ему сказали. На основе этого и в скаде свой скрипт. А как сделано у вас я не знаю. Для каждой задачи свои решения. MS4D очень капризная штука с её разделением регистра на две части, приём и передачу. Тут так просто нельзя ничего сделать.

  10. #10

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Вот именно, что всё зависит от того, как реализовано управление в самом плк. У меня плк принимает команду, и сразу её в ноль сбрасывает и делает что ему сказали. На основе этого и в скаде свой скрипт. А как сделано у вас я не знаю. Для каждой задачи свои решения. MS4D очень капризная штука с её разделением регистра на две части, приём и передачу. Тут так просто нельзя ничего сделать.
    Да пёс с ним, с ПЛК, пусть это будет условный счётчик, где счёт запускается по биту.

    В общем, проблему локализовал. У меня биты активируются через кнопки. Если удалить кнопки, ничего не затирается. Получается, кнопки подхватывают входящее значение позже, чем происходит запись.
    Хотя это странно. Я и ST писал, где выходам переменных присваиваются входа и активируется переменная INIT, которая разрешает выполнение ФБ на подмену бита. И таймер ставил на включение разрешения выполнения ФБ. Бесполезно. Как наличие кнопок влияет на затирание битов, если ФБ на подмену бита не выполняется?
    Чертовщина короче. Шифт+дел.
    Последний раз редактировалось BolshakovRV; 20.10.2026 в 20:11.

Страница 1 из 6 123 ... ПоследняяПоследняя

Похожие темы

  1. Ответов: 7
    Последнее сообщение: 30.03.2017, 16:23
  2. Проблема с обнулением счетчика CTU
    от LuckLake в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 02.06.2016, 22:11
  3. Таймер с обнулением
    от NiGHT в разделе Подбор Оборудования
    Ответов: 1
    Последнее сообщение: 11.12.2012, 12:56
  4. Изменение битов в PSW СП-270
    от smashrod в разделе СП3хх, СП270
    Ответов: 8
    Последнее сообщение: 13.11.2011, 09:15
  5. Передача битов в пакете :)
    от saniyo в разделе СП3хх, СП270
    Ответов: 2
    Последнее сообщение: 12.01.2011, 11:52

Ваши права

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