PDA

Просмотр полной версии : Изменение переменной не изменяет привязанное изображение



xTeAmParkerx
01.08.2019, 10:57
Добрый день, написал код который работает он дискретной переменной ready. Переменная ready - это подключённый контакт к выносному клеммному модулю. Пока переменная в false,по задумке, картинка должна окрашиваться в красный показывая что двигатель не готов к работе из-за отпавшего контакта ready. Раньше всё работало исправно, но после временного перерыва, снова подключили контакт ready и был написан следующий код:

IF inputs.ready=TRUE
THEN
sCurrentFrame:=CONCAT(sPictureMainName,sFrame2);
sCurrentNagrName:=CONCAT(sPictureNagrName,sFrame2N agr);
ELSIF inputs.ready=FALSE
THEN
sCurrentFrame:=CONCAT(sPictureMainName,sFrame4);
sCurrentNagrName:=CONCAT(sPictureNagrName,sFrame4N agr);
startMain.startall:=FALSE;
END_IF
мало того что контакт начал сам по себе периодически переходить кратковременно в false, так и изображение с "alarm" после того как ready становится true не переходит в "normal". Помогите понять что сделал не так, дело в коде или всё же в чём-то другом?
Ниже привожу список объявленных переменных и скрин работы на самом плк.

PROGRAM idImage
VAR
sPictureMainName:STRING :='right_engine_';
sCurrentFrame:STRING:='right_engine_default';
sFrame1:STRING:='default';
sFrame2:STRING:='normal';
sFrame3:STRING:='warning';
sFrame4:STRING:='alarm';
sPictureNagrName:STRING:='engine_';
sCurrentNagrName:STRING:='engine_default';
sFrame1Nagr:STRING:='default';
sFrame2Nagr:STRING:='normal';
sFrame3Nagr:STRING:='warning';
sFrame4Nagr:STRING:='alarm';
END_VAR

43825

Евгений Кислов
01.08.2019, 11:29
Добрый день.
По фрагменту кода сложно что-то сказать.
Выложите, пожалуйста, небольшой проект, в котором можно увидеть эту проблему (изображение с "alarm" после того как ready становится true не переходит в "normal").

По поводу "мало того что контакт начал сам по себе периодически переходить кратковременно в false" - для начала стоит проверить монтаж сигнальных линий.

Sulfur
01.08.2019, 11:31
ELSIF inputs.ready=FALSE
THEN
Непонятно почему используется ELSIF для операции ветвления из двух возможных состояний. Вполне достаточно указанный фрагмент заметить одним оператором ELSE.
Если проект пишется для СПК1хх, то изменение цвет элемента по переменной можно назначать в визуализации не нагромождая тонны кода.

xTeAmParkerx
02.08.2019, 09:25
Добрый день.
По фрагменту кода сложно что-то сказать.
Выложите, пожалуйста, небольшой проект, в котором можно увидеть эту проблему (изображение с "alarm" после того как ready становится true не переходит в "normal").

По поводу "мало того что контакт начал сам по себе периодически переходить кратковременно в false" - для начала стоит проверить монтаж сигнальных линий.

В общем я разобрался в чём дело когда начал переписывать для Вас проект. В чистом проекте всё работало нормально и контакт не мигал. Я потом догадался проверить с помощью обзора перекрёстных ссылок. Всё дело было в этом участке кода
IF inputs.ready:=FALSE THEN
PLC_PRG.uilastErrCode := 22;
Plc_PRG.alarms_array := array_manager (
code := 22, //"Стенд не готов",
arr :=PLC_PRG.alarms_array
);
END_IF
Как Вы уже, я думаю, поняли, дело в этом двоеточии вначале "IF inputs.ready:=false". Я не заметил когда его ставил что здесь нужно просто = и из-за этого переменная в данном участке из чтения превратилась в запись. Контакт мигал потому что не мог определиться ведь контакт подключен и стоит на true, а в журнале ошибок он записывается на false. Не смотря на это всё равно спасибо Вам большое за помощь, если бы я сделал чистый вариант программы только с этой функцией, я бы не догадался "где собака зарыта":)

xTeAmParkerx
02.08.2019, 09:26
ELSIF inputs.ready=FALSE
THEN
Непонятно почему используется ELSIF для операции ветвления из двух возможных состояний. Вполне достаточно указанный фрагмент заметить одним оператором ELSE.
Если проект пишется для СПК1хх, то изменение цвет элемента по переменной можно назначать в визуализации не нагромождая тонны кода.
Да, изначально у меня стоял просто else. Это уже когда я перепробовал почти всё, от безысходности поставил elseif чтобы совсем точно указать что я хочу от программы:)