Показано с 1 по 9 из 9

Тема: Как правильно эмулировать работу контроллеров?

  1. #1

    Question Как правильно эмулировать работу контроллеров?

    Здравствуйте.
    Недавно начал разбираться с MasterSCADA и MasterOPC - создал небольшой проект по управлению задвижкой.

    Работу контроллеров, разумеется, нужно как-то эмулировать. Я попробовал сделать это в самом OPC-сервере - сделал все теги SERVER_ONLY и пытаюсь изменить их значения при помощи скриптов.

    Всего у меня 4 тега - Открыта, Закрыта, Открыть и Закрыть, все дискретные. Я хочу, чтобы при выполнении команды Открыть или Закрыть, индикаторы Открыта и Закрыта сначала сбрасывались (чтобы отобразить процесс в MasterSCADA), а потом через несколько секунд устанавливался нужный индикатор. Использую вот такой код:
    Код:
    function sleep(s)
        local ntime = os.time() + s
        repeat until os.time() > ntime
    end
    
    function setOpenIndicator(v)
        server.WriteTag("Насосная станция.Клапан 1.Kl1_IndO", v, OPC_QUALITY_GOOD);
    end
    
    function setClosedIndicator(v)
        server.WriteTag("Насосная станция.Клапан 1.Kl1_IndC", v, OPC_QUALITY_GOOD);
    end
    
    function OnWrite()
        TV, TQ, TS = server.ReadCurrentTag();
        
        if TV then
            server.Message("КЛ1: Открывается");
    
            server.RunFunctionFromDevice("setOpenIndicator", 0, false);
            server.RunFunctionFromDevice("setClosedIndicator", 0, false);
    
            sleep(3);
    
            server.RunFunctionFromDevice("setOpenIndicator", 0, true);
    
            server.Message("КЛ1: Открыт");
        end
    end
    Проблема в том, что код сброса значений (перед sleep) игнорируется - индикаторы не меняют свои значения. А вот код после sleep отрабатывает нормально. Сообщения при этом в консоль выводятся, sleep работает корректно.

    В чем может быть проблема? Можно ли мою задачу решить какими-то другими способами?

  2. #2

    По умолчанию

    1. Если хотите сделать задержку выполните команду server.Sleep
    2. Если вызываете функцию в пределах одного скрипта, то она вызывается просто по имени, без RunFunctionFromDevice
    Спасибо.

  3. #3

    По умолчанию

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    1. Если хотите сделать задержку выполните команду server.Sleep
    То есть проблема именно в этом или это просто общая рекомендация?

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    2. Если вызываете функцию в пределах одного скрипта, то она вызывается просто по имени, без RunFunctionFromDevice
    Я упростил, функции лежат в разных скриптах.

    UPD: Команда server.Sleep (которая, кстати, не документирована и принимает задержку в миллисекундах) проблему, к сожалению, не решила.
    Последний раз редактировалось koceg; 29.09.2015 в 20:34.

  4. #4

    По умолчанию

    Приложите конфигурацию ОРС сервера
    Спасибо.

  5. #5

    По умолчанию

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    Приложите конфигурацию ОРС сервера
    Готово, залил архив.
    Вложения Вложения

  6. #6

    По умолчанию

    Дело в задержке - использовать ее для подобных целей нельзя, так как значения присваиваются когда завершится выполнение скрипта.
    Вам нужно взводить тег, а сбрасывать его уже из скрипт после чтения - считать такты например, и по ним выключать скрипт.
    Спасибо.

  7. #7

    По умолчанию

    А если запустить-таки симулятор и реализовать эту же логику, но не при помощи server.WriteTag, а используя функции пакета modbus? Запись в симулятор тоже будут выполняться при завершении скрипта?

  8. #8

    По умолчанию

    Не играет роли - обновление тегов произойдет только в конце скрипта.
    Но вы можете управлять тегами другого узла - поскольку это отдельный поток, то там теги будут обновляться сразу (в собственном цикле).
    Спасибо.

  9. #9

    Thumbs up

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    Не играет роли - обновление тегов произойдет только в конце скрипта.
    Но вы можете управлять тегами другого узла - поскольку это отдельный поток, то там теги будут обновляться сразу (в собственном цикле).
    Вынос этой логики из тегов на уровень выше, в устройство, решил проблему. Спасибо за ваши ответы, вы мне очень помогли.
    Приложу работающий пример, вдруг кому-нибудь пригодится.
    Вложения Вложения

Похожие темы

  1. ПР 114 проверить работу в ОНЛАЙНЕ как?
    от дрю в разделе Программируемые реле
    Ответов: 10
    Последнее сообщение: 08.04.2015, 20:29
  2. Как правильно объявить структуру?
    от Вова в разделе ПЛК1хх
    Ответов: 17
    Последнее сообщение: 21.04.2014, 17:37
  3. Ответов: 4
    Последнее сообщение: 01.11.2013, 17:42
  4. Как проконтролировать работу датчика?
    от asupsp700 в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 30.01.2012, 10:14
  5. Как оченить свою работу
    от Димитрий в разделе Трёп (Курилка)
    Ответов: 10
    Последнее сообщение: 05.12.2008, 21:50

Ваши права

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