Куда переехали методы и сохранились ли ? v6

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

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

    Михаил, сохранились ли методы, которые были в версии 5 и куда переехали, если сохранились?

    CommUtils.AddZeros(CommLineSvc.Number, 3)

    Собственно сам AddZeros и что теперь вместо CommLineSvc.Number ?

    #22756
    manjey73
    Участник

    Ну и так же вопрос как теперь со срезами работать
    И как работать с Event-ами из драйвера

    #22761
    manjey73
    Участник
    2022-04-02 23:31:00 Ошибка при вызове метода Session устройства [2] Mercury23x_82:
    System.Collections.Generic.KeyNotFoundException: The given key 'Меркурий236_82' was not present in the dictionary.

    Раньше было

            private MyDevice GetMyDevice()
            {
                MyDevice devaddr = CommonProps.ContainsKey(address) ?
                    CommonProps[address] as MyDevice : null;
    
                if (devaddr == null)
                {
                    devaddr = new MyDevice();
                    if (!CommonProps.ContainsKey(address))
                    {
                        CommonProps.Add(address, devaddr);
                    }
                }
                return devaddr;
            }
    

    Ну и так далее по коду на счетчик Меркурий 23x, весь код есть на Git

    Теперь пытаюсь сделать по аналогии

            private MyDevice GetMyDevice()
            {
                MyDevice devaddr = LineContext.SharedData.ContainsKey(address) ? // CommonProps.ContainsKey(address) ?
                    LineContext.SharedData[address] as MyDevice : null; 
    
                if (devaddr == null)
                {
                    devaddr = new MyDevice();
                    if (!LineContext.SharedData.ContainsKey(address))
                    {
                        LineContext.SharedData.Add(address, devaddr);
                    }
                }
                return devaddr;
            }
    

    Но получаю ошибку выше… Так как правильно с новыми способами обходиться по сравнению с вариантами из версии 5 чтобы сохранить данные в общих свойствах, чтобы они
    1. Не отображались во вкладке Пользовательские
    2. Были доступны между экземплярами драйвера на одной линии связи ?

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

    CommUtils.AddZeros(CommLineSvc.Number, 3)

    В .NET есть встроенный метод добавить нули впереди. Пример или n.ToString(«D3»)

    Ну и так же вопрос как теперь со срезами работать
    И как работать с Event-ами из драйвера

    DeviceData.EnqueueSlice
    DeviceData.EnqueueEvent
    Примера пока нет.

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

    System.Collections.Generic.KeyNotFoundException: The given key ‘Меркурий236_82’ was not present in the dictionary.

    Ошибка означает, что указанный ключ отсутствует в словаре. Посмотрите в отладчике, что есть в словаре, и чего нет.

    #22767
    manjey73
    Участник

    Из-за того, что теперь нет OnAddedToCommLine который выполнялся раньше, чем OnCommLineStart и происходят эти проблемы. Но это бы ничего, если бы можно было все из OnCommLineStart перекинуть по быстрому в InitDeviceTags, например в его конец.

    Теперь надо понять что в последних двух и в какой последовательности выполняется.
    Я перекидывал часть кода в InitDeviceTag и получилось, что общие данные не появились.

    По Slice и Event можете набросать примеры, чтобы понять, как заменить те, которые были в 5-й версии ?

    #22770
    manjey73
    Участник

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

    #22771
    manjey73
    Участник

    System.ArgumentNullException: Value cannot be null. (Parameter ‘key’)
    at System.Collections.Generic.Dictionary`
    2.FindValue(TKey key)
    at System.Collections.Generic.Dictionary`2.ContainsKey(TKey key)
    at Scada.Comm.Drivers.DrvMercury23x.Logic.DevMercury23xLogic.InitDeviceTags()
    at Scada.Comm.Engine.DeviceWrapper.InitDeviceTags()

    Объясните, как теперь правильно работать с добавлением тегов и разделять их на группы ? Не выходит каменный цветок для драйвера Меркурий 23х

    • Этот ответ был изменен 1 год, 12 месяцев назад от manjey73.
    #22774
    manjey73
    Участник

    Одну ошибку отловил, пришлось воспользоваться Log.WriteLine, расставленные по коду.
    Так как подключиться к незапущенному процессу не понял как, если это вообще возможно, а ошибка возникала в самом начале.

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

    #22775
    manjey73
    Участник

    В симуляторе есть CnlPrototypeFactory но вот не совсем понимаю, как в него передать словарь активных сигналов…

    Создал внутри
    internal class CnlPrototypeFactory
    {
    public class ActiveChannel
    {
    public string Name;
    public string Code;
    public string CnlType;
    }
    private ActiveChannel activeChannel;

    И далее
    public static List<CnlPrototypeGroup> GetCnlPrototypeGroups(Dictionary<string, ActiveChannel> activeChannel)

    Но следующий метод ругается
    public static List<CnlPrototype> GetCnlPrototypes()
    {
    return GetCnlPrototypeGroups().SelectMany(group => group.CnlPrototypes).ToList();
    }

    Отсутствует аргумент, соответствующий требуемому формальному параметру «activeChannel» из «CnlPrototypeFactory.GetCnlPrototypeGroups(Dictionary<string, CnlPrototypeFactory.ActiveChannel>)».

    Для чего необходим этот метод ? Gets a flatten list of the channel prototypes.

    Как мне передать словарь активных сигналов в CnlPrototypeFactory и там обработать как мне надо ?

    Так понимаю мне надо в Shared это запихивать, чтобы был доступ и из Logic и из View

    #22785
    manjey73
    Участник

    В DevXXX.Logic не работает код назначения типа канала

    deviceTag = tagGroup.AddTag(devTemplate.SndGroups[idgr].value[i].code, Allname);
    deviceTag.Cnl.CnlTypeID = CnlTypeID.Input; // deviceTag.Format = TagFormat.FloatNumber;

    А вот Формат работает. В Dev в принципе нельзя назначить тип канала?

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

    Как подключиться к процессу, который еще не запущен?

    Написать, как здесь.

    По Slice и Event можете набросать примеры, чтобы понять, как заменить те, которые были в 5-й версии ?

    Смогу но только позже. Создаёте объект события или среза через new и вызываете соответствующие методы.

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

    deviceTag.Cnl — это ссылка на канал из базы.
    Чтобы установить тип данных тега, пример по ссылке.

    Прототипы каналов нужны для работы мастера создания каналов. Вопрос об этом?

    #22792
    manjey73
    Участник

    Да, лучше через прототипы, но выше написал, не пойму как передать в прототипы свой словарь с каналами, которые будут активны.

    В Симуляторе жесткая привязка имен, которая меня не устраивает.

    #22795
    manjey73
    Участник

    DataType это не то, интересует именно возможность назначения Input, Input/Output, Output

    Это возможно только из прототипов ?

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