PDA

Просмотр полной версии : ПЛК73. Вывод на дисплей.



zaur
25.01.2012, 20:32
Написал программу для ПЛК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 символов.

kolyan
25.01.2012, 21:08
У меня проблема мерцания решилась после внимательного чтения описания библиотек WORK_MODE и IND_MODE на диске ПЛК-63\73.

Там сказано (например, стр.15), что "Во избежание мигания индикации запрещается вывод на один и тот же экран информации чаще, чем раз в 200 мс."

Поэтому, нужно обязательно вводить таймер в режиме генератора, с периодом импульсов минимум в 200мс. И формирование и обновление индикации производить только после появления импульса на выходе таймера.

Например, так (пример взят оттуда же):

ton1(in:=NOT ton1.q,pt:=t#200ms);
IF ton1.Q THEN
SHOW STRING и так далее.

zaur
26.01.2012, 08:22
Понятно. Спасибо. Приблизительно подобные сомнения и были.

Леонид
15.03.2012, 17:44
Пользуюсь монопольным режимом, обновление происходит по строкам string(16) каждые 250ms, экран переодически мерцает?
Как попедить данный эфект?

Леонид
15.03.2012, 20:20
А пишите только при изменении, но не чаще 0.2с
И что гарантировано пропадет мерцание?

arcsin
04.06.2017, 19:53
кто как выводит время? есть таймер TON, для понимания надо указывать сколько времени прошло. как выводить на ЖКИ время в типа TIME в виде ММ:СС ? готовых функий вроде нет.

жекон
05.06.2017, 04:48
FullTime:=TIME_TO_DWORD(in)/1000;
min:=DWORD_TO_WORD(FullTime/60);
sec:=DWORD_TO_REAL(FullTime MOD 60/100);
TimeReal:=min+sec;

arcsin
05.06.2017, 13:00
спасибо, жекон. реализовал так, но еще не проверял на оборудовании:

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 в си?

жекон
06.06.2017, 05:05
Я просто не 2 целых а REAL вывожу

arcsin
12.06.2017, 11:59
какая-то лажа в моем коде. лишние движения с ":", но это понятно. но почему-то иногда вылазит минус. минуты по нулям.
time_rem получаю так:31643. на железе поиграться не успел(надо было возвращаться)

PS наверно преобразование типов: у меня to_int, a у жекона to_dword. int всего до 32 тысяч, а у меня милесекунд порядка сотен тысяч. и минус похоже отттуда же.

lectorleo
19.06.2017, 12:15
Добрый день. у меня два вопроса:
1) подскажите пожалуйста как реализовать переключение между экранами не вверх/вниз, а кнопками F1 F2 F3, и чтобы если ничего не делать или длительное нажатие на любую F включался основной экран?
2) можно ли инвертировать цвета в некоторых ячейках? например чтобы одно слово стало не черным на белом фоне, а белым на черном