Как организовать обмен данными между программами?
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Как организовать обмен данными между программами?
Имеем: программу управления инвертором через modbus в LinuxCNC
и программу настройки инвертора - естественно, тоже через модбас
Первая регулярно сканирует инвертор, считывая данные.
Как ей сказать "подожди, закрой порт, я хочу пообщаться с инвертором"?
Нужен какой-то флаг межпрограммного обмена. Как его организовать в Linux?
и программу настройки инвертора - естественно, тоже через модбас
Первая регулярно сканирует инвертор, считывая данные.
Как ей сказать "подожди, закрой порт, я хочу пообщаться с инвертором"?
Нужен какой-то флаг межпрограммного обмена. Как его организовать в Linux?
Чудес не бывает. Бывают фокусы.
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: Как организовать обмен данными между программами?
закрываешь программу, настраиваешь и запускаешь вновь ЕМСSerg-tmn писал(а):Как ей сказать "подожди, закрой порт, я хочу пообщаться с инвертором"?
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Как организовать обмен данными между программами?
...и когда мне эта процедура надоела, я написал сей постaftaev писал(а):закрываешь программу, настраиваешь и запускаешь вновь ЕМС
Чудес не бывает. Бывают фокусы.
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Как организовать обмен данными между программами?
обе программы общаются с устройством через один порт ...
для начала работы мастер (программа на компе) инициализирует порт а потом открывает его (на чтение -запись)(mb_param->fd = open(mb_param->device);)
чтоб другая программа нормально могла провести обмен с устройством ,первая наверно должна закрыть порт(close(mb_param->fd))
если все так - то опрос состояния флага добавлять в сами скрипты - если флаг true - то закрываем порт , "передаем" порт другой программе...
(потом опять нужна будет инициализация и открытие - на случай изменения параметров)
а по какому действию должна происходить "смена " программ?
как в работе возникает такая необходимость?
для начала работы мастер (программа на компе) инициализирует порт а потом открывает его (на чтение -запись)(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: Как организовать обмен данными между программами?
Ну в принципе, можно читать скажем stdin и как только там что-то появляется - открываешь и закрываешь порт...
Покаж свою программу.
Кстати, если под linuxCNC, можешь добаваить ей пин enable, и потом смотришь, если enable == 1 и порт не открыт - то открываешь, если enable == 0 и порт открыт - закрываешь.
Покаж свою программу.
Кстати, если под linuxCNC, можешь добаваить ей пин enable, и потом смотришь, если enable == 1 и порт не открыт - то открываешь, если enable == 0 и порт открыт - закрываешь.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Как организовать обмен данными между программами?
Можно послать сигнал процессу командой/функцией kill.Serg-tmn писал(а):Нужен какой-то флаг межпрограммного обмена. Как его организовать в Linux?
А вообще непонятно, неужели программа настройки не умеет запускать шпиндель? Настройка ведь не каждый день делается - можно временно оторвать от 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 писал(а):А вообще непонятно, неужели программа настройки не умеет запускать шпиндель?
И даже кнопки "Start" и "Stop" приладил.
А вот организовать регулярный опрос/отображение параметров было тяжко - плохо у меня с Tcl/Tk
Поэтому подумал, что проще запустить LCNC и vfd.tcl одновременно, а на время выполнения команд Load и Save притормаживать сканирование и освобождать порт. А потом возобновлять и смотреть, что получается.
Чудес не бывает. Бывают фокусы.
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Как организовать обмен данными между программами?
мне кажется линукс тут "не нужен" ...Serg-tmn писал(а):Только я не знаю, как в линуксе организуются подобные "семафоры".
просто сделать передачу в самих программах...
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Как организовать обмен данными между программами?
Покаж ссылку на программу!
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Как организовать обмен данными между программами?
Ну вот программа настройки (в процессе, так сказать, но работает).
- Вложения
-
- vfd.zip
- (6.08 КБ) 297 скачиваний
Чудес не бывает. Бывают фокусы.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Как организовать обмен данными между программами?
Но как? Где взять "общую площадку" для разных программ?nkp писал(а):мне кажется линукс тут "не нужен" ...
просто сделать передачу в самих программах...
Чудес не бывает. Бывают фокусы.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Как организовать обмен данными между программами?
Я уже почти сам догадался.Serg-tmn писал(а):Дык, твоя программа-тоя только ее подправил под свой инвертор.
И даже кнопки "Start" и "Stop" приладил.
А вот организовать регулярный опрос/отображение параметров было тяжко - плохо у меня с Tcl/Tk
Поэтому подумал, что проще запустить LCNC и vfd.tcl одновременно, а на время выполнения команд Load и Save притормаживать сканирование и освобождать порт. А потом возобновлять и смотреть, что получается.
Регулярный опрос не делал принципиально - довольно долгий процесс.
Можно попробовать встроить vfdctl в прогу...
Изначально так не делал т.к. настройки на модель инвертора сильно по разному делаются.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Как организовать обмен данными между программами?
Средства межпроцессного/межпрограммного общения - это функция ОС.nkp писал(а):мне кажется линукс тут "не нужен" ...
просто сделать передачу в самих программах.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- mhael
- Мастер
- Сообщения: 2443
- Зарегистрирован: 09 мар 2013, 11:22
- Репутация: 769
- Настоящее имя: Ильдар
- Контактная информация:
Re: Как организовать обмен данными между программами?
Как один из вариантов - сокеты. В программе, которой всегда надо управлять движком, стартует серверная часть, и все время слушает сокет. ПРограмма настройки посылает в сокет запрос на доступ к порту для настройки. Если первая прога может отдать контроль порта для настройки, то закрывает на своей стороне порт, и посылает ответ "Все ок. НАстривай". И ждет пока прога настройки сообщит, что настройка закончена. После этого продолжает свою работу.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Как организовать обмен данными между программами?
Общий алгоритм я вполне себе представляю. Интересует конкретная реализация. Что такое "сокеты" в линуксе?mhael писал(а):Как один из вариантов - сокеты. В программе, которой всегда надо управлять движком, стартует серверная часть, и все время слушает сокет. ПРограмма настройки посылает в сокет запрос на доступ к порту для настройки. Если первая прога может отдать контроль порта для настройки, то закрывает на своей стороне порт, и посылает ответ "Все ок. НАстривай". И ждет пока прога настройки сообщит, что настройка закончена. После этого продолжает свою работу.
Чудес не бывает. Бывают фокусы.
- mhael
- Мастер
- Сообщения: 2443
- Зарегистрирован: 09 мар 2013, 11:22
- Репутация: 769
- Настоящее имя: Ильдар
- Контактная информация:
Re: Как организовать обмен данными между программами?
Они не в линуксе, а в сети. http://www.opennet.ru/docs/RUS/tcltk/tc ... B%F3%E9%F3Serg-tmn писал(а):Что такое "сокеты" в линуксе?
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Как организовать обмен данными между программами?
Чем это лучше сигналов? Тем, что подтягивает библиотеки для работы с сетью?mhael писал(а):Как один из вариантов - сокеты. В программе, которой всегда надо управлять движком, стартует серверная часть, и все время слушает сокет. ПРограмма настройки посылает в сокет запрос на доступ к порту для настройки. Если первая прога может отдать контроль порта для настройки, то закрывает на своей стороне порт, и посылает ответ "Все ок. НАстривай". И ждет пока прога настройки сообщит, что настройка закончена. После этого продолжает свою работу.
Если уж и делать серверную часть, то уж сразу со множеством входных сокетов и транслятором команд приходящих из них в единственный порт. Но это уже другая, более заумная задача.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- mhael
- Мастер
- Сообщения: 2443
- Зарегистрирован: 09 мар 2013, 11:22
- Репутация: 769
- Настоящее имя: Ильдар
- Контактная информация:
Re: Как организовать обмен данными между программами?
А где хоть слово про "лучше"?UAVpilot писал(а):Чем это лучше сигналов?
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Как организовать обмен данными между программами?
Поясню почему я так спросил:mhael писал(а):А где хоть слово про "лучше"?
Сокеты предложены после того, как я предложил сигналы. Просто сокеты и сигналы нет смысла сравнивать - это совсем разные вещи. Но тут сокеты предложены только как средство передачи дискретной информации занято/свободно, что легко реализуется и сигналами. Отсюда и возник такой вопрос.
IPC тоже можно применить (семафоры), но это тоже несколько избыточно и накладно - нужно решать вопросы создания/уничтожения семафоров и т.п.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
