EnglishУкраїнськаРocсийский
Login/New
Topic with many replies

Попытка "адаптации" OpenSCADA к QNX 6.5


Author Message
Written on: 10. 11. 2015 [11:30]
mr_dsv
Сергей Дорошка
Topic creator
registered since: 31.10.2012
Posts: 22
Пытаюсь "заставить" работать OpenSCADA-у на QNX 6.5. Пока скорее из "любопытства"...
1. версия 0.8.13 (пробовал также добавлять исправления из 0.8.14 в правленые мной файлы)
2. Система запускается и "работает" (пока без QT) - только web.
3. Пока работаешь с системой от имени пользователя не входящего в группу "root" все хорошо. Запускаются WebCfg, WebCfgD, WebVision.
4. Если зарегистрироваться пользователем из группы "root" скады, то при попытке войти в WebCfg, WebCfgD - OpenSCADA "падает".
Описанное показано в приложенном видео.

В каком месте (хоть примерно) может быть проблема?

[This article was edited 3 times, at last 10.11.2015 at 11:45.]
Attachment

qnx4.avi.7z (File type: application/octet-stream, Size: 870.82 kilobytes) — 184 downloads
Written on: 10. 11. 2015 [12:35]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3447
"mr_dsv" wrote:

Пытаюсь "заставить" работать OpenSCADA-у на QNX 6.5. Пока скорее из "любопытства"...
1. версия 0.8.13 (пробовал также добавлять исправления из 0.8.14 в правленые мной файлы)

Осуществлять адаптацию сборки и работы нужно на рабочей версии, а не LTS!

"mr_dsv" wrote:

2. Система запускается и "работает" (пока без QT) - только web.
3. Пока работаешь с системой от имени пользователя не входящего в группу "root" все хорошо. Запускаются WebCfg, WebCfgD, WebVision.
4. Если зарегистрироваться пользователем из группы "root" скады, то при попытке войти в WebCfg, WebCfgD - OpenSCADA "падает".
В каком месте (хоть примерно) может быть проблема?

Если Вы берётесь за адаптацию, то Вы очевидно должны:
- владеть понятиями и особенностями кросплатформенной разработки;
- владеть спецификой целевой платформы;
- владеть кросплатформенным инструментарием сборки и отладки, использованным OpenSCADA;
- знать про структуру, функции и возможности OpenSCADA.

Ну и ответ на Ваш вопрос следует из вышеописанных требований — включайте генерацию дампов и анализируйте падения с помощью gdb.

Прямо-же Вам сказать про специфику окружения QNX или иного, адаптация под которое официально не осуществлялась, Вам тут никто не сможет. И вообще, на такие вопросы Вы очевидно сами должны отвечать, раз взялись.

Learn, learn and learn better than work, work and work.
Written on: 11. 11. 2015 [15:06]
mr_dsv
Сергей Дорошка
Topic creator
registered since: 31.10.2012
Posts: 22
Спешу сообщить, что "пинок" - возымел действие... :D

Проблема была вызвана "спецификой" структуры dirent в qnx 6.5 :
"The struct dirent structure doesn't include space for the pathname. You must provide it:
struct dirent *entry;
entry = malloc( sizeof(*entry) + NAME_MAX + 1 );"


После исправлений соответствующих мест в исходниках "в стиле qnx" - проблема ушла, теперь работает при любом пользователе через WEB.

Имею такой вот вопрос.
При старте с QT интерфейсом выводится следующее предупреждение
WARNING: QApplication was not created in the main() thread.

QT библиотеки версии 4.8.7 собраны "заботливыми руками" других людей (СВД ВС).

Собственно вопрос: Насколько данное предупреждение критично? Потому как система "падает", судя по дампу где-то в "глубине" QT.
Written on: 11. 11. 2015 [15:16]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3447
"mr_dsv" wrote:

Спешу сообщить, что "пинок" - возымел действие... :D

Проблема была вызвана "спецификой" структуры dirent в qnx 6.5 :
"The struct dirent structure doesn't include space for the pathname. You must provide it:
struct dirent *entry;
entry = malloc( sizeof(*entry) + NAME_MAX + 1 );"


После исправлений соответствующих мест в исходниках "в стиле qnx" - проблема ушла, теперь работает при любом пользователе через WEB.

Чудно, погляжу где это ещё есть и включу как вариант для QNX или может пойдёт и для Linux.

"mr_dsv" wrote:

Имею такой вот вопрос.
При старте с QT интерфейсом выводится следующее предупреждение
WARNING: QApplication was not created in the main() thread.

QT библиотеки версии 4.8.7 собраны "заботливыми руками" других людей (СВД ВС).

Собственно вопрос: Насколько данное предупреждение критично? Потому как система "падает", судя по дампу где-то в "глубине" QT.

Оно и на Linux выводится, если отладка включена. Но запуск в отдельно потоке это особенность подключения Qt-модулей к OpenSCADA, да и вообще это нормально, всегда работало и должно так работать.

P.S. Пробуйте проверять на простейшем, т.е. только UI.QTStarter, без остальных.

Learn, learn and learn better than work, work and work.
Written on: 12. 11. 2015 [23:57]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3447
"roman" wrote:

Чудно, погляжу где это ещё есть и включу как вариант для QNX или может пойдёт и для Linux.

Переписал к рабочему виду на Linux и QNX!

Learn, learn and learn better than work, work and work.
Written on: 16. 11. 2015 [11:42]
mr_dsv
Сергей Дорошка
Topic creator
registered since: 31.10.2012
Posts: 22
Удалось заставить работать QT интерфейс. Для этого пришлось пересобрать OpenScada с библиотеками QT версии 5.5.0 также собранных "заботливыми руками" других людей (СВД ВС).
В принципе все работает, но:
- при "хождении" по меню QTCfg в консоли появляются строки "This plugin does not support grabbing the keyboard"
- по завершении работы имеем "OpenSCADA system correct exit by code 16"
- далее - "QObject::~QObject: Timers cannot be stopped from another thread"
- далее "остатки валятся в кору". GDB указывает на проблему где-то в системной си библиотеке.
Скорее всего проблемы "кроются" где-то в QT (данной ее сборке). На прошлой версии (4.8.7) совсем не запускалось.

Для того что-бы OpenScada "работала" на QNX 6.5 хотя бы в таком виде пришлось исключить следующее:
- отключен выбор конкретного CPU, в qnx это делается иначе - нужно разбираться
- langinfo.h - не поддерживается, похоже с локализацией будут трудности
- crypt_r не поддерживается, использую стандартный crypt c DES (MD5 не поддерживается)
- структура dirent в qnx не содержит поля d_type, пришлось закомментировать. Кстати чем это чревато?
- в транспорте serial пришлось убрать CRTSCTS и высокоскоростные режимы (B230400 и выше). Кроме того думаю, что работа с com-портом в qnx имеет свою специфику.

Ну пока как-то так...
Written on: 16. 11. 2015 [12:40]
fido_max
Maxim Kochetkov
Developer
Contributor
registered since: 28.10.2010
Posts: 129
А может попробовать 6.6?
Written on: 16. 11. 2015 [12:44]
mr_dsv
Сергей Дорошка
Topic creator
registered since: 31.10.2012
Posts: 22
Еще вот заметил (специфика QT 5.5.0 ?) - при попытке выбора графических элементов мнемосхем в консоли выводится "QPixmap::grabWidget is deprecated, use QWidget::grab() instead" и ничего не происходит...
Written on: 16. 11. 2015 [22:12]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3447
"mr_dsv" wrote:

В принципе все работает, но:
- при "хождении" по меню QTCfg в консоли появляются строки "This plugin does not support grabbing the keyboard"

Скорее какой-то "серый" плагин Qt такое выдаёт, да и плагины Qt в OpenSCADA прямо не используются.

"mr_dsv" wrote:

- по завершении работы имеем "OpenSCADA system correct exit by code 16"

Размер стека мал наверное, а в QNX он похоже и не динамический.

"mr_dsv" wrote:

- далее - "QObject::~QObject: Timers cannot be stopped from another thread"

Они там и не останавливаются собственно из других потоков.

"mr_dsv" wrote:

- далее "остатки валятся в кору". GDB указывает на проблему где-то в системной си библиотеке.
Скорее всего проблемы "кроются" где-то в QT (данной ее сборке). На прошлой версии (4.8.7) совсем не запускалось.

Таки стек наверное.

"mr_dsv" wrote:

Для того что-бы OpenScada "работала" на QNX 6.5 хотя бы в таком виде пришлось исключить следующее:
- отключен выбор конкретного CPU, в qnx это делается иначе - нужно разбираться

GNU вроде, по идее можно опцией "-D_GNU_SOURCE", к параметрам компилятора, включить.

"mr_dsv" wrote:

- langinfo.h - не поддерживается, похоже с локализацией будут трудности

Да, локаль как-то по иному определяется.

"mr_dsv" wrote:

- crypt_r не поддерживается, использую стандартный crypt c DES (MD5 не поддерживается)

Тоже "-D_GNU_SOURCE" должно исправить.

"mr_dsv" wrote:

- структура dirent в qnx не содержит поля d_type, пришлось закомментировать. Кстати чем это чревато?

Черевато обнаружением нужных типов файлов, т.е. однострочный выбор файлов будет проблематичен. Вообще быть такое должно, может чем включается.

"mr_dsv" wrote:

- в транспорте serial пришлось убрать CRTSCTS и высокоскоростные режимы (B230400 и выше). Кроме того думаю, что работа с com-портом в qnx имеет свою специфику.

Вы не убирайте просто, а ставьте условия препроцессора типа:
#ifndef __QNXNTO__
#endif
или
#ifndef __QNX__
#endif

Какой-то должен подойти, попробуйте!

"mr_dsv" wrote:

Еще вот заметил (специфика QT 5.5.0 ?) - при попытке выбора графических элементов мнемосхем в консоли выводится "QPixmap::grabWidget is deprecated, use QWidget::grab() instead" и ничего не происходит...

Позже добавлю условие тут для Qt5, хотя на Linux он хоть и ругается, но и работает.

Learn, learn and learn better than work, work and work.
Written on: 20. 11. 2015 [14:13]
mr_dsv
Сергей Дорошка
Topic creator
registered since: 31.10.2012
Posts: 22
"fido_max" wrote:

А может попробовать 6.6?

А нету там Photon-а!

"Пободался" еще с QT интерфейсом. Улучшений нет.
Применил Ваши "патчи" по-поводу "QPixmap::grabWidget...", данное сообщение ушло.

Кстати в vis_run.cpp из 0.9+r2311 есть похоже ошибки.
QPixmap img = rpg->grab(); - выдает ошибку, пришлось дополнить до:
QPixmap img = rpg->grab().toImage();

Сообщение "This plugin does not support grabbing the keyboard" в версии QT 5.5.0 выводится из-за "неполной реализации" данной сборки ее авторами.
В исходниках QT 5.5.0 в qplatformwindow.cpp предлагается следующая "заглушка":

bool QPlatformWindow::setKeyboardGrabEnabled(bool grab)
{
Q_UNUSED(grab);
qWarning("This plugin does not support grabbing the keyboard");
return false;
}


Кстати данное сообщение выскакивает и во многих других местах, делая QT-интерфейс OpenSCADA "неработопригодным" в данный момент.

"QObject::~QObject: Timers cannot be stopped from another thread" - при выходе возможно также следствие "ранней интерпретации", а может и нет...

"Игрался" с различными параметрами стека в компиляторе "qcc -N ..." (увеличивал до "неприличных" размеров 4М), но не помогло. Да и в QNX 6.5 вроде "обещают" динамический стек.
И так пробую в tuimod.cpp (QTStarter)

#ifdef __QNXNTO__
pthread_attr_t tattr;
// size_t size = PTHREAD_STACK_MIN + 0x400000; // > 4M
size_t size = 0x400000; // 4M

/* initialized with default attributes */
pthread_attr_init(&tattr);

/* setting the size of the stack also */
pthread_attr_setstacksize(&tattr, size);

SYS->taskCreate(nodePath('.',true), 0, Task, this,5,&tattr);

#else
SYS->taskCreate(nodePath('.',true), 0, Task, this);
#endif


Похоже нужно или ждать следующих реализаций библиотек QT от "СВД ВС" или попробовать "вступить с ними в дискуссию".

Кстати после установки переменных окружения LANG, LANGUAGE, LC_* в ru_RU.UTF-8 появилась частичная русификация интерфейса. В "рантайме" так вообще неплохо (мнемосхемы, графики, отчеты).

По поводу прочих отличий. Предлагаемая Вами опция "-D_GNU_SOURCE" не помогает т.к. (crypt_r, dirent.d_type, CRTSCTS и B230400...) просто отсутствуют в заголовочных файлах на QNX 6.5.



3353