Просмотр полной версии : ПЛК73. Вывод на дисплей.
Написал программу для ПЛК73. Все работате хорошо, но возникает один маленький нюанс. Надпись на дисплее временами начинает мигать (то полностью, то отдельные ее части - отдельные символы).
Вот пример одного из выводов текста.
IF historread=FALSE AND handmode=FALSE THEN
ClearScreen(0);
ShowString(0,0,0, 'Температура');
ShowDint(0,13,0,'%d',INT_TO_DINT(TWater));
ShowString(0,0,1,'Регул');
ShowDint(0,7,1,'%d',INT_TO_DINT(Tosn-5));
ShowDint(0,12,1,'%d',INT_TO_DINT(Tosn+5));
ShowString(0,0,2,'Откл при');
ShowDint(0,10,2,'%d',INT_TO_DINT(Tosn+12));
Temp(IN:=TWater , HIGH:=Tosn+5 , LOW:=Tosn-5);
TempA(IN:=Twater , HIGH:=Tosn+5+7 , LOW:=Tosn-5-7);
Возможно надо вывод осуществлять используюя тригерры, а не переменные (тогда функция вывода выполнится один раз и все, а не постоянно будет вызываться как здесь). Проверить на железе не получается пока (контроллер уже на объекте работает), а потому хочется уточнить на будущее.
Филоненко Владислав
25.01.2012, 20:43
Чтобы свести мерцание к минимуму (а в 99% случаев) и исключить полностью просто формируйте строку экрана в отдельном буфере и выводите её целиком. Не чаще раза в 50мс. А не генерируйте множество запросов на изменение 1-2-3 символов.
У меня проблема мерцания решилась после внимательного чтения описания библиотек WORK_MODE и IND_MODE на диске ПЛК-63\73.
Там сказано (например, стр.15), что "Во избежание мигания индикации запрещается вывод на один и тот же экран информации чаще, чем раз в 200 мс."
Поэтому, нужно обязательно вводить таймер в режиме генератора, с периодом импульсов минимум в 200мс. И формирование и обновление индикации производить только после появления импульса на выходе таймера.
Например, так (пример взят оттуда же):
ton1(in:=NOT ton1.q,pt:=t#200ms);
IF ton1.Q THEN
SHOW STRING и так далее.
Понятно. Спасибо. Приблизительно подобные сомнения и были.
Пользуюсь монопольным режимом, обновление происходит по строкам string(16) каждые 250ms, экран переодически мерцает?
Как попедить данный эфект?
А пишите только при изменении, но не чаще 0.2с
И что гарантировано пропадет мерцание?
кто как выводит время? есть таймер TON, для понимания надо указывать сколько времени прошло. как выводить на ЖКИ время в типа TIME в виде ММ:СС ? готовых функий вроде нет.
FullTime:=TIME_TO_DWORD(in)/1000;
min:=DWORD_TO_WORD(FullTime/60);
sec:=DWORD_TO_REAL(FullTime MOD 60/100);
TimeReal:=min+sec;
спасибо, жекон. реализовал так, но еще не проверял на оборудовании:
VAR
sec_for_lcd: DINT;
min_for_lcd: DINT;
END_VAR
min_for_lcd:=TIME_TO_INT(time_rem) / 60000;
ShowDint (0, 11, 0, '%02d:', min_for_lcd);
ShowString (0, 13, 0, ':');
sec_for_lcd:=TIME_TO_INT(time_rem) / 1000 MOD 60;
ShowDint (0, 14, 0, '%02d:', sec_for_lcd);
и видел еще подобные решения с часами.
теперь вопрос в следующем. как сформировать буфер? как преобразовать целое в строку с дополнением нулями? что-то типа sprintf в си?
Я просто не 2 целых а REAL вывожу
какая-то лажа в моем коде. лишние движения с ":", но это понятно. но почему-то иногда вылазит минус. минуты по нулям.
time_rem получаю так:31643. на железе поиграться не успел(надо было возвращаться)
PS наверно преобразование типов: у меня to_int, a у жекона to_dword. int всего до 32 тысяч, а у меня милесекунд порядка сотен тысяч. и минус похоже отттуда же.
lectorleo
19.06.2017, 12:15
Добрый день. у меня два вопроса:
1) подскажите пожалуйста как реализовать переключение между экранами не вверх/вниз, а кнопками F1 F2 F3, и чтобы если ничего не делать или длительное нажатие на любую F включался основной экран?
2) можно ли инвертировать цвета в некоторых ячейках? например чтобы одно слово стало не черным на белом фоне, а белым на черном
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot