Автор |
Сообщение |
Сообщение создано: 22. 02. 2015 [19:19]
|
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 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 ?
[Сообщение редактировалось 2 раз(а), в последний раз 22.02.2015 в 19:21.]
|
Сообщение создано: 23. 02. 2015 [08:59]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
|
Сообщение создано: 23. 02. 2015 [20:25]
|
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
|
"roman" wrote:
В данном случае это наверное потому, что сначала "setenv("LC_NUMBERIC","C",1)" а затем "setlocale(LC_ALL,"")", что сбрасывает "LC_NUMBERIC" в некорректное значение, если прямо указано LC_ALL. Поменял местами!
Видимо поторопился..., т.к вижу что теперь сообщение подправлено и "Поменял местами!" убрано. собрал сборку v2216, установил на raspberry pi, изменений никаких не заметил, локализация демона Openscada у меня по не работает. В ближайшее время надо будет проверить на OpenSuse 13.2 собрать и посмотреть работу в режиме демона.
[Сообщение редактировалось 1 раз(а), в последний раз 23.02.2015 в 20:27.]
|
Сообщение создано: 23. 02. 2015 [21:07]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
|
Сообщение создано: 24. 02. 2015 [03:37]
|
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 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/
|
Сообщение создано: 24. 02. 2015 [22:51]
|
almaz
Almaz Karimov
Contributor
Зарегистрирован(а) с: 25.09.2008
Сообщения: 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 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Сообщение создано: 25. 02. 2015 [13:18]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
|
Сообщение создано: 26. 02. 2015 [21:34]
|
almaz
Almaz Karimov
Contributor
Зарегистрирован(а) с: 25.09.2008
Сообщения: 516
|
Согласен. Делали проект, работающий с запятыми в вещественных числах, с чистого листа, не используя готовых библиотек. Существующие проекты, разработанные и отлаженные в неполностью локализованных системах, могут и не работать.
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|