Реклама ⓘ
Главная » Промышленная электроника
Призовой фонд
на июнь 2024 г.
1. 50 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Simatic S7-200 быстрый старт. Часть 2.

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

Коротко пробежим по основным операциям.

Логические операции. Доступны через вкладку Bit Logic

Тест

Что мы здесь видим. Нормально разомкнутый контакт -| |-. Мы его уже применяли. Он пропустит на свой выход сигнал если его состояние равно логической «1». Нормально замкнутый контакт -| \ |-. Он пропустит на выход сигнал если его состояние равно логическому «0». Сигнал инверсии –| NOT |- инвертирует входной сигнал. Сигнал выделения фронта -| P |- формирует на своем выходе импульс в течении одного цикла программы при обнаружении на своем входе положительного фронта. –( )- сигнал установки бита. Приравнивает бит или группу битов логическому состоянию на входе. –( S )- устанавливает бит или группу битов при появлении логической 1 на входе. –( R )- сбрасывает бит или группу битов при появлении на входе логической единицы. Всякие триггеры и так далее.

Создание ветвлений в программе осуществляется стрелками

рис 34.jpg

На рисунке показано как реализовать комбинированную логическую схему. Входа I0.1и I0.2 объединены по ИЛИ и вместе они объединены по И с входом I0.0.

Операции сравнения – Compare. Используются понятное дело для сравнения различных аналоговых величин. На выходе формируют логический сигнал соответствующий результату сравнения. Например

рис 35.jpg

Сделайте такую схему и экспортируйте ее в awl файл. Запустите симулятор S7-200 от canal. Два раза щелкните по полю с надпись 0. Откроется окно в котором выберем модуль EM 231

рис 36.jpg

Теперь у нас есть аналоговый модуль с входами AIW0 AIW1 AIW2. Нажимаем Program -> load program и загружаем наш файл awl. Откроется окно

рис 37.jpg

Нажимаем RUN. И теперь двигая ползунок аналогового входа AI0 видим что при превышении значения 10000 устанавливается выход Q0.0.

рис 38.jpg

Еще одна тонкость – полезность. В симуляторе и при работе с реальным ПЛК доступен режим state program (состояние программы).

рис 39.jpg

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

При результате логической операции равной 1 – сама операция подсвечивается синим цветом. Видно что аналоговое значение 32760 это больше 10000 следовательно результат операции сравнения = логической 1. Значение выхода Q0.0 тоже становиться равным 0.

Математические операции делятся на математику целочисленную Integer Math и математику с плавающей запятой Floating Point Math. Тут важно заметить что нельзя напрямую величины типа integer 16 бит и аналоговые входа с размерностью WORD 16 бит засовывать в математику типа REAL. Необходимо преобразовать сначала Integer в Double Integer а затем DI в REAL. Функции преобразования лежат во вкладке convert.

рис 40.jpg

Для примера напишем программу которая считывает аналоговый вход и делит его на 2,5.

Вот как будет выглядеть программа

рис 41.jpg

Вот опять используем системный меркер SM0.0 и используем аккумулятор АС0 для хранения промежуточных результатов.

Таймеры

Есть несколько видов таймеров. TON – с задержкой включения. Когда на его входе появляется логическая 1 то таймер начинает считать до заданного значения по достижении которого он выставляет бит своего состояния в логическую единицу.

TOF – таймер с задержкой выключения. Бит состояния выставляется в 1 сразу по появлению на входе логической 1 и сбрасывается по достижению таймером заданного значения.

Таймеры в S7-200 делятся по дискретности устанавливаемого времени. Так таймеры с номерами T32, T96 имеют дискретность 1 мс и максимальное время   32.767 с.

Таймеры с номерами T33-T36, T97-T100 имеют дискретность 10 мс и максимальное время 327.67 секунды.

Таймеры с номерами T37-T63, T101-T255 имеют дискретность 100 мс и максимальное время 3276.7 секунды.

Для настройки таймера необходимо выбрать его номер из группы с необходимой дискретностью и задать значение до которого считать (максимум 32767).

На рисунке приведен пример мигалки на двух таймерах

рис 42.jpg

Логика работы такая. Так как логическое состояние таймера при первом старте равно 0 то результат опроса команды -| / |- Q0.0 равно 1. Оно приводит к тому, что стартует таймер Т35. Как только таймер Т35 досчитал до 1 секунды то выставляется выход Q0.0 в 1. Это приводит к тому что стартует таймер Т36. Когда он досчитывает до 1 секунды то в сбрасывается Q0.0 и стартует таймер Т35 и так по кругу. Загрузите этот пример в симулятор и нажав state program посмотрите как это работает в железе.

Необходимо заметить, что можно опрашивать не только логическое состояние таймера но и его текущее значение. Важно помнить, что значение таймера имеет разрядность 16 бит и при сравнении используется целочисленная математика и сравнение Integer.

рис 43.jpg

На рисунке пример программы реализующей мигалку на одном таймере. Логика работы такая. Так как в первый момент состояние меркера m0.0 равно 0 то результат опроса команды -| / |- M0.0 равно 1. Оно приводит к тому, что стартует таймер Т35. Как только таймер Т35 досчитал до 1 секунды то выставляется выход Q0.0 в 1. Как только таймер досчитал до 2 секунд, то сбрасывается выход Q0.0 в 0 и устанавливается на один цикл меркер m0.0. Установка меркера (результат опроса команды -| / |- М0.0 становиться равен 0) приводит к рестарту таймера Т35 и цикл повторяется.

Высокоскоростные счетчики

На практике часто необходимо осуществлять подсчет импульсов (например при измерении оборотов). Для этого в ПЛК S7-200 предусмотрены высокоскоростные 32-х разрядные счетчики HSC (High Speed Counter). В линейке S7-200 есть ПЛК имеющие от 4 до 6 скоростных счетчиков с максимальной частотой счета 30кГц и CPU 224XP имеющий к четырем 30кГц счетчикам еще два с максимальной частотой 200кГц. Аппаратно входы счетчиков подключены на ноги порта I0 (нужно смотреть в документации). Для конфигурации счетчиков я рекомендую использовать мастер.

рис 57.jpg

На примере рассмотрим как настроить счетчик на подсчет импульсов за определенное время (классическое измерение частоты). Запускаем мастер настройки счетчика.

рис 58.jpg

Выбираем какой счетчик настраиваем и режим работы (я использую режим Mode 0 – простой счет без сброса и старта). Mode 12 например используется ля генерации PWM сигнала (подробнее можно найти в Help). Нажимаем Next.

рис 59.jpg

Даем название процедуре настройки счетчика (например «настройка счетчика импульсов»). Выбираем начальное значение, значение до которого считать и направление счета. В нашем случае выбираем Preset = 0, Current = 0, Direct = UP. Нажимаем Next.

рис 60.jpg

Здесь все оставляем без изменений так как мы считаем импульсы за период времени (если бы считали импульсы до определенного значения то в предыдущем окне установили бы Preset на необходимую величину и в текущем окне поставили бы галку «генерировать прерывание по достижению PV). Нажимаем Next и в следующем окне Finish.

рис 61.jpg

В окне Program Block появились две новые процедуры

Настройка счетчика импульсов SBR0 и процедура прерывания INT_0. В коде блока OB1 вставляем нормально разомкнутый контакт sm0.1 (First Scan) и из списка Call Soubrutines выбираем «Настройка счетчика импульсов SBR0».

рис 62.jpg

Теперь мы можем убедиться, что счетчик считает. Допишем в Network2 следующий код.

рис 63.jpg

Делаем экспорт в awl. Открываем симулятор S7_200. Двойной щелчок по CPU и выбираем CPU 226. Загружаем наш awl файл и переводим ПЛК в RUN. Теперь если переключать тумблер I0.0 то счетчик будет считать и его значение будет отображаться на байте выходов Q0.

рис 64.jpg

Теперь попишем программу для автоматического подсчета импульсов за период времени.

В настройках счетчика вставляем network и дописываем в него следующий код

рис 65.jpg

Тут необходимо сделать следующие пояснения.

В системе есть специальный таймер тикающий с периодом равным 1мс*SMB34 и вызывающий так называемое событие №10. Функция ATCH из выпадающего списка Intertupt имеет следующие входа выхода. Вызываемое прерывание (в нашем случае INT_0) и вход номера события запускающее это прерывание (в нашем случае №10). Таким образом мы настроили вызов прерывания INT_0 каждые 250мс.

Теперь заходим в прерывание INT_0 и вставляем следующий код

рис 66.jpg

Теперь в переменной VD0 мы имеем число импульсов измеренное за 250мс.

Работа с функциями

Часто целесообразно для выполнения типовых действий создать функцию. Делается это следующим образом. Правым щелчком мыши на поле Program block -> Insert -> Subroutine.

рис 44.jpg

Появляется еще одна подпрограмма SBR1. Ее можно переименовать по клику правой кнопкой -> rename.

Теперь для ее вызова необходимо в нужном месте программы (например в основном цикле при включение входа i0.0 должна вызываться наша подпрограмма func_1 (имена могут быть и на русском языке)) необходимо встать на линию после опроса входа -| |- i0.0 и два раза щелкнуть по имени нашей подпрограммы в списке call subroutine. Функция автоматически встанет на место.

рис 45.jpg

Теперь наша функция вызывается. Что бы изменить начинку функции необходимо кликнуть ее два раза в списке Program block.

Откроется окно аналогичное основному блоку, где можно написать свою программу. Например как на рисунке.

рис 46.jpg

Это пример функции ни чего не возвращающей и не имеющей входных параметров. Этот прием используется в основном для структурирования программы путем разбития ее на отдельные сегменты. Часто на практике требуются функции обрабатывающие входной сигнал и возвращающие результат. Это делается следующим образом. Заходим в нашу функцию и вверху видим поля для данной функции. In это входа Out выхода Temp внутренние переменные. В поле symbol пишем символьное имя входной переменной (например «вход 1»), в поле data type определяем какого типа будет эта переменная , если это аналоговый вход то тип word и так далее. Добавляем например «вход 2» типа word и выход «выход 1» типа BOOL.

Теперь пишем программу. Будем например сравнивать значение переменной вход 1 и вход 2 и если вход 1 больше то устанавливать выход в 1.

Вот как выглядит эта программа.

рис 47.jpg

При заполнении символов в программе знак # писать не надо, он ставиться автоматически.

Теперь вызовем нашу функцию. В основном цикле после условия вызова (например sm0.0 вызывать всегда) выбираем нашу функцию func_1 из списка call subroutines.

Появляется наша подпрограмма в таком виде

рис 48.jpg

Заполняем знаки вопроса необходимыми нам переменными. Например в первом нетворке сравнивается значение аналогового входа AIW0 с уставкой 10000 и если вход больше то устанавливается выход q0.0. Во втором нетворке сравнивается значение аналогового входа AIW2 с уставкой 20000 и если вход больше то устанавливается выход q0.1.

рис 49.jpg

Как верно замети Сергей в симуляторе от Canals этот пример не работает. Зато он нормально работает в симуляторе S7_200_SIM, просто замените AIW0 на IB0 и AIW2 на IB1, а впроцедуре тип WORD входных переменных на BYTE. В сравнении естественно нужно сравнивать не INT а BYTE. Можно загрузить готовый проект подрограмма.mwp. Естественно на практике внутри функции выполняется как правило больше действий. Например я использую подобные функции чтобы получить значение давления в кгс с датчиков с токовым выходом 4-20мА. На вход передаю значение из аналогового модуля и величину давления соответствующего току 20мА для данного датчика. Внутри функции по формуле вычисляю давление соответствующее текущему току и возвращаю из функции.

Теперь о дополнительных тонкостях и хитростях.

Например необходимо узнать где у нас используется та или иная переменная. Для это служит средство cross reference.

рис 50.jpg

В таблице видно, что мы использовали слово памяти VW0 один раз в основном цикле OB1.

Системный меркер sm0.0 Always_On мы использовали три раза. Два раза в основном цикле OB1 и один раз в подпрограмме func_1. Если в этой таблице два раза щелкнуть по имени переменной то автоматически произойдет переход в то место программы где произошло использование этой переменной.

Допишем в программе OB1 код

рис 51.jpg

Нажимаем PLC -> compile All. Открываем опять cross reference.

Открываем вкладку Byte Usage

рис 52.jpg

Здесь показано как у нас занята память. У нас занята память под VW0 и VW2, а так как они используют по два байта то отображаются буквами W, и занимают каждая по две клетки байтовой области. Меркер M0.0 занимает бит в байте MB0. Также мы используем специальный меркер sm0.0 Always_On из байта SMB0. Здесь удобно смотреть какие ячейки еще свободны что бы случайно не использовать уже занятый.

На вкладке Bit Usage уже показывается распределение занятых битов в байте.

рис 53.jpg

Здесь видно, что в программе мы уже использовали два дискретных выхода Q0.0 и Q0.1 и один дискретный вход I0.0. Эту табличку я смотрю когда необходимо заиметь свободный меркер типа BOOL для какого либо флага в программе и при необходимости узнать какие еще входа выхода свободны в контроллере.

Отладка программы

Для просмотра значений переменных и состояния входов выходов используется инструмент Chart Status

рис 54.jpg

В таблице вбиваем нужные нам переменные и смотрим их значения. Можно задать свои значения в поле New Value и нажать карандашик Write All и эти значения передадутся в программу.

рис 55.jpg

Состояние выполнения программы можно увидеть нажав кнопку program status (как в симуляторе) и при включенном ПЛК будут отображаться состояния входов выходов и текущие значения переменных

рис 56.jpg

В следующей статье рассмотрим создание HMI интерфейса с контроллером SIMATIC S7-200 на базе панели оператора TD и на базе PC с помощью программы ProTool.

Прикрепленные файлы:

Теги:

Опубликована: 29.01.2013 Изменена: 02.06.2013 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.7 Проголосовало: 1 чел.

Комментарии (15) | Я собрал (0) | Подписаться

0
ded2006 #
Цикл статей очень хороший и познавательный. Узнал , что для S7-200 есть эмулятор. Будет ли статья про ПРОФИБАС и его конфигурацию?
Ответить
0

[Автор]
tvilsa #
Нет не будет. Цикл статей имеет характер ознакомительный. Кому глубже надо, тот и в хелпе найдет и на сайте сименса почитает. Просто на словах вряд ли что объяснишь, а показать не на чем. В моих проектах Profibus не используется.
Ответить
0
Сергей #
Уважаемые, в чем проблема: не могу отладить программу на симуляторе для функции с двумя аналоговыми входами (смотрим статью автора). Программа запускается, но при варьировании аналоговых сигналов выхода Q0.0 и Q0.1 не реагируют и остаются в 0, причем в подпрограмме - функция на выходе постоянно присутствует 1. Есть те, у кого работает эта программа на симуляторе?
Ответить
0

[Автор]
tvilsa #
Сергей за внимательность получает пять с плюсом! Да действительно с этим симулятором не работает. В процессе написания статьи в основном использовалось железо. И за внимательность Сергей (ну и все остальные) награждается симулятором S7_200_SIM в котором этот пример (слегка в видоизмененном состоянии нормально работает)
Ответить
0
Сергей #
Просто отлично! Я дней 5 пытался запустить программу, видоизменял, но не вышло! Подумал не хватает какой-либо инструкции начало и окончания функции. Жду нужный симулятор. И еще пару вопросов имеется, надеюсь услышать ответы:
1. Зачем писать программу опроса аналогового входа через прерывание? В реальном ПЛК программа же будет его опрашивать всё-равно! Или тут дело в том, что ПЛК будет опрашивать очень часто, а через прерывание нам достаточно и раз в секунду?
2. Перевел значение аналогового вход через математику вещественную в кПа, скажем мне нужно округлить до третьего числа после запятой и убрать экспоненту, как это сделать?! И возможно ли? На симуляторе округление имеется только до целого числа и то, он мне указывает значение со всеми нулями после запятой 1.000000Е+00.
Ответить
0

[Автор]
tvilsa #
По первому вопросу, где опрос аналогового входа через прерывание? Вы имели ввиду подрограмму? Так она не в прерывании, а просто подпрограмма. Если где про счетчик, то там нет аналогового входа. Короче не понял я что за вопрос.
По второму вопросу. Зачем убирать экспоненту? Это просто вид отображения на экране. Если вам не нужна такая точность разрядности 32, то для получения с точностью до 3 знака вам нужно умножить вашу величину типа REAL на 1000 и сделать операцию R->DI получите на выходе DI (только не забудьте что в 1000 раз больше). Например я при расчете давлений с датчиков с токовым выходом получаю REAL, но мне такая точность не нужна, поэтому я умножаю на 10 и перевожу сначала R->DI затем DI->I и на выходе имею давление умноженное на 10. В дальнейшем я использую эту величину естественно учитывая что типа последняя цифра это первый знак после запятой (так и передаю в SCADA систему, а при отображении ставлю нужное положение запятой и на экране получаю правильное значение давления с одним знаком после запятой).
Ответить
0
Сергей #
Да, действительно у вас нет примера с прерыванием. Это я в книжке увидел, как через подпрограмму-прерывание опрашивают значение аналогового входа каждые 0.5 сек. Вот я и подумал зачем городить огород через прерывание, если можно по-простому как у вас ставить инструкцию сравнения чисел /I/ и всё. А что касается SCADA систем, то я с ними не знаком пока,но понял что в них можно устанавливать как пожелаешь. Пример: датчик давление предел 0-2,5 кПа, в программе я ставлю уставку в сравнении чисел REAL на 2,20 кПа и соответственно точность сигнала мне нужна не больше сотой, а если в DI , то будет 2200 Па , чего не хотелось бы, так как все привыкли мерить давление в кПа и Па воспринимаются уже не так.
Ответить
0

[Автор]
tvilsa #
Вы не совсем правильно поняли про типы чисел и запятые. Я не говорю, что надо переводить кПа в Па или другие единицы измерения в их производные. С точки зрения программы без разницы что сравнивать 12,345 кПа или 12345кПа. Я не перевожу единицы в другие, я просто перевожу число со знаками после запятой в целое число умножением на 10 100 или 1000 и отбрасываю дробную часть, смотря какая точность нужна. И в программе обрабатываю уже умноженное число и в скаду его передаю и там уже для пользователя просто переношу положение запятой и как следовательно пользователь не видит что я работаю с числом умноженным на 10 100 или 1000. Способ хорош для экономии памяти так как можно заменить REAL на Integer и иногда даже Byte а это экономия 16 или 24 бит, что при большом числе аналоговых каналов позволяет серьезно сэкономить память в ПЛК и что самое главное количество тэгов при передачи в скаду.
Например меряется давление до 20кГс/см с точностью 0,1кг/см при расчете получаем например 19,34534кг/см типа REAL. умножаем на 10 и отбрасываем дробную часть получаем 193 кгс/см, что для данного диапазона и точности укладывается в тип Byte от 0 до 255. Далее в программе например нужно сравнить это давление с величиной 12,5 кг/см , так и сравниваем нашу величину 193 с величиной 125 сравнением двух байтов командой compare Byte. Надеюсь понятно объяснил? Если что спрашивай.
И далее: например надо отобразить пользователю наше давление 19,3 кг/см. Так и передаем в скаду Byte 193 и в скаде описываем, что положение запятой 1 знак и на экране получаем 19,3 кг/см и пользователь и не знает что мы гоняли байт, а не 4 байта в типе REAL.
Ответить
0
Сергей #
Всё понятно, но как я понимаю СКАДА - это есть пользовательская программа, по которой оператор следит за режимом работы оборудования, линии и пр., изменяют уставки (если он имеет право на это), и в СКАДЕ вы уже установили уставки с запятой, а если у операторов на смене пользовательская программа только СИМАТИК, то составит большую трудность в инструктаже объяснять, что 193 это есть 19,3 кПа, а скажем 133, это есть 1,33 кПа. Надеюсь мы друг друга поняли. Теперь у меня вопросы.
1. Где и что можно почитать для самостоятельного изучения СКАДА-ситем.
2. Ваша Подпрограмма с функцией сравнения байтов работает на симуляторах, указанных в 1-й части по симатику, а вот принцип работы демо-версии симулятора во 2-й части не понятен мне. В МикроВине экспортирую программу, затем меняю в ней расширение .awl на .s7s,но запустить вашей демо-версией проект не получается,т.к. пишет, что демо-версия не предназначена для этого.
Ответить
0

[Автор]
tvilsa #
Оператор не работает с ПЛК из MicroWin (из него только программируют) что ты имеешь под словом СИМАТИК. Для оператора есть панели оператора или HMI на базе ПК с соответствующими скада системами. Поэтому оператор всегда видит то что ты ему нарисуешь.
1. По скада системам для начала посмотри статью HMI для S7-200. Рекомендую также поискать лекции по Protool от siemens. Я в основном использовал Protool, но сейчас при реализации очередного проекта с прискорбием обнаружил, что нельзя купить Protool. Вместо него используется WinCC flexible advantage. Но они очень похожи, разобрался быстро.
2. Этот демо симулятор хорош тем что не надо для него проектов. В настройках симулятора добавляешь пару виртуальных com портов. один из которых имеет номер порта ПЛК. Потом в MicroWin устанавливаешь соединение по заданному порту и делаешь поиск ПЛК. Таким образом симулятор создает как бы виртуальный ПЛК, с которым можно работать как с настоящим. Поэтому мой проект нужно открывать в микровине и конектиться с виртуальным ПЛК.
Ответить
0
Сергей #
Статью про HMI для TD200 освоил, сделал программу с аналоговым входом с округлением и переносом запятой! Отлично! Единственное, почему меркер М0.0 соответствует нажатию кнопки F1 и соответственно М0.3 это кнопка F4. Нигде я не нашел описание этого присвоения. Плюс не до конца понятен процесс заполнения 20 квадратиков в названии сообщения. Почему место резервируется (серые квадратики) в непонятном мне процессе. Приходилось оставлять 4 квадратика, затем писать название сообщения, и при этом меняется ячейка памяти VW, где храниться значение этого сообщения. Далее вопрос по таймерам: таймер Т37: 100мс, РТ=100, срабатывает только через 34 секунды. Таймер Т36:10мс, РТ=1000, срабатывает тоже через 34 секунды. Как я понимаю срабатывать они должны оба через 10 секунд. Таймеры использую как задержки времени на время 10-40 секунд. Поясните пожалуйста в чем различие?
Ответить
0

[Автор]
tvilsa #
Итак по порядку.
Соответствие меркеров нажатым кнопкам определяется на этапе конфигурирования панели в разделе настройки в выпадающем меню есть пункт "F-key should be set M-bits" , а над ним в каком конкретно меркере и после конфигурации в блоке данных под именем TD_DATA_0 можно посмотреть что есть такая строка //Set the Function Keys notification bits to M0.0 - M0.7, F-Keys configured to set M-bits. Т.е. мы определили что нажатие кнопок F1-F8 будут устанавливать меркеры M0 по порядку.
С квадратиками вроде тоже в статье понятно. В белые пишеш то что постоянно. Нажимаешь Embedded Data и выбираешь тип переменной (сбоку будет к какой ячейке памяти привязать переменную).
Вы где проверяли таймеры? В симуляторе? У меня еще и не так бывало :-) В реале все работает как надо. Симулятор не реал тайм, призадумывается.
А так ваши таймеры отличаются базой времени 10мс и 100мс и разной величиной 1000 и 100. Результат в реале будет одинаковым сработают через 10 сек.
Ответить
0
Сергей #
Спасибо. Таймеры только на симуляторе проверял. Попробую внимательнее изучить резервирование мест для сообщения.
Ответить
0
Дмитрий #
Спасибо, перечень статей очень полезен. Не могли бы вы показать как можно подключить энкодер к контроллеру для определения длины?
Ответить
0
Олег #
А как сделать что бы энкодер (Type 725/1/PP PPR 1000 ) считал в одну сторону, т.е. когда крутится в одну сторону? А то его туда сюда крутишь, по часовой что против, счёт увеличивается.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

FM-модуль RDA5807M
FM-модуль RDA5807M
Мультиметр Mastech MS8239C AVR-программатор USB ASP
вверх