- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Программа на С++
-
- здесь недавно
- Сообщения: 81
- Зарегистрирован: 05 сен 2013, 12:29
- Имя: Александр Дмитриевич
- Страна: Россия
- город/регион: Нижний Новгород
- Благодарил (а): 6 раз
Программа на С++
Пишу программу на С++Builder для взаимодействия с оборудованием (ПЛК Delta) по протоколу Modbus. Возник вопрос как организовать этот процесс. Допустим запрос на запись данных можно отправлять по соответствующему событию (например нажатие кнопки в программе), а вот запрос на считывание данных, для мониторинга состояния оборудованию, не понятно. Эти запросы должны отправляться периодически. Но по событию таймера, по-моему, не очень подходит, потому что я заранее не знаю кол-во запросов и соответственно время, необходимое для организации этих запросов. Соответственно, если я установлю время между тиками таймера слишком маленьким, то новый тик может начаться раньше, чем успеет обработаться очередь запросов предъидушего.
Что делать, люди добрые?
Что делать, люди добрые?
-
- завсегдатай
- Сообщения: 575
- Зарегистрирован: 04 фев 2014, 08:41
- Имя: Тарас Валерьевич
- Страна: Россия
- город/регион: Екатеринбург
- Благодарил (а): 59 раз
- Поблагодарили: 89 раз
Re: Программа на С++
Почитайте про механизм организации ОРС-серверов. Может найдёте ответы на часть вопросов.
Взгляд знатока намного уже кругозора неуча. Ю.Базылев
-
- БАН
- Сообщения: 642
- Зарегистрирован: 03 июн 2010, 12:26
- Имя: Козин Александр Елисеевич
- Страна: Украина
- город/регион: Одесса
- Поблагодарили: 4 раза
- Забанен: Бессрочно
Re: Программа на С++
Как-же вы не знаете количество запросов-то? Судя по тому, что именно вы нажимаете кнопку на экране - с вашей стороны мастер, который и формирует эти запросы. Или ваши слейвы лезут с ответами, когда их не спрашивают? :)
-
- почётный участник форума
- Сообщения: 5623
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 546 раз
- Поблагодарили: 706 раз
Re: Программа на С++
Если у Вас мониторинг, а не управление, то зачем Вам заморачиваться с жёсткой привязкой по времени?
Закончился предыдущий запрос и есть условия на инициацию следующего - вперёд к новым знаниям и запросам!
Закончился предыдущий, но время ещё не подошло - курим бамбук, ждём-с.
Пора бы запросить, но не ответили на предыдущий - ждём-с, ничего страшного, мы же не управляем процессом, а мониторим его.
Ах, надо быстрее? Изменяем настройки связи или переходим на связь по другому каналу, по двум сразу и/или т.п.
Как-то так...
Закончился предыдущий запрос и есть условия на инициацию следующего - вперёд к новым знаниям и запросам!
Закончился предыдущий, но время ещё не подошло - курим бамбук, ждём-с.
Пора бы запросить, но не ответили на предыдущий - ждём-с, ничего страшного, мы же не управляем процессом, а мониторим его.
Ах, надо быстрее? Изменяем настройки связи или переходим на связь по другому каналу, по двум сразу и/или т.п.
Как-то так...
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- здесь недавно
- Сообщения: 81
- Зарегистрирован: 05 сен 2013, 12:29
- Имя: Александр Дмитриевич
- Страна: Россия
- город/регион: Нижний Новгород
- Благодарил (а): 6 раз
Re: Программа на С++
Спасибо, будем поглядеть.dtv писал(а):Почитайте про механизм организации ОРС-серверов. Может найдёте ответы на часть вопросов.
Да, Вы правы, с моей стороны мастер и, конечно, слейвы не лезут с ответами, пока их не спрашивают. Дело в том, что в каждом частном случае можно прикинуть кол-во запросов, определиться со скоростью передачи данных и установить необходимый период тиков таймера. Мне же хотелось бы сейчас сделать что-то типа шаблона, что бы потом можно было применить в другом проекте, если конечно понадобиться. Ну и интересно, конечно, ка-то это реализовано в той же СКАДе. Вот интересно как? Там же разработчик СКАДы заранее не знает сколько каналов организует САКДа-программист.Alexander писал(а):Как-же вы не знаете количество запросов-то? Судя по тому, что именно вы нажимаете кнопку на экране - с вашей стороны мастер, который и формирует эти запросы. Или ваши слейвы лезут с ответами, когда их не спрашивают? :)
Я бы хотел сделать и управление и мониторинг.Ryzhij писал(а):Если у Вас мониторинг, а не управление, то зачем Вам заморачиваться с жёсткой привязкой по времени?
Закончился предыдущий запрос и есть условия на инициацию следующего - вперёд к новым знаниям и запросам!
Закончился предыдущий, но время ещё не подошло - курим бамбук, ждём-с.
Пора бы запросить, но не ответили на предыдущий - ждём-с, ничего страшного, мы же не управляем процессом, а мониторим его.
Ах, надо быстрее? Изменяем настройки связи или переходим на связь по другому каналу, по двум сразу и/или т.п.
Как-то так...
-
- почётный участник форума
- Сообщения: 5623
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 546 раз
- Поблагодарили: 706 раз
Re: Программа на С++
В этом случае для каждого тега назначают требуемый период и политики обновления. На основании этого уже и формируются пакеты запросов. Иногда это помогает обновлять не всю, а наиболее важную в данный момент информацию по-быстрее.Rock87 писал(а):Я бы хотел сделать и управление и мониторинг.
Скажем, информация по значениям тегов, не участвующим в формировании активного окна, или не запрашивается вовсе, или запрашивается гораздо реже, чем для тегов активного окна.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- SCADA+
- Сообщения: 592
- Зарегистрирован: 05 ноя 2009, 11:18
- Имя: Бузинов Роман Анатольевич
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 8 раз
- Поблагодарили: 33 раза
Re: Программа на С++
Судя вопросу - Вы не программист, совсем. Зачем Вам это, а тем более знать как оно устроено в серьезных системах? Под каждою задачу - своя архитектура для ее решения, если вкратце, то в скадах и ОРС-серверах обычно это многопоточная (или асинхронная) модель обработки транзакций, но зачастую и однопоточная. Но - для чего Вам это нужно? Мне кажется, что любой профф. софт типа Скада-системы, или специализированного ОРС справится с Вашей задачей лучше и с меньшими затратами. Или Вам хочется непременно свой велосипед и руки очень чешутся? :)
SCADA+
-
- здесь недавно
- Сообщения: 81
- Зарегистрирован: 05 сен 2013, 12:29
- Имя: Александр Дмитриевич
- Страна: Россия
- город/регион: Нижний Новгород
- Благодарил (а): 6 раз
Re: Программа на С++
Очень интересная мысль. Спасибо.Ryzhij писал(а):В этом случае для каждого тега назначают требуемый период и политики обновления. На основании этого уже и формируются пакеты запросов. Иногда это помогает обновлять не всю, а наиболее важную в данный момент информацию по-быстрее.Rock87 писал(а):Я бы хотел сделать и управление и мониторинг.
Скажем, информация по значениям тегов, не участвующим в формировании активного окна, или не запрашивается вовсе, или запрашивается гораздо реже, чем для тегов активного окна.
Чем вызвана такая реакция? Почему я совсем не программист?Romcheg писал(а):Судя вопросу - Вы не программист, совсем. Зачем Вам это, а тем более знать как оно устроено в серьезных системах? Под каждою задачу - своя архитектура для ее решения, если вкратце, то в скадах и ОРС-серверах обычно это многопоточная (или асинхронная) модель обработки транзакций, но зачастую и однопоточная. Но - для чего Вам это нужно? Мне кажется, что любой профф. софт типа Скада-системы, или специализированного ОРС справится с Вашей задачей лучше и с меньшими затратами. Или Вам хочется непременно свой велосипед и руки очень чешутся? :)
Мотивация - интерес.
Как это может быть реализовано в однопоточной структуре программы?
-
- администратор
- Сообщения: 17483
- Зарегистрирован: 17 июн 2008, 16:01
- Имя: Евгений свет Брониславович
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 749 раз
- Поблагодарили: 1281 раз
Re: Программа на С++
Этим занимается OPC-сервер, в СКАДА он не входит обычно. Поэтому Вас совершенно правильно направили на путь изучения OPC. Там - все ответы на Ваши вопросы.Rock87 писал(а):Ну и интересно, конечно, ка-то это реализовано в той же СКАДе. Вот интересно как? Там же разработчик СКАДы заранее не знает сколько каналов организует САКДа-программист.
И кстати, зачем Вы с нуля пишете OPC когда можно взять готовый?
По вопросам работы Форума можно обратиться по этим контактам.
-
- почётный участник форума
- Сообщения: 5623
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 546 раз
- Поблагодарили: 706 раз
Re: Программа на С++
Да, но многие SCADA для MODBUS имеют свои встроенные драйвера.TEB писал(а):Этим занимается OPC-сервер, в СКАДА он не входит обычно.
Медлительность этого протокола, особенно при применении его на линиях последовательной связи, побуждает разработчиков к этому.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- администратор
- Сообщения: 17483
- Зарегистрирован: 17 июн 2008, 16:01
- Имя: Евгений свет Брониславович
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 749 раз
- Поблагодарили: 1281 раз
Re: Программа на С++
Есть такое, у нас так и есть.Ryzhij писал(а):Да, но многие SCADA для MODBUS имеют свои встроенные драйвера.TEB писал(а):Этим занимается OPC-сервер, в СКАДА он не входит обычно.
А как можно ускорить опрос по изначально медленной линии?Ryzhij писал(а):Медлительность этого протокола, особенно при применении его на линиях последовательной связи, побуждает разработчиков к этому.
Мы например решаем проблему скорости на стороне слейвов: в слейвах компонуем адресное пространство так чтобы за две посылки можно было всё что надо прочитать и записать. Но мастер с его OPC тут ни при чём.
По вопросам работы Форума можно обратиться по этим контактам.
-
- почётный участник форума
- Сообщения: 5623
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 546 раз
- Поблагодарили: 706 раз
Re: Программа на С++
Оптимизировать адресное пространство в слейвах - очень хорошая идея и многие производители приборов сейчас позволяют это делать, собирая интересующие параметры в пакет при настройке прибора.TEB писал(а):А как можно ускорить опрос по изначально медленной линии?
А SCADA, имея свой встроенный драйвер, просто не требует лишнего из медленного канала.
PS Более того, отправляя номер индицируемого экрана в слейв, SCADA-система может побудить слейв сформировать в буфере обмена пакет необходимых данных для быстрого чтения мастером, а также соответствующим образом интерпретировать (парсить) данные в буфере для передаваемой мастером информации.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- SCADA+
- Сообщения: 592
- Зарегистрирован: 05 ноя 2009, 11:18
- Имя: Бузинов Роман Анатольевич
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 8 раз
- Поблагодарили: 33 раза
Re: Программа на С++
Потому что у программиста такой вопрос бы не возник, это достаточно очевидные вещи. Даже разработчик средней квалификации может на вскидку сказать несколько методик организации такого, но среди них НИКОГДА не будет таймера. :)Rock87 писал(а):Чем вызвана такая реакция? Почему я совсем не программист?
Мотивация - интерес.
Как это может быть реализовано в однопоточной структуре программы?
SCADA+
-
- здесь недавно
- Сообщения: 68
- Зарегистрирован: 05 сен 2014, 13:17
- Имя: Виталий Анатольевич Куроткин
- Страна: РФ
- город/регион: Москва
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
Re: Программа на С++
Если вы сами пишите протокольную часть, то читаете из входного потока сокета:
-Если получили ошибки - повторяете запрос.
-Если ошибка повторилась - пишите в лог и переходите в тайм-аут.
-Если данные прошли проверку - переходите в тайм-аут.
Величину тайм-аута и кол-во подключений задаете в программе
-Если получили ошибки - повторяете запрос.
-Если ошибка повторилась - пишите в лог и переходите в тайм-аут.
-Если данные прошли проверку - переходите в тайм-аут.
Величину тайм-аута и кол-во подключений задаете в программе
-
- здесь недавно
- Сообщения: 44
- Зарегистрирован: 28 май 2015, 14:11
- Имя: Мезенцев Вячеслав Николаевич
- Страна: Россия
- город/регион: Екатеринбург
Re: Программа на С++
Таймер конечно будет ;)
Если вы делаете что-то уровня конфигуратора, то вам будут заранее известны параметры, значения которых нужно считывать. Обычно конфигураторы состоят из набора страниц-форм, при переключении на страницу делается актуальным некий список параметров, который нужно считывать. Каждому параметру сопоставлена 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.
Если вы делаете что-то уровня конфигуратора, то вам будут заранее известны параметры, значения которых нужно считывать. Обычно конфигураторы состоят из набора страниц-форм, при переключении на страницу делается актуальным некий список параметров, который нужно считывать. Каждому параметру сопоставлена 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.