Потоки(Thread) — Программы(class) — Переменные

Стартовая страница Форумы Разработка и интеграция Потоки(Thread) — Программы(class) — Переменные

  • В этой теме 123 ответа, 4 участника, последнее обновление 2 года назад сделано manjey73.
Просмотр 15 сообщений - с 106 по 120 (из 124 всего)
  • Автор
    Записи
  • #34186
    manjey73
    Участник

    Как-то можно контролировать отправку, чтобы кругами не ходить?

    #34187
    manjey73
    Участник

    Хм, похоже мой косяк с чтением и записью переменных в потоках.
    Наворотил, что теперь EN не воспринимается потоком и не считает почему-то…

    #34189
    Mikhail
    Модератор

    Для чего нужна отправка команд?
    Какие выходные формулы используются в выходных каналах?

    > Как-то можно контролировать отправку, чтобы кругами не ходить?
    Информацию об отправке команды можно записывать в события, например, если настроить канал. Также отправка отображается в ScadaServer.log

    #34191
    manjey73
    Участник

    Нашел один косяк, и получил другой.

    Суть — если делать запись из Scada, то переменная принимается. Но Записать обратно не получается, так как перетирается значением из канала.

    Как зачем нужны команды? — для управления устройствами в дальнейшем. МАУ тут не подходит, потому что не умеет работать по сложным алгоритмам.
    К тому же настраивать работу для нескольких однотипных задач проще застрелиться.

    #34193
    JurasskPark
    Участник

    МАУ тут не подходит, потому что не умеет работать по сложным алгоритмам.

    Убийца МАУ идёт. Поточный Искусственный Интеллект 2000 отправлен в прошлое, чтобы остановить МАУ.
    😀 😀 😀

    #34196
    manjey73
    Участник

    @JurasskPark не, убийцы МАУ не будет, будет что-то вроде ModSoftPlc но с программированием на C#.

    Жалко я не смог достучаться до Scripts в памяти, потому что мой тестовый класс прекрасно откомпилировался в Скриптах и можно было бы программы писать прямо там на C#. Но увы.

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

    #34243
    manjey73
    Участник

    Что-то хохмы не пойму.
    Канал Calculated/Output — формулы
    Val(); Stat() и SetVal(CnlNum, Cmd)

    Но, если из модуля не передать значения, то всегда ---

    При этом кроме

    CnlData curData = ServerContext.GetCurrentData(cnl.Value.CnlNum);
    if (curData.IsDefined)
    {

    там нет записи в канал. Что не так? почему канал перестает работать так, как он бы работал без модуля?

    #34244
    manjey73
    Участник

    Такс. Выходная формула SetVal(CnlNum, Cmd) не меняет статус и входная формула Val(); Stat() честно ни черта не записывает в канал, либо обнуляет его…

    #34285
    Mikhail
    Модератор

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

    Согласен, что для сложных алгоритмов нужны более сложные модули, чем МАУ.

    #34290
    manjey73
    Участник

    Скажем так, канал Calculated/Output используется для изменения уставок программы, запущенной из модуля. Как пример.
    Но при этом у канала может быть стартовое значение, указанное в «программе».

    Val();Stat() не позволяет задать значение канала даже без модуля.

    Вроде в более ранних версиях это было возможно, но не проверял.

    • Ответ изменён 2 года назад пользователем manjey73.
    #34328
    Mikhail
    Модератор

    Можно попробовать такую формулу:

    // Установить значение уставки по умолчанию. 
    // Для каналов типа Расчётный/выходной
    public CnlData GetDefaultData(double val)
    {
      return Stat() > 0 ? Data() : NewData(val, 1)
    }
    
    #34330
    manjey73
    Участник

    ; забыли.

    Работает. входная GetDefaultData(11111)
    выходная SetVal(CnlNum, Cmd)

    Теперь осталось разобраться, как эту переменную сделать типа энергонезависимой для Модуля.
    Например стартанули с 11111, потом в процессе поменяли на 22222 и чтобы 22222 уже при следующем старте переменная была.

    #34334
    Romiros
    Участник

    SetVal(CnlNum, Cmd)

    Естественно у тебя это не будет работать. Val(); Stat() просто продлевает значение и текущий статус канала. Если у тебя там был изначально 0, то и будут прочерки. Его же сначала надо задать. Т.е. используй SetData(n, val, stat) или SetData(n, cnlData).

    #34337
    manjey73
    Участник

    Ну я уже это понял, что SetVal(CnlNum, Cmd) не задает статус и из-за этого прочерки.
    Вопрос несколько глобальнее. Как задать значению канала понятия Retain после перезапуска Сервера.

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

    • Ответ изменён 2 года назад пользователем manjey73.
    #34339
    Romiros
    Участник

    Так я об этом выше написал. Сохранять в значении расчетного канала последнее время изменения. У меня так и делается.

Просмотр 15 сообщений - с 106 по 120 (из 124 всего)
  • Для ответа в этой теме необходимо авторизоваться.