создание модуля для создания двух командё

Стартовая страница Форумы Разработка и интеграция создание модуля для создания двух командё

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Автор
    Сообщения
  • #37186
    ivan3012020
    Участник

    Добрый день!
    Идея в чем у меня есть канал 101 (это пароль) и канал 102 (значение которое надо поменять) и канал 103 (канал который не к чему не привязан).
    Мы делаем запись в канал 103, если эта запись не равно 102 каналу. То сначала отправляем значение на 101 канал а потом на 102.
    Вот какой у меня код получается

    public override void OnIteration()
    {
    CnlData curData = ServerContext.GetCurrentData(InputChannel);
    CnlData curData2 = ServerContext.GetCurrentData(OutputChannel);
    
    if (curData.IsDefined)
    {
    if (curData.Val != curData2.Val)
    {
    ServerContext.SendCommand(new TeleCommand(PassworChanel, password, UserID));
    Thread.Sleep(1000);
    ServerContext.SendCommand(new TeleCommand(OutputChannel, curData.Val , UserID));
    
    }
    }
    }
    
    
    
    
    
    • Тема изменена 1 год, 3 месяца назад пользователем Mikhail.
    #37192
    Mikhail
    Модератор

    Добрый день!
    Какой у Вас вопрос?

    #37196
    ivan3012020
    Участник

    как включить это модуль? я скомпилировал и вставил все в соответствующие папки как написано по инструкции на сайте, но ни чего не работает, даже в события не пишется что модуль включен.

    #37197
    ivan3012020
    Участник

    надо ли еще плагин закидывать на сам сервер ?

    #37198
    manjey73
    Участник

    Ну в модуле будет куда больше кода, чем вы привели.
    Смотрите в исходниках OpenModules.

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

    #37199
    manjey73
    Участник

    Можете посмотреть код View части хотя бы моего модуля ModFarm. Поймете, что там программировать и программировать 🙂
    Ну конечно можно обойтись минимумом необходимым.

    #37201
    ivan3012020
    Участник

    а где найти исходник кода ModFarm?

    #37202
    ivan3012020
    Участник

    я взял за основу код который идет в пример, заменил по сути разедел public override void OnIteration() и добавил переменные собственные

    #37203
    ivan3012020
    Участник

    просто как я понял это платный модуль и никто исходниками делится не будет …

    #37204
    manjey73
    Участник

    Самой логикой ModFarm делиться не буду, это точно 🙂
    Но если вам для эксперимента, могу сделать ключ.
    Скоро выпущу ModSoftPlc, который будет работать аналогично, не будет затачиваться под Ферму от слова никак, просто аналогичный запуск программ. И будет дешевле.

    OnIteration там работает несколько раз в секунду. Если нужно реже, то надо использовать таймер.

    а, да. Можно будет использовать в Lite версии еще.
    Кстати ModFarm вы тоже можете использовать по сути в Lite версии. В демо режиме там доступно одно устройство без инициализации и сохранения переменных., и без календарных программ насколько я помню. При чем количество программ на устройство не ограничено.

    • Ответ изменён 1 год, 3 месяца назад пользователем manjey73.
    #37206
    ivan3012020
    Участник

    а для совсем глупеньких… может где то есть объяснение как писать плагины… как связать плагин с ядром скады, что бы можно было перехватывать команды и отправлять их на устройство..

    #37207
    ivan3012020
    Участник

    https://github.com/Ivan301202/Mod-ABC/tree/main
    Вот что у меня сейчас получилось… но это и не принимает данные с нужного канала и не отправляет данные, как будто бы просто не включен

    #37208
    manjey73
    Участник

    public override void OnCommand(TeleCommand command, CommandResult commandResult)

    Вы тут перехватываете команду и сравниваете с тем, она ваша или не ваша по номеру command.CnlNum

    Я сохраняю словарь команд при запуске модуля, которые обслуживает модуль и соответственно проверяю команда должна обслуживаться модулем или нет

    #37209
    manjey73
    Участник

    Вот видите, у вас нет OnCommand — вы не перехватите команду

    #37210
    manjey73
    Участник
            public override void OnCommand(TeleCommand command, CommandResult commandResult)
            {
                if (CnlFromTask.ContainsKey(command.CnlNum))
                {
    
                        // KeyCnl.Key - Имя переменной с номером канала, KeyCnl.Value все данные Cnl по каналу
                        KeyValuePair<string, Cnl> KeyCnl = cnlDict.Where(x => x.Value.CnlNum == command.CnlNum).FirstOrDefault();
    
                        // TEST 
                        string devName = "";
                        try
                        {
                            devName = ServerContext.ConfigDatabase.DeviceTable.Where(x => x.DeviceNum == command.DeviceNum).FirstOrDefault().Name;
                        }
                        catch { }
    
                        string objName = "";
                        try
                        {
                            objName = ServerContext.ConfigDatabase.ObjTable.Where(x => x.ObjNum == command.ObjNum).FirstOrDefault().Name;
                        }
                        catch { }
    
                        if (CnlTypeIdToString(KeyCnl.Value.CnlTypeID) == "CalculatedOutput")
                        {
    
                            moduleLog.WriteAction(Locale.IsRussian ?
                                $"Получение команды: Канал:[{command.CnlNum}] {KeyCnl.Value.Name}, " +
                                $"Устройство:[{command.DeviceNum}] {devName}, Объект:[{command.ObjNum}] {objName}, Значение: {command.CmdVal}" :
                                $"GetCommand: {modTask.programm.program.Task} PrgID: PrgID: {modTask.programm.programIndex}, Channel:[{command.CnlNum}] {KeyCnl.Value.Name}, " +
                                $"Device:[{command.DeviceNum}] {devName}, Object:[{command.ObjNum}] {objName}, Value: {command.CmdVal}");
                        }
                        if (CnlTypeIdToString(KeyCnl.Value.CnlTypeID) == "InputOutput" || CnlTypeIdToString(KeyCnl.Value.CnlTypeID) == "Input")
                        {
                            // Входная часть должна попадать как команда или это в рамках Iteration ?
                            moduleLog.WriteInfo(Locale.IsRussian ?
                                $"Получение значения: Канал:[{command.CnlNum}] {KeyCnl.Value.Name}, " +
                                $"Устройство:[{command.DeviceNum}] {devName}, Объект:[{command.ObjNum}] {objName}, Значение: {command.CmdVal}" :
                                $"GetValue: Channel:[{command.CnlNum}] {KeyCnl.Value.Name}, " +
                                $"Device:[{command.DeviceNum}] {devName}, Object:[{command.ObjNum}] {objName}, Value: {command.CmdVal}");
                        }
                    }
                }
            }

    Убрал тут лишнее, возможно суть будет понятна +-

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