Показано с 1 по 7 из 7

Тема: ПЛК210, sqlite3 и cp1251

  1. #1

    Post ПЛК210, sqlite3 и cp1251

    Добрый день.
    В своем проекте использую БД на встроенной sqlite3. Данные на русском пишутся в БД в кодировке cp1251. Возникло 2 проблемы: запросы типа SELECT * FROM table WHERE name LIKE %что-то% не возвращают ничего,
    при выгрузке данных непосредственно из терминала, выгружаются в нечитаемом виде.
    В ОС контроллера кодовой страницы cp1251 нет.
    Вопрос: можно ли ее доустановить? Или писать данные на русском в UTF8 ?

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,755

    По умолчанию

    Цитата Сообщение от Алексей Не Посмотреть сообщение
    Добрый день.
    В своем проекте использую БД на встроенной sqlite3. Данные на русском пишутся в БД в кодировке cp1251. Возникло 2 проблемы: запросы типа SELECT * FROM table WHERE name LIKE %что-то% не возвращают ничего,
    при выгрузке данных непосредственно из терминала, выгружаются в нечитаемом виде.
    В ОС контроллера кодовой страницы cp1251 нет.
    Вопрос: можно ли ее доустановить? Или писать данные на русском в UTF8 ?
    Добрый день.
    Уточните, пожалуйста, версию прошивки ПЛК.

  3. #3

  4. #4

  5. #5

    По умолчанию

    Да, но как это сделать? В Codesys для кириллицы UTF-16

  6. #6
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,755

    По умолчанию

    Цитата Сообщение от Алексей Не Посмотреть сообщение
    Да, но как это сделать? В Codesys для кириллицы UTF-16
    См. библиотеку StringUtils - там есть функция для конверсии между UTF-16 и UTF-8.
    https://content.helpme-codesys.com/e.../fld-UTF8.html

    У нас есть готовый пример для работы с СУБД (в т. ч. sqlite3) - в нем можно использовать кириллицу в записях:
    https://ftp.owen.ru/CoDeSys3/21_Exam...projectarchive

  7. #7
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,629

    По умолчанию

    как вариант можно чрез python записывать в базу
    Код:
    FUNCTION_BLOCK SQLitePython
    VAR_INPUT
    	xExecute:		BOOL;			// по переднему фронту запускаем скрипт на питоне
    	sSqlStatement:	STRING(255);	// в строке должны быть аргументы через пробел для передачи в базу число и строка в кавычках
    END_VAR
    VAR_OUTPUT
    	xDone:						BOOL;
    	xBusy:						BOOL;
    	xError:						BOOL;
    	// Результат выполнения запроса
    	asResult:					ARRAY [1..255] OF STRING(255);
    	// Число строк в ответе (число элементов массива asResult)
    	usiCountOfStrings:			USINT;
    	// TRUE - при выдаче ответа произошло переполнение массива, часть информации потеряна
    	xOverFlow:					BOOL;
    END_VAR
    VAR
    	fbSe4:		 	CmpSysExec.SysExecute4;
    	sCommand:		STRING(255);
    	fbRiseEdge:		R_TRIG;
    END_VAR
    VAR CONSTANT
    	c_sCommand:		STRING(255) := 'python3 test_sqlite3.py #SQL#';
    END_VAR
    
    fbRiseEdge(CLK := xExecute);
    IF fbRiseEdge.Q THEN
    	sCommand := OSU.ReplaceSubstring(c_sCommand,	'#SQL#',	sSqlStatement);
    END_IF;
    fbSe4
    (
    	xExecute 	:= fbRiseEdge.Q,
    	sCommand 	:= sCommand,
    	sOutput  	=> asResult,
    	cntReadStr  => usiCountOfStrings,
    	xOverFlow   => xOverFlow,
    	xDone       => xDone,
    	xBusy       => xBusy,
    	xError      => xError
    );
    
    (* скрипт test_sqlite3.py
    import sqlite3
    import sys
    
    def save_data(arg1, arg2):
            try:
                    conn = sqlite3.connect('/home/root/CODESYS/otchet.db')
                    cursor = conn.cursor()
                    # first step
                    #cursor.execute('''CREATE TABLE otchet (id INTEGER PRIMARY KEY, "1" TEXT,"2" TEXT)''')
                    # second step
                    user_data = [(arg1, arg2)]
                    cursor.executemany('INSERT INTO otchet ("1","2") VALUES(?,?);', user_data)
                    conn.commit()
            except Exception as ex:
                    print(f'Error {str(ex)}')
            finally:
                    if 'conn' in locals():
                            conn.close()
    
    if __name__ == "__main__":
            if len(sys.argv) != 3:
                    sys.exit(1)
            try:
                    arg1 = int(sys.argv[1]) #
                    arg2 = sys.argv[2].encode('utf-8', errors='surrogateescape').decode('cp1251')
            except ValueError:
                    print('error code')
                    sys.exit(1)
            save_data(arg1, arg2)
    
    *)
    у меня в консоли читается Screenshot 2026-01-13 143502.png
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Похожие темы

  1. Ответов: 10
    Последнее сообщение: 26.02.2026, 08:15
  2. ПЛК210-13 mmcblk0p6
    от tsda в разделе ПЛК2хх
    Ответов: 6
    Последнее сообщение: 10.12.2024, 15:03
  3. ПЛК210-03 + FESTO
    от NoobAlexPLC в разделе ПЛК2хх
    Ответов: 3
    Последнее сообщение: 19.11.2024, 09:46
  4. ПЛК210 и MASTERScada 3.XX
    от wallera в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 03.08.2024, 06:51
  5. ПЛК210
    от and909 в разделе ПЛК2хх
    Ответов: 26
    Последнее сообщение: 11.01.2020, 18:51

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •