Modbus AND Меркурий (одна линия связи)

Стартовая страница Форумы Разработка и интеграция Modbus AND Меркурий (одна линия связи)

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

    Ну собственно вместо протокола Меркурий может выступать что-то другое, теоретически работающее вместе с Modbus.

    У меня стало на один USB порт меньше и решил я соединить чтение по Modbus со счетчиком. По отдельности работает, вместе почему-то Меркурий падает.

    2023-09-21 09:44:01 Ошибка при вызове метода Session устройства [3] Mercury23x:
    System.InvalidCastException: Unable to cast object of type 'TemplateDict' to type 'MyDevice'.
       at Scada.Comm.Drivers.DrvMercury23x.Logic.DevMercury23xLogic.Session()
       at Scada.Comm.Engine.DeviceWrapper.Session()

    TemplateDict — это точно из драйвера Modbus. MyDevice из драйвера Меркурий 23х

    Вопрос — куда копать, чтобы устранить обмен данными между общими свойствами линии (так полагаю) и драйвера не мешали друг другу.
    При этом Modbus продолжает опрос без проблем и ему не мешает Меркурий, а вот второй не хочет.

    з.ы. спать лег поздно, не подключался отладчиком еще.

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

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

    #29786
    manjey73
    Участник

    Ну на самом деле запускается первым как раз Меркурий. А потом уже Modbus
    Что как раз и странно. Когда в таком случае его успевает инициализировать Modbus ?

    Хотя да…

    --------------------------------------------------------------------------------
    2023-09-21 10:28:23 Запуск линии связи [10] pr200_tn_Mercury
    
    2023-09-21 10:28:23 Открытие последовательного порта /dev/mydev/Com4
    Загрузка шаблона устройства из файла PR200_TN.xml
    
    2023-09-21 10:28:25 Сеанс связи с устройством [3] Mercury23x
    2023-09-21 10:28:25 Ошибка при вызове метода Session устройства [3] Mercury23x:
    System.InvalidCastException: Unable to cast object of type 'TemplateDict' to type 'MyDevice'.
       at Scada.Comm.Drivers.DrvMercury23x.Logic.DevMercury23xLogic.Session()
       at Scada.Comm.Engine.DeviceWrapper.Session()
    
    2023-09-21 10:28:25 Сеанс связи с устройством [11] PR200TN
    Запрос значений группы элементов "PR200"
    Отправка (8): 01 03 02 00 00 15 85 BD
    Приём (2/2): 01 03
    Приём (45/45): 2A 00 00 00 00 00 00 99 9A 42 75 66 66 42 0E 00 00 41 C8 CC CD 41 C4 00 00 41 DC 00 00 42 20 CC CD 3D CC 00 00 00 00 00 00 00 00 E2 6E
    OK

    Сперва Модбас загружает шаблон, потом пытается Меркурий. А сам опрос сперва Меркурий, потом Modbus.

    А как сделать разные свойства (имена), чтобы не совпадало с Modbus ? у меня то оно не называется TemplateDict вообще, почему он вдруг ругается на него ?

    #29787
    manjey73
    Участник
                if (!LineContext.SharedData.ContainsKey(address))
                {
                    LineContext.SharedData.Add(address, devaddr);
                }
                else
                {
                    devaddr = LineContext.SharedData[address] as MyDevice;
                }

    Записывается address — адреса у устройств отличаются, у Modbus = 1
    у счетчика 14h (20)

    С чего бы он лезет в другой и нарывается на свойство от Модбас устройства ?

    LineContext.SharedData — Это разве можно изменить?

    #29788
    manjey73
    Участник

    В догонку

    MyDevice prop = (MyDevice)LineContext.SharedData[address];

    Где здесь возьмется TemplateDict ????

    #29789
    manjey73
    Участник

    ааааа, вот еще что есть

    for (int x = 0; x < LineContext.SharedData.Count; x++)
    {
    var Val = (MyDevice)LineContext.SharedData.ElementAt(x).Value;
    Val.firstFix = true;
    }

    Скорее всего тут он и падает, так как еще там же добавлен и Modbus…

    Как это возможно изменить малой кровью ? внутри цикла завернуть в try catch проверку на тип (MyDevice) ?

    #29790
    manjey73
    Участник

    Изменим вопрос по другому. Можно ли сделать так

    LineContext.SharedData.Mercury23x и уже в этом создавать словари и переменные ?

    То есть добавить к SharedData еще одно вложение на все и там уже добавлять адреса и прочее ?

    #29791
    manjey73
    Участник

    В общем у меня в двух местах эти циклы, завернул в try/catch и опрос вместе пошел.
    Читается и счетчик Меркурий и ПР200(Modbus)

    вроде как друг другу не мешают

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

    Здесь извлекаются общие данные. Используется ключ «Modbus.Templates». У Вас должно быть другое имя ключа. Более точно нужно в отладчике смотреть.

    #29801
    manjey73
    Участник

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

    Вопрос как не зная, сколько будет устройств сделать разделение, чтобы исключить чужие ключи из LineContext.SharedData…

    У меня это в Session по причине того, что нужна постоянная обработка, а как это сделать при старте линии и потом использовать в Session ?

    Вопрос немного может не по теме, в части Коммуникатора что-то менялось по работе со срезами? у меня перестало работать чтение профилей мощностей, но при этом нет никаких ошибок. Просто не работает и все.

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

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

    #29811
    manjey73
    Участник

    А где в коде есть пример работы со срезами? Просто драйвер для Меркурий портировал еще на бете какой-то, вроде все работало…

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