Андрей Смирнов
Время чтения: ~24 мин.
Просмотров: 160

Fbd

Введение

  • C — слишком низкоуровневый и небезопасный
  • C++ — по наследству получил много недостатков низкоуровневости, появились новые способы выстрелить себе в ногу, отсутствие рефлексии
  • D — сборщик мусора, отдельные ссылочные типы
  • Java — сборщик мусора, все композитные типы ссылочные, сильная завязанность на виртуальную машину. Многое и этого применимо и к языках на основе JVM.
  • C# — недостатки во многом аналогичны Java
  • Rust — необходимость явного взятия ссылок и явного их разыменования, (субъективно) опасность подхода, когда всё есть выражение и возвращает результат, наличие явного указания соответствия протоколу, отсутствие наследования
  • Go — сборщик мусора, отсутствие шаблонов
  • Swift — ссылочные типы, необходимость явного указания соответствия протоколу

Что делает C компилятор

объектный файл

  • код, соответствующий функции в C файле
  • данные, соответствующие глобальных переменных в C файле (для инициализированных глобальных переменных начальное значение переменной тоже должно быть сохранено в объектном файле).

Анализирование объектного файла

портированные под WindowsGNU binutils

  • Класс U обозначает неопределённые ссылки, те самые «пустые места», упомянутые выше. Для этого класса существует два объекта: и . (Некоторые версии могут выводить секцию, которая была бы или в этом случае.)
  • Классы t и T указывают на код, который определён; различие между t и T заключается в том, является ли функция локальной (t) в файле или нет (T), т.е. была ли функция объявлена как . Опять же в некоторых системах может быть показана секция, например .
  • Классы d и D содержат инициализированные глобальные переменные. При этом статичные переменные принадлежат классу d. Если присутствует информация о секции, то это будет .data.
  • Для неинициализированных глобальных переменных, мы получаем b, если они статичные и B или C иначе. Секцией в этом случае будет скорее всего .bss или *COM*.

Операторы

Арифметические операторы

Все арифметические операторы часто называют математическими операторами, потому что они представляют собой математические действия. Результатом всегда будет результат математического выражения.
+ (сложение)
— (вычитание / отрицание)
* (умножить)
** (показатель)
/ (деление)
MOD (остаток от деления)

Пример

15 MOD 4
//Результат: 3

Операторы сравнения

Для сравнения или нахождения соотношения между двумя значениями, вы можете использовать один из реляционных операторов.Они используются для сравнения и результатом будет логическое значение (логического типа), либо ИСТИНА, либо ЛОЖЬ.

  • = (равно)
  • < (меньше)
  • <= (меньше или равно)
  • > (больше)
  • >= (больше или равно)
  • <> (не равно)

Пример

TEMPERATURE := 93.9;
TEMPERATURE >= 100.0
// Результат: FALSE

Логические операторы

Если вы хотите сравнить логические значения (BOOL) и сделать некоторую логику из него, вы должны использовать логические операторы. Эти операторы также дает логическое значение ИСТИНА или ЛОЖЬ в результате выражения.

  • & Или OR
  • AND
  • XOR
  • NOT

Пример

LIMIT_SWITCH1 = TRUE;
LIMIT_SWITCH2 = false;
LIMIT_SWITCH1 OR LIMIT_SWITCH2
// Результат: True

Побитовые Операторы

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

  • & Или OR
  • AND
  • XOR
  • NOT

Пример

15 AND 8
// Результат: 15

Данная операция побитовая. Таким образом, чтобы понять, что здесь происходит, вы должны преобразовать числа в двоичные значения:
15 = 1111
8 = 1000
Теперь каждый бит в числе 1111 (15) может быть использован в логической операции с другим числом 1000 (8):
1111 AND 1000

3.4 Описание выходных секций

Команда SECTIONS непосредственно указывает место расположения
выходных секций, их порядок в результирующем файле и некоторые
тонкости их размещения. Вы можете использовать только одну команду
SECTIONS в скрипте, но Вы можете определить столько выражений внутри
нее, сколько захотите. Выражения внутри команды SECTIONS могут делать
одну из трех вещей:

  • определять точку входа
  • присваивать значение символу
  • описывать размещение именованных выходных секций, и какие
    входные секции пойдут в них.

Если Вы не используете команду SECTIONS, линкер размещает каждую
входную секцию в выходную секцию с тем же названием в том порядке, в
каком секции впервые встретились во входных файлах. Например, если все
входные секции присутствуют в первом файле, порядок секции в выходном
файле будет идентичен их порядку в первом входном файле.

Описание секций

Наиболее часто используемые выражения в команде SECTIONS — это
описания секций, которые определяют их свойства в выходных секциях:
расположение, выравнивание, содержание, образец заполнения и целевой
регион памяти. Большинство из этих описаний необязательны. Простейшая
форма описания секции приведена ниже:

Линкер не будет создавать выходных секций, которые ничего в себе
не содержат. Например:

Расположение секций

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

Содержимое описания секции может включать любые типы описанных
ниже выражений; Вы можете включать их в описание секции столько раз,
сколько необходимо, разделяя отдельные выражения пробелом.

Для того чтобы определить список файлов, нужно набрать

  • (<секции>)
  • (<секция>, <секция>, …)
  • (<секция> <секция> …)

Если Вы уже включили несколько файлов с помощью их имени, ‘*’
ссылается на все оставшиеся файлы, т.е. те файлы, имя которых во
входном файле не было еще определено.

Например, чтобы скопировать секции с номерами от одного до
четырех из файла в формате ‘Oasys’ в секцию ‘.text’ файла в формате
‘a.out’, и секции 13 и 14 в секцию ‘.data’, необходимо дать следующие
команды:

Например, следующий скрипт разделяет выходной файл на три секции
с названиями: ‘.text’, ‘.data’, ‘.bss’, беря из каждого входного файла
соответствующие секции:

Описание секций данных

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

Пусть ‘sample.ld’ — файл, содержащий этот скрипт, и ‘a.o’, ‘b.o’,
‘c.o’ и ‘d.o’ — четыре входных файла с содержимым, похожим на
нижеследующий пример:

Многобайтовые последовательности размещаются в том порядке,
который определен для формата выходного файла (см. 5).

Дополнительные атрибуты секции

Перед Вами полный синтаксис описания секции, включающий все
дополнительные порции:

Вы можете заставить выходную секцию загружаться по указанному
адресу путем определения начала непосредственно после названия секции.
‘start’ может быть представлен любым выражением. Следующий пример
генерирует секцию output по адресу 0x40000000:

3.2 Выражения

Множество полезных команд используют арифметические выражения.
Синтаксис выражений в ЯУЛ индентичен синтаксису выражений в языке Cи
со следующими особенностями:

  • Все выражение вычисляется как целое.
  • Все константы целые.
  • Поддерживаются все арифметические операции языка Cи.
  • Вы можете определять, создавать и ссылаться на глобальные
    переменные.
  • Вы можете использовать специфические для линкера встроенные
    арифметические функции.

Целые числа

Восьмиричное целое — это число, начинающееся с ‘0’, после
которого идет 0 или более восьмеричных цифр («01234567»).

Для того, чтобы записать отрицательное число, используйте
префиксный оператор ‘-‘ (см. 3.2.4).

Имена символов

Без использования двойных кавычек, имена символов могут
начинаться с буквы, подчеркивания или точки и могут содержать любые
буквы, подчеркивания, точки и тире. Имена символов, не заключенные в
двойные кавычки, не должны конфликтовать с названиями команд ЯУЛ. Если
Вы хотите использовать в имени пробелы или необычные буквы, Вы должны
заключить это имя в двойные кавычки.

Счетчик позиций

Специальная переменная линкера «.» («точка») всегда содержит
текущую позицию вывода. Так как она всегда указывает на позицию
выходной секции, она должна всегда прояляться внутри команды SECTIONS.
Она может использоваться в любом месте выражения как обычный символ,
но присваивания ей значения имеют побочный эффект. Если вы присвоите
«точке» значение, это вызовет изменение счетчика позиций. Иногда это
используется для создания дыр в выходных секциях. Счетчик позиций
никогда не должен уменьшаться.

Вычисления

Линкер использует «ленивые вычисления» для выражений. Он
вычисляет значение для выражения, только когда это крайне необходимо.
Линкеру необходимо значение начального адреса и длин регионов памяти
для выполнения любой линковки. Эти значения вычисляются при первой же
возможности, когда линкер читает скрипт. Тем не менее, если другие
значения (например, значения символов) неизвестны или не являются
необходимыми до окончания размещения секций, то их значения
вычисляются позднее, когда другая информация (например, размеры
выходных секций) доступна для использования в выражениях,
присваивающих значения символам.

Присваивание: определение символов

Вы можете создавать глобальные символы и присваивать им значения
(адреса), используя любой оператор присваивания языка Cи:

  • Присваивание может быть использовано только в начале выражения
    (‘a=b+3’ допустимо, но ‘a+b=3’ — это ошибка).
  • Вы должны помещать точку с запятой ‘;’ в конце выражения с
    присваиванием.

Присваивание может появляться:

  • в командах
  • в независимых выражениях внутри команды SECTIONS
  • как часть определений секций в команде SECTIONS

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

Тип выражения зависит от его позиции в скрипт файле. Символ,
значение которому присваивается в описании секции, является
относительным. Символ, присваивание которому производится в любом
другом месте, создается как абсолютный. Так как символ, создаваемый
внутри описания секции, создается относительным к началу секции, он
будет перемещаемый, если затребован перемещаемый формат объектного
файла. Символ может быть создан абсолютным, даже когда присваивание
ему значения происходит внутри описания секции с помощью использования
функции ABSOLUTE. Для примера, чтобы создать абсолютный символ, адрес
которого указывает на последний байт выходной секции с названием
‘.data’, нужно написать:

Иногда желательно описать символ только в том случае, если он не
используется, и если он не определен другим объектом, включенным в
линковку. К примеру, традиционные линкеры определяют символ ‘etext’.
Тем не менее, ANSI-C требует, чтобы пользователь мог использовать
‘etext’ в качестве имени функции без возникновения ошибки. Ключевое
слово PROVIDE может быть использовано для определения такого символа.
Оно используется в виде PROVIDE(символ = выражение).

3.1 Скрипты линкера

Язык управления линкером (ЯУЛ) LD — это набор команд; некоторые
из этих команд устанавливают отдельную опцию, некоторые используются
для выбора группы входных файлов или для установки имени выходного
файла. Два типа управления имеют фундаментальное значение в процессе
линковки.

Самая фундаментальная команда LD — это команда SECTIONS (см.
3.4). Каждый осмысленный скрипт линкера должен иметь команду SECTIONS:
она определяет «карту» выходного файла и изобилует множеством деталей.
Ни одна другая команда ЯУЛ не является необходимой в таком большинстве
случаев, как эта.

Команда MEMORY дополняет команду SECTIONS описывая доступную
память в целевой архитектуре. Эта команда не является обязательной.
Если Вы не будете использовать команду MEMORY, тогда LD выделит
необходимый блок доступной памяти для всего вывода (см. 3.3).

Вы можете вставлять комментарии в скрипты линкера, как в языке C,
используя для начала комментария символы ‘/*’ и для завершения —
символы ‘*/’. Как и в языке C комментарии синтаксически эквивалентны
пробелу.

Бизнес и финансы

БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумагиУправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги — контрольЦенные бумаги — оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудитМеталлургияНефтьСельское хозяйствоЭнергетикаАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством

Циклы

Циклы в программировании ПЛК могут быть использованы для различных целей. У вас может быть функция или набор утверждений, которые вы хотите выполнить определенное количество раз или пока что-то остановит цикл.
В Structured Text вы найдете 3 различных типа циклов:

  1. FOR
  2. WHILE
  3. REPEAT

Общим для всех типов циклов является то, что они имеют условие либо повторения, либо остановки цикла.Условие в FOR и WHILE циклах задает, следует ли цикл повторить или нет. Для REPEAT условие не является условием выполнения, оно будет решать, следует ли остановить цикл.

Цикл FOR

Первым циклом является цикл FOR и используется, чтобы повторить определенное количество раз. Цикл FOR имеет и некоторые другие ключевые слова. TO, BY, DO and END_FOR.
Синтаксис для цикла в Structured Text.

FOR count := initial_value TO final_value BY increment DO
 <statement>;
END_FOR;

На первый взгляд первая строка выглядит немного сложной, но это не так, если рассмотреть ее по частям.
FOR — ключевое слово начала цикла.
count := initial_value — операция присваивания, где выполняется начальное присваивание, от которого надо начать счет.
TO — ключевое слово, определяющее до какого значения вести счет.
Final_value — конечное значение счетчика.
BY — ключевое слово для использования пользовательского счетчика.
increment — значение, на которое необходимо увеличивать счетчик на каждой итерации цикла. Если установить значение 10, конечное значение 100, цикл отработает 10 раз.
DO <оператор>;
END_FOR;
Эта последняя часть между ключевым DO и END_FOR — выражение, которые вы хотите выполнять каждый раз, когда запускается цикл. Эти выражения будут выполнены столько раз, сколько цикл повторяется.
Цикл FOR используется для выполнения действий заранее заданное количество раз.
Цикл FOR может быть заменен следующим выражением IF:

IF boolean expression THEN
  EXIT;
END_IF;

Цикл WHILE

Данный цикл в отличие от FOR выполняется до тех пор, пока истинно логическое выражение.
Синтаксис WHILE

WHILE boolean expression DO
  <statement>;
END_WHILE;

Между ключевыми словами WHILE и DO находится логическое выражение. Если логическое выражение истинно, все выражения до ключевого слова END_WHILE будут выполнены.
При достижении END_WHILE, логическое выражение будет вычисляться снова. Это будет происходить снова и снова, пока выражение не перестанет быть истинным. Чтобы сделать остановку цикла, вы должны изменить значение логического выражения с истинного на ложное.
Пример цикла WHILE в STL

counter := ;
WHILE counter < 10 DO
  counter := counter + 1;
  machine_status := counter * 10;
END_WHILE;

В третьей строке вы увидите, как цикл в конечном итоге перестанет выполняться. Логическое выражение использует переменную и проверяет счетчик, если его значение меньше или равно 10. Но так как значение счетчика устанавливается в 0 перед выполнением цикла, логическое выражение будет истинным, если счетчик не изменяется.
В приведенном выше примере, цикл будет повторяться 10 раз. Когда значение счета достигает 10, логическое выражение будет вычисляться в ЛОЖЬ (потому что 10 не менее 10), и цикл остановится.
Вы также можете использовать ключевое слово EXIT, тогда цикл может быть остановлен до перехода булева выражения в ложно. Синтаксисом выражения является выражение с ключевыми словами IF и EXIT. Это выражение может находиться в любом месте между DO и END_WHILE.

IF boolean expression THEN
  EXIT;
END_IF;

Цикл REAPEAT

Последним типом цикла в Structured Text является REAPEAT цикл. Он работает противоположным образом от цикла WHILE. Этот цикл прекращает повторение, когда логическое выражение имеет значение ИСТИНА.
В ST, синтаксис для REPEAT цикла выглядит следующим образом:

REPEAT
 <statement>;
UNTIL boolean expression
END_REPEAT;

Так как логическое выражение в этом типе цикла расположено после выражений, выражение всегда будет выполняться по крайней мере один раз. Это полезно, если вы хотите, чтобы действие произошло один раз, а затем, в зависимости от условия, решить, должно ли это действие повториться.
Так же, как с циклом WHILE, вы должны изменить значение в логического выражения, чтобы цикл перестал выполняться. Это может быть сделано увеличением значения переменной (счетчика), или это может быть сделано с помощью условного оператора IF внутри цикла.

Определения: что находится в C файле?

Определение

  • Определение переменной побуждает компилятор зарезервировать некоторую область памяти, возможно задав ей некоторое определённое значение.
  • Определение функции заставляет компилятор сгенерировать код для этой функции

Объявление

  • глобальные переменные, которые существуют на протяжении всего жизненного цикла программы («статическое размещение») и которые доступны в различных функциях;
  • локальные переменные, которые существуют только в пределах некоторой исполняемой функции («локальное размещение») и которые доступны только внутри этой самой функции.
  • статичные () локальные переменные на самом деле являются глобальными, потому что существуют на протяжении всей жизни программы, даже если они видимы только в пределах одной функции.
  • статичные глобальные переменные также являются глобальными с той лишь разницей, что они доступны только в пределах одного файла, где они определены.
Код Данные
Глобальные Локальные Динамические
Инициа-
лизиро-
ванные
Неинициа-
лизиро-
ванные
Инициа-
лизиро-
ванные
Неинициа-
лизиро-
ванные
Объяв-
ление
N/A N/A N/A
Опреде-
ление

(область действия
— файл)

(область действия — файл)

(область действия — функция)

(область действия — функция)

Общие принципы программирования контроллеров

Определение 1

Программируемый логический контроллер (ПЛК, программируемый контроллер, программоконтроллер, или просто контроллер) — электронное вычислительное устройство, предназначенное для автоматизации процессов на производствах, в «умных домах», робототехнике и т.п.

Для эффективного использования контроллеров необходимо установить в его память программное обеспечение («прошить» контроллер). Для этого разработчикам предоставляются следующие средства:

  1. готовые программные библиотеки, процедуры, шаблоны; их применение ускоряет написание прошивок;
  2. средства отладки прошивок без загрузки в ПЛК (эмуляторы, симуляторы);
  3. средства документирования; программы, предназначенные для промышленного использования, должны быть оснащены комментариями в соответствии с международными стандартами.

Современные IDE для программирования контроллеров могут поддерживать сразу несколько языков разработки. Стандартом Международной Электротехнической Комиссии IEC 61131 такие языки были унифицированы. Целью этого шага было обеспечение переносимости ПО между различными аппаратными платформами. На практике такая совместимость наблюдается далеко не всегда, хотя корпорации-поставщики ПЛК и стараются придерживаться установленных правил.

Охарактеризуйте язык функциональных блок-схем fbd.

Язык FBD
(Function
Block
Diagram)
– графический язык программирования
высокого уровня, обеспечивающий
управление потоками данных всех типов.
Позволяет использовать очень мощ­ные
алгоритмы простым вызовом функций и
функциональных блоков. Удовлетворяет
непрерывным динамическим процессам.
Замечателен для небольших приложений.
Хорош для сложных ве­щей подобно ПИД
регуляторам, массивам и т. д. Имеет
большую библиотеку блоков. FBD
заимствует символику булевой алгебры
и, так как булевы символы имеют входы и
выходы, которые могут быть соединены
между собой, FBD
является более эффективным для
представления структурной информации,
чем язык релейно-контактных схем.

2. Что такоеEFB,DFB,UDEFB?

EFB
(Elementary
Function
Block)
– элементарные функции и элементарные
функциональные блоки; они находятся в
библиоте­ках. Логика обработки в EFB
(программа) написана на языке С и не
может быть изменена в редакторе FBD.
Изменять можно только параметры блоков;

DFB(Derived
Function
Block)
– функции и функциональные блоки
пользователя; они конструируются
пользователем из EFB;

UDEFB(User
Defined
Elementary
Function
Block)
– разработан­ные пользователем на
языке С; они оформляются как объекты
библиотек.

3.Каково назначение
входовENи выходовENOфункциональных блоков?

Все FFB
могут быть вызваны с дополнительными
(необязатель­ными) формальными
параметрами: EN
(входом) и ENO
(выходом).

Конфигурирование (включение
или выключение) параметров EN
и ENO
осуществляется в диалоговом окне
Property
(свойства) FFB,
которое вызывается посредством команд
Object,
Property
(Объекты, Свойства), или двойным нажатием
левой клавиши (ЛК) мыши на изображении
FFB.

Если FFB
вызывается с параметрами EN/ENO
и при этом значе­ние EN
равно нулю, то алгоритмы, определяемые
FFB,
не будут вы­полняться. В этом случае
значение ENO
автоматически устанавлива­ется равным
0. Если же значение EN
равно 1, то алгоритмы, опреде­ляемые
FFB,
будут выполнены. После выполнения этих
алгоритмов без ошибок значение ENO
автоматически устанавливается равным
1. Если же возникает ошибка во время
выполнения этих алгоритмов, то значение
ENO
будет установлено равным 0.

Поведение FFB
одинаково как в случае вызова FFB
с EN
= 1, так и при вызове без параметров
EN/ENO.

4. Какую структуру имени, присваиваемого
автоматически, имеет FFB?

Для EFB,
DFB
и UDEFB
принято общее обозначение – FFB
(Functions/Function
Block).
Каждый из перечисленных объектов
представляет собой подпро­грамму,
которая помещается в одну из библиотек,
используемых при разработке программы
работы ПЛК. Таким образом обеспечи­вается
возможность вызова и хранения FFB
в форме библиотек.

Имя экземпляра является уникальным
идентификатором для функционального
блока в проекте. Имя экземпляра создается
автоматически и имеет следующую
структуру: FBI_n

FBI = Экземпляр Функционального Блока

n = порядковый номер функционального
блока в проекте

Это автоматически генерируемое имя
может быть изменено для наглядности.
Имя экземпляра (максимум 32 символа)
должно быть уникальным в пределах всего
проекта и не является чувствительным
к регистру. Имя экземпляра должно
соответствовать общим соглашениям об
именовании.

5.Для чего служат связи?

Связи являются соединениями между FFB.
Несколько связей могут быть соединены
с FFB выходом. Пункты любого такого
соединения отмечаются жирной точкой.
Входы/выходы, которые будут соединены,
должны иметь соответствующие типы
данных. Связи могут быть отредактированы
в режиме Выбора. Перекрывание с другими
объектами разрешается. Связи не могут
использоваться для конфигурации
контуров, потому что не возможно ясно
определить порядок обработки в секции.
Контуры должны решаться с помощью
фактических параметров.

6. Какое значение
назначается по умолчанию несвязанным
входамFFB?

Несвязанным входам FFB назначается по
умолчанию значение ”0”.

Основные понятия языка SFC¶

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

После вызова программного модуля, описанного языком SFC, первым
выполняется начальный шаг. Шаг, выполняемый в данный момент, называется
активным. Действия, связанные с активным шагом, выполняются один раз в
каждом управляющем цикле. В режиме выполнения активные шаги выделяются
салатовым цветом. Следующий за активным шагом шаг станет активным,
только если в переходе между этими шагами условие будет истинно.

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

Далее описывается каждый элемент SFC диаграммы.

Наиболее важным элементом языка SFC является шаг, который описывает одну
операцию. Шаг изображается в виде прямоугольника с собственным именем
внутри (см. рис. 7.1).

Рис. 7.1 – Графическое представление «Шага» языка SFC

У каждого шага может быть 3 контакта. Сверху и снизу для соединения с
переходом и справа для соединения с блоком действий. Шаг предваряется
переходом, который определяет условие для активации данного шага в
процессе выполнения программы и отображается в виде горизонтальной черты
на ветви диаграммы процесса с указанием имени и условия. Два шага
никогда не могут быть соединены непосредственно, они должны всегда
отделяться переходом (см. рис. 7.2).

Рис. 7.2 – Шаги «step2» и «step3», соединённые переходом «tr2_3»

Любая SFC диаграмма должна содержать начальный шаг (шаг, выделенный
двойной рамкой), с которого начинается выполнение диаграммы.

Между шагами находятся так называемые переходы. Условием перехода может
быть логическая переменная или константа, логический адрес или
логическое выражение, описанное на любом языке. Условие может включать
серию инструкций, образующих логический результат, в виде ST выражения,
например:

(i<= 100) AND b

либо на любом другом языке.

На рис. 7.3 приведён пример перехода между шагом «Step3» и «Step5» с
именем «transition4».

Рис. 7.3 – Переход между шагами «Step3» и «Step5» с предопределённым
условием «transition4»

В данном случае «transition4» это имя для предопределённого перехода,
который может использоваться многократно на SFC диаграмме для
определения переходов между несколькими шагами. Код для него может быть
представлен, например, на языке ST:

:= (flag = True AND level > 10);

На рис. 7.4 представлен переход между шагами «Step6» и «Step7» в виде
обычного условия:

level > 10

Рис. 7.4 – Переход между шагами «step6» и «step7» с предопределённым
условием «transition4»

На рис. 7.5 представлен переход между шагами «Step8» и «Step9» в виде
значения логического выражения «AND» на языке FBD:

Рис. 7.5 – Переход между шагами «step8» и «step9», заданный «логическим
И» на языке FBD

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

Каждый шаг имеет нулевое или большее количеством действий, объединённых,
как правило, на диаграмме, в блок действий. На рис. 7.6 показан примера
шага «evaluateStep» и связанный с ним блок действий.

Рис. 7.6 – Шаг «evaluateStep» и связанный с ним блок действий,
содержащий 3 действия

Блок действий определяет операции, которые должны выполняться при
активации (выполнении) шага. Шаги без связанного блока действий
идентифицируются как ждущий шаг. Блок действий может состоять из
предопределённых действий. Каждому предопределённому действию
присваивается имя (на рис. 7.6 это «action0» и «action1»). Одно действие
может использоваться сразу в нескольких шагах. Действие может
выполняться непрерывно, пока активен шаг, либо единожды. Это
определяется специальными квалификаторами, описание которых приведено в
таблице 6. Квалификаторы также могут ограничивать время выполнения
каждого действия в шаге.

Шаг может быть также заменён «прыжком». Последовательности шагов всегда
ассоциируются с прыжком к другому шагу той же самой последовательности
шагов. Это означает, что они выполняются циклически. Переход на
произвольный шаг – это соединение на шаг, имя которого указано под
знаком «прыжка». Такие переходы нужны для того, чтобы избежать
пересекающихся и идущих вверх соединений. На рис. 7.7 показана SFC
диаграмма, содержащая два «прыжка».

Рис. 7.7 – SFC диаграмма, содержащая «прыжки»

Первый делает переход к шагу «init» в случае выполнения условия
«transition4», второй делает переход к шагу «step1», в случае выполнения
условия «transition2».

Использованная литература:

  1. Chris Hobbs. Embedded Software Development for Safety-Critical Systems. CRC Press, 2016.
  2. ГОСТ Р МЭК 61508-3-2012 Функциональная безопасность систем электрических, электронных, программируемых электронных, связанных с безопасностью. Часть 3. Требования к программному обеспечению (пер. IEC 61508-3:2010). М.: Стандартинформ, 2014.
  3. ГОСТ Р МЭК 61508-7-2012. Функциональная безопасность систем электрических, электронных, программируемых электронных, связанных с безопасностью. Часть 7. Методы и средства (пер. IEC 61508-7:2010). М.: Стандартинформ, 2014.
  4. MISRA C:2012 Guidelines for the use of the C language in critical systems. MIRA Limited, 2012.
  5. MISRA C++:2008 Guidelines for the use of the C++ language in critical systems. MIRA Limited, 2008.
  6. ISO/IEC 9899:2011 Information technology — Programming languages — C. ISO/IEC, 2011.
  7. ISO/IEC 9899:1999 Information technology — Programming languages — C. ISO/IEC, 1999.
  8. ISO 26262-6:2011 Road vehicles — Functional safety — Part 6: Product development at the software level, ISO, 2011.
  9. DO-178C Software Considerations in Airborne Systems and Equipment Certification. RTCA, 2012.
  10. EN 50128 ed. 2 Railway applications — Communication, signalling and processing systems — Software for railway control and protection systems. CEN, 2011.
  11. IEC 62304:2006 Medical device software – Software life cycle processes. IEC, 2006.
  12. IEC 60880:2006 Nuclear power plants — Instrumentation and control systems important to safety — Software aspects for computer-based systems performing category A functions. IEC, 2006.
  13. Bruce Powel Douglass. Real-Time Design Patterns: robust scalable architecture for Real-time systems. Addison-Wesley, 2003.
  14. ISO/IEC 14882:2011 Information technology — Programming languages — C++. ISO/IEC, 2011.
  15. ISO/IEC 14882:2003 Information technology — Programming languages — C++. ISO/IEC, 2003.

Устранение неполадок при открытии файлов FBD

Общие проблемы с открытием файлов FBD

DART Pro 98 User-definied Complex Restoration Filters не установлен

Дважды щелкнув по файлу FBD вы можете увидеть системное диалоговое окно, в котором сообщается «Не удается открыть этот тип файла». В этом случае обычно это связано с тем, что на вашем компьютере не установлено DART Pro 98 User-definied Complex Restoration Filters для %%os%%. Так как ваша операционная система не знает, что делать с этим файлом, вы не сможете открыть его дважды щелкнув на него.

Совет: Если вам извстна другая программа, которая может открыть файл FBD, вы можете попробовать открыть данный файл, выбрав это приложение из списка возможных программ.

Установлена неправильная версия DART Pro 98 User-definied Complex Restoration Filters

В некоторых случаях у вас может быть более новая (или более старая) версия файла CADfix Geometry Database File, не поддерживаемая установленной версией приложения. При отсутствии правильной версии ПО DART Pro 98 User-definied Complex Restoration Filters (или любой из других программ, перечисленных выше), может потребоваться загрузить другую версию ПО или одного из других прикладных программных средств, перечисленных выше. Такая проблема чаще всего возникает при работе в более старой версии прикладного программного средства с файлом, созданным в более новой версии, который старая версия не может распознать.

Совет: Иногда вы можете получить общее представление о версии файла FBD, щелкнув правой кнопкой мыши на файл, а затем выбрав «Свойства» (Windows) или «Получить информацию» (Mac OSX).

Резюме: В любом случае, большинство проблем, возникающих во время открытия файлов FBD, связаны с отсутствием на вашем компьютере установленного правильного прикладного программного средства.

Даже если на вашем компьютере уже установлено DART Pro 98 User-definied Complex Restoration Filters или другое программное обеспечение, связанное с FBD, вы все равно можете столкнуться с проблемами во время открытия файлов CADfix Geometry Database File. Если проблемы открытия файлов FBD до сих пор не устранены, возможно, причина кроется в других проблемах, не позволяющих открыть эти файлы. Такие проблемы включают (представлены в порядке от наиболее до наименее распространенных):

Структурированный текст (ST)

С его петлями IF…THEN, CASE селекторами, и окончанием строк точкой с запятой, язык ST сильно напоминает языки программирования верхнего уровня, такие как  PASCAL или C. Ранее упомянутый обзор Control Engineering показывает, что из всех языков программирования  IEC61131, язык ST получает самое быстрое распространение.

Рис. 5. Язык ST сильно напоминает языки программирования верхнего уровня, такие как PASCAL или C.

Этот язык лучше всего подходит для сложного программирования ПЛК, такого как, например, управление процессами в производстве пластмасс или химической промышленности. Тригонометрические функции, математические вычисления и анализ данных на этом языке можно реализовать легче, чем на языке релейно-контактных схемах или языке списка инструкций. Циклы выбора и указатели  (переменные, используемые для косвенной адресации) позволяют реализацию более компактных программ, чем могут быть созданы на языке релейно-контактных схем. Для написания программы на языке ST используется удобный текстовый редактор, который облегчает ввод комментариев в программу, а также позволяет использовать знаки абзацев и пробелы для выделения связанных участков кода. Это облегчает задачу структурирования комплексных программ. Текстовый, неграфический характер языка ST, похожего на язык IL, позволяет создавать программы, которые работают гораздо быстрее, чем программа созданные на языке LD. Дополнительным преимуществом языка ST является то, что он ближе других языков программирования подошел к достижению переносимости, обещанной стандартом  IEC61131. Копирование и вставка в языке ST из редактора одного программного пакета в другой часто может быть выполнено с минимальными изменениями, освобождая программиста от аппаратной платформы. Окончательным преимуществом является то, что многие студенты инженерных специальностей лучше владеют компьютерными языками, чем основами электротехники, и поэтому лучше владеют языком ST, чем LD.

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации