Модули сервера V6, возможности?

Стартовая страница Форумы Разработка и интеграция Модули сервера V6, возможности?

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

    OnServiceStart
    OnServiceStop
    OnIteration
    OnCurrentDataProcessing
    OnCurrentDataProcessed
    OnHistoricalDataProcessing
    OnHistoricalDataProcessed
    OnEvent
    OnEventAck
    OnCommand

    1. Порядок выполнения?
    2. Назначение ?

    И такой вопрос, из кода модуля .View возможно получить данные из БД scada в виде фильтрованного списка например по тегу канала ?
    Например у меня есть названия каналов heat_100, heat_101
    wcool_100, wcool_101, wheat_100, wheat_101
    Могу я получить список с номерами каналов, начинающихся на «cool_»

    з.ы. мне не нравится как реализовано в том же RapidGate указание 1-5, 11-15, 21-25 и так далее, особенно если каналов будут сотни…

    #27834
    manjey73
    Участник

    И собственно вопрос, кроме получения списка каналов по имени тега, что еще из данных канала можно получить?

    Объект, Устройство, их линии связи ????
    Длина данных, границы канала и так далее

    • Этот ответ был изменен 12 месяцев назад от manjey73.
    #27862
    Mikhail
    Модератор

    OnServiceStart вызывается при старте сервиса, OnServiceStop — при остановке сервиса. Остальные методы — при наступлении соответствующих событий.

    В логике модуля доступен объект ServerContext. Посмотрите, какие свойства и методы он имеет. В том числе доступна база конфигурации.

    Из кода модуля .View есть доступ к открытому проекту.

    #27867
    manjey73
    Участник

    OnIteration с каким периодом вызывается данный метод?
    Как мне Роман сказал это аналог Session в драйвере. Как я этим периодом могу управлять?

    #27878
    manjey73
    Участник

    Как из модуля запустить прослушивание порта, чтобы автоматом порт был открыт в firewall либо Windows, либо Linux.

    есть пример кода?, так понимаю порт открывает dotnet, то есть ковырять что-то в системе не требуется.

    #27880
    JurasskPark
    Участник

    Как из модуля запустить прослушивание порта, чтобы автоматом порт был открыт в firewall либо Windows, либо Linux.

    Автоматом в системе порт на Firewall не будет открыт никогда. Это основы ИБ. 🙂
    Решение — это только писать правило через Реестр во время запуска приложения или библиотеки.

    #27881
    manjey73
    Участник

    JurasskPark а разве вы открываете порты на Сервера 10000, 10008, и так далее при установке RapidScada ?

    Они указаны в настройках Scada, и если посмотреть например на Linux, слушает их dotnet. значит есть какой-то механизм в коде который позволяет открывать порт на прослушку.

    Ну, если фаарволом все закроют, типа все что сейчас не открыто то drop тогда да, придется снова переоткрывать..

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

    OnIteration с каким периодом вызывается данный метод?

    Ссылка на код. Период зависит от скорости обработки данных. Примерно 10 раз в секунду. Если нужен свой период, используйте свой поток.

    Когда все приложения SCADA установлены на 1 компьютере, нет необходимости разрешать порт в firewall для общения между ними. Посмотрите, как реализовано прослушивание порта здесь.

    #27947
    Romiros
    Участник

    В OnHistoricalDataProcessed можно как-то определить в какой именно архив пишутся данные, часовой, дневной, минутный или вообще свой архив?

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

    Нет, в этот метод передаются только данные, маска архивов не передаётся.

    #27976
    Romiros
    Участник

    Ну это я и из метода понял :))

    Имелось ввиду, что вообще это можно получить в ModLogic или надо идти через какой-нибудь ModArc?

    Пойду изучать исходники.

    #28011
    manjey73
    Участник

    Интересуют некоторые вещи.

    1. Можно ли из .View модуля работать с POST, GET запросами?
    Если может и надо одновременно это выполнять из .Logic и .View куда код пихать? в общий проект?

    2. Чтение на POST запрос занимает больше 2-х секунд, а может еще больше занимать в зависимости от объема данных.

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

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

    Обработка полученных исторических данных происходит здесь.

    Из WinForms отправлять запросы можно. Библиотеки View и Logic не взаимосвязаны между собой. Но если используется общий код, то его можно положить в отдельную DLL или Shared-проект. Чтобы пользовательский интерфейс не блокировался на время ожидания ответа, удобнее всего использовать асинхронные вызовы.

    #28030
    Romiros
    Участник

    Обработка полученных исторических данных происходит здесь.

    Спасибо.

    #28032
    manjey73
    Участник
            public bool SendNotification(HttpRequestMessage request, out string contentResponse) // , string tagCode
            {
                try
                {
                    HttpStatusCode responseStatus;
                    string responseContent;
                    using (HttpResponseMessage response = httpClient.SendAsync(request).Result)
                    {
                        responseStatus = response.StatusCode;
                        responseContent = response.Content.ReadAsStringAsync().Result;
                    }
                    contentResponse = responseContent;
                    return true;
                }
                catch (Exception ex)
                {
                    contentResponse = ex.Message;
                    return false;
                }
            }
    

    собственно пример из HttpNotif — вроде как ReadAsStringAsync() это асинхронное чтение, но при этом окно замирает на эти 2 секунды напрочь… пока не прочтет…
    Получилось без задержек при использовании

     public async Task ReadAsync()
            {
                // Call asynchronous network methods in a try/catch block to handle exceptions.
                try
                {
                    using HttpResponseMessage response = await client.PostAsync(ТУТ URI, null);
                    response.EnsureSuccessStatusCode();
                    string responseBody = await response.Content.ReadAsStringAsync();
    
                    rBox.Text += responseBody + Environment.NewLine + Environment.NewLine;
                }
                catch (HttpRequestException e)
                {
                    rBox.Text += e.Message + Environment.NewLine + Environment.NewLine;
                }
            }
    
            private void bSave_Click(object sender, EventArgs e)
            {
                _ = ReadAsync();
            }

    Привязал непосредственно к кнопке Save. Тогда могу двигать окно, пока там что-то читается. Но тут вопрос — в RichTextBox идет печать тогда, когда оно прочтется и код находится там же. Как в данном случае задачу перенести в другой .cs (в Shared) и узнать, что оно прочиталось?
    async Task не допускает out, ref и так далее….

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