Профиль должен быть заполнен на русском языке кириллицей. Заполнение профиля заведомо ложными или некорректными данными - причина возможного отказа в регистрации на форуме.

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


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

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

Сообщение lsr » 07 июл 2014, 06:35

Уважаемые форумчане, всем доброго времени суток! Первое знакомство с реальным ПЛК.
Есть задание на развитие (так сказать на "слабо" от коллег), не могу выполнить, очень зацепило, хочу разобраться.
Азбука морзе. Имеем ПЛК, используем 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 и т.д.
как только их вызывать (прерывать импульсы).

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


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

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

Сообщение Михайло » 07 июл 2014, 09:28

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


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

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

Сообщение lsr » 07 июл 2014, 09:49

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


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

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

Сообщение Михайло » 07 июл 2014, 12:48

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

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


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

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

Сообщение lsr » 07 июл 2014, 13:15

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

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


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

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

Сообщение Михайло » 07 июл 2014, 17:47

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

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

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


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

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

Сообщение lsr » 08 июл 2014, 12:35

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

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:


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

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

Сообщение Михайло » 08 июл 2014, 14:13

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
почётный участник форума
почётный участник форума
Сообщения: 2561
Зарегистрирован: 07 окт 2011, 08:12
Ф.И.О.: Гаско Вячеслав Эриевич
Откуда: Рязань, Россия
Благодарил (а): 43 раза
Поблагодарили: 71 раз

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

Сообщение Ryzhij » 08 июл 2014, 14:28

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

Подсказка
Пункты с 1-го по 5-й реализуются "знакогенератором", а 6 и 7 обработкой массива (буфера) текста, где п.6 - индекс массива.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может». Жан-Поль Сартр


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

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

Сообщение lsr » 10 июл 2014, 11:37

Михаил Алексеевич, символ длинной в три импульса рассматриваю как первый попавшийся пример. касательно 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 условий.


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

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

Сообщение Михайло » 10 июл 2014, 15:01

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

Для этого-то и придумано следующее:
Михайло писал(а):3. байт, кодирующий длину морзянки символа (общее число импульсов, от 2 до 8)
...
5. байт, содержащий счет текущего импульса (счетчик импульсов в пределах символа)

То есть Вы должны организовать в программе цикл от 1 до длины морзянки, соответственно, если длина морзянки равна 3, то только три бита и будут переданы, остальные пять битов игнорируются.


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

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

Сообщение Михайло » 10 июл 2014, 15:08

lsr писал(а):5.далее ASCII в INT переводим в BYTE (*sim - 16#64*)

Не заморачивайся на типе BYTE, можно работать с INT. Все зависит от возможностей системы команд и среды разработки.


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

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

Сообщение lsr » 14 июл 2014, 07:32

Добрый день, нашел время по разбираться и наткнулся на проблему:
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;


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

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

Сообщение Михайло » 14 июл 2014, 08:56

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


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

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

Сообщение lsr » 16 июл 2014, 06:34

нет идей?

Аватара пользователя

TEB
специалист по DEIF
специалист по DEIF
Сообщения: 7900
Зарегистрирован: 17 июн 2008, 15:01
Ф.И.О.: Евгений свет Брониславович
Благодарил (а): 38 раз
Поблагодарили: 65 раз
Контактная информация:

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

Сообщение TEB » 16 июл 2014, 12:08

lsr писал(а):нет идей?


Нет диалога - нет идей.

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


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

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

Сообщение lsr » 16 июл 2014, 12:57

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


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

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

Сообщение Михайло » 16 июл 2014, 15:41

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

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

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


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

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

Сообщение lsr » 17 июл 2014, 06:52

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

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

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 519
Зарегистрирован: 21 сен 2012, 21:45
Ф.И.О.: Воробьев Александр
Поблагодарили: 12 раз
Контактная информация:

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

Сообщение aranea » 17 июл 2014, 11:30

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


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

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

Сообщение lsr » 17 июл 2014, 14:04

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

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

Аватара пользователя

TEB
специалист по DEIF
специалист по DEIF
Сообщения: 7900
Зарегистрирован: 17 июн 2008, 15:01
Ф.И.О.: Евгений свет Брониславович
Благодарил (а): 38 раз
Поблагодарили: 65 раз
Контактная информация:

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

Сообщение TEB » 17 июл 2014, 14:12

lsr писал(а):Евгений, ну что же вы так резко сразу.

Вопрос был - ответа не было. Как еще реагировать?

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


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

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

Сообщение Михайло » 17 июл 2014, 14:50

aranea писал(а):если таймеры не реагируют, то наверное вы их не вызываете

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


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

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

Сообщение lsr » 28 июл 2014, 06:37

Решил попробовать реализовать все на эмуляторе 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, 12:45
Ф.И.О.: :.О.N.Ф
Благодарил (а): 3 раза
Поблагодарили: 3 раза

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

Сообщение Exactamente » 28 июл 2014, 08:13

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


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



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей