PDA

Просмотр полной версии : CmpSysExec



6385428
16.11.2022, 08:01
Здравствуйте!

Проблема в библиотеке CmpSysExec. При вызове любого ФБ из ее состава возвращает код ошибки - 1. Где взять расшифровку кодов ошибок?

Причем раньше все работало и вдруг перестало.

код такого плана:

Объявление:
fbCmpSysExec: CmpSysExec.sysExecute3;

Выполнение:
fbCmpSysExec(xExecute := TRUE, sCommand := 'ls');

Евгений Кислов
16.11.2022, 08:12
Здравствуйте!

Проблема в библиотеке CmpSysExec. При вызове любого ФБ из ее состава возвращает код ошибки - 1. Где взять расшифровку кодов ошибок?

Причем раньше все работало и вдруг перестало.

код такого плана:

Объявление:
fbCmpSysExec: CmpSysExec.sysExecute3;

Выполнение:
fbCmpSysExec(xExecute := TRUE, sCommand := 'ls');

Добрый день.

Этот код возвращается, если превышено допустимое число одновременно вызываемых экземпляров блоков библиотеки (9).
Т.е., например, если у вас в проекте 4 экземпляра sysExecute3 и 5 экземпляров sysExecute4, и в конкретный момент времени все они вызваны с xExecute := TRUE - то при попытке вызова 10-го экземпляра вернется ошибка с кодом 1.

6385428
16.11.2022, 08:30
Спасибо за оперативный ответ!

Экземпляр точно 1, перепроверил много раз. Но код загружался на ПЛК множество раз через полную загрузку и ПЛК не перезагружался. Внутренний счетчик экземпляров библиотеки находится в области памяти не затрагиваемой при обновлении кола проекта?

Евгений Кислов
16.11.2022, 08:37
Спасибо за оперативный ответ!

Экземпляр точно 1, перепроверил много раз. Но код загружался на ПЛК множество раз через полную загрузку и ПЛК не перезагружался. Внутренний счетчик экземпляров библиотеки находится в области памяти не затрагиваемой при обновлении кола проекта?

Вообще, если код загружался через полную загрузку (а не через онлайн-изменение) - то все должно работать корректно.
У нас когда-то были проблемы, похожие на ту, которую описываете вы - их поправили в прошивке 1.3.0812.1315.

6385428
16.11.2022, 20:44
Перепроверил - действительно при полной загрузке счетчик не сбрасывается. При перезагрузке вызов начинает работать. Если потом упустить количество даже не экземпляров блоков, а вызовы одного и того экземпляра с разными параметрами, не сбросив его в промежутках в false - перестает работать. И только перезагрузка помогает

Zagagulkin
07.07.2023, 12:09
Здравствуйте, а как организовать циклический доступ, например к БД каждые 10 секунд, с помощью CmpSysExec?

Евгений Кислов
07.07.2023, 12:11
Здравствуйте, а как организовать циклический доступ, например к БД каждые 10 секунд, с помощью CmpSysExec?

Для этого потребуется циклически вызывать экземпляр ФБ из библиотеки CmpSysExec - например, по таймеру.

Zagagulkin
07.07.2023, 12:52
Спасибо, за оперативный ответ!

Zagagulkin
07.07.2023, 14:45
timer(ENABLE := TRUE, TIMELOW := T#10S, TIMEHIGH := T#1MS);

IF timer.OUT THEN

arIntErrorTable[i] := INSERT_TO_DB(xEnable := TRUE, tableName := arLINES_COUNTERS[1][i], counterStr := arLINES_COUNTERS[2][i], atSpeed := 1);

IF arIntErrorTable[i] = 1 THEN
answerStr := arLINES_COUNTERS[1][i];
END_IF

i := i + 1;

IF i > 7 THEN
i := 1;
END_IF
END_IF

Вот такой код как-то странно работает, при первом проходе от 1 до 7, данные записываются в БД SQlite3 функцией INSERT_TO_DB(обертка над SysExec3), а при последующих возвращает код ошибки 1.

Евгений Кислов
07.07.2023, 20:57
Выложите, пожалуйста, простейший проект, в котором я смогу повторить вашу проблему.

Zagagulkin
10.07.2023, 07:52
Проект во вложении.

Евгений Кислов
10.07.2023, 07:59
Проект во вложении.

Не вижу в проекте работы с SQLite.

Zagagulkin
10.07.2023, 08:14
Проект во вложении.

Евгений Кислов
10.07.2023, 08:32
Проект во вложении.

Всё равно не вижу.
Программа PLC_PRG пустая.

Zagagulkin
10.07.2023, 08:39
Функция INSERT_TO_DB

Евгений Кислов
10.07.2023, 08:53
Функция INSERT_TO_DB

Скачайте, пожалуйста, тот проект, что вы выложили выше, откройте его и выложите скриншот, на котором будет видно эту функцию.

Zagagulkin
10.07.2023, 08:55
Прошу прощения, не то прислал.

Евгений Кислов
10.07.2023, 09:06
Прошу прощения, не то прислал.

Вы внутрии функции INSERT_TO_DB вызываете функциональный блок sysExecute3.
Это некорректно, так как локальные переменные функции (в т.ч. экземпляр ФБ вместо со всеми его данными) не сохраняются при его вызове.
Вам нужно сделать INSERT_TO_DB фунциональным блоком.

Zagagulkin
10.07.2023, 10:03
Понял Вас, спасибо за совет, сейчас переделаю.

Zagagulkin
10.07.2023, 10:30
Евгений, еще раз спасибо огромное за помощь, всё работает!