PDA

Просмотр полной версии : ПЛК210, sqlite3 и cp1251



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

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

Добрый день.
Уточните, пожалуйста, версию прошивки ПЛК.

Алексей Не
13.01.2026, 09:08
plc210 2.4.0601.0905

Евгений Кислов
13.01.2026, 09:25
plc210 2.4.0601.0905

Для ПЛК210-0x нужно использовать UTF-8.

Алексей Не
13.01.2026, 09:35
Да, но как это сделать? В Codesys для кириллицы UTF-16

Евгений Кислов
13.01.2026, 11:49
Да, но как это сделать? В Codesys для кириллицы UTF-16

См. библиотеку StringUtils - там есть функция для конверсии между UTF-16 и UTF-8.
https://content.helpme-codesys.com/en/libs/StringUtils/Current/Public-Parts/UTF8/fld-UTF8.html

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

capzap
13.01.2026, 14:35
как вариант можно чрез 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)

*)

у меня в консоли читается 87522