Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: ModBus-OPС-Scada и RW регистры  (Прочитано 13027 раз)

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
ModBus-OPС-Scada и RW регистры
« : 11 Января 2017, 19:24:22 »
Раньше работал с Ареной, там ОРС встроен и незаметен глазу.

Тут начались вопросы дивные.

Имеем: Контроллер (МВ Slave), Lectus (MBMaster - OPC), SimpleScada.

В целях экономии биты пакуются в один регистр.

Суть задачи: есть RW регистры, в которые надо отлавливать изменения и писать в них то что изменилось с обоих сторон.

Контроллер свои регистры перечитывает регулярно, но реагирует (перезаписывет) если только регистры изменились или он сам внес изменения. Скада делает нечто темное и непонятное с лектусом, парсит биты из "ОРС переменной" по факту изменения значения и пишет в "ОРС переменную" по факту внесения изменений.

Проблема в том, что при таком порядке действий, не всегда с первого раза получается записать данные. Причем с обеих сторон. Точнее, если я правильно понимаю происходящее, лектус успевает переписывать данные в обе стороны еще до того как поймет что они изненились.

Как, вообще, правильно в таком случае работать?
« Изменён: 11 Января 2017, 19:44:06 от Teodor »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: ModBus-OPС-Scada и RW регистры
« Ответ #1 : 12 Января 2017, 15:19:09 »
Здравствуйте.

Цитировать
Суть задачи: есть RW регистры, в которые надо отлавливать изменения и писать в них то что изменилось с обоих сторон.
Вы хотите записывать биты в переменную со скады и с контроллера одновременно. Но изменение хотя бы одного бита переменной будет принято за изменение всей переменной, т.к. её значение изменится.

Цитировать
Скада делает нечто темное и непонятное с лектусом, парсит биты из "ОРС переменной" по факту изменения значения и пишет в "ОРС переменную" по факту внесения изменений.
Скада при старте добавляет теги на OPC-сервер для чтения с частотой равной частоте обновления переменной, которую Вы можете задать при создании переменной в Редакторе. C этой частотой OPC-сервер будет читать переменную с контроллера. Скада никогда сама по себе не пишет значение в переменные на OPC-сервере (а только получает их с OPC-сервера). Она может писать значения на OPC-сервер только если пользователь попытается ввести новое значение в объект Поле или Уровень, или нажмёт Кнопку связанную с этой переменной, или если выполнится скрипт в котором будет производиться изменение значения переменной, например: myVar.Value := 10;

Цитировать
Проблема в том, что при таком порядке действий, не всегда с первого раза получается записать данные. Причем с обеих сторон. Точнее, если я правильно понимаю происходящее, лектус успевает переписывать данные в обе стороны еще до того как поймет что они изненились.
Здесь ситуация проста, как мы поняли из описания. Данные хранятся на контроллере, контроллер их перезаписывает время от времени, скада же получает их с определенной периодичностью и Вы также пытаетесь писать значения в эту переменную из скады. Неудивительно, что писать в неё из скады не всегда получается, т.к. запись может быть моментально перезаписана контроллером и будет бесполезна.
« Изменён: 13 Января 2017, 13:00:26 от Simple-Scada »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: ModBus-OPС-Scada и RW регистры
« Ответ #2 : 13 Января 2017, 12:04:57 »
Увы, нет... Проблема изощреннее.. Контроллер от Лектуса находится за парой тунелей. Пишет только по смене данных. Возможно лектус в запаре провтыкивает запись, или просто не проходят некоторые пакеты. Проблему решил весьма извращенно (может кому пригодится):

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: ModBus-OPС-Scada и RW регистры
« Ответ #3 : 14 Января 2017, 13:48:04 »
Если можно еще вопрос о связке с лектусом.

При перезапуске проекта, иногда (я так понимаю, кто первым успеет) скада успевает передать лектусу 0 в регистры. Или это происходит не так, но у клиента (и в лектусе) все поля RW регистров забивает нолями. Забивание их мной исключено, ибо за это отвечает скрипт, переписывающий ОРС переменную по разрешающему флагу, который изначально false.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: ModBus-OPС-Scada и RW регистры
« Ответ #4 : 14 Января 2017, 14:30:49 »
Цитировать
При перезапуске проекта, иногда (я так понимаю, кто первым успеет) скада успевает передать лектусу 0 в регистры.
При старте скада создает на OPC-сервере группу (или несколько групп) с частотой опроса равной той, которую Вы выставили в Редакторе для переменных. А затем она помещает в эту группу соответствующие теги, чтобы OPC-сервер начал их опрос с заданной частотой. Никаких присвоений при этом не выполняется (если только они не выполняются в скриптах проекта). А на контроллере эти RW регистры имеют ненулевые значения в момент запуска проекта?
« Изменён: 14 Января 2017, 14:31:56 от Simple-Scada »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: ModBus-OPС-Scada и RW регистры
« Ответ #5 : 14 Января 2017, 15:00:09 »
Точно не 0. Но контроллер от ОРС далеко за тунелями и не исключена потеря парочки пакетов по дороге.

Еще вариант. Что происходит после остановки сервера? Мой скрипт ставит метку записи, если изменились значения полей и собранная из них переменная НЕ совпадает с ОРС переменной. Теоретически, если ОРС переменная поимеет статус 0, поля скинет в 0 (например после редактирования), а локальная переменная, куда собираются поля НЕ скинется, то такой сценарий отработается как смена значения на 0.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: ModBus-OPС-Scada и RW регистры
« Ответ #6 : 14 Января 2017, 19:49:26 »
Цитировать
Еще вариант. Что происходит после остановки сервера?
Программа освобождает оперативную память и все собственные переменные. Затем при запуске она возьмет значения переменных с OPC-сервера. Локальные переменные восстановлены не будут.
« Изменён: 14 Января 2017, 19:50:34 от Simple-Scada »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: ModBus-OPС-Scada и RW регистры
« Ответ #7 : 16 Января 2017, 10:37:52 »
Цитировать
Еще вариант. Что происходит после остановки сервера?
Программа освобождает оперативную память и все собственные переменные. Затем при запуске она возьмет значения переменных с OPC-сервера. Локальные переменные восстановлены не будут.
Странно это все... И все-же. Есть ли хотя-бы теоретическая возможность, что лектус или скада при старте забьют регистры нулями, если есть задержка связи с контроллером, скажем дольше периода опроса. Точнее, что за истинное значение регистра будет принят тот 0, которому равна OPC переменная. Или она должна быть не просто равна 0, а этот 0 ей должен быть явно присвоен(пользовательский скрипт, поле ввода)?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: ModBus-OPС-Scada и RW регистры
« Ответ #8 : 16 Января 2017, 12:03:35 »
Цитировать
И все-же. Есть ли хотя-бы теоретическая возможность, что лектус или скада при старте забьют регистры нулями, если есть задержка связи с контроллером, скажем дольше периода опроса.
Про лектус не можем точно сказать... если считать значение ему не удастся то возможно он просто скаде покажет нули, но записывать нули на контроллер вряд ли станет. А скада гарантированно ничего не записывает в теги, если только Вы сами не напишете скрипт в котором будет идти присвоение в переменную.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: ModBus-OPС-Scada и RW регистры
« Ответ #9 : 16 Января 2017, 12:26:34 »
Тогда еще вопрос... будет ли  TM_Variable.AsInt OPC переменной (которая еще не получила от лектуса данных) равен ему-же внутренней переменной, которой еще ничего не присваивали и которой присвоили 0? Чему равен TM_Variable.AsBool которому еще ничего не присвоили?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: ModBus-OPС-Scada и RW регистры
« Ответ #10 : 16 Января 2017, 12:30:40 »
Цитировать
будет ли  TM_Variable.AsInt OPC переменной (которая еще не получила от лектуса данных) равен ему-же внутренней переменной
Судя по всему да. AsInt будет равен 0 как и на внутренней переменной Лектуса. То же самое с AsBool, только он будет равен FALSE.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: ModBus-OPС-Scada и RW регистры
« Ответ #11 : 16 Января 2017, 16:36:18 »
Цитировать
будет ли  TM_Variable.AsInt OPC переменной (которая еще не получила от лектуса данных) равен ему-же внутренней переменной
Судя по всему да. AsInt будет равен 0 как и на внутренней переменной Лектуса. То же самое с AsBool, только он будет равен FALSE.
Проект я скинул. Там в скриптах видно, что запись в ОРС переменную произойдет только при поднятом флаге и разных значениях In и Out переменных. Флаг подымется при разнице в Out и формуле из полей.

Я считал, что при инициализации нулями не должно произойти ничего, пока не прийдет значение от контроллера. Далее, т.к. есть разница в In и формуле полей, в поля впишутся новые значения и тут-же по датаченджу продублируются в Out c поднятием флага, через секунду в виду равности значений упадет флаг. Это если в полях ноль, а не Null, которые, например, в "CoachAx Arena" совсем не равны.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: ModBus-OPС-Scada и RW регистры
« Ответ #12 : 17 Января 2017, 14:57:01 »
Цитировать
Проект я скинул. Там в скриптах видно, что запись в ОРС переменную произойдет только при поднятом флаге и разных значениях In и Out переменных.
Проект получили, сегодня посмотрим и ответим на e-mail.