Изменение переменной в рамках линии связи

Стартовая страница Форумы Разработка и интеграция Изменение переменной в рамках линии связи

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

    Хотя в принципе не так уже важно, главное что разнесенные во времени опросы одного прибора имеют разные ID запросов и счетчики у приборов с разными адресами у каждого свой.

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

    Нужно брать из общих параметров объект целиком MyCounter
    MyCounter myCounter = CommonProps["MyCounter"];

    а затем использовать поле myCounter.Counter.

    Метод ToString() используется при выводе текстового представления объекта на txt файл.

    #13727
    manjey73
    Участник

    Так вроде сперва так и делал, использовал поле myCounter.Counter сперва, но в текстовом файле было это

    88 = Scada.Comm.Devices.KpRAdf1Logic+MyCounter

    Но счетчик вроде был сквозным для двух вызовов. Потом что-то поломалось 🙂 Или я где-то не так что-то сделал..

    То есть нужно в принципе писать туда объект, а ToString() на работу счетчика не повлияет ?

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

    ToString() на работу счётчика не повлияет, а должен повлиять на вывод в текстовый файл.

    #15907
    manjey73
    Участник

    Возвращаясь к теме. Как в CommonProps оперировать несколькими переменными ?

     public class MyDevice // счетчик для линии связи
            {
                public bool mcast = true;
                public long tik = 0;
            }
            protected virtual string address
            {
                get
                {
                    return "DevAddr_" + Convert.ToString(Address);
                }
            }
            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;
            }

    Соответственно будет сохранен объект devaddr с полями mcast (булевая) и tik (long)
    но не могу понять как их вытянуть в коде ?
    Если использовать только одну, например CommonProps.Add(address, devaddr.tik);
    То без проблем, а как несколько ?

    • Этот ответ был изменен 3 года, 10 месяцев назад от manjey73.
    #15911
    Mikhail
    Модератор

    Насколько я понимаю вопрос, нужно придумать несколько имен, например, address + «_name».

    Хотя я бы, вероятно, упаковал бы всё что нужно внутрь одного объекта. Вы получаете из CommonProps объект целиком, а затем обращаетесь к его свойствам.

    #15912
    manjey73
    Участник

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

    Может надо было еще где-то что-то сделать ? но не пойму как ?

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

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

    MyDevice property = (MyDevice)CommonProps[address];

    А если просто то ругается на приведение типов…
    MyDevice property = CommonProps[address];

    address соответственно выглядит как «DevAddress_20″например

    • Этот ответ был изменен 3 года, 10 месяцев назад от manjey73.
    • Этот ответ был изменен 3 года, 10 месяцев назад от manjey73.
    #15919
    Mikhail
    Модератор

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

    if (CommonProps.TryGetValue(address, out object val) && val is MyDevice myDevice)
    {
    ...
    }
    else
    {
    // обработка ошибки, что переменная не найдена
    }
    • Этот ответ был изменен 3 года, 10 месяцев назад от Mikhail.
Просмотр 9 сообщений - с 16 по 24 (из 24 всего)
  • Вы должны авторизироваться для ответа в этой теме.