1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Задачка на программирование

Закрыто

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Задачка на программирование

Сообщение lsr »

Уважаемые форумчане, всем доброго времени суток! Первое знакомство с реальным ПЛК.
Есть задание на развитие (так сказать на "слабо" от коллег), не могу выполнить, очень зацепило, хочу разобраться.
Азбука морзе. Имеем ПЛК, используем 1-DO, и светодиод. Задача в скаде писать текст и отбивать его светодиодом.
Буду признателен за любые мысли и идеи.

--
Вложение, отображение индикации буквы "S", где:
1) Блок генерации импульса (переменная "ax" - позволяет зациклить выдачу импульса)
2) Счетчик импульсов (PV - 3, т.к. буква S имеет шифр "...", т.е. три коротких импульса, 2 сек)
3) Выход на DO
Самый простой вариант для самого простого шифра (http://ru.wikipedia.org/wiki/%D0%90%D0% ... 0%B7%D0%B5)
--
Идейно представляю себе точка (короткий импульс) тире (три точки). Каждую букву обозначать двоичным кодом типа WORD 16бит, пример CH (----): CH:= 2#0_1_1_1_0_1_1_1_0_1_1_1_0_1_1_1 и т.д.
как только их вызывать (прерывать импульсы).

Есть ли ошибки на данном этапе и в каком направление смотреть далее?
Спасибо
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

Прежде чем писать код, нужно определиться с глобальными входами и выходами программы. Иначе мы можем только гадать, что за переменные в программе болтаются...

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

Не очень вас понял..ну глоб. выход это одна булевая переменная DO01_BOOL. Входные переменные (время таймеров, счетчик, переменные отражающие алфавит) локальные

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

Ну должна быть какая-то команда внешнего запуска... Вопрос сразу: что делать, если команда внешнего запуска пришла в момент работы "телеграфа"? И т.д. А выход, который будет сигнализировать, что команда завершена? В итоге нарисовалась более расширенная задача: мы подаем внешний сигнал запуска удерживаем его до тех пор, пока буква не "отобьется" и мы не получим флаг завершения.

Теперь уже думаем над алгоритмом: похоже переменная sbros неплохо подходит под определение флага завершения. Но в твоей программе этот флаг является локальным и приводит к самоинициализации.
Очевидно, что необходим как минимум второй таймер, который отсчитывает паузы между сигналами. Не совсем понятна Ваша идея с "ax" и "CH". Вы хотите сделать универсальную программу, которая будет отбивать любую букву?

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

Михайло, максимальная задача отбивать слова. Для начала можно и буквами обойтись. Про команду внешнего запуска понял (в примере им служит переменная znak_S). Эта "программа" выдает 3 коротких импульса и отключается.
Не могу понять оптимизированное решение, можно городить блоки для каждой буквы, выйдет массивно, и как их потом объединять в слова тяжело представляется.. :) Наверняка можно сделать все красиво, массивом из букв, и просто прерывать постоянный сигнал в нужной последовательности и задержки по времени.

переменная "ax" имеет отношение только к генератору импульса. Она присваивается на вход "IN" и инверсионный выход "NOT Q" блока TP, тем самым получается цикл

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

Предлагаю создать "якорные" переменные, на которых будет строиться программа:
1. четыре таймера - длинный импульс, короткий импульс, пауза между импульсами, пауза между символами.
2. байт, содержащий код текущего символа в формате ASCII.
3. байт, кодирующий длину морзянки символа (общее число импульсов, от 2 до 8)
4. байт, кодирующий морзянку символа (например, 11010000 - длинный-длинный-короткий-длинный - буква Щ, последующие биты не имеют значения)
5. байт, содержащий счет текущего импульса (счетчик импульсов в пределах символа)
6. слово-указатель на текущую букву в тексте
7. текст в формате STRING

Тип BYTE можно заменить на INT или WORD, если это будет выгодно с точки зрения системы команд.

Подсказка: очень выгодно в таком контексте использовать команды SHL или ROL для сдвига морзянки символа, а также побитные логические операции со словами WAND, WOR, WXOR...

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

Михаил Алексеевич, признателен, ни разу не сталкивался с чем-то подобным :) буду пробовать и походу вопросы задавать

2) для английского алфавита 27 переменных типа байт?
Пример: Sim_a: BYTE:= 97; (*строчная буква "а" английского алфавита в формате ASCII*);
или можно задать как массив:
Simvol: ARRAY[97..122] OF BYTE; (*массив из английских букв A-Z в формате ASCII*)

3) не очень понял, длина импульса или все же количество для одного символа. Пример: S (...) - переменная будет равна BYTE:=7 или 224 (11100000 или 00000111) верно?;
5) зависит от 3)
6) Как реализовать данную функцию? В целом у меня нет представления как программа должна понять введенный текст для дальнейшей работы :ges_no:

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

lsr писал(а):2) для английского алфавита 27 переменных типа байт?
Пример: Sim_a: BYTE:= 97; (*строчная буква "а" английского алфавита в формате ASCII*);
или можно задать как массив:
Simvol: ARRAY[97..122] OF BYTE; (*массив из английских букв A-Z в формате ASCII*)
Можно и русские буквы закодировать, вроде есть некий "кириллический" вариант ASCII.
lsr писал(а):3) не очень понял, длина импульса или все же количество для одного символа. Пример: S (...) - переменная будет равна BYTE:=7 или 224 (11100000 или 00000111) верно?;
Вы всегда рассматриваете символы длиной в три импульса, а ведь есть символы с двумя импульсами. И с четырьмя. Вплоть до восьми...
lsr писал(а):5) зависит от 3)
Точно.
lsr писал(а):6) Как реализовать данную функцию? В целом у меня нет представления как программа должна понять введенный текст для дальнейшей работы :ges_no:
Существуют текстовые типы данных - STRING и CHAR. Строка STRING представляет собой набор из отдельных символов CHAR. Указатель на символ в строке - это порядковый номер символа в строке. Например, строка "Я из лесу вышел..." состоит из 18 символов, если указатель равен 6, то соответственно извлекается символ "л". "Я из лесу вышел..."[6] = "л".
Текстовые типы данных - это которые не выражаются числами, однако использование указателя (числовой тип данных), а также функций определения длины строки, конвертации символа CHAR в число ASCII и обратная конвертация - все это позволяет гибко работать с текстовыми типами данных.
Реализуемость подхода зависит от того, как Ваш ПЛК поддерживает текстовые типы данных.

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5632
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 600 раз
Поблагодарили: 756 раз

Re: Задачка на программирование

Сообщение Ryzhij »

Михайло писал(а):Предлагаю создать "якорные" переменные, на которых будет строиться программа:
1. четыре таймера - длинный импульс, короткий импульс, пауза между импульсами, пауза между символами.
2. байт, содержащий код текущего символа в формате ASCII.
3. байт, кодирующий длину морзянки символа (общее число импульсов, от 2 до 8)
4. байт, кодирующий морзянку символа (например, 11010000 - длинный-длинный-короткий-длинный - буква Щ, последующие биты не имеют значения)
5. байт, содержащий счет текущего импульса (счетчик импульсов в пределах символа)
6. слово-указатель на текущую букву в тексте
7. текст в формате STRING
Подсказка
Пункты с 1-го по 5-й реализуются "знакогенератором", а 6 и 7 обработкой массива (буфера) текста, где п.6 - индекс массива.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

Михаил Алексеевич, символ длинной в три импульса рассматриваю как первый попавшийся пример. касательно max 8 импульсов, имеете ввиду шифр ошибки 8 точек?
Спасибо за направление к текстовым типам данных!
1.запускаю программу (глобальный вход)
2.вводим слово (*dog*)
3.определяем длину строки и записываем в переменную (*INT 3*)
4.выделяем первый символ строки и переводим в формат ASCII (по дефолту это формат INT) (*sim - INT100*)
5.далее ASCII в INT переводим в BYTE (*sim - 16#64*)
6.как на этом этапе ПЛК должен понять что буква d - 16#64 в морзе это 2#100_00000. Правильный подход.
---
для пункта 6.
я несилен, поэтому примитивный вариант:
задал для каждой буквы английского алфавита 26 переменных (adcd..) и присвоил им шифр в двоичном коде и одну переменную (cod) отвечающую за код морязнки, все тип BYTE.
Далее условие что если sim:=16#64 то cod:=d (где d:=2#100_00000) и так 26 условий.
---
Вячеслав, спасибо, но не осилю такие подсказки :)
--
вопрос. как организовать ограниченное считывание битов в байте шифра. Для той же d 2#100_00000. нужно подать только три импульса, для другого 4...опять те же 8. разделитель в записи двоичного когда "_" - нельзя ни как применить?!))). Я же просто опять добавил переменную импульс в каждые выше упомянутые 26 условий.

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

lsr писал(а):вопрос. как организовать ограниченное считывание битов в байте шифра. Для той же d 2#100_00000. нужно подать только три импульса, для другого 4...опять те же 8. разделитель в записи двоичного когда "_" - нельзя ни как применить?!))). Я же просто опять добавил переменную импульс в каждые выше упомянутые 26 условий.
Для этого-то и придумано следующее:
Михайло писал(а):3. байт, кодирующий длину морзянки символа (общее число импульсов, от 2 до 8)
...
5. байт, содержащий счет текущего импульса (счетчик импульсов в пределах символа)
То есть Вы должны организовать в программе цикл от 1 до длины морзянки, соответственно, если длина морзянки равна 3, то только три бита и будут переданы, остальные пять битов игнорируются.

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

lsr писал(а):5.далее ASCII в INT переводим в BYTE (*sim - 16#64*)
Не заморачивайся на типе BYTE, можно работать с INT. Все зависит от возможностей системы команд и среды разработки.

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

Добрый день, нашел время по разбираться и наткнулся на проблему:
1)запуск программы (start:=TRUE)
2)ввода слова (enter_word:=dog)
3)цикл выбора символа устанавливается сразу в значение (n_sim:=4), строку выделили жирным и подчеркнул.
Я вижу это так: выполняется условие, переменная n_sim стремится к длине строки с шагом единица, 0+1=1, далее выполняются инструкции для n_sim=1, цикл прошел 1+1=2, выпол. инструкции для n_sim=2 и т.д.
что не так? с Циклом WHILE тоже пробовал, сразу уходит в значение (n_sim:=4)

Код: Выделить всё

VAR
enter_word: STRING; 					(*введите слово*)
ASCII: INT; 						(*выделенный символ в формате ASCII*)
Lstring: INT; 						(*длина введенного слова*)
morze: BYTE;						(*шифр морзе для данного символа*)
imp: INT;						(*количество импульсов для данного символа*)
C_imp: INT:=1;						(*счетчик импульса*)
n_sim: INT:=1;						(*номер символа в строке*)
abcA: BYTE:=2#00000_10_0;				(* .- 	*)
abcB: BYTE:=2#000_1000_0;				(* -... *)
abcC: BYTE:=2#000_1010_0;				(* -.-. *)
abcD: BYTE:=2#0000_100_0;				(* -.. 	*)
abcE: BYTE:=2#000000_0_0;				(* . 	*)
abcF: BYTE:=2#000_0010_0;				(* ..-. *)
abcG: BYTE:=2#0000_110_0;				(* --. 	*)
abcH: BYTE:=2#000_0000_0;				(* .... *)
abcI: BYTE:=2#00000_00_0;				(* .. 	*)
abcJ: BYTE:=2#000_0111_0;				(* .--- *)
abcK: BYTE:=2#0000_101_0;				(* -.- 	*)
abcL: BYTE:=2#000_0100_0;				(* .-.. *)
abcM: BYTE:=2#00000_11_0;				(* -- 	*)
abcN: BYTE:=2#00000_10_0;				(* -. 	*)
abcO: BYTE:=2#0000_111_0;				(* --- 	*)
abcP: BYTE:=2#000_0110_0;				(* .--. *)
abcQ: BYTE:=2#000_1101_0;				(* --.- *)
abcR: BYTE:=2#0000_010_0;				(* .-. 	*)
abcS: BYTE:=2#0000_000_0;				(* ... 	*)
abcT: BYTE:=2#000000_1_0;				(* - 	*)
abcU: BYTE:=2#0000_001_0;				(* ..- 	*)
abcV: BYTE:=2#000_0001_0;				(* ...-	*)
abcW: BYTE:=2#0000_011_0;				(* .-- 	*)
abcX: BYTE:=2#000_1001_0;				(* -..- *)
abcY: BYTE:=2#000_1011_0;				(* -.-- *)
abcZ: BYTE:=2#000_1100_0;				(* --.. *)
END_VAR	

TP_LongImp.PT:=t#6s;					(*Интервал длинный импульс "-" *)
TP_ShortImp.PT:=t#2s;					(*Интервал короткий импульс "." *)
TON_PauseI.PT:=t#2s;					(*Интервал паузы между импульсами "." *)
TON_PauseS.PT:=#t10s;					(*Интервал паузы между символами "....." *)

(*НАЧАЛО*)						
IF START THEN
Lstring:=LEN(enter_word);										(* Длина строки *)

(* Цикл отбивания шифра на выходе DO01 *)
	[b][u]FOR n_sim:=n_sim to Lstring BY 1 DO[/u][/b]								(* Выбор символа из строки, начиная с первого *)							
	TON_PauseS.IN:=TRUE;										(* Запуск таймера задержки, для выполнения паузы между символами *)
		IF TON_PauseS.Q THEN									(* По окончанию паузы, выполнение условий *)			
		ASCII:=GET_CHAR(enter_word,n_sim);							(* Преобразование символа строки в ASCII код *)
			IF b_code=16#61 THEN morze:=abcA; imp:=2; END_IF;
			IF b_code=16#62 THEN morze:=abcB; imp:=4; END_IF;
                        IF ASCII=97 THEN morze:=abcA; imp:=2; END_IF;
			IF ASCII=98 THEN morze:=abcB; imp:=4; END_IF;
			IF ASCII=99 THEN morze:=abcC; imp:=4; END_IF;
			IF ASCII=100 THEN morze:=abcD; imp:=3; END_IF;
			IF ASCII=101 THEN morze:=abcE; imp:=1; END_IF;
			IF ASCII=102 THEN morze:=abcF; imp:=4; END_IF;
			IF ASCII=103 THEN morze:=abcG; imp:=3; END_IF;
			IF ASCII=104 THEN morze:=abcH; imp:=4; END_IF;
			IF ASCII=105 THEN morze:=abcI; imp:=2; END_IF;
			IF ASCII=106 THEN morze:=abcJ; imp:=4; END_IF;
			IF ASCII=107 THEN morze:=abcK; imp:=3; END_IF;
			IF ASCII=108 THEN morze:=abcL; imp:=4; END_IF;
			IF ASCII=109 THEN morze:=abcM; imp:=2; END_IF;
			IF ASCII=110 THEN morze:=abcN; imp:=2; END_IF;
			IF ASCII=111 THEN morze:=abcO; imp:=3; END_IF;
			IF ASCII=112 THEN morze:=abcP; imp:=4; END_IF;
			IF ASCII=113 THEN morze:=abcQ; imp:=4; END_IF;
			IF ASCII=114 THEN morze:=abcR; imp:=3; END_IF;
			IF ASCII=115 THEN morze:=abcS; imp:=3; END_IF;
			IF ASCII=116 THEN morze:=abcT; imp:=1; END_IF;
			IF ASCII=117 THEN morze:=abcU; imp:=3; END_IF;
 			IF ASCII=118 THEN morze:=abcV; imp:=4; END_IF;
			IF ASCII=119 THEN morze:=abcW; imp:=3; END_IF;
			IF ASCII=120 THEN morze:=abcX; imp:=4; END_IF;
			IF ASCII=121 THEN morze:=abcY; imp:=4; END_IF;
			IF ASCII=122 THEN morze:=abcZ; imp:=4; END_IF;
			simp:=INT_TO_SINT(imp);								         (* преобразование переменной Imp из INT в SINT для использования в функции BIT_TEST *)

			FOR C_imp:=C_imp to imp By simp DO								(* Выбор импульса, начиная с первого *)
			TON_PauseI.IN:=TRUE									(* Запуск таймера задержки, для выполнения паузы между импульсами *)
			IF TON_PauseI.Q THEN									(* По окончанию паузы, выполнение условий *)
				bit_code:=BIT_TEST(morze,C_imp);						(* вывод бита из строки Morze, номер бита соответсвует номеру импульса *)
				IF bit_code=TRUE THEN TP_LongImp.IN:=TRUE; TP_ShortImp.IN:=FALSE;		(* если выведенный бит "1" то выдается длинный импульс *)
				ELSE
				TP_ShortImp.IN:=TRUE; TP_LongImp.IN:=FALSE;					(* если выведенный бит "0" то выдается короткий импульс *)
				END_IF;
					IF TP_LongImp.Q OR TP_ShortImp.Q THEN DO01_BOOL:=TRUE;			(* импульс поступает на дискретный выход №1 *)
					ELSE
					DO01_BOOL:=FALSE;
					END_IF;
			END_IF;
			TON_PauseI.IN:=FALSE;									(* перезапуск таймера паузы между импульсами *)
			END_FOR;
		END_IF;
	TON_PauseS.IN:=FALSE;											(* перезапуск таймера паузы между символами *)
	END_FOR;
END_IF;

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

В чем программируете?

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

нет идей?
Аватара пользователя

Jackson
администратор
администратор
Сообщения: 17561
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 819 раз
Поблагодарили: 1648 раз

Re: Задачка на программирование

Сообщение Jackson »

lsr писал(а):нет идей?
Нет диалога - нет идей.
Михайло писал(а):В чем программируете?
По вопросам работы Форума можно обратиться по этим контактам.

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

Евгений, ну что же вы так резко сразу. По коду замечаний нет, ищем проблему в платформе?

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

TEB, Isr мне в личку ответил.

От платформы зависят первые два вопроса.

А третий вопрос - тут все просто, мне кажется, Вы как-то неправильно работаете с таймерами на языке ST? Или это не ST?

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

Михаил Алексеевич, ST

*попробовал выписать 4 таймера отдельно, каждому вх/вых присвоил переменные. Использовал их в коде. Результат не изменился
покопавшись, понял что вх/вых таймеров не реагируют на происходящий процесс
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 30 раз
Поблагодарили: 165 раз

Re: Задачка на программирование

Сообщение aranea »

это же вроде Scl от сименса
если таймеры не реагируют, то наверное вы их не вызываете
TP_LongImp(); .. и т.д.
Изображение

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

язык ST
Вложение:
таймер реагирует на входе, но цикл мгновенно пролетает в значение 4 (строка 16) и все "встает"

-
В итоге ступор, может кто черкнуть как реализовывать все это с регистрами сдвига и массивами?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя

Jackson
администратор
администратор
Сообщения: 17561
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 819 раз
Поблагодарили: 1648 раз

Re: Задачка на программирование

Сообщение Jackson »

lsr писал(а):Евгений, ну что же вы так резко сразу.
Вопрос был - ответа не было. Как еще реагировать?

Зато вон как всё оживилось. Так что всё правильно: нет диалога - нет мыслей. Счас есть диалог - есть и мысли.
По вопросам работы Форума можно обратиться по этим контактам.

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3575
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 271 раз

Re: Задачка на программирование

Сообщение Михайло »

aranea писал(а):если таймеры не реагируют, то наверное вы их не вызываете
Я при анализе программы понял, что опрос производится всего один раз сразу после инициации таймера. Но ведь таймеры работают от 2 до 10 секунд, т.е. при отсутствии отклика нужно повторить опрос.

Автор темы
lsr
здесь недавно
здесь недавно
Сообщения: 29
Зарегистрирован: 25 дек 2013, 14:19
Имя: Станислав
Страна: Россия

Re: Задачка на программирование

Сообщение lsr »

Решил попробовать реализовать все на эмуляторе codesys. Программный код по шагово (F8) работает на ура, все выполняется, лампочка в окне визуализации мигает согласно шифру.
НО если делать запуск программы, то выходит сообщение о зацикливание (см.вл)

Как обойти беду?
код в codesys:

Код: Выделить всё

TP_LongImp.PT:=t#6s;
TP_ShortImp.PT:=t#2s;
TON_PauseI.PT:=t#2s;
TON_PauseS.PT:=t#8s;

IF start THEN
Lstring:= LEN(enter_word);
	FOR n_sim:=n_sim TO Lstring BY 1 DO
        IF n_sim>Lstring THEN EXIT;
        ELSE
		WHILE TON_PauseS.Q=FALSE DO
		TON_PauseS.IN:=TRUE;
		TON_PauseS;
		a:=a+1;
		END_WHILE;
		IF TON_PauseS.Q=TRUE THEN
		ASCII:=CODE (enter_word, n_sim);
			IF ASCII=97 THEN morze:=abcA; imp:=2; END_IF;
			IF ASCII=98 THEN morze:=abcB; imp:=4; END_IF;
			IF ASCII=99 THEN morze:=abcC; imp:=4; END_IF;
			IF ASCII=100 THEN morze:=abcD; imp:=3; END_IF;
			IF ASCII=101 THEN morze:=abcE; imp:=1; END_IF;
			IF ASCII=102 THEN morze:=abcF; imp:=4; END_IF;
			IF ASCII=103 THEN morze:=abcG; imp:=3; END_IF;
			IF ASCII=104 THEN morze:=abcH; imp:=4; END_IF;
			IF ASCII=105 THEN morze:=abcI; imp:=2; END_IF;
			IF ASCII=106 THEN morze:=abcJ; imp:=4; END_IF;
			IF ASCII=107 THEN morze:=abcK; imp:=3; END_IF;
			IF ASCII=108 THEN morze:=abcL; imp:=4; END_IF;
			IF ASCII=109 THEN morze:=abcM; imp:=2; END_IF;
			IF ASCII=110 THEN morze:=abcN; imp:=2; END_IF;
			IF ASCII=111 THEN morze:=abcO; imp:=3; END_IF;
			IF ASCII=112 THEN morze:=abcP; imp:=4; END_IF;
			IF ASCII=113 THEN morze:=abcQ; imp:=4; END_IF;
			IF ASCII=114 THEN morze:=abcR; imp:=3; END_IF;
			IF ASCII=115 THEN morze:=abcS; imp:=3; END_IF;
			IF ASCII=116 THEN morze:=abcT; imp:=1; END_IF;
			IF ASCII=117 THEN morze:=abcU; imp:=3; END_IF;
			IF ASCII=118 THEN morze:=abcV; imp:=4; END_IF;
			IF ASCII=119 THEN morze:=abcW; imp:=3; END_IF;
			IF ASCII=120 THEN morze:=abcX; imp:=4; END_IF;
			IF ASCII=121 THEN morze:=abcY; imp:=4; END_IF;
			IF ASCII=122 THEN morze:=abcZ; imp:=4; END_IF;
			simp:=INT_TO_SINT(imp);
				FOR C_imp:=C_imp TO imp BY 1 DO
				WHILE TON_PauseI.Q=FALSE DO
						TON_PauseI.IN:=TRUE;
						TON_PauseI;
						a:=a+1;
						VIVOD:=FALSE;
				END_WHILE;
					IF TON_PauseI.Q=TRUE THEN
						c_impb:=INT_TO_BYTE(c_imp);
						bit_code:=EXTRACT(morze,c_impb);
						IF bit_code=TRUE THEN
						TP_LongImp.IN:=TRUE; TP_ShortImp.IN:=FALSE; TP_LongImp; TP_ShortImp;
						ELSE
						TP_LongImp.IN:=FALSE; TP_ShortImp.IN:=TRUE; TP_LongImp; TP_ShortImp;
						END_IF;
							WHILE TP_LongImp.Q=TRUE OR TP_ShortImp.Q=TRUE DO
							VIVOD:=TRUE;
							TP_LongImp;
							TP_ShortImp;
							END_WHILE;
							VIVOD:=FALSE;
					TON_PauseI.IN:=FALSE;
					TON_PauseI;
					TP_LongImp.IN:=FALSE; TP_ShortImp.IN:=FALSE;
					TP_LongImp;
					TP_ShortImp;
					END_IF;
				END_FOR;
				C_Imp:=1;
				VIVOD:=FALSE;
		END_IF;
		TON_PauseS.IN:=FALSE;
		TON_PauseS;
        END_IF;
	END_FOR;
END_IF;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя

Exactamente
частый гость
частый гость
Сообщения: 409
Зарегистрирован: 20 ноя 2012, 13:45
Имя: :.О.N.Ф
Страна: Россия
Благодарил (а): 3 раза
Поблагодарили: 7 раз

Re: Задачка на программирование

Сообщение Exactamente »

код не читал, но по первым 4 строкам предположу, что сработку вочдога вызывают большие задержки?
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».
Закрыто

Вернуться в «Вопросы от студентов»