1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Программа на С++

SCADA, серверы, АРМ верхнего уровня, диспетчерские
Ответить

Автор темы
Rock87
здесь недавно
здесь недавно
Сообщения: 81
Зарегистрирован: 05 сен 2013, 12:29
Имя: Александр Дмитриевич
Страна: Россия
город/регион: Нижний Новгород
Благодарил (а): 6 раз

Программа на С++

Сообщение Rock87 »

Пишу программу на С++Builder для взаимодействия с оборудованием (ПЛК Delta) по протоколу Modbus. Возник вопрос как организовать этот процесс. Допустим запрос на запись данных можно отправлять по соответствующему событию (например нажатие кнопки в программе), а вот запрос на считывание данных, для мониторинга состояния оборудованию, не понятно. Эти запросы должны отправляться периодически. Но по событию таймера, по-моему, не очень подходит, потому что я заранее не знаю кол-во запросов и соответственно время, необходимое для организации этих запросов. Соответственно, если я установлю время между тиками таймера слишком маленьким, то новый тик может начаться раньше, чем успеет обработаться очередь запросов предъидушего.
Что делать, люди добрые?
Аватара пользователя

dtv
завсегдатай
завсегдатай
Сообщения: 575
Зарегистрирован: 04 фев 2014, 08:41
Имя: Тарас Валерьевич
Страна: Россия
город/регион: Екатеринбург
Благодарил (а): 59 раз
Поблагодарили: 89 раз

Re: Программа на С++

Сообщение dtv »

Почитайте про механизм организации ОРС-серверов. Может найдёте ответы на часть вопросов.
Взгляд знатока намного уже кругозора неуча. Ю.Базылев

Alexander
БАН
БАН
Сообщения: 642
Зарегистрирован: 03 июн 2010, 12:26
Имя: Козин Александр Елисеевич
Страна: Украина
город/регион: Одесса
Поблагодарили: 4 раза
Забанен: Бессрочно

Re: Программа на С++

Сообщение Alexander »

Как-же вы не знаете количество запросов-то? Судя по тому, что именно вы нажимаете кнопку на экране - с вашей стороны мастер, который и формирует эти запросы. Или ваши слейвы лезут с ответами, когда их не спрашивают? :)

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5623
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 546 раз
Поблагодарили: 706 раз

Re: Программа на С++

Сообщение Ryzhij »

Если у Вас мониторинг, а не управление, то зачем Вам заморачиваться с жёсткой привязкой по времени?
Закончился предыдущий запрос и есть условия на инициацию следующего - вперёд к новым знаниям и запросам!
Закончился предыдущий, но время ещё не подошло - курим бамбук, ждём-с.
Пора бы запросить, но не ответили на предыдущий - ждём-с, ничего страшного, мы же не управляем процессом, а мониторим его.
Ах, надо быстрее? Изменяем настройки связи или переходим на связь по другому каналу, по двум сразу и/или т.п.
Как-то так...
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)

Автор темы
Rock87
здесь недавно
здесь недавно
Сообщения: 81
Зарегистрирован: 05 сен 2013, 12:29
Имя: Александр Дмитриевич
Страна: Россия
город/регион: Нижний Новгород
Благодарил (а): 6 раз

Re: Программа на С++

Сообщение Rock87 »

dtv писал(а):Почитайте про механизм организации ОРС-серверов. Может найдёте ответы на часть вопросов.
Спасибо, будем поглядеть.
Alexander писал(а):Как-же вы не знаете количество запросов-то? Судя по тому, что именно вы нажимаете кнопку на экране - с вашей стороны мастер, который и формирует эти запросы. Или ваши слейвы лезут с ответами, когда их не спрашивают? :)
Да, Вы правы, с моей стороны мастер и, конечно, слейвы не лезут с ответами, пока их не спрашивают. Дело в том, что в каждом частном случае можно прикинуть кол-во запросов, определиться со скоростью передачи данных и установить необходимый период тиков таймера. Мне же хотелось бы сейчас сделать что-то типа шаблона, что бы потом можно было применить в другом проекте, если конечно понадобиться. Ну и интересно, конечно, ка-то это реализовано в той же СКАДе. Вот интересно как? Там же разработчик СКАДы заранее не знает сколько каналов организует САКДа-программист.
Ryzhij писал(а):Если у Вас мониторинг, а не управление, то зачем Вам заморачиваться с жёсткой привязкой по времени?
Закончился предыдущий запрос и есть условия на инициацию следующего - вперёд к новым знаниям и запросам!
Закончился предыдущий, но время ещё не подошло - курим бамбук, ждём-с.
Пора бы запросить, но не ответили на предыдущий - ждём-с, ничего страшного, мы же не управляем процессом, а мониторим его.
Ах, надо быстрее? Изменяем настройки связи или переходим на связь по другому каналу, по двум сразу и/или т.п.
Как-то так...
Я бы хотел сделать и управление и мониторинг.

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5623
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 546 раз
Поблагодарили: 706 раз

Re: Программа на С++

Сообщение Ryzhij »

Rock87 писал(а):Я бы хотел сделать и управление и мониторинг.
В этом случае для каждого тега назначают требуемый период и политики обновления. На основании этого уже и формируются пакеты запросов. Иногда это помогает обновлять не всю, а наиболее важную в данный момент информацию по-быстрее.
Скажем, информация по значениям тегов, не участвующим в формировании активного окна, или не запрашивается вовсе, или запрашивается гораздо реже, чем для тегов активного окна.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)

Romcheg
SCADA+
SCADA+
Сообщения: 592
Зарегистрирован: 05 ноя 2009, 11:18
Имя: Бузинов Роман Анатольевич
Страна: Россия
город/регион: Москва
Благодарил (а): 8 раз
Поблагодарили: 33 раза

Re: Программа на С++

Сообщение Romcheg »

Судя вопросу - Вы не программист, совсем. Зачем Вам это, а тем более знать как оно устроено в серьезных системах? Под каждою задачу - своя архитектура для ее решения, если вкратце, то в скадах и ОРС-серверах обычно это многопоточная (или асинхронная) модель обработки транзакций, но зачастую и однопоточная. Но - для чего Вам это нужно? Мне кажется, что любой профф. софт типа Скада-системы, или специализированного ОРС справится с Вашей задачей лучше и с меньшими затратами. Или Вам хочется непременно свой велосипед и руки очень чешутся? :)
SCADA+

Автор темы
Rock87
здесь недавно
здесь недавно
Сообщения: 81
Зарегистрирован: 05 сен 2013, 12:29
Имя: Александр Дмитриевич
Страна: Россия
город/регион: Нижний Новгород
Благодарил (а): 6 раз

Re: Программа на С++

Сообщение Rock87 »

Ryzhij писал(а):
Rock87 писал(а):Я бы хотел сделать и управление и мониторинг.
В этом случае для каждого тега назначают требуемый период и политики обновления. На основании этого уже и формируются пакеты запросов. Иногда это помогает обновлять не всю, а наиболее важную в данный момент информацию по-быстрее.
Скажем, информация по значениям тегов, не участвующим в формировании активного окна, или не запрашивается вовсе, или запрашивается гораздо реже, чем для тегов активного окна.
Очень интересная мысль. Спасибо.
Romcheg писал(а):Судя вопросу - Вы не программист, совсем. Зачем Вам это, а тем более знать как оно устроено в серьезных системах? Под каждою задачу - своя архитектура для ее решения, если вкратце, то в скадах и ОРС-серверах обычно это многопоточная (или асинхронная) модель обработки транзакций, но зачастую и однопоточная. Но - для чего Вам это нужно? Мне кажется, что любой профф. софт типа Скада-системы, или специализированного ОРС справится с Вашей задачей лучше и с меньшими затратами. Или Вам хочется непременно свой велосипед и руки очень чешутся? :)
Чем вызвана такая реакция? Почему я совсем не программист? :oops:
Мотивация - интерес.
Как это может быть реализовано в однопоточной структуре программы?
Аватара пользователя

Jackson
администратор
администратор
Сообщения: 17483
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 749 раз
Поблагодарили: 1281 раз

Re: Программа на С++

Сообщение Jackson »

Rock87 писал(а):Ну и интересно, конечно, ка-то это реализовано в той же СКАДе. Вот интересно как? Там же разработчик СКАДы заранее не знает сколько каналов организует САКДа-программист.
Этим занимается OPC-сервер, в СКАДА он не входит обычно. Поэтому Вас совершенно правильно направили на путь изучения OPC. Там - все ответы на Ваши вопросы.

И кстати, зачем Вы с нуля пишете OPC когда можно взять готовый?
По вопросам работы Форума можно обратиться по этим контактам.

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5623
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 546 раз
Поблагодарили: 706 раз

Re: Программа на С++

Сообщение Ryzhij »

TEB писал(а):Этим занимается OPC-сервер, в СКАДА он не входит обычно.
Да, но многие SCADA для MODBUS имеют свои встроенные драйвера.
Медлительность этого протокола, особенно при применении его на линиях последовательной связи, побуждает разработчиков к этому.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
Аватара пользователя

Jackson
администратор
администратор
Сообщения: 17483
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 749 раз
Поблагодарили: 1281 раз

Re: Программа на С++

Сообщение Jackson »

Ryzhij писал(а):
TEB писал(а):Этим занимается OPC-сервер, в СКАДА он не входит обычно.
Да, но многие SCADA для MODBUS имеют свои встроенные драйвера.
Есть такое, у нас так и есть.
Ryzhij писал(а):Медлительность этого протокола, особенно при применении его на линиях последовательной связи, побуждает разработчиков к этому.
А как можно ускорить опрос по изначально медленной линии?
Мы например решаем проблему скорости на стороне слейвов: в слейвах компонуем адресное пространство так чтобы за две посылки можно было всё что надо прочитать и записать. Но мастер с его OPC тут ни при чём.
По вопросам работы Форума можно обратиться по этим контактам.

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5623
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 546 раз
Поблагодарили: 706 раз

Re: Программа на С++

Сообщение Ryzhij »

TEB писал(а):А как можно ускорить опрос по изначально медленной линии?
Оптимизировать адресное пространство в слейвах - очень хорошая идея и многие производители приборов сейчас позволяют это делать, собирая интересующие параметры в пакет при настройке прибора.
А SCADA, имея свой встроенный драйвер, просто не требует лишнего из медленного канала.

PS Более того, отправляя номер индицируемого экрана в слейв, SCADA-система может побудить слейв сформировать в буфере обмена пакет необходимых данных для быстрого чтения мастером, а также соответствующим образом интерпретировать (парсить) данные в буфере для передаваемой мастером информации.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)

Romcheg
SCADA+
SCADA+
Сообщения: 592
Зарегистрирован: 05 ноя 2009, 11:18
Имя: Бузинов Роман Анатольевич
Страна: Россия
город/регион: Москва
Благодарил (а): 8 раз
Поблагодарили: 33 раза

Re: Программа на С++

Сообщение Romcheg »

Rock87 писал(а):Чем вызвана такая реакция? Почему я совсем не программист? :oops:
Мотивация - интерес.
Как это может быть реализовано в однопоточной структуре программы?
Потому что у программиста такой вопрос бы не возник, это достаточно очевидные вещи. Даже разработчик средней квалификации может на вскидку сказать несколько методик организации такого, но среди них НИКОГДА не будет таймера. :)
SCADA+
Аватара пользователя

Siluet
здесь недавно
здесь недавно
Сообщения: 68
Зарегистрирован: 05 сен 2014, 13:17
Имя: Виталий Анатольевич Куроткин
Страна: РФ
город/регион: Москва
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Программа на С++

Сообщение Siluet »

Если вы сами пишите протокольную часть, то читаете из входного потока сокета:
-Если получили ошибки - повторяете запрос.
-Если ошибка повторилась - пишите в лог и переходите в тайм-аут.
-Если данные прошли проверку - переходите в тайм-аут.
Величину тайм-аута и кол-во подключений задаете в программе
Аватара пользователя

uni
здесь недавно
здесь недавно
Сообщения: 44
Зарегистрирован: 28 май 2015, 14:11
Имя: Мезенцев Вячеслав Николаевич
Страна: Россия
город/регион: Екатеринбург

Re: Программа на С++

Сообщение uni »

Таймер конечно будет ;)

Если вы делаете что-то уровня конфигуратора, то вам будут заранее известны параметры, значения которых нужно считывать. Обычно конфигураторы состоят из набора страниц-форм, при переключении на страницу делается актуальным некий список параметров, который нужно считывать. Каждому параметру сопоставлена callback-функция для его интерпретации и визуализации. Чтение данных по протоколу и визуализация должны быть в разных потоках. Поскольку общую память эти потоки будут использовать, то нужен механизм блокировки. Это уже отдельная тема, в билдере есть методы Lock() и Unlock(), упрощающие жизнь при межпоточном взаимодействии.

Что касается модбаса и работы с ним. Можете посмотреть как это сделано у других. Существует ActiveX компонент (mbaxp.ocx - это какая-то старая, но работающая версия), который я слегка подлечил, которым можно пользоваться на первых порах, чтобы продумать идеологию пакетной обработки. Компонент имеет неплохую документацию. Ещё есть исходники на JavaScript, которые показывают как этот компонент может быть устроен изнутри. Я реализовал работу по протоколу modbus из однопоточного JavaScript.

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

Ссылки:

0. MBAXP Modbus ActiveX Control.
1. Modbus на Pinboard II. Тестовое приложение.
2. HomeControl (svn, vb6, mbaxp.ocx).
3. Реализация Modbus-RTU на JavaScript.
Ответить

Вернуться в «Верхний уровень автоматизации (отображение)»