EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

вопрос про локализацию демона Openscada


Author Message
Written on: 22. 02. 2015 [19:19]
pentagon128
Руслан Кучерявый
Topic creator
registered since: 15.11.2011
Posts: 102
Здравствуйте! Использую OpenScada v2189 на Raspberry Pi под Raspbian (Debian).
root назначена русская локаль.
Мой вывод locale
root@raspberrypi:~# locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

С Openscada запускаемой как процесс проблем нет. Локализация интерфейса подхватывается автоматически. С Openscada запускаемая в режиме сервиса (демона) локаль не подхватывается. Если подправить стартовый скрипт демона /etc/init.d/openscada заменяем
*******************************************
do_start()
{
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
*******************************************

на
*******************************************
do_start()
{
export LANG=ru_RU.UTF-8
export LANGUAGE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8
*******************************************
то тогда локаль подхватывается, но возникает косяк - Openscada в режиме демона не рисует элементы из подключенных библиотек web vision в режиме исполнения т.е. русская локализация в демоне не работает, пришлось всё
вернуть назад. Как нибудь можно без потери функционала задать демону Openscada локаль ru_RU.UTF-8 ?

[This article was edited 2 times, at last 22.02.2015 at 19:21.]
Written on: 23. 02. 2015 [08:59]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"pentagon128" wrote:

С Openscada запускаемой как процесс проблем нет. Локализация интерфейса подхватывается автоматически. С Openscada запускаемая в режиме сервиса (демона) локаль не подхватывается. Если подправить стартовый скрипт демона /etc/init.d/openscada заменяем
do_start()
{
export LANG=ru_RU.UTF-8
export LANGUAGE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8
*******************************************

Строку с LC_ALL нужно убрать вообще иначе в качестве разделителя дробной части вещественного станет ',', что и будет вызывать проблемы. А вообще достаточно только "export LANG=ru_RU.UTF-8".

Собственно в исходнике OpenSCADA есть "setenv("LC_NUMBERIC","C",1)", что должно эту проблему всегда исключать, однако в случае с Debian такого не происходит, поскольку он локали компилирует только под надобность, что вроде и хорошо, но приводит к таким коллизиям когда может кроме ru_RU.UTF-8 ничего не быть, хотя C там вроде есть всегда.
В данном случае это потому, что сначала "setenv("LC_NUMBERIC","C",1)" а затем "setlocale(LC_ALL,"")", что сбрасывает "LC_NUMBERIC" в некорректное значение, поскольку LC_ALL приоритетный и давит всё. Т.е. использование LC_ALL тут недопустимо!

Learn, learn and learn better than work, work and work.
Written on: 23. 02. 2015 [20:25]
pentagon128
Руслан Кучерявый
Topic creator
registered since: 15.11.2011
Posts: 102
"roman" wrote:

В данном случае это наверное потому, что сначала "setenv("LC_NUMBERIC","C",1)" а затем "setlocale(LC_ALL,"")", что сбрасывает "LC_NUMBERIC" в некорректное значение, если прямо указано LC_ALL. Поменял местами!


Видимо поторопился..., т.к вижу что теперь сообщение подправлено и "Поменял местами!" убрано. собрал сборку v2216, установил на raspberry pi, изменений никаких не заметил, локализация демона Openscada у меня по не работает. В ближайшее время надо будет проверить на OpenSuse 13.2 собрать и посмотреть работу в режиме демона.

[This article was edited 1 times, at last 23.02.2015 at 20:27.]
Written on: 23. 02. 2015 [21:07]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"pentagon128" wrote:

Видимо поторопился..., т.к вижу что теперь сообщение подправлено и "Поменял местами!" убрано. собрал сборку v2216, установил на raspberry pi, изменений никаких не заметил, локализация демона Openscada у меня по не работает. В ближайшее время надо будет проверить на OpenSuse 13.2 собрать и посмотреть работу в режиме демона.

У меня на Debian 7 всё работает!
export LANG=ru_RU.UTF-8 только оставили?

"$ locale -a" что кстати говорит?

Learn, learn and learn better than work, work and work.
Written on: 24. 02. 2015 [03:37]
pentagon128
Руслан Кучерявый
Topic creator
registered since: 15.11.2011
Posts: 102
Теперь локализация демона заработала. Спасибо Роман! Мой вывод переменных locale -a
root@raspberrypi:~# locale -a
C
C.UTF-8
en_GB.utf8
POSIX
ru_RU.utf8

в /etc/init.d/openscada прописал
do_start()
{
export LANG=ru_RU.UTF-8
# export LANGUAGE=en_US.UTF-8
# export LC_ALL=en_US.UTF-8

кстати заметил что при переустановке openscada файл в /etc/init.d/openscada остался от прежней версии,
т.е. в случае необходимости обновления его необходимо вручную вытаскивать из deb пакета и класть в в /etc/init.d/
Written on: 24. 02. 2015 [22:51]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
OpenSCADA в режиме службы отлично работает и с запятыми в вещественных числах, и с другими параметрами локализации, но при полной локализации консоли. Проверено на многих машинках, включая Raspberry Pi.

В Debian должны быть установлены пакеты (при установке console-cyrillic задаются клавиши переключения раскладок клавиатуры):
root@debian:~# apt-get install console-cyrillic locales tzdata

Настройка локали (включить в появившемся интерфейсе * на нужных локалях и задать локаль по умолчанию):
root@debian:~# dpkg-reconfigure locales

Настройка часового пояса (в появившемся интерфейсе выбрать нужное):
root@debian:~# dpkg-reconfigure tzdata

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 25. 02. 2015 [13:18]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"almaz" wrote:

OpenSCADA в режиме службы отлично работает и с запятыми в вещественных числах, и с другими параметрами локализации, но при полной локализации консоли. Проверено на многих машинках, включая Raspberry Pi.

Не работает, если нужно открывать существующие БД. Модель АГЛКС (ДемоБД) докажет это!
Поскольку функции atof(), printf() и иже с ними, но в первую очередь atof(), используют LC_NUMERIC для определения разделителя дробной части, без возможности проверять и точку и запятую. Эта проблема известна далеко за пределами OpenSCADA и решается она именно установкой LC_NUMERIC в локаль C, что и ломается применением LC_ALL.

Т.е., конечно, если начать новый проект с запятой и всех их держать такими, и даже если использовать БД библиотек OpenSCADA, то и проблем не будет, но если рассчитывать на возможность открытия существующих проектов в разных локалях, скажем сменив на en_US.UTF-8 то все числа с запятой atof() прочитает отбросив дробную часть и это будет сразу заметно на DAQ.BlockCalc и на UI.{VCAEngine,Vision,WebVision}, если в геометрии применяется дробные числа, поскольку они хранят все текущие переменные в строковом представлении.

Т.е. использование LC_ALL крайне не желательно и как показывает практика всегда достаточно указать LANG, для многоязыковых проектов как то "АГЛКС" и "Котёл9" и стандартных библиотек OpenSCADA.

Learn, learn and learn better than work, work and work.
Written on: 26. 02. 2015 [21:34]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
Согласен. Делали проект, работающий с запятыми в вещественных числах, с чистого листа, не используя готовых библиотек. Существующие проекты, разработанные и отлаженные в неполностью локализованных системах, могут и не работать.

21 век - век повсеместной автоматизации. Главное - во благо всем людям.



5551