Смещение данных между устройствами

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

  • В этой теме 28 ответов, 3 участника, последнее обновление 1 год назад сделано Mikhail.
Просмотр 15 сообщений - с 1 по 15 (из 29 всего)
  • Автор
    Сообщения
  • #30479
    manjey73
    Участник

    Вопрос, что в коде Коммуникатора отвечает за передачу данных в Сервер и что может влиять на смещение данных между устройствами?

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

    #30480
    manjey73
    Участник

    https://ibb.co/4ScXFM

    Возможности подключиться к ПК нет, пока требуется понимание, если Session в драйвере завершается корректно и нет вылета с ошибкой по исключению, что может повлиять на смещение данных при ошибке чтения одного из устройств?

    Или наоборот, если ошибка Сессии произошла в коде драйвера по исключению.

    #30481
    JurasskPark
    Участник

    Вопрос, что в коде Коммуникатора отвечает за передачу данных в Сервер и что может влиять на смещение данных между устройствами?

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

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

    P.S. Потом мне мозги вправили и я так больше не пишу код. 🙂

    #30482
    manjey73
    Участник

    А немного подробнее?
    Я вроде не использую общие данные линии для передачи параметров и чтения шаблонов.
    К тому же ошибок нет, если все приборы читаются (если я правильно понял), смещение происходит после того, как происходит ошибка чтения какого-то прибора, а на это может влиять только Коммуникатор

    К тому же в конце кода Session есть такие строки

                stopwatch.Stop();
                Log.WriteLine(Locale.IsRussian ?
                    "Получено за {0} мс" :
                    "Received in {0} ms", stopwatch.ElapsedMilliseconds);
                FinishSession();

    То есть если в логе есть такие строки, то не должно быть смещения данных между устройствами

    DeviceData.Set — по идее в рамках сессии должен отправлять данные только своему связанному с сервером устройству. А отправляет какому-то соседнему.
    Вот и интересует, если ошибка происходила по длине ответа, ошибке CRC или еще какой, что может повлиять на то, что последующий опрос следующего устройства может заставить DeviceData.Set отправить данные в другое устройство, а не в то, которое опрашивается?

    #30483
    manjey73
    Участник

    Смещение данных

    • Этот ответ был изменен 1 год назад от manjey73.
    #30485
    JurasskPark
    Участник

    А немного подробнее?

    
    namespace Scada.Comm.Drivers.DrvModbusJP.Logic
    {
        /// <summary>
        /// Implements the device logic.
        /// <para>Реализует логику устройства.</para>
        /// </summary>
        internal class DevModbusJPLogic : DeviceLogic
        {
    	/// <summary>
            /// Name configuration file
            /// <para>Название файл конфигурации</para>
            /// </summary>
            private readonly string shortFileName;
            /// <summary>
            /// Path configuration file
            /// <para>Путь до файла конфигурации</para>
            /// </summary>
            private readonly string projectFileName;
            /// <summary>
            /// Project configuration
            /// <para>Конфигурация проекта</para>
            /// </summary>
            private readonly Project project;
    		
    	/// <summary>
            /// Initializes a new instance of the class.
            /// </summary>
            public DevModbusJPLogic(ICommContext commContext, ILineContext lineContext, DeviceConfig deviceConfig)
                : base(commContext, lineContext, deviceConfig)
            {
                this.deviceNum = deviceConfig.DeviceNum;
                this.driverCode = DriverUtils.DriverCode;
                this.shortFileName = DriverUtils.GetFileName(deviceNum);
                this.projectFileName = Path.Combine(CommContext.AppDirs.ConfigDir, shortFileName);
                this.project = new Project();
    
                // load configuration
                string errMsg = string.Empty;
                project.Load(projectFileName, out errMsg);
    
                if (errMsg != string.Empty)
                {
                    Log.WriteLine(errMsg);
                }
            }
    	}
    }
    

    Проект project в формате private readonly и public override void OnCommLineStart() не используется.

    • Этот ответ был изменен 1 год назад от JurasskPark.
    #30487
    JurasskPark
    Участник

    DeviceData.Set — по идее в рамках сессии должен отправлять данные только своему связанному с сервером устройству. А отправляет какому-то соседнему.
    Вот и интересует, если ошибка происходила по длине ответа, ошибке CRC или еще какой, что может повлиять на то, что последующий опрос следующего устройства может заставить DeviceData.Set отправить данные в другое устройство, а не в то, которое опрашивается?

    Ну тут надо наблюдать. В моем варианте Устройство(Device) получало рандомно чужую конфигурацию (могло получить, а могло и нет) и данные шли от двух устройств.

    Хотя если у каждой квартиру — разные устройства, то они последовательно при чтение xml перезаписали конфигурацию. Так что сходится.

    #30488
    manjey73
    Участник

    xml шаблона у них совершенно один. Это вообще один и тот же прибор, только их несколько на одной линии. где-то 160

    • Этот ответ был изменен 1 год назад от manjey73.
    #30490
    JurasskPark
    Участник

    Шаблон один. А адреса разные.
    Я пока в логах не удостоверился с помощью логирования, что действительно конфигурация прочитаная не совпадает с адресом устройства, тоже поверить этому не мог.

    Драйвер ваш или стандартный Modbus?
    Просто если ваш, можете добавить в цикл опроса запись текущего адреса устройства. И тогда будет понятно, конфигурация его или нет.

    #30491
    manjey73
    Участник

    драйвер мой MBus, но я пока не могу понять, как мне сделать имитацию ситуации. Так как у меня один счетчик всего на руках с этим протоколом, а люди подключили 160 счетчиков.

    Я бы мог понять смещение, если бы в логах вылетало исключение по NET6 например до окончания кода драйвера Session, но так как в логах он пишет «Получено за ХХХХ мс» :
    А дальше только завершение Сессии, то становится непонятным, откуда берется смещение данных и типа данные одного счетчика передаются в Сервер другому счетчику????

    Вот это и есть загадка. Вот и хотелось бы, чтобы Михаил прояснил исходя из понимания своего кода Коммуникатора, что может вызывать подобное и где мне искать причину такого поведения?

    #30492
    manjey73
    Участник

    Ведь DeviceData.Set передает данные устройству согласно тегам устройства.

    #30496
    JurasskPark
    Участник

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

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

    Драйвер пишет данные в свой объект DeviceData. Дальше Коммуникатор передаёт эти данные «источникам данных» для дальнейшей передачи.

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

    Каждое устройство имеет свой экземпляр DeviceData, поэтому данные не перемешиваются.
    Какой тип канала связи?
    P.S. у меня не открываются скриншоты на ibb.co почему-то.

    #30502
    manjey73
    Участник

    в первой ссылке на конце не хватает N на конце, криво скопировал.
    Сейчас да, почему-то не открывает, ошибка 504

    Тип канала связи как понял TCP клиент у пользователя.
    Стоит GSM модем вроде.

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