Добрый день, хабровчане! Полазив по Хабру, мною было обнаружено всего несколько топиков, в котором упоминалось бы словосочетание «Simatic Step 7». Хочу поделиться с Вами небольшой частью информации, накопленной мною за все время работы с программируемыми логическими контроллерами, и показать, что из себя представляют ПЛК, оболочка и что мне приходилось на них строить.
Данный пост содержит общую ознакомительную информацию о программировании ПЛК Siemens.
- Введение
- Программируемые логические контроллеры Siemens
- Что из себя представляет Simatic Step 7?
- Вместо заключения
- Структурированный язык управления SCL
- Язык SCL
- Введение
- Описание языка
- Идентификаторы
- Структура программы
- Комментарии
- Перечислимые
- Временные
- Строковые
- Файловые
- Остальные
- Константы
- Способы задания констант
- Определение констант в программе
- Переменные
- Операторы
- Операции
- Операторы сравнения
- Оператор ожидания wait
- Оператор цикла loop
- Оператор цикла while
- Вывод информации report
- Функции
- Стимуляция регистров
- История регистра
- Чтение текстовых файлов
- Обработка строк
- Время
- Для отладки
- Работа с файлами
- Программирование
- Подключение программы SCL к симулятору
- Сложности отладки
- Недостаток операторов
- Доступ к регистрам контроллера
- Примеры
- Генератор 1 KHz
- Генератор программного UART
- Генератор аналогового сигнала
- Генератор DTMF
- Формат файла «data_dtmf.txt»
- Текст скрипта
- Заключение
Введение
Устроилась я в эту фирму еще на 5м курсе института. К слову, образование мое к программированию относится весьма косвенно и было это больше увлечением. Познания мои на тот момент ограничивались курсом Delphi и весьма базовым Ассемблером. Компания занималась (да и занимается) проектированием, строительством и обслуживанием грузоподъемных машин, таких как погрузчики, портальные, козловые, мостовые и прочие краны. К ГП машинам мое образование имело еще меньше отношения. Поэтому я решила попробовать. 🙂
Программируемые логические контроллеры Siemens
ПЛК фирмы Siemens — это промышленные контроллеры и используются для автоматизации технологических процессов. У нас, в частности, использовались для автоматизации работы грузоподъемных машин.
Simatic включает в себя несколько линеек ПЛК — Simatic S5 и Simatic S7. В свою очередь линейка Simatic S7 содержит семейства S7-200, S7-300, S7-400 и S7-1200.
Чаще всего мы использовали ПЛК семейств S7-300 и S7-400, для которых компанией Siemens было разработано собственное программное обеспечение Simatic Step 7.
Кроме этого, к ПЛК через сеть Profibus подключалось большое количество ведомых устройств, таких как частотные преобразователи, приводы, абсолютные/инкрементные энкодеры и пр.
Вся работа ГП машины по максимуму автоматизировалась и крановщику нужно применять минимум усилий для управления оной.
Что из себя представляет Simatic Step 7?
Главной утилитой является Step 7 — Simatic Manager, которая позволяет производить конфигурацию ПЛК и сетей (утилиты HWConfig и NetPro).
В процессе конфигурации определяется состав оборудования, способы подключения, используемые сети, адреса, выбираются настройки для используемых модулей. Готовая конфигурация загружается в ПЛК, что так же является настройкой оборудования.
Утилиты конфигурации позволяют осуществлять диагностику оборудования, обнаруживать аппаратные ошибки или неправильный монтаж.
ПЛК выполняет команды в порядке, определяемом программой, сверху вниз, затем начинает сначала.
С помощью редактора STL всегда можно посмотреть или отредактировать программы, созданные на LAD или FBD, обратное не всегда возможно.
Я работала с самого начала в STL, пробовала LAD, мне показался слишком непонятным и многие вещи таки не удавалась так просто в нем сделать, как в STL. Плюс еще в том, что при загрузке программы в ПЛК, она компилируется в STL и, соответственно, при выкачке ее из ПЛК на программатор она так же представлена в STL.
Вместо заключения
Программирование ПЛК занятие увлекательное, особенно когда это не стенд, а реальное оборудование.
Моя работа заключалась в создании программы на ПЛК для управления всей ГП машины либо отдельных ее частей, а так же загрузке программного обеспечения непосредственно в оборудование и его отладке.
Случалось разное, но работать с железом было очень интересно, хоть и не легко иногда.
А строили мы вот такие ГП машины:
Видео:Непонятный SCL. Урок 1Скачать
Структурированный язык управления SCL
1 Структурированный язык управления SCL Структурированный язык управления SCL (Structured Control Language) является языком программирования высокого уровня для SIMATIC S7. Язык базируется на стандарте DIN EN (часть «Structured Text» [«Структурированные тексты»]) и имеет сертификат совместимости с PLC Base Level [Базовый уровень] версии V4.01 при использовании интернациональных мнемоник (в данной книге изначально использованы мнемоники, принятые в Германии). Язык SCL оптимизирован для программирования программируемых контроллеров (PLC). SCL содержит в себе элементы языка Паскаль (Paskal) наряду с типичными для PLC элементами, такими, например, как «вход» («input») и «выход» («output»). SCL особенно подходит для программирования сложных алгоритмов или для задач, относящихся к области управления данными. Язык SCL поддерживает характерную для STEP 7 блочную структуру, а также позволяет создавать S7-программы, включающие в себя фрагменты на базовых языках программирования STL, LAD и FBD. Программное обеспечение S7-SCL является опционным (то есть, поставляемым по отдельному заказу) программным продуктом. ПО S7- SCL может быть поставлено вместе с базовым пакетом STEP 7 Basic Package. Описание S7-SCL в данной книге базируется на версии языка SCL V.5.1 При инсталляции ПО S7-SCL данный язык программирования полностью интегрируется с утилитой SIMATIC Manager и может после этого использоваться наряду с базовыми языками программирования (например, STL). Используя редактор SCL-программ, пользователь может создавать в S7-проекте исходные программы, которые он должен затем скомпилировать с помощью SCL-компилятора. Программа пользователя содержит скомпилированные SCL-блоки; эта программа, кроме того, может содержать скомпилированные блоки, написанные на других языках программирования. Пользователю также предоставляется возможность протестировать блоки, созданные с использованием языка SCL, в интерактивном (online) режиме в CPU с использованием отладчика SCL Debugger. Элементы языка SCL в синтаксисе инструкций отличаются от элементов других (базовых) языков программирования (имеются в виду операторы, выражения, присвоение значений). Однако, все они совместно используют типы данных, адресные области, символьные имена и блочную структуру. Используя управляющие операторы (control statements), пользователь может организовывать ветвление программы, выполнять программные циклы. С помощью использования операций переходов можно прерывать Automating with STEP 7 in STL and SCL 27-1
3 27 Введение. Элементы языка В данной главе рассматриваются требования, которые должны выполняться при программировании на языке SCL. В главе 2 «Программное обеспечение STEP 7» и в главе 3 «SIMATIC S7-программа» содержится детальное описание данного вопроса, поэтому Вы найдете здесь ссылки на эти главы. В главе 2 «Программное обеспечение STEP 7» предоставлено введение в вопросы, касающиеся средств программирования, таких как, редактор символов (symbol editor), редактор SCL-программ (SCL program editor), компилятор и отладчик. В главе также говорится о программноаппаратной среде программирования на языке SCL. В главе 3 «SIMATIC S7-программа» представлена структура программы пользователя. В главе описываются различные варианты выполнения программы, структура блоков, а также перечислены все требуемые для программирования блоков ключевые слова. Вы найдете там также введение в темы «адресация переменных» и «типы данных, поддерживаемые STEP 7». Примеры, рассматриваемые в данной главе, Вы можете найти на прилагаемой дискете в библиотеке STL_Book library в разделе «27 Language Elements» («Элементы языка») Интеграция с SIMATIC Инсталляция (установка) Инсталляция средств программирования на языке SCL требует наличия утилиты SIMATIC Manager соответствующей версии. SCL устанавливается посредством программы установки SETUP; при инсталляции всех поддерживаемых языков и примеров программирования для установки требуется около 8 Мб на жестком диске. Кроме того, Вам потребуется также выполнить авторизацию SCL (подтвердить права на использование), для чего служит специальная дискета. Automating with STEP 7 in STL and SCL 27-3
8 27. Введение. Элементы языка процессе выполнения программы. В пошаговом режиме Вы можете останавливать выполнение программы в точке прерывания и выполнять программу оператор за оператором, отслеживая состояние переменных (см. раздел 2.7 «Тестирование программы»). Таблица переменных (VAT) также может использоваться для тестирования SCL-программы. С помощью этой таблицы Вы можете устанавливать значения переменных и затем наблюдать при выполнении программы результаты таких назначений Адреса и типы данных Адресные области Адреса и переменные, применяемые при программировании на языке SCL, соответствуют адресам и переменным, применяемым при написании программ на стандартных языках программирования (см. раздел 1.5 «Адресные области»): входы I, выходы Q, меркеры M; периферийные входы PI; периферийные выходы PQ; адреса глобальных данных D; временные и статические локальные данные (только символьная адресация); организационные блоки ОВ, функциональные FB, функции FC как с возвращаемым значением, так и без него; блоки данных DB. Функции таймеров Т и функции счетчиков С обрабатываются в SCLпрограммах как «стандартные функции» (см. раздел 30.1 «Функции таймеров Т» и раздел 30.2 «Функции счетчиков С»). Примечание: Адреса глобальных данных имеют отличающиеся адресные идентификаторы по сравнению со стандартными языками программирования. Более подробное изложение вопроса, посвященного адресным идентификаторам в SCL, представлено в разделе «Абсолютная адресация». В SCL функции, которые возвращают «значение функции», могут использоваться в выражениях как адреса. Типы данных Назначение типа данных определяет: тип и значение (компонентов) данных (например, integer [целая], character string [строка символов]); разрешенные диапазоны (например, числовой диапазон, длина строки символов); разрешенные операции, допустимые для обработки данных определенного типа; 27-8 Automating with STEP 7 in STL and SCL
13 27. Введение. Элементы языка В языке программирования SCL доступ к адресам глобальных данных возможен только способом полной адресации. Блок данных может быть переменной типа BLOCK_DB (см. также раздел «Косвенная адресация в SCL»). Примечание: В SCL не допускается присутствие разделителей (типа «пробел» или «табуляция») между адресом и идентификатором адреса. Различия по сравнению со стандартными языками программирования: в SCL не применяется абсолютная адресация временных и статических локальных данных; вызов блока данных с частичным адресом невозможен; вычисление номера и размера глобального экземплярного блока данных невозможно Символьная адресация При символьной адресации символьные имена должны быть назначены абсолютным адресам и переменным. Для глобальных данных имена назначаются в таблице символов; для локальных данных имена назначаются в разделе объявления переменных блока. Символьная адресация в SCL соответствует символьной адресации в стандартных языках программирования (см. раздел 3.3 «Адресация переменных»). Может иметь место также использование смешанных абсолютно-символьных (mixed absolute/symbolic) идентификаторов, например таких: DB10.Setpoint «Motor1Data».DW12 Данные идентификаторы допустимы для доступа к глобальным данным с использованием полного адреса. В SCL Вы можете назначать имена константам в разделе объявления блока и использовать в программе эти имена как символы Косвенная адресация в SCL Косвенное назначение глобальных адресов Косвенное использование глобальных адресов основывается на абсолютной адресации. При этом для указания расположения данных в памяти в квадратных скобках указывается переменная INT (две переменные INT в случае адресации бита): I[byteindex.bitindex]; MB[byteindex], где byteindex и bitindex являются константами или переменными, которые могут быть изменены в процессе обработки программы, или выражениями типа INT. Automating with STEP 7 in STL and SCL 27-13
14 27. Введение. Элементы языка Таким способом Вы можете адресовать следующие области: периферийные входы PI и периферийные выходы PQ (в обоих этих случаях адрес бита не указывается); входы I, выходы Q, меркеры M; адреса глобальных данных D (блок данных и адрес данных); временные и статические локальные данные (только символьная адресация); Функции таймеров Т и функции счетчиков С (для обоих этих функций адрес бита не указывается). Косвенное назначение адресов глобальных данных Косвенное использование адресов глобальных данных основывается на абсолютной адресации, но при этом адреса данных также как адреса блоков данных могут быть изменены в процессе обработки программы. Вы можете использовать или абсолютный адрес или символьный адрес для блока данных: DB10.DX[byteindex.bitindex]; MotorData.DW[byteindex], где byteindex и bitindex являются константами или переменными, которые могут быть изменены в процессе обработки программы, или выражениями типа INT. Применяя функцию преобразования WORD_TO_BLOCK, Вы можете назначить косвенный адрес блоку данных. Номер блока данных DB определяется либо как переменная, либо как выражение с типом данных WORD (см. пример на рис. 27.2). WORD_TO_BLOCK_DB[dbindex].DW0, где dbindex является переменной, которая может быть изменена в процессе обработки программы, или выражением с типом данных WORD. Если блок данных адресован косвенным способом, то для доступа к адресу данных не может использоваться символьное имя. Обращение к адресам данных с помощью параметра блока BLOCK_DB Если к блоку данных возможен доступ через параметр блока BLOCK_DB, то обращение к адресам данных в блоке может быть организовано и абсолютным, и косвенным способом (см. рис. 27.2). Пусть входной параметр Data имеет тип BLOCK_DB: Data.DW0; Data.DX2.0; Data.DW[byteindex]; Data.DX[byteindex.bitindex], где byteindex и bitindex являются константами или переменными, которые могут быть изменены в процессе обработки программы, или выражениями типа INT Automating with STEP 7 in STL and SCL
15 27. Введение. Элементы языка Если блок данных адресован через параметр блока BLOCK_DB, то для доступа к адресу данных не может использоваться символьное имя. //************************************************************************* //Пример косвенного использования глобальных адресов k := 120; FOR i := 48 TO 62 BY 2 DO MW[k] := PIW[i]; k := k + 2; END_FOR; //************************************************************************* //Косвенная адресация блоков данных //Индекс DB имеет тип данных WORD M0.0 := WORD_TO_BLOCK_DB(dbindex_w).DX0.0; M0.0 := WORD_TO_BLOCK_DB(dbindex_w).DX[byteindex,bitindex]; //Индекс DB имеет тип данных INT M0.0 := WORD_TO_BLOCK_DB(INT_TO_WORD(dbindex_i)).DX0.0; M0.0 := WORD_TO_BLOCK_DB(INT_TO_WORD(dbindex_i)).DX[byteindex,bitindex]; //************************************************************************* //Косвенная адресация посредством параметра блока // Для имени «Data» и параметра с типом BLOCK_DB M0.0 := Data.DX0.0; //абсолютная адресация M0.0 := Data.DX[byteindex,bitindex]; //косвенная адресация //************************************************************************* Рис Пример косвенного использования глобальных адресов Адресация массивов В SCL в качестве индекса массива Вы можете использовать или константу, или переменную, или выражение типа INT, поэтому индекс может быть изменен в процессе выполнения программы. Вы можете также организовать доступ к части массива как к переменной (см. раздел «Присвоение значений массивам»). При предопределении массивов отдельным размерностям массивов могут назначаться множители повторения Операторы Выражения обеспечивают получение определенных значений. Выражение может включать в себя один адрес (идентификатор) данных (одну переменную) или несколько адресов (идентификаторов) данных (несколько переменных), которые объединяются с помощью операторов. Automating with STEP 7 in STL and SCL 27-15
17 27. Введение. Элементы языка инвертирования. Выражение может содержать адреса (идентификаторы) данных (переменные), объединенные в группы с помощью операторов. Сами выражения могут объединяться в группы с помощью операторов; при этом такие комбинированные выражения могут иметь очень сложную структуру. Порядок выполнения операторов в выражении обычно регулируется с помощью скобок. Результат, полученный при выполнении выражения, может быть присвоен переменной или параметру блока, или этот результат может быть использован для проверки критерия условия в инструкции управления (control instruction). Выражения могут быть разделены в соответствии со способом объединения (комбинирования) данных на арифметические выражения, логические выражения и выражения сравнения Арифметические выражения Арифметическое выражение или состоит из численного значения или оно объединяет два значения или выражения с помощью арифметических операторов. Пример: Voltage * Current В таблице 27.5 представлен перечень допустимых типов данных для арифметических выражений, а также для результатов арифметических выражений. Спецификация класса типов данных ANY_NUM означает то, что тип данных первого и второго операнда может относиться к типу данных INT, DINT или REAL. Если Вы объединяете с помощью оператора операнд типа INT с операндом типа DINT, то результат должен быть типа DINT; если Вы объединяете с помощью оператора операнд типа INT или DINT с операндом типа REAL, то результат должен быть типа REAL. Перед тем как сформировать исполняемый блок, редактор выполняет (незаметно для пользователя) преобразование данных, то есть приводит данные из выражения к требуемому типу (см. также таблицу 30.4 «Функции неявного преобразования (Implicit Conversion Functions)»). В случае операции деления, второй операнд (делитель) не должен быть равным нулю. На рис представлен пример арифметических выражений в сочетании с выражением присвоения значений Выражения сравнения Выражение сравнения сравнивает значения двух операндов и выдает результат в виде булева значения; если условие сравнения выполняется, Automating with STEP 7 in STL and SCL 27-17
20 27. Введение. Элементы языка Пример: Automatic AND NOT Manual_on Логическое выражение также включает в себя (булево) инвертирование; эта операция аналогична изменению знака значения. Логическое выражение выдает значение, относящееся к классу типов данных ANY_BIT. Результат логического выражения относится к типу BOOL, если оба операнда также имеют тип BOOL. Если один или оба операнда имеют тип BYTE, WORD или DWORD, то результат будет иметь тип данных более «требовательного к памяти» операнда. На рис представлены несколько примеров логических выражений в сочетании с выражениями присвоения значений Присвоение значений С помощью операции присвоения значения одна переменная получает значение другой переменной или значение выражения. Слева от оператора присваивания «:=» находится переменная, которая принимает значение другой переменной или выражения, которые в свою очередь находятся справа от оператора присваивания. Тип данных, находящихся с двух сторон от знака присваивания, должен быть идентичен. Исключение составляет только случай присваивания в функции «неявного изменения типа данных» («Implicit data type conversion»): если тип данных переменной характеризуется по крайней мере таким же размером в битах или имеет больший размер в битах, чем тип данных выражения, то тип данных выражения «неявно» конвертируется (значение выражения автоматически конвертируется в требуемый тип данных и присваивается переменной). Другими словами, «неявное изменение типа данных» (с помощью функции преобразования типа данных) является необходимым Присвоение значений в случае простых типов данных С помощью операции присвоения значение константы, переменной, адреса или выражение может быть присвоено переменной или адресу (см. рис. 27.3). Абсолютные адреса (например, MW 10) имеют тип данных ANY_BIT; они имеют тип данных, определяемый размером занимаемой области (типы BOOL, BYTE, WORD, DWORD). Если Вы хотите назначить значение отличающегося типа данных абсолютному адресу, то используйте преобразование типа данных, или назначьте этому адресу имя и требуемый тип данных в таблице символов Присвоение значений переменным типов DT и STRING Каждой DT-переменной может быть назначено значение другой DT Automating with STEP 7 in STL and SCL
21 27. Введение. Элементы языка переменной или DT-константы. Каждой STRING-переменной может быть назначено значение другой STRING-переменной или строки символов. Если назначаемая строка символов длиннее, чем переменная, стоящая слева от оператора присваивания, то на этапе компиляции пользователь получит предупреждающее сообщение. Нельзя выполнять предопределение в разделе объявления в области временных локальных данных. Если Вы используете функции обработки STRING-операндов, например, IEC-функции, с помощью которых STRINGпеременная проверяется (так, как выходной параметр), то Вы должны запрограммировать предопределенное выходное значение Присвоение значений структурам С помощью операции присвоения одной STRUCT-переменной может быть назначено значение другой STRUCT-переменной только в том случае, если: структуры этих данных согласованы; компоненты структур согласованы с точки зрения типов данных; компоненты структур согласованы с точки зрения имен. Отдельные компоненты структур могут быть обработаны как переменные одного типа данных; например, значение компонента структуры Motor1.Setpoint типа INT может быть присвоено другой INT-переменной, или какое-либо целое (INT) значение может быть присвоено данному компоненту структуры Присвоение значений массивам С помощью операции присвоения одной ARRAY-переменной может быть назначено значение другой ARRAY-переменной только в том случае, если согласованы типы данных элементов этих массивов, а также граничные значения индексов (наименьшее и наибольшее значения) в каждой размерности, а также число размерностей для этих массивов совпадают. Отдельные компоненты массивов могут быть обработаны так же как переменные соответствующего типа данных. В случае использования массивов с несколькими размерностями, Вы можете работать с частями массивов как с массивами соответствующей размерности (ARRAY-переменными соответствующей размерности): если отбрасывать те или иные индексы массива, то можно получать массивы с меньшей размерностью по сравнению с исходным массивом данных. Пример: пусть исходный массив задан следующим образом: Field1 : ARRAY [1..8,1..16] OF INT; Таким образом, массив Field1 представляет собой двумерный массив. Automating with STEP 7 in STL and SCL 27-21
22 27. Введение. Элементы языка Исходя из условий данного примера, Вы можете: обращаться к массиву в целом, используя идентификатор Field1; обращаться к части массива, используя идентификатор Field1[i] (что соответствует строке матрицы); обращаться к элементу массива, используя идентификатор Field1[i,j]. Вы можете также присваивать часть массива Field1[i] другому массиву (то есть, другой ARRAY-переменной), имеющему соответствующую размерность, например: Field12 := Field1[i], где: i может принимать значения от 1 до 8; массив Field2 объявлен следующим образом: Field2 : ARRAY [1..16] OF INT; Automating with STEP 7 in STL and SCL
Видео:Разбор программы написанной на SCL. Tia Portal v16Скачать
Язык SCL
Виктор Тимофеев, ноябрь 2009
osa@pic24.ru
Видео:SCL 1. Введение и первая программаСкачать
Введение
Интегрированная среда MPLAB IDE имеет в своем составе встроенный симулятор, который позволяет отлаживать программу еще до программирования микросхемы. Для приближения к реальным условиям MPLAB предоставляет возможность имитировать входные сигналы с помощью встроенного инструмента Stimulus. С помощью него можно имитировать уровни на портах ввода вывода и значения регистров, причем можно привязывать эти события ко времени, к состояниям или изменениям состояний портов и регистров. Для этого интегрированной средой MPLAB предоставляется диалоговое окно (доступно через меню «Debugger/Stimulus»), в котором пользователю предлагается задать внешние воздействия.
Однако, когда нужно задать сигнал сложной формы, или довольно много внешних воздействий, связанных между собой во времени и состояниях, вводить имитируемые сигналы через диалоговое окно становится трудно и неудобно. Даже простая задача, например, имитация сигнала в виде манчестерского кода вызывает большие трудности из-за большего объема данных, которые требуется ввести (особенно трудности вызывает подсчет времен для асинхронной стимуляции).
Возможно, при описании я что-то не учел, что-то описал неполно, а где-то допустил ошибку. Не стесняйтесь ругаться, если обнаружите неточности. Если у кого-то будет какое-то сущетвенное дополнение, я обязательно внесу его в это пособие (некоторые моменты, такие как определение пользовательских типов, я умышленно не стал здесь упоминать из-за их, на мой взгляд, ненадобности и малозначимости в SCL-программах).
Помимо самой этой статьи, я бы рекомендовал ознакомиться с двумя ветками на форуме microchip.com (на английском языке):
В том же форуме по разным темам разбросаны еще несколько примеров, но я в своей статье постарался объединить все затрагиваемые там вопросы.
Видео:Что представляет из себя язык STL?Скачать
Описание языка
Видео:Siemens STL 01 - Задача на собеседованииСкачать
Идентификаторы
Идентификаторы должны начинаться с латинской буквы и могут содержать латинские буквы, цифры и знак подчеркивания. Пример правильных идентификаторов:
Имена идентификаторов чувствительны к регистру. Имена идентификаторов не могут совпадать с зарезервированными словами.
Видео:TIA Portal LD/FBD/SCLСкачать
Структура программы
Основное тело программы заключено в операторные скобки testbench:
(Для блока configuration я нашел только одно применение, о нем будет сказано в разделе Функции: Стимуляция регистров. Во всех остальных случаях его можно и не ставить.)
Само тело программы состоит из процессов, которые выполняются параллельно, но могут быть синхронизированы друг с другом:
Тело процесса выполняется по кругу. Если его нужно выполнить только один раз, то в конце можно поставить оператор wait без параметров.
Видео:Практикуемся в языке программирования SCl TIA-portalСкачать
Комментарии
Комментарии в языке SCL могут начинаться с «—«, как в VHDL, или с «//», как в Си. Все, что следует за символами «—» или «//» считается комментарием и игнорируется при трансляции.
Язык SCL является строго типизированным, т.е. в нем не допускается смешение типов в одной операции (например, нельзя присваивать переменной типа integer переменную типа bit; или нельзя суммировать переменную типа byte с переменной типа time).
На данный момент язык SCL поддерживает следующие типы данных:
Перечислимые
integer | 32-битное целое знаковое |
byte | = integer |
word | = integer |
boolean | Логический тип, может принимать значения true или false |
bit | Битовый тип, может принимать значения ‘0’ или ‘1’ |
character | Символьный. |
paddress | Адрес в памяти программы. 24-битовое беззнаковое целое. |
daddress | Адрес в памяти данных. 24-битовое беззнаковое целое. |
Временные
time | Временной. Знаковое 64-битное целое, задается в пикосекундах. Однако можно указать другие единицы измерения: ns, us, ms, sec, min, hr. |
cycle | Схожий с временным типом, только время задается в циклах. Задается в виде числа с указанием единиц измерения ic (instruction cycle). |
frequency | Частотный. Задается в герцах (от 0 до 1e9). Может задаваться с явным указанием единиц измерения: hz, khz, mhz. |
Строковые
string | Текстовая строка. Представляет собой массив character’ов (type string is array (integer range ) of character;). Применяется для вывода информации по ходу симуляции |
line | Строка для обработки данных. Может быть прочитана из файла и обработана. |
Файловые
text | Файловый. Применяется для чтения файлов (запись через этот тип произвести не удается). |
file_open_kind | Тип открываемого файла. Может принимать значения: read_mode, write_mode, append_mode. (Удалось заставить работать только в режиме read_mode) |
file_open_status | Состояние открытого файла. Может принимать значения: open_ok, status_error, name_error, mode_error |
Остальные
severity_level | тип сообщения в операторе report. Может принимать значения: note, warning, error, failure. |
array | позволяет определять массивы. Но в настоящее время толку от них мало, т.к. нет возможности обращаться к элементу массива по индексу |
bit_vector | массив битов. Также нет возможности обращаться к элементам по индексу |
record | Структура. Позволяет обращаться к битовым переменным SFR (например, ADCON.ADON). |
Видео:Тренировка SCL TIA Portal. Challenge от автора ))Скачать
Константы
Способы задания констант
Целые числа можно задавать с указанием системы счисления или без нее (по умолчанию число считается записанным в десятичной системе):
система_счисления#число# Причем поле «число» может содержать не только цифры (и буквы A,B,C,D,E,F), но и символ подчеркивания ‘_’, что очень удобно для более наглядного представления длинных чисел. Например, число 168 можно записать так:
Времена можно задавать в виде целого или вещественного числа с указанием единиц измерения:
причем, как уже упоминалось, времена могут обозначаться как положительными, так и отрицательными числами.
Определение констант в программе
Константы определяются внутри процесса перед операторными скобками begin … end с ключевым словом constant и указанием типа и значения:
Видео:SCL 2. Классы и типы переменных / Преобразование типов / Цикл FORСкачать
Переменные
Определение файловых переменных производится с ключевым словом file :
Видео:Программирование ПЛК Simatic (Siemens). Программа "Светофор" Step 7Скачать
Операторы
Операции
Операторы сравнения
Оператор ожидания wait
Есть четыре применения этого оператора:
Время может быть указано как в виде константы, так и в виде переменной.
Обращу внимание на то, что если на момент начала выполнения wait until условие выполняется, то это не считается событием. Например, «wait until RB0 == ‘1’» будет ожидать не единичное состояние, а переход ‘0’→’1′. Т.е. если на момент выполнения wait у нас RB0 уже в состоянии ‘1’, то это не считается уже случившимся событием и оператор wait будет ждать сначала перехода ‘1’→’0′, а потом ‘0’→’1′.
Оператор цикла loop
Цикл будет выполняться бесконечно. Прервать его выполнение можно оператором exit (безусловное прерывание) или exit when … (условное):
Оператор цикла while
Цикл похож на предыдущий, но с предустановленным условием выполнения. Например, цикл из предыдущего примера выглядел бы так:
Вывод информации report
выведет следующую последовательность сообщений:
Обратим внимание, что последняя строка уже не выводится, т.к. severity failure прервало работу скрипта.
Видео:Мой скромный опыт программирования / Поддержите идею курса по SCLСкачать
Функции
На данный момент мне известны следующие функции:
Стимуляция регистров
accessin (FileName: string, FileMode: mode, Reg: register, Wrap: boolean) |
Параметры:
Типы файла:
triggerin (FileName: string, FileMode: mode, Reg: register, PC: paddress, Wrap: boolean) |
Параметры:
Если значение PC указывается в виде имени функции, то это имя должно быт ьобъявлено в секции configuration с ключевыми словами shared label (нечто вроде extern в Си).
Пример:
packetin (Data: line, Reg: register, Wrap: boolean) |
Параметры:
Пример стимулирования принятых данных по UART:
История регистра
accessout (FileName: string, FileMode: mode, Reg: register, Wrap) |
Параметры:
triggerout (FileName: string, FileMode: mode, Reg: register, PC: paddress) |
Параметры:
FileName Имя файла FileMode Тип файла: hex_mode, dec_mode, binary_mode, formatted_mode (см. выше) Reg Наблюдаемый регистр PC Значение программного счетчика, при котором производить запись значения регистра в файл (может быть указан в виде имени функции)
Пример:
Параметры:
FileName Имя файла FileMode Тип файла: hex_mode, dec_mode, binary_mode, formatted_mode (см. выше) GPR Имя переменной PC Значение программного счетчика, при котором производить запись значения регистра в файл (может быть указан в виде имени функции) Size Количество байт на одну запись (в текстовом режиме будут разделены пробелами)
Для того, чтобы скрипт знал имя используемой переменной, ему нужно его сообщеть в секции configuration c ключевыми словами shared variable :
Пример:
Чтение текстовых файлов
file_open (Status: file_open_status, F: text, Name: string, Kind: file_open_kind |
Параметры:
Status в эту переменную будет записан результат открытия файла (open_ok, status_error, name_error, mode_error) F файловая переменная Name имя файла в текстовом виде Kind режим работы файла (read_mode,write_mode,append_mode). Хоть SCL и позволяет открывать файлы в режимах write и append, и даже создает файлы с указанным именем на диске, но произвести запись в эти файлы так и не удалось. Так что на сегодняшний день реально из файлов можно только читать.
Пример:
Параметр:
F файловая переменная
Пример:
Параметр:
F файловая переменная
Пример:
Параметр:
F файловая переменная Data переменная, куда будет помещена прочитанная строка
Пример:
Обработка строк
Параметры:
Line здесь содержится строка, начало которой мы проверяем Pattern здесь находится шаблон для сравнения
Пример:
Параметры:
Line Исходная строка Data Переменная, куда будет помещен результат
Пример:
Время
Пример:
random_time (LowerLimit: integer, UpperLimit: integer, Units: string, Seed1: integer, Seed2: integer, Result: time) |
Параметры:
LowerLimit Нижний предел UpperLimit Верхний предел Units Единицы измерения («»ps», «ns», «us», «ms», «sec», «min», «hr») Seed1, Seed2 параметры генератора случайных чисел (в самом простом случае можно задать любыми ненулевыми значениями) Result Результат работы функции
Пример (генератор шума):
Для отладки
Параметры: эта функция может принимать не более 5 параметров различных типов: line, string, integer, character, boolean, bit, time, cycle.
Пример:
Видео:TIA Portal за час!Скачать
Работа с файлами
Мы уже упоминали функции для стимуляции регистров значениями из файлов (assignin, triggerin). Эти функции при своей простоте имеют недостатки:
Рассмотрим порядок обработки файла data.txt следующего содержания (задача взята наобум):
Сначала мы обнуляем значения регистров PORTA и PORTB. Через 10 мс отправляем данные по USART, после чего устанавливаем порты в значения PORTA = 0x10, PORTB = 0xFF. А еще через 10 мс порты снова обнуляются.
Отметим одно важное свойство: с одним и тем же файлом параллельно могут работать несколько процессов.
Видео:Условные операторы. Непонятный SCLСкачать
Программирование
В этом параграфе рассмотрим некоторые особенности и сложности работы с SCL файлами при работе с интегрированной средой MPLAB.
Подключение программы SCL к симулятору
После того, как программа генерации входных сигналов написана, нам нужно ее подключить. Для этого нужно (действия для версии MPLAB 8.xx):
Сложности отладки
Работая с SCL-файлами, желательно, чтобы на виду было рабочее окно «Output» с открытой вкладкой «MPLAB SIM». Все сообщения об ошибках, а также вся отладочная информация, формируемая самим SCL-скриптом (print и report) будут выводиться в это окно. Чем нам MPLAB IDE помогает при отладке? Во-первых, он обеспечивает подсветку синтаксиса для файлов SCL, что позволяет избежать некоторых малозаметных помарок. Во-вторых, при прикреплении SCL-файла в окно «Output» выводится информация с номером строки, содержащей ошибку, и тип ошибки (здесь он довольно скуп на сообщения и чаще всего пишет «syntax error»); кроме того, двойным щелчком мышки по сообщению в окне «Output» мы попадаем на строку с ошибкой в исходном файле.
Я бы рекомендовал подключать файл SCL еще на начальном этапе программирования. Т.е., сначала создаем пустой файл:
потом подключаем его по описанному выше алгоритму, убеждаемся, что он подключился (в окне Output должно появиться сообщение «Stimulus: SCL file attached successfully.»). Теперь можно писать SCL-скрипт, причем для проверки того, что все написано правильно уже не нужно делать «Detach/Attach», а достаточно всего лишь нажать кнопку F6 (Reset при отладке). По этой кнопке файл SCL автоматически перезагружается и проходит повторную проверку. В окне Output будут появляться сообщения об ошибках, если они есть, или ничего не будет появляться, если ошибок нет. (Когда ничего не появляется, это несколько настораживает, поэтому я во все свои SCL-скрипты встраиваю такой процесс:
Если нет ошибок, то по нажатию F6 в окне Output будет появляться надпись «SCL-file loaded OK.»)
Недостаток операторов
Во-первых, у нас нет возможности использовать сложные выражения в условных операторах. Мы не можем написать:
Нам придется делать вложенные условия:
Это немного усложняет структуру программы, т.к. появляется очень много операторных блоков.
Кроме того, сильно огорчает отсутствие выделения битовых полей. Например, мы не можем воспользоваться операцией and :
Примерно так же решается задача сдвига с извлечением младшего бита:
Доступ к регистрам контроллера
Во время выполнения SCL-скрипта у нас есть возможность обращаться к регистрам контроллера. Мы можем получить текущее значения программно счетчика, значение регистра FSR, значения таймеров, регистров управления модулем CCP и т.д. Здесь я особо глубоко исследования не проводил. Но с сожалением должен заметить, что не все регистры можно прочитать. Например, на это:
парсер ругается «Type error in assignment». В то время как значения остальных регистров прочитать таким образом удается. (Также не читаются TRISx, TXREG и еще некоторые периферийные регистры). В принципе, это не страшно, т.к., во-первых, операция чтения регистра PORTA довольно редкая, а во-вторых, ее можно заменить побитовым заполнением:
Встроенный в MPLAB симулятор сам накладывает кое-какие ограничения. Их поиском я не занимался, а когда и натыкался на них, то старался обходить, при этом, к сожалению, не отмечая для себя на будущее. По отзывам с форума на microchip.com есть ограничения на стимуляцию регистров АЦП для dsPIC’ов, но я лично не проверял.
Примеры
Здесь приведу несколько примеров готовых скриптов. Сначала совсем простые, потом посложнее. Основная цель, которую я преследовал, выбирая задачи для скриптов, не в том, чтобы их можно было использовать для отладки ваших программ, а в том, чтобы, глядя на них, у вас сложилось более четкое представление о структуре скрипта, порядке его работы и о его возможностях.
Генератор 1 KHz
В результате работы данного скрипта мы получим такой сигнал на входе RB0:
Можем его немного усложнить, добавив управление из самой отлаживаемой программы:
Теперь в программе для микроконтроллера, устанавливая порт RB1 в «1», мы включаем генерацию на RB0 из SCL-скрипта. Для примера была написана небольшая программа, которая формирует на выводе RB1 меандр частотой 50 Гц для управления генератором. На графике видно, что как только на RB1 появляется «1», скрипт начинает генерировать на вход RB0 меандр частотой 1 КГц.
Генератор программного UART
Большинство контроллеров PIC младшего и среднего семейства имеют на борту всего один аппаратный USART-модуль, но часто бывает нужно управлять двумя и более устройствами посредством этого интерфейса. При отладке программы хорошо бы убедиться в том, что прораммный UART-приемник работает корректно. Вот пример скрипта, который генерирует на вход ПИКу сигнал UART. Скорость выбирается пользователем (по умолчанию 9600), данные берутся из файла.
Пример исходного файла data_uart.txt:
В добавок, данный пример является некоей иллюстрацией синхронизации двух процессов через внутреннюю переменную. Скрипт разбит на два процесса: один читает файлы и формирует данные для генерации сигнала, а второй формирует сам сигнал. Процессы выполняются параллельно. В конкрентом случае можно было обойтись и без разделения программы на два процесса, т.к. у нас всего один процесс (и только в одном месте) запускает второй. Но в общем случае это может оказаться полезным, когда:
Для синхронизации служит общая переменная UART_Work. Когда она = 0, процесс отправки байта свободен. Для отправки байта головной процесс должен подготовить данные для отправки (записать нужное значение в UART_Data), а потом установить UART_Work в «1», тем самым сообщив процессу отправки, что можно начинать работать. Процесс отправки сам обнулит эту переменную, когда байт будет полностью передан, сообщем тем самым основному процессу, что передатчик вновь свободен.
Ниже приведен график генерируемого сигнала. На нем отчетливо видно, что данные передаются двумя пакетами с интервалом 3 мс.
Генератор аналогового сигнала
Симулятор в интегрированной среде MPLAB IDE не позволяет имитировать разные уровни напряжения на аналоговых входах. Однако он позволяет симулировать регистры ADRESH и ADRESL напрямую. Этим мы можем воспользоваться для имитации аналоговых сигналов.
Ниже приведен пример, который будет заполнять регистры ADRESH:ADRESL значениями из файла. Это будет происходить в тот момент, когда программа будет обращаться к АЦП. Это пример является только демонстрацией необходимых действия для формирования регитсров ADRES, он не подходит для практического применения, поскольку входные данные синхронизированы только с обращениями программы к АЦП. Т.е. если обращений не будет, то и сигналы формироваться не будут (или другими словами: когда бы мы не обратились к АЦП, мы всегда прочитаем один и тот же сигнал). На практике такое не встречается.
Генератор DTMF
Итак, как уже было сказано, для практического применения предыдущий пример не очень подходит. Представьте, что нам нужно оцифровать и распознать DTMF сигнал. Для этого нам нужно точно вымерять моменты обращения к АЦП, а если скрипт синхронизирован только с самим обращением, то он будет работать при любых условиях. В новом примере мы создадим реальную модель аналогового сигнала, по которой уже можно будет отлаживать программу.
Скрипт будет состоять из 4-х процессов:
(Примечание: еще добавлены пятый процесс, в который для удобства вынесены объявления глобальных переменных, и шестой, который содержит строку «SCL loaded OK!»)
Формат файла «data_dtmf.txt»
freq Генерировать синус частоты f на канале c (c = 1 или 2) stop остановить генерацию (отключает оба канала) duration задать длительность тонов (по умолчанию 100 мс) pause
задать паузу между тонами (по умолчанию 100 мс) level задать уровень сигнала от 0% до 100% (по умолчанию 100%)
Также допускается использование комментариев
Пример рабочего файла:
Вот отчет его обработки:
Текст скрипта
Наконец, сам скрипт:
(файл с таблицей синуса прилагается sinus.rar)
Ниже приведен фрагмент графика сигнала, сформированного данным скриптом для команды «1» (697 Гц + 1209 Гц):
Заключение
Виктор Тимофеев, ноябрь, 2009
osa@pic24.ru