Стартовая страница › Форумы › Разработка и интеграция › Изменение переменной в рамках линии связи
- В этой теме 23 ответа, 2 участника, последнее обновление 3 года, 10 месяцев назад сделано Mikhail.
-
АвторСообщения
-
21.08.2019 в 17:27 #13328manjey73Участник
Собственно есть счетчик запросов и ответов в протоколе драйвера. При условии запросов к прибору с одним адресом но нескольких запросов, разнесенных во времени сделать чтобы счетчик запросов и ответов был сквозным. Не пересекался со счетчиком для прибора с другим адресом на этой линии и на другой линии.
Какой тип переменной надо применить или как это реализовать другими способами ?
22.08.2019 в 10:06 #13340MikhailМодераторВнтури Вашего класса KPLogic заведите обычную переменную, например, типа int.
Для каждого КП создаётся свой экзепляр класса, поэтому счётчики не будут пересекаться.22.08.2019 в 10:34 #13347manjey73УчастникМихаил, вы немного не поняли.
Прибор ОДИН, нужно, чтобы счетчик был сквозным для одного отдельно взятого прибора, даже если у него несколько КП, то есть я делаю два, три КП на один прибор с одним адресом с разным временем опроса — цикличиский, раз в минуту, раз в час.
При этом на другой линии связи может быть такой же прибор с таким же адресом.Если сделать 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.
22.08.2019 в 12:52 #13360MikhailМодераторТогда нужно использовать CommonProps — это общие свойства в пределах одной линии связи.
Потребуется завести свой класс, как-то так:public class MyCounter { public int Counter; }
и получать этот объект как здесь.
22.08.2019 в 13:39 #13364manjey73УчастникПро сам CommonProps где посмотреть ?
например словарь int, int в него запихнуть ?
CommonProps.Add требует string в качестве ключа, а не int
22.08.2019 в 15:09 #13365manjey73УчастникВроде получилось сделать сквозной счетчик но с нюансами.
Как сделать счетчик, начинающийся с 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.
22.08.2019 в 17:34 #13369MikhailМодераторДолжно сработать:
public class MyCounter { public ushort Counter = 1; }
Либо добавить в класс конструктор и в нём инициализировать переменную.
22.08.2019 в 17:35 #13370MikhailМодераторВ качестве string для Словаря использую адрес прибора, преобразовав.
Так можно, но красивее было бы добавить префикс
string key = «MyDeviceCounter» + address;22.08.2019 в 17:46 #13372manjey73Участникpublic class MyCounter { public ushort Counter = 1; }
Вызов второго экземпляра тут же сделает значение = 1 на этом же адресе. Правда не проверял.
Имеете ввиду, чтобы не голый string был «88» или «25» а именно со словами ?
типа MyAddress25 в качестве ключа ?23.08.2019 в 17:11 #13388MikhailМодераторMyAddress25 в качестве ключа ?
Да, так более наглядно. Общие переменные можно увидеть в файле txt линии связи.
24.08.2019 в 10:44 #13408manjey73УчастникЛиния 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 оказался в тектовом файле именно счетчик.
30.08.2019 в 16:41 #13490manjey73УчастникМихаил, подскажите как вывести счетчик вместо Scada.Comm.Devices.KpRAdf1Logic+MyCounter
25.09.2019 в 14:59 #13713manjey73УчастникНе получается вывести именно счетчик вместо названия всего объекта…
25.09.2019 в 17:31 #13714MikhailМодераторв классе MyCounter сделайте метод примерно
public override string ToString() { return N.ToString(); }
25.09.2019 в 17:46 #13715manjey73УчастникНу проблема в том, что не только вывод требуется, но и использование. А тут 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 линии показывает счетчик, который будет следующим при запросе. Но работает.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.