- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Задачка на программирование
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Задачка на программирование
Уважаемые форумчане, всем доброго времени суток! Первое знакомство с реальным ПЛК.
Есть задание на развитие (так сказать на "слабо" от коллег), не могу выполнить, очень зацепило, хочу разобраться.
Азбука морзе. Имеем ПЛК, используем 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 и т.д.
как только их вызывать (прерывать импульсы).
Есть ли ошибки на данном этапе и в каком направление смотреть далее?
Спасибо
Есть задание на развитие (так сказать на "слабо" от коллег), не могу выполнить, очень зацепило, хочу разобраться.
Азбука морзе. Имеем ПЛК, используем 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: Задачка на программирование
Прежде чем писать код, нужно определиться с глобальными входами и выходами программы. Иначе мы можем только гадать, что за переменные в программе болтаются...
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
Не очень вас понял..ну глоб. выход это одна булевая переменная DO01_BOOL. Входные переменные (время таймеров, счетчик, переменные отражающие алфавит) локальные
-
- почётный участник форума
- Сообщения: 3575
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
Re: Задачка на программирование
Ну должна быть какая-то команда внешнего запуска... Вопрос сразу: что делать, если команда внешнего запуска пришла в момент работы "телеграфа"? И т.д. А выход, который будет сигнализировать, что команда завершена? В итоге нарисовалась более расширенная задача: мы подаем внешний сигнал запуска удерживаем его до тех пор, пока буква не "отобьется" и мы не получим флаг завершения.
Теперь уже думаем над алгоритмом: похоже переменная sbros неплохо подходит под определение флага завершения. Но в твоей программе этот флаг является локальным и приводит к самоинициализации.
Очевидно, что необходим как минимум второй таймер, который отсчитывает паузы между сигналами. Не совсем понятна Ваша идея с "ax" и "CH". Вы хотите сделать универсальную программу, которая будет отбивать любую букву?
Теперь уже думаем над алгоритмом: похоже переменная sbros неплохо подходит под определение флага завершения. Но в твоей программе этот флаг является локальным и приводит к самоинициализации.
Очевидно, что необходим как минимум второй таймер, который отсчитывает паузы между сигналами. Не совсем понятна Ваша идея с "ax" и "CH". Вы хотите сделать универсальную программу, которая будет отбивать любую букву?
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
Михайло, максимальная задача отбивать слова. Для начала можно и буквами обойтись. Про команду внешнего запуска понял (в примере им служит переменная znak_S). Эта "программа" выдает 3 коротких импульса и отключается.
Не могу понять оптимизированное решение, можно городить блоки для каждой буквы, выйдет массивно, и как их потом объединять в слова тяжело представляется.. :) Наверняка можно сделать все красиво, массивом из букв, и просто прерывать постоянный сигнал в нужной последовательности и задержки по времени.
переменная "ax" имеет отношение только к генератору импульса. Она присваивается на вход "IN" и инверсионный выход "NOT Q" блока TP, тем самым получается цикл
Не могу понять оптимизированное решение, можно городить блоки для каждой буквы, выйдет массивно, и как их потом объединять в слова тяжело представляется.. :) Наверняка можно сделать все красиво, массивом из букв, и просто прерывать постоянный сигнал в нужной последовательности и задержки по времени.
переменная "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...
1. четыре таймера - длинный импульс, короткий импульс, пауза между импульсами, пауза между символами.
2. байт, содержащий код текущего символа в формате ASCII.
3. байт, кодирующий длину морзянки символа (общее число импульсов, от 2 до 8)
4. байт, кодирующий морзянку символа (например, 11010000 - длинный-длинный-короткий-длинный - буква Щ, последующие биты не имеют значения)
5. байт, содержащий счет текущего импульса (счетчик импульсов в пределах символа)
6. слово-указатель на текущую букву в тексте
7. текст в формате STRING
Тип BYTE можно заменить на INT или WORD, если это будет выгодно с точки зрения системы команд.
Подсказка: очень выгодно в таком контексте использовать команды SHL или ROL для сдвига морзянки символа, а также побитные логические операции со словами WAND, WOR, WXOR...
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
Михаил Алексеевич, признателен, ни разу не сталкивался с чем-то подобным :) буду пробовать и походу вопросы задавать
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) Как реализовать данную функцию? В целом у меня нет представления как программа должна понять введенный текст для дальнейшей работы
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) Как реализовать данную функцию? В целом у меня нет представления как программа должна понять введенный текст для дальнейшей работы
-
- почётный участник форума
- Сообщения: 3575
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
Re: Задачка на программирование
Можно и русские буквы закодировать, вроде есть некий "кириллический" вариант ASCII.lsr писал(а):2) для английского алфавита 27 переменных типа байт?
Пример: Sim_a: BYTE:= 97; (*строчная буква "а" английского алфавита в формате ASCII*);
или можно задать как массив:
Simvol: ARRAY[97..122] OF BYTE; (*массив из английских букв A-Z в формате ASCII*)
Вы всегда рассматриваете символы длиной в три импульса, а ведь есть символы с двумя импульсами. И с четырьмя. Вплоть до восьми...lsr писал(а):3) не очень понял, длина импульса или все же количество для одного символа. Пример: S (...) - переменная будет равна BYTE:=7 или 224 (11100000 или 00000111) верно?;
Точно.lsr писал(а):5) зависит от 3)
Существуют текстовые типы данных - STRING и CHAR. Строка STRING представляет собой набор из отдельных символов CHAR. Указатель на символ в строке - это порядковый номер символа в строке. Например, строка "Я из лесу вышел..." состоит из 18 символов, если указатель равен 6, то соответственно извлекается символ "л". "Я из лесу вышел..."[6] = "л".lsr писал(а):6) Как реализовать данную функцию? В целом у меня нет представления как программа должна понять введенный текст для дальнейшей работы
Текстовые типы данных - это которые не выражаются числами, однако использование указателя (числовой тип данных), а также функций определения длины строки, конвертации символа CHAR в число ASCII и обратная конвертация - все это позволяет гибко работать с текстовыми типами данных.
Реализуемость подхода зависит от того, как Ваш ПЛК поддерживает текстовые типы данных.
-
- почётный участник форума
- Сообщения: 5632
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 600 раз
- Поблагодарили: 756 раз
Re: Задачка на программирование
ПодсказкаМихайло писал(а):Предлагаю создать "якорные" переменные, на которых будет строиться программа:
1. четыре таймера - длинный импульс, короткий импульс, пауза между импульсами, пауза между символами.
2. байт, содержащий код текущего символа в формате ASCII.
3. байт, кодирующий длину морзянки символа (общее число импульсов, от 2 до 8)
4. байт, кодирующий морзянку символа (например, 11010000 - длинный-длинный-короткий-длинный - буква Щ, последующие биты не имеют значения)
5. байт, содержащий счет текущего импульса (счетчик импульсов в пределах символа)
6. слово-указатель на текущую букву в тексте
7. текст в формате STRING
Пункты с 1-го по 5-й реализуются "знакогенератором", а 6 и 7 обработкой массива (буфера) текста, где п.6 - индекс массива.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
Михаил Алексеевич, символ длинной в три импульса рассматриваю как первый попавшийся пример. касательно 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 условий.
Спасибо за направление к текстовым типам данных!
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 условий.
То есть Вы должны организовать в программе цикл от 1 до длины морзянки, соответственно, если длина морзянки равна 3, то только три бита и будут переданы, остальные пять битов игнорируются.Михайло писал(а):3. байт, кодирующий длину морзянки символа (общее число импульсов, от 2 до 8)
...
5. байт, содержащий счет текущего импульса (счетчик импульсов в пределах символа)
-
- почётный участник форума
- Сообщения: 3575
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
Re: Задачка на программирование
Не заморачивайся на типе BYTE, можно работать с INT. Все зависит от возможностей системы команд и среды разработки.lsr писал(а):5.далее ASCII в INT переводим в BYTE (*sim - 16#64*)
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
Добрый день, нашел время по разбираться и наткнулся на проблему:
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)
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;
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
-
- администратор
- Сообщения: 17560
- Зарегистрирован: 17 июн 2008, 16:01
- Имя: Евгений свет Брониславович
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 819 раз
- Поблагодарили: 1648 раз
Re: Задачка на программирование
Нет диалога - нет идей.lsr писал(а):нет идей?
Михайло писал(а):В чем программируете?
По вопросам работы Форума можно обратиться по этим контактам.
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
Евгений, ну что же вы так резко сразу. По коду замечаний нет, ищем проблему в платформе?
-
- почётный участник форума
- Сообщения: 3575
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
Re: Задачка на программирование
TEB, Isr мне в личку ответил.
От платформы зависят первые два вопроса.
А третий вопрос - тут все просто, мне кажется, Вы как-то неправильно работаете с таймерами на языке ST? Или это не ST?
От платформы зависят первые два вопроса.
А третий вопрос - тут все просто, мне кажется, Вы как-то неправильно работаете с таймерами на языке ST? Или это не ST?
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
Михаил Алексеевич, ST
*попробовал выписать 4 таймера отдельно, каждому вх/вых присвоил переменные. Использовал их в коде. Результат не изменился
покопавшись, понял что вх/вых таймеров не реагируют на происходящий процесс
*попробовал выписать 4 таймера отдельно, каждому вх/вых присвоил переменные. Использовал их в коде. Результат не изменился
покопавшись, понял что вх/вых таймеров не реагируют на происходящий процесс
-
- знаток Eplan
- Сообщения: 1136
- Зарегистрирован: 21 сен 2012, 22:45
- Имя: aranea
- Благодарил (а): 30 раз
- Поблагодарили: 165 раз
Re: Задачка на программирование
это же вроде Scl от сименса
если таймеры не реагируют, то наверное вы их не вызываете
TP_LongImp(); .. и т.д.
если таймеры не реагируют, то наверное вы их не вызываете
TP_LongImp(); .. и т.д.
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
язык ST
Вложение:
таймер реагирует на входе, но цикл мгновенно пролетает в значение 4 (строка 16) и все "встает"
-
В итоге ступор, может кто черкнуть как реализовывать все это с регистрами сдвига и массивами?
Вложение:
таймер реагирует на входе, но цикл мгновенно пролетает в значение 4 (строка 16) и все "встает"
-
В итоге ступор, может кто черкнуть как реализовывать все это с регистрами сдвига и массивами?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- администратор
- Сообщения: 17560
- Зарегистрирован: 17 июн 2008, 16:01
- Имя: Евгений свет Брониславович
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 819 раз
- Поблагодарили: 1648 раз
Re: Задачка на программирование
Вопрос был - ответа не было. Как еще реагировать?lsr писал(а):Евгений, ну что же вы так резко сразу.
Зато вон как всё оживилось. Так что всё правильно: нет диалога - нет мыслей. Счас есть диалог - есть и мысли.
По вопросам работы Форума можно обратиться по этим контактам.
-
- почётный участник форума
- Сообщения: 3575
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
Re: Задачка на программирование
Я при анализе программы понял, что опрос производится всего один раз сразу после инициации таймера. Но ведь таймеры работают от 2 до 10 секунд, т.е. при отсутствии отклика нужно повторить опрос.aranea писал(а):если таймеры не реагируют, то наверное вы их не вызываете
-
- здесь недавно
- Сообщения: 29
- Зарегистрирован: 25 дек 2013, 14:19
- Имя: Станислав
- Страна: Россия
Re: Задачка на программирование
Решил попробовать реализовать все на эмуляторе codesys. Программный код по шагово (F8) работает на ура, все выполняется, лампочка в окне визуализации мигает согласно шифру.
НО если делать запуск программы, то выходит сообщение о зацикливание (см.вл)
Как обойти беду?
код в codesys:
НО если делать запуск программы, то выходит сообщение о зацикливание (см.вл)
Как обойти беду?
код в 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;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- частый гость
- Сообщения: 409
- Зарегистрирован: 20 ноя 2012, 13:45
- Имя: :.О.N.Ф
- Страна: Россия
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
Re: Задачка на программирование
код не читал, но по первым 4 строкам предположу, что сработку вочдога вызывают большие задержки?
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».