Драйвер ODBC

Просмотр 15 сообщений - с 61 по 75 (из 84 всего)
  • Автор
    Сообщения
  • #24711
    JurasskPark
    Участник

    Мне нужна помощь! Ничего нового. 😀
    Скажу честно, в v5, я команды не трогал и оставлял как есть.
    Но т.к. в v6 я код переношу и правлю, то решил проверить работает отправка команд или нет.
    И на любую отправку команд — система пишет неизвестная команда. Решил проверить на драйвере Simulator — тоже самое.

    Хотя у симулятора есть обработка команд

       /// <summary>
            /// Sends the telecontrol command.
            /// </summary>
            public override void SendCommand(TeleCommand cmd)
            {
                base.SendCommand(cmd);
    
                if (cmd.CmdCode == TagCode.DO || cmd.CmdNum == 4)
                {
                    double relayVal = cmd.CmdVal > 0 ? 1 : 0;
                    Log.WriteLine(Locale.IsRussian ?
                        "Установить состояние реле в {0}" :
                        "Set the relay state to {0}", relayVal);
                    DeviceData.Set(TagCode.DO, relayVal);
                }
                else if (cmd.CmdCode == TagCode.AO || cmd.CmdNum == 5)
                {
                    Log.WriteLine(Locale.IsRussian ?
                        "Установить аналоговый выход в {0}" :
                        "Set the analog output to {0}", cmd.CmdVal);
                    DeviceData.Set(TagCode.AO, cmd.CmdVal);
                }
                else if (cmd.CmdCode == "Hist")
                {
                    // demonstrate how to create a historical data slice
                    DateTime now = DateTime.UtcNow;
                    DeviceSlice deviceSlice = new DeviceSlice(
                        new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, DateTimeKind.Utc),
                        1, 1);
                    deviceSlice.DeviceTags[0] = DeviceTags[TagCode.Sin];
                    deviceSlice.CnlData[0] = new CnlData(cmd.CmdVal, CnlStatusID.Defined);
                    deviceSlice.Descr = "Demo slice";
                    DeviceData.EnqueueSlice(deviceSlice);
                }
                else if (cmd.CmdCode == "Event")
                {
                    // demonstrate how to create an event
                    DeviceData.EnqueueEvent(new DeviceEvent(DeviceTags[TagCode.Sin])
                    {
                        Timestamp = DateTime.UtcNow,
                        CnlVal = cmd.CmdVal,
                        CnlStat = CnlStatusID.Defined,
                        Descr = "Demo event"
                    });
                }
                else
                {
                    LastRequestOK = false;
                    Log.WriteLine(CommPhrases.InvalidCommand);
                }
    
                FinishCommand();
            }

    Но почему он тоже пишет неизвестная команда??? При этом команды же логируются.

    Вот видео: https://www.youtube.com/watch?v=U2YMGhvOUy0
    Михаил, подскажите, пожалуйста, как и где глубоко копать. 🙂

    Код отправки команд, который я почти не трогал.

       public override void SendCommand(TeleCommand cmd)
            {
                base.SendCommand(cmd);
    
                Log.WriteLine("cmd " + cmd.CmdCode);
    
                try
                {
                    if (CanSendCommands)
                    {
                        LastRequestOK = false;
    
                        if ((cmd.CmdCode == "SendStr" || cmd.CmdCode == "SendBin") &&
                            (dataSource.ExportCommands.TryGetValue(cmd.CmdNum, out DbCommand dbCommand) ||
                            dataSource.ExportCommands.TryGetValue(0, out dbCommand)))
                        {
                            if (ValidateDataSource() && ValidateCommand(dbCommand))
                            {
                                dataSource.SetCmdParam(dbCommand, "cmdVal",
                                    cmd.CmdCode == "SendStr" ? (object)cmd.CmdVal : cmd.GetCmdDataString());
                                dataSource.SetCmdParam(dbCommand, "cmdNum", cmd.CmdNum);
                                int tryNum = 0;
    
                                while (RequestNeeded(ref tryNum))
                                {
                                    if (Connect() && SendDbCommand(dbCommand))
                                        LastRequestOK = true;
    
                                    Disconnect();
                                    FinishRequest();
                                    tryNum++;
                                }
                            }
                        }
                        else
                        {
                            Log.WriteLine(CommPhrases.InvalidCommand);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.WriteLine(ex.ToString());
                }
    
                FinishCommand();
            }
    
            /// <summary>
            /// Sends the command to the database.
            /// </summary>
            private bool SendDbCommand(DbCommand dbCommand)
            {
                try
                {
                    Log.WriteLine(Locale.IsRussian ?
                        "Запрос на изменение данных" :
                        "Data modification request");
                    dbCommand.ExecuteNonQuery();
                    return true;
                }
                catch (Exception ex)
                {
                    Log.WriteLine(string.Format(Locale.IsRussian ?
                        "Ошибка при отправке команды БД: {0}" :
                        "Error sending command to the database: {0}", ex.Message));
                    return false;
                }
            }
    #24713
    JurasskPark
    Участник

    Вопрос закрыт. Надо код команды указывать. 🙂

    #24714
    manjey73
    Участник

    Если вы подаете команду из Коммуникатора то так и есть, отправляется или Номер или Код. Если в драйвере не используется Номер то соответственно будет ошибка.

    Из самой Scada вроде происходит сопоставление Номеру Кода команды

    #24715
    JurasskPark
    Участник

    Спасибо большое за помощь и ответ! 🙂

    #24753
    JurasskPark
    Участник
    #24755
    JurasskPark
    Участник
    #24782
    Mikhail
    Модератор

    Спасибо! Добавлю в репозиторий модулей.

    #24790
    Mitrich
    Участник

    Просьба для v.5 в архиве KpDbImportPlus_5.1.1.0_Release.zip разложить файлы в требуемых каталогах (SCADA\ScadaComm и т.п.), а не общей кучей, если не сложно.

    #24792
    JurasskPark
    Участник

    Не сложно, я об этом думал вчера. Но времени не хватило. Сделаю, когда прийду с работы 🙂

    #24807
    JurasskPark
    Участник

    https://github.com/JurasskPark/RapidScada_v5/releases/tag/v5.1.1.1
    Опубликовал новую версию, где разложил по папкам и небольшую недоработку подправил 🙂

    #25850
    JurasskPark
    Участник

    Обновил драйвер до 6.0.0.1
    https://raw.githubusercontent.com/JurasskPark/RapidScada_v6/master/OpenDrivers/Source/DrvDbImportPlus_005.png

    Главная ошибка была в том, если значение в таблице (строка пропадала из результатов), то все теги после пропавшего КП (он же тег, он же канал) поднимались вверх и писали в другом номер.
    + если пропадает связь, то последнее значение писалось, сейчас идёт проверка, что если в результате нет этого канала (тега), то статус и значение пишем 0.

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

    Это хорошая новость 🙂

    #25980
    JurasskPark
    Участник

    Обновил драйвер до 6.0.0.2
    https://github.com/JurasskPark/RapidScada_v6/releases/tag/v6.0.0.2

    Убрано ограничение на количество тегов с 100 до 65535. 🙂

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

    В репозитории ссылка на все релизы, поэтому ссылка остаётся актуальной.

    #26840
    JurasskPark
    Участник

    Короче, продолжение темы https://forum.rapidscada.ru/?topic=server-data-source#post-26832

    Как Михаил исторические данные передаёт
    https://github.com/RapidScada/scada-v6/blob/cf5fa41dd5a7b67a7c50073387f67e7d356ea40d/ScadaComm/OpenDrivers/DrvDsScadaServer.Logic/ScadaServerDSL.cs#L267
    https://github.com/RapidScada/scada-v6/blob/cf5fa41dd5a7b67a7c50073387f67e7d356ea40d/ScadaComm/OpenDrivers/DrvDsScadaServer.Logic/ScadaServerDSL.cs#L354

    И мой быдло код
    https://github.com/JurasskPark/RapidScada_v6/blob/6b077f8b0c32a4b7d2aff3a1aa06ffd24bae1c0e/OpenDrivers/DrvDbImportPlus_v6/DrvDbImportPlus.Logic/DevDbImportPlusLogic.cs#L579

    Если коротко, то Михаил из многих «срезов» делает один и записывает его в БД.
    А я для каждого тега тиражирую по их количеству.

    Надо исправлять. 🙂

Просмотр 15 сообщений - с 61 по 75 (из 84 всего)
  • Вы должны авторизироваться для ответа в этой теме.