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

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

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

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

    Какой тип переменной надо применить или как это реализовать другими способами ?

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

    Внтури Вашего класса KPLogic заведите обычную переменную, например, типа int.
    Для каждого КП создаётся свой экзепляр класса, поэтому счётчики не будут пересекаться.

    #13347
    manjey73
    Участник

    Михаил, вы немного не поняли.
    Прибор ОДИН, нужно, чтобы счетчик был сквозным для одного отдельно взятого прибора, даже если у него несколько КП, то есть я делаю два, три КП на один прибор с одним адресом с разным временем опроса — цикличиский, раз в минуту, раз в час.
    При этом на другой линии связи может быть такой же прибор с таким же адресом.

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

    Сейчас и так внутри класса используется переменная. Но я опрашиваю прибор на двух разных КП и счетчик выглядит так.
    Опрос 1 — 1, 2, 3
    Опрос 2 — 1, 2
    Опрос 1 — 4, 5, 6
    Опрос 2 — 3, 4

    Прибор вроде не умничает и отвечает :), но это неправильно немного (там есть еще заморочки)
    Надо
    Опрос 1 — 1, 2, 3
    Опрос 2 — 4, 5
    Опрос 1 — 6, 7, 8
    Опрос 2 — 9, 10

    Но только в рамках одного адреса прибора и в рамках одной линии связи.

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

    Тогда нужно использовать CommonProps — это общие свойства в пределах одной линии связи.
    Потребуется завести свой класс, как-то так:

    public class MyCounter
    {
      public int Counter;
    }
    

    и получать этот объект как здесь.

    #13364
    manjey73
    Участник

    Про сам CommonProps где посмотреть ?

    например словарь int, int в него запихнуть ?

    CommonProps.Add требует string в качестве ключа, а не int

    #13365
    manjey73
    Участник

    Вроде получилось сделать сквозной счетчик но с нюансами.
    Как сделать счетчик, начинающийся с 1 а не с 0 ? то есть инициализировать переменную в таком случае ?

    Сейчас так

            public class MyCounter // TEST TEST TEST счетчик для линии связи
            {
                public ushort Counter;
            }
    
            protected virtual string address // TEST TEST TEST
            {
                get
                {
                    return Convert.ToString(Address);
                }
            }
    
            private MyCounter GetMyCounter() // TEST TEST TEST
            {
                MyCounter counter = CommonProps.ContainsKey(address) ?
                    CommonProps[address] as MyCounter : null;
                if (counter == null)
                {
                    counter = new MyCounter();
                    if (counter.Counter == 0) counter.Counter = 1;
                    CommonProps.Add(address, counter);
                }
                return counter;
            }
    

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

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

    Должно сработать:

    public class MyCounter
    {
      public ushort Counter = 1;
    }

    Либо добавить в класс конструктор и в нём инициализировать переменную.

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

    В качестве string для Словаря использую адрес прибора, преобразовав.

    Так можно, но красивее было бы добавить префикс
    string key = «MyDeviceCounter» + address;

    #13372
    manjey73
    Участник
    public class MyCounter
    {
      public ushort Counter = 1;
    }

    Вызов второго экземпляра тут же сделает значение = 1 на этом же адресе. Правда не проверял.

    Имеете ввиду, чтобы не голый string был «88» или «25» а именно со словами ?
    типа MyAddress25 в качестве ключа ?

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

    MyAddress25 в качестве ключа ?

    Да, так более наглядно. Общие переменные можно увидеть в файле txt линии связи.

    #13408
    manjey73
    Участник
    Линия 19 "Allen"
    ----------------
    Состояние : цикл работы
    Действие  : 24.08.2019 10:40:20 Выбор КП для связи
    
    Канал связи
    -----------
    Тип: TcpClient
    Соединение:  не установлено
    Пользовательские параметры
    --------------------------
    Нет
    
    Общие свойства
    --------------
    87 = Scada.Comm.Devices.KpRAdf1Logic+MyCounter
    88 = Scada.Comm.Devices.KpRAdf1Logic+MyCounter
    
    Активные КП
    -----------
    1. КП 132 "MicroLogix1400" : ошибка
    2. КП 133 "ML1400_1"       : ошибка

    Не очень то наглядно выглядит сам объект. Или надо как-то дополнительно что-то делать, чтобы вместо Scada.Comm.Devices.KpRAdf1Logic+MyCounter оказался в тектовом файле именно счетчик.

    #13490
    manjey73
    Участник

    Михаил, подскажите как вывести счетчик вместо Scada.Comm.Devices.KpRAdf1Logic+MyCounter

    #13713
    manjey73
    Участник

    Не получается вывести именно счетчик вместо названия всего объекта…

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

    в классе MyCounter сделайте метод примерно

    public override string ToString()
    {
      return N.ToString();
    }
    #13715
    manjey73
    Участник

    Ну проблема в том, что не только вывод требуется, но и использование. А тут ToString() ???

    Сейчас вот приколхозил так:

    public class MyCounter //  счетчик для линии связи для приборов с одним адресом
            {
                public ushort Counter = 1;
            }
    protected virtual string address 
            {
                get
                {
                    return "Count_Addr_" + Convert.ToString(Address);
                }
            }
     private MyCounter GetMyCounter() // TEST TEST TEST
            {
                MyCounter counter = CommonProps.ContainsKey(address) ?
                    CommonProps[address] as MyCounter : null;
    
                if (counter == null)
                {
                    counter = new MyCounter();
                    if (!CommonProps.ContainsKey(address)) // пришлось добавить, потому что второй запрос ругался, что ключ уже создан
                    {
                        CommonProps.Add(address, counter.Counter);
                    }
                }
                return counter;
            }
    

    Потом при запуске вызываю

     public override void OnCommLineStart()
            {
                GetMyCounter();
            }
    

    А вот потом чтобы получить ushort пришлось сделать так
    tns = (ushort)CommonProps[address];

    Ну и после обработки счетчика его сохраняю туда же

                                CommonProps[address] = tns;
    

    Но как-то выглядит с костылем… в txt линии показывает счетчик, который будет следующим при запросе. Но работает.

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