Как организовать обмен данными между программами?

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Как организовать обмен данными между программами?

Сообщение Сергей Саныч »

Имеем: программу управления инвертором через modbus в LinuxCNC
и программу настройки инвертора - естественно, тоже через модбас
Первая регулярно сканирует инвертор, считывая данные.
Как ей сказать "подожди, закрой порт, я хочу пообщаться с инвертором"?
Нужен какой-то флаг межпрограммного обмена. Как его организовать в Linux?
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение aftaev »

Serg-tmn писал(а):Как ей сказать "подожди, закрой порт, я хочу пообщаться с инвертором"?
закрываешь программу, настраиваешь и запускаешь вновь ЕМС :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Сергей Саныч »

aftaev писал(а):закрываешь программу, настраиваешь и запускаешь вновь ЕМС :)
...и когда мне эта процедура надоела, я написал сей пост
Чудес не бывает. Бывают фокусы.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение nkp »

обе программы общаются с устройством через один порт ...
для начала работы мастер (программа на компе) инициализирует порт а потом открывает его (на чтение -запись)(mb_param->fd = open(mb_param->device);)
чтоб другая программа нормально могла провести обмен с устройством ,первая наверно должна закрыть порт(close(mb_param->fd))
если все так - то опрос состояния флага добавлять в сами скрипты - если флаг true - то закрываем порт , "передаем" порт другой программе...
(потом опять нужна будет инициализация и открытие - на случай изменения параметров)
а по какому действию должна происходить "смена " программ?
как в работе возникает такая необходимость?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Nick »

Ну в принципе, можно читать скажем stdin и как только там что-то появляется - открываешь и закрываешь порт...

Покаж свою программу.
Кстати, если под linuxCNC, можешь добаваить ей пин enable, и потом смотришь, если enable == 1 и порт не открыт - то открываешь, если enable == 0 и порт открыт - закрываешь. ;)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Serg »

Serg-tmn писал(а):Нужен какой-то флаг межпрограммного обмена. Как его организовать в Linux?
Можно послать сигнал процессу командой/функцией kill.

А вообще непонятно, неужели программа настройки не умеет запускать шпиндель? Настройка ведь не каждый день делается - можно временно оторвать от linuxcnc управление и порулить прогой настройки.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Сергей Саныч »

nkp писал(а):обе программы общаются с устройством через один порт ...
для начала работы мастер (программа на компе) инициализирует порт а потом открывает его (на чтение -запись)(mb_param->fd = open(mb_param->device);)
чтоб другая программа нормально могла провести обмен с устройством ,первая наверно должна закрыть порт(close(mb_param->fd))
если все так - то опрос состояния флага добавлять в сами скрипты - если флаг true - то закрываем порт , "передаем" порт другой программе...
(потом опять нужна будет инициализация и открытие - на случай изменения параметров)
а по какому действию должна происходить "смена " программ?
как в работе возникает такая необходимость?
Это все понятно, именно так я и представлял себе процесс. Обе программы "под контролем", я могу их модифицировать, как надо.
Только я не знаю, как в линуксе организуются подобные "семафоры".
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Сергей Саныч »

UAVpilot писал(а):А вообще непонятно, неужели программа настройки не умеет запускать шпиндель?
Дык, твоя программа-то :tongue: я только ее подправил под свой инвертор.
И даже кнопки "Start" и "Stop" приладил.
А вот организовать регулярный опрос/отображение параметров было тяжко - плохо у меня с Tcl/Tk :monkey:
Поэтому подумал, что проще запустить LCNC и vfd.tcl одновременно, а на время выполнения команд Load и Save притормаживать сканирование и освобождать порт. А потом возобновлять и смотреть, что получается.
Чудес не бывает. Бывают фокусы.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение nkp »

Serg-tmn писал(а):Только я не знаю, как в линуксе организуются подобные "семафоры".
мне кажется линукс тут "не нужен" ...
просто сделать передачу в самих программах...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Nick »

Покаж ссылку на программу!
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Сергей Саныч »

Ну вот программа настройки (в процессе, так сказать, но работает).
Вложения
vfd.zip
(6.08 КБ) 298 скачиваний
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Сергей Саныч »

nkp писал(а):мне кажется линукс тут "не нужен" ...
просто сделать передачу в самих программах...
Но как? Где взять "общую площадку" для разных программ?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Serg »

Serg-tmn писал(а):Дык, твоя программа-то :tongue: я только ее подправил под свой инвертор.
И даже кнопки "Start" и "Stop" приладил.
А вот организовать регулярный опрос/отображение параметров было тяжко - плохо у меня с Tcl/Tk :monkey:
Поэтому подумал, что проще запустить LCNC и vfd.tcl одновременно, а на время выполнения команд Load и Save притормаживать сканирование и освобождать порт. А потом возобновлять и смотреть, что получается.
Я уже почти сам догадался. :)
Регулярный опрос не делал принципиально - довольно долгий процесс.
Можно попробовать встроить vfdctl в прогу...
Изначально так не делал т.к. настройки на модель инвертора сильно по разному делаются.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Serg »

nkp писал(а):мне кажется линукс тут "не нужен" ...
просто сделать передачу в самих программах.
Средства межпроцессного/межпрограммного общения - это функция ОС.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
mhael
Мастер
Сообщения: 2443
Зарегистрирован: 09 мар 2013, 11:22
Репутация: 769
Настоящее имя: Ильдар
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение mhael »

Как один из вариантов - сокеты. В программе, которой всегда надо управлять движком, стартует серверная часть, и все время слушает сокет. ПРограмма настройки посылает в сокет запрос на доступ к порту для настройки. Если первая прога может отдать контроль порта для настройки, то закрывает на своей стороне порт, и посылает ответ "Все ок. НАстривай". И ждет пока прога настройки сообщит, что настройка закончена. После этого продолжает свою работу.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Сергей Саныч »

mhael писал(а):Как один из вариантов - сокеты. В программе, которой всегда надо управлять движком, стартует серверная часть, и все время слушает сокет. ПРограмма настройки посылает в сокет запрос на доступ к порту для настройки. Если первая прога может отдать контроль порта для настройки, то закрывает на своей стороне порт, и посылает ответ "Все ок. НАстривай". И ждет пока прога настройки сообщит, что настройка закончена. После этого продолжает свою работу.
Общий алгоритм я вполне себе представляю. Интересует конкретная реализация. Что такое "сокеты" в линуксе?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
mhael
Мастер
Сообщения: 2443
Зарегистрирован: 09 мар 2013, 11:22
Репутация: 769
Настоящее имя: Ильдар
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение mhael »

Serg-tmn писал(а):Что такое "сокеты" в линуксе?
Они не в линуксе, а в сети. http://www.opennet.ru/docs/RUS/tcltk/tc ... B%F3%E9%F3
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Serg »

mhael писал(а):Как один из вариантов - сокеты. В программе, которой всегда надо управлять движком, стартует серверная часть, и все время слушает сокет. ПРограмма настройки посылает в сокет запрос на доступ к порту для настройки. Если первая прога может отдать контроль порта для настройки, то закрывает на своей стороне порт, и посылает ответ "Все ок. НАстривай". И ждет пока прога настройки сообщит, что настройка закончена. После этого продолжает свою работу.
Чем это лучше сигналов? Тем, что подтягивает библиотеки для работы с сетью? :)

Если уж и делать серверную часть, то уж сразу со множеством входных сокетов и транслятором команд приходящих из них в единственный порт. Но это уже другая, более заумная задача.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
mhael
Мастер
Сообщения: 2443
Зарегистрирован: 09 мар 2013, 11:22
Репутация: 769
Настоящее имя: Ильдар
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение mhael »

UAVpilot писал(а):Чем это лучше сигналов?
А где хоть слово про "лучше"? ;) Я как программист вообще бы изначально закладывался бы на технологии типа IPC или подобной. Но топикстартеру не стал об этом писать, ибо хорошим советом вряд-ли помогу, а зачем тогда советывать ;)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Как организовать обмен данными между программами?

Сообщение Serg »

mhael писал(а):А где хоть слово про "лучше"?
Поясню почему я так спросил:
Сокеты предложены после того, как я предложил сигналы. Просто сокеты и сигналы нет смысла сравнивать - это совсем разные вещи. Но тут сокеты предложены только как средство передачи дискретной информации занято/свободно, что легко реализуется и сигналами. Отсюда и возник такой вопрос. :)

IPC тоже можно применить (семафоры), но это тоже несколько избыточно и накладно - нужно решать вопросы создания/уничтожения семафоров и т.п.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

Вернуться в «LinuxCNC»