Word тип данных codesys
Пять основных языков программирования (ST, SFC, FBD, LD, IL), установленных стандартом МЭК 61131-3, используются при написании программ для логических контроллеров. В дополнение к ним CODESYS предлагает язык непрерывных функциональных схем (CFC). Редактор языка и сама его структура интуитивно понятна. Для написания программ не требуется специальных знаний. Именно поэтому CFC является языком выбора для начинающих программистов.
Начиная с 1993 года стандартом IEC 61131-3 (МЭК 61131-3) определено пять основных языков (ST, SFC, FBD, LD, IL) для программирования логических контроллеров. Из них наиболее простым в изучении и удобным в работе является графический язык FBD.
Некоторые компании для облегчения программирования внедряют в свои программные продукты языки, не входящие в стандарт МЭК. Например, CODESYS использует язык непрерывных функциональных схем (CFC), как вариант языка FBD. Язык удобен для прикладных специалистов, не имеющих специальной подготовки в области информатики.
Принципиальное отличие CFC от FBD заключается в том, что в редакторе CFC размещать компоненты программы (функциональные и логические блоки) и задавать порядок их выполнения можно произвольным образом. Такие возможности позволяют легко реализовывать обратные связи, что удобно при разработке схем регулирования. При создании программ на CFC необходимо вручную выстраивать связи между элементами, в то время как на FBD соединения выполняются автоматически.
Свойства редактора CFC
Существуют две разновидности редактора CFC: стандартный (рис. 1) и страничный (рис. 2). Выбрать тип редактора можно при создании нового проекта или при добавлении POU (компонент организации программы) в уже существующий проект
Рис. 1 Рис. 2
Страничный тип редактора CFC удобен при создании проектов, содержащих большое количество последовательно выполняющихся частей программы. Постраничное размещение программы позволяет быстро переключаться между ее разделами, акцентировать внимание только на необходимых элементах, снижает риск построения ошибочных связей и делает проект интуитивно понятным. При работе программы страницы выполняются последовательно, а передача информации с одной страницы на другую осуществляется с помощью меток соединения.
Стандартный тип редактора CFC более популярен среди пользователей, так как обладает рядом преимуществ: наглядность представления кода (все блоки и связи между ними расположены на единой рабочей области), не требуется переключения между страницами, что позволяет избежать лишних действий при написании кода.
Важно помнить, что стандартный и страничный типы редактора не конвертируются один в другой.
Общие свойства блоков
При работе с большим числом ФБ могут остаться не задействованными входные/выходные контакты. Для компактности программы их можно удалить. При необходимости удаленные контакты всегда можно восстановить функцией сброс контактов. Операции удаления и сброса контактов выполняются аналогично добавлению входных и выходных контактов, а также при помощи соответствующих кнопок на панели инструментов. Чтобы поменять порядок входных/выходных контактов, необходимо их удалить, а потом заново добавить в нужном порядке.
После создания блока начинается этап создания входов и выходов путем перемещения их с панели инструментов. Если блок имеет два-три входных/выходных контакта, то операция занимает мало времени. Если у блока большое число контактов, то потребуется оптимизировать процесс. Необходимо выделить входной или выходной контакт блока и начать вводить имя переменной или константу. Таким образом выход будет добавляться автоматически столько раз, сколько потребуется (рис. 3).
Существует еще один способ добавления входа/выхода блока сразу с переменной. Для этого переменные задаются в разделе программы VAR: выделяется имя переменной и перемещается к нужному входному или выходному контакту блока.
При формировании логики программы блоки добавляются, как правило, в произвольном порядке и так же строятся связи между ними. Это приводит к тому, что нумерация блоков отличается от последовательности их расположения (порядка выполнения) (рис. 4). Чтобы соблюсти очередность выполнения (рис. 5), нужно перед запуском программы нажать ПКМ на рабочем поле редактора CFC и в меню Порядок выполнения, выбрать пункт Упорядочить в соответствии с потоком данных.
Рис. 4 Рис. 5
В версии CODESYS V3.5 SP15 появилась новая опция – автоматическая нумерация блоков в соответствии с потоком данных. Теперь элементы можно добавлять на рабочую область редактора в любом порядке и как угодно перемещать. Автоматическая нумерация элементов программы установлена по умолчанию. Вместе с тем сохранена нумерация элементов в режиме заданного порядка выполнения. Переключаться между режимами можно из свойств POU на вкладке: Порядок выполнения CFC. Посмотреть номера элементов при автоматической нумерации (рис. 6) можно из пункта контекстного меню Порядок выполнения с помощью кнопки Показать порядок выполнения или с помощью этой же кнопки, расположенной на панели инструментов.
Функциональные блоки и структуры
При работе с ФБ, имеющими большое количество входов/выходов, или структурами, содержащими большое количество переменных, удобно использовать компоновщик и селектор (рис. 7), которые находятся на панели инструментов.
Компоновщик упаковывает входы ФБ или структуры, а селектор распаковывает в отдельные выходы, таким образом заменяется большое количество близко расположенных линий связи на одну. Такой подход позволяет избежать ошибок и ускорить процесс компоновки и перемещения блоков, а также экономит место на рабочей области редактора и делает код программы нагляднее.
Линии связи
Для построения линии связи между двумя элементами нужно соединить контакты двух блоков. В редакторе CFC реализован ряд полезных функций по построению линий свиязи. Функция автосоединения линий связи по умолчанию активна, ее можно включить или отключить в меню Инструменты, пункт Опции. Для автосоединения необходимо вплотную приблизить контакты элементов. Существует поддержка параллельной связи от одного элемента к многим другим (рис. 3).
Если линия связи целиком не умещается на экране монитора, нужно выделить один из контактов линии связи (зажать клавишу <Ctrl> + нажать стрелку <Влево/Вправо>), тогда рабочая область сама сдвинется к входным или выходным контактам.
Для того чтобы избежать проблем из-за наличия большого количества линий связи, в стандартном редакторе CFC используют соединительные метки (рис. 8). Единственная задача меток – заменить длинные нечитаемые линии связи. Соединительные метки можно установить с панели инструментов. Сначала добавляется метка выхода (ей автоматически присваивается идентификационный номер), затем добавляется метка входа, и ей присваивается соответствующий номер. Заменить линию связи метками можно в пункте Метка соединения контекстного меню, вызываемого нажатием ПКМ на самой линии или на соответствующем входе/выходе. Аналогичным образом можно восстановить линию из меток.
В страничном редакторе CFC нельзя добавить соединительную метку на рабочую область (заменить ими линии связи), так как они выполняют другую задачу. Соединительные метки служат входами и выходами на страницах проекта – осуществляют передачу данных с одной страницы на другую (рис. 9). Метки добавляются не на рабочей области, что улучшает наглядность проекта и экономит место непосредственно на рабочей области редактора.
Оформление и компоновка программ
Неотъемлемой частью оформления программы являются комментарии. В редакторе CFC можно свободно размещать комментарии на рабочей области. Создать комментарий можно с помощью одноименного элемента на панели инструментов. Переход на новую строку при написании комментария осуществляется с помощью комбинации клавиш: <Ctrl>+<Enter>.
Во второй части статьи речь пойдет о реализации условий на языке CFC; особенностях работы с элементами, охваченными обратной связью; свойствах раздела VAR_INPUT CONSTANT в ФБ; кастомизации проектов и других важных особенностях работы с CFC.
© Автоматизация и Производство, 2021. Все права защищены. Любое использование материалов допускается только с согласия редакции. За достоверность сведений, представленных в журнале, ответственность несут авторы статей.
Среда разработки CODESYS V3.5 используется для программирования контроллеров ОВЕН ПЛК2хх и СПК1хх. Одной из наиболее важных задач контроллеров является обмен данными с другими устройствами. В качестве основного коммуникационного протокола применяется Modbus. Среда CODESYS включает в себя компоненты для настройки обмена по этому протоколу. Они являются простыми в использовании, но имеют ряд ограничений, которые в некоторых случаях мешают их применению. Чтобы предоставить клиентам расширенный функционал для настройки обмена, компания ОВЕН разработала библиотеку OwenCommunication.
Стандартные средства конфигурирования CODESYS
Стандартные средства CODESYS позволяют настраивать обмен через дерево проекта (рис. 1). Удобство использования этих средств заключается в том, что пользователю не требуется обладать навыками программирования – достаточно добавить требуемые компоненты и задать их параметры. Чтобы еще больше упростить процесс настройки обмена, специалисты ОВЕН разработали шаблоны для опроса модулей ввода-вывода Mx110/Mx210 и других приборов ОВЕН. Шаблоны включают в себя настроенные каналы опроса для основных параметров устройства. Все, что нужно сделать для опроса прибора через шаблон – добавить его в проект, указать адрес и привязать к нужным каналам переменные программы.
Стандартные средства конфигурирования имеют ряд ограничений, которые в некоторых случаях затрудняют их использование. Эти ограничения можно разделить на три основные группы.
Первое ограничение связано со сложностью изменения настроек обмена из кода программы. Изменение настроек может потребоваться в тех случаях, когда настройки опрашиваемых устройств (например, их адреса) заранее неизвестны, и оператор должен задать их через визуализацию. Стандартные средства CODESYS позволяют менять только ряд настроек, и пользователю придется самостоятельно организовывать их применение после каждой перезагрузки (по умолчанию будут применяться настройки из дерева проекта).
Второе ограничение – количественное. Например, существует ограничение на количество добавляемых slave-устройств, каналов slave-устройств, регистров в режиме Slave и т.д.
Третье ограничение – функциональное. Например, в режиме Slave нельзя изменить значения holding регистров ПЛК из его программы – то есть отсутствует область памяти, которая могла бы изменяться как со стороны ПЛК, так и со стороны опрашивающего его master-устройства.
Библиотека OwenCommunication лишена всех этих ограничений и предоставляет пользователю дополнительный функционал по настройке обмена. Сравнение библиотеки и стандартных средств конфигурирования приведено в табл. 1.
Библиотека OwenCommunication
Библиотека OwenCommunication содержит 4 группы функциональных блоков:
- Блоки управления интерфейсами (COM_Control, TCP_Client).
- Блоки для реализации обмена по Modbus (MB_SerialRequest, MB_SerialSlave, MB_TcpRequest, MB_TcpSlave).
- Блоки для реализации нестандартных протоколов (UNM_SerialRequest, UNM_TcpRequest, UNM_UdpRequest).
- Блоки и функции конвертации данных (REAL_TO_WORD2, WORD2_TO_REAL и т.д.).
Все функциональные блоки имеют единообразный интерфейс (аналогичный CAA-библиотекам), что упрощает их использование (рис. 2). Так как стандарт Modbus не специфицирует никаких типов данных (вся информация передается в виде последовательностей 16-битных регистров; в CODESYS такому регистру соответствует тип WORD), то библиотека содержит готовые блоки для конвертации данных типов REAL, DWORD и т.д. Эти блоки могут также использоваться в сочетании со стандартными компонентами Modbus.
Помимо отсутствия ограничений, присущих стандартным компонентам CODESYS, библиотека OwenCommunication включает в себя дополнительный функционал.
Блок MB_TcpRequest, помимо протокола Modbus TCP, позволяет использовать протокол Modbus RTU over TCP. Этот протокол может потребоваться в тех случаях, когда slave-устройство подключается через конвертер интерфейсов Ethernet/RS-485 или, например, GPRS-модем с интерфейсом RS-485.
Блок MB_TcpSlave поддерживает функцию Modbus 20 (0x16) Read File Record, которая используется для считывания файлов, и позволяет, в частности, Modbus TCP-клиенту загружать файлы архивов. OPC-cервер компании ИнСАТ MasterOPC Universal Modbus Server содержит готовый скрипт, который считывает архивные данные с контроллера и предоставляет SCADA-системе доступ к ним через интерфейс OPC HDA. Таким образом, в случае разрыва и восстановления связи с контроллером SCADA сможет выгрузить сохраненные в нем исторические данные и скопировать их в свою базу данных, сохранив «бесшовность» архива.
Блок MB_SerialSlave поддерживает работу по протоколу Modbus ASCII. При этом блок автоматически определяет протокол запроса (RTU или ASCII) и отправляет ответ в нужном формате. Кроме того, если блоку задан адрес 255, то он отвечает на запросы по любому адресу. Это удобно на этапе тестирования, когда требуется сэмулировать наличие в сети нескольких slave-устройств с разными адресами.
Блоки MB_SerialSlave и MB_TcpSlave предоставляют пользователю информацию о получаемых запросах, что дает возможность в программе определить момент получения новой команды записи (и, например, однократно проверить корректность полученных значений). Также можно запретить обработку определенных запросов – например, заблокировать возможность записи или чтения определенных диапазонов регистров. Кроме того, блоки позволяют установить начальный адрес регистров slave’a и изменить порядок байт в буфере данных (это удобно в ситуациях, когда поменять порядок байт в master-устройстве невозможно – например, его уже нельзя перепрограммировать).
Реализация нестандартных протоколов
В будущем планируется разработка отдельной библиотеки OwenVendorProtocols, которая будет содержать блоки опроса наиболее используемых тепло- и электросчетчиков.
Особенности реализации библиотеки
Блоки библиотеки выполняются асинхронно по отношению к циклу контроллера – то есть их вызовы не являются блокирующими. Выполнение одного блока занимает несколько циклов контроллера, что позволяет снизить влияние работы библиотеки на время цикла и не создает непредвиденных задержек. По этой же причине библиотека не позволяет «ускорить» обмен – частота опроса при использовании ее блоков не превышает возможности стандартных средств CODESYS и в отдельных ситуациях даже может быть несколько ниже.
Примеры и документация
Библиотека OwenCommunication доступна для загрузки на сайте ОВЕН в разделе CODESYS V3/Библиотеки и компоненты. Описание и примеры использования библиотеки приведены в документе CODESYS V3.5. Настройка обмена по протоколу Modbus. На YouTube-канале ОВЕН доступны видеоуроки по работе с библиотекой.
Характеристика
Стандартные средства
OwenCommunication
Общие характеристики
Управление обменом из кода программы
С существенными ограничениями
Modbus Serial Master
Макс. число каналов опроса
для одного slave-устройства
Modbus Serial Slave
Две независимых области памяти:
Одна область памяти
Изменение значений holding регистров из кода программы
Макс. число регистров
500 Input + 500 Holding
Modbus TCP Master
Макс. число опрашиваемых
Макс. число каналов опроса
для одного slave-устройства
Modbus TCP Slave
Две независимых области памяти:
Одна область памяти (как в ПЛК1хх)
Изменение значений holding-регистров из кода программы
Макс. число регистров
4096 Input + 4096 Holding
© Автоматизация и Производство, 2021. Все права защищены. Любое использование материалов допускается только с согласия редакции. За достоверность сведений, представленных в журнале, ответственность несут авторы статей.
Стандарт МЭК 61131-3 определяет типы данных при программировании ПЛК. Они делятся на четыре основных группы: биты, числа, строки и временные типы. В статье описывается работа со строками в среде CODESYS V3.5, применяемой для программирования контроллеров ОВЕН СПК1хх с Ethernet и ПЛК210.
Первые программируемые контроллеры появились в 60-70 годах прошлого века для замены электромеханических реле и аналоговых регуляторов. Тогда для разработки программ было достаточно двух основных типов данных: логического – для представления дискретных сигналов и целочисленного – для представления аналоговых сигналов. Эволюция ПЛК расширила спектр выполняемых задач, что потребовало введения новых типов данных, одним из которых стали строки.
Строки могут использоваться для задач:
Типы строк в CODESYS V3.5
Строка – это массив чисел, каждое из которых соответствует определенному символу. Соответствие между числами и символами называется кодировкой. В CODESYS V3.5 присутствуют два типа строк – STRING и WSTRING. Основные характеристики типов строк
Параметр
STRING
WSTRING
Пример записи литерала
(важен тип кавычек)
Выбор типа зависит от решаемой задачи. Например, для отображения строк в визуализации контроллеров ОВЕН следует использовать только тип WSTRING. При работе с SMS удобнее применять STRING, так как при формировании AT-команд для модемов используется кодировка ASCII.
Длина и размер строки
В CODESYS V3.5 при объявлении строки задается ограничение числа ее символов. Если число символов не указано, то по умолчанию используется значение 80. Ограничение максимального числа символов строки в явном виде отсутствует. Фактически длина строки ограничена только объемом памяти, выделенной под проект.
В CODESYS используются нуль-терминированные строки (как в языке С), то есть каждая строка завершается NUL-символом с кодом «0». Память под этот символ выделяется автоматически, и он не учитывается при объявлении переменной.
VAR
// Максимальная длина – 40 символов
// Выделенная память – 41 байт
sMessage: STRING(40) := ‘test’;
// Максимальная длина – 80 символов (по умолчанию)
// Выделенная память – 162 байта
wsTitle: WSTRING := “test”;
END_VAR
Базовые функции работы со строками
Значение строковой переменной можно присвоить не только при ее объявлении, но и в коде программы. Однако одного присваивания недостаточно. Для реализации алгоритмов требуются дополнительные операции, например, объединение нескольких строк в одну, поиск в строке нужного символа и т.д. Для этих операций используются базовые функции из библиотеки Standard. Список этих функций с кратким описанием
Функция
Краткое описание
CONCAT (STR1, STR2)
Объединяет две строки в одну
DELETE (STR, LEN, POS)
Удаляет из строки заданное число символов с нужной позиции
Производит поиск подстроки в строке
INSERT (STR1, STR2, POS)
Добавляет подстроку в строку с заданной позиции
Выделяет из строки подстроку заданной длины (начиная с первого символа)
Вычисляет длину строки
MID (STR, LEN, POS)
Выделяет из строки подстроку заданной длины (начиная с нужной позиции)
REPLACE (STR1, STR2, LEN, POS)
Заменяет в строке один фрагмент на другой (начиная с нужной позиции)
Выделяет из строки подстроку заданной длины (начиная с последнего символа)
Примеры использования этих функций
sVar1 := ‘Hello, ’;
sVar2 := ‘world’;
// sVar3 теперь имеет значение ‘Hello, world’
sVar3 := CONCAT(sVar1, sVar2);
// iLen будет иметь значение 12
iLen := LEN(sVar3);
Функции из библиотеки Standard могут работать только с переменными типа STRING.
Для работы с WSTRING используется библиотека Standard64 с идентичным набором функций, имеющих префикс «W» (WCONCAT, WDELETE и т. д.).
Расширенные функции работы со строками
Важно отметить, что функции из библиотек Standard/Standard64 могут работать только со строками, длина которых не превышает 255 символов. Для работы с более длинными строками используется библиотека StringUtils. В ней содержатся функции, которые в качестве аргументов принимают не строки, а указатели на них. Кроме того, библиотека содержит дополнительные функции для перевода строк в верхний/нижний регистр, удаления пробелов и т. д.
- конвертировать кодировки;
- работать с подстроками;
- форматировать вывод переменных типа DATE/TOD/DT/REAL.
// sMessage получит значение ‘dbca’
sMessage := MIRROR(‘abcd’);
// sMessage получит значение ‘FF’
sMessage := BYTE_TO_STRH(255);
Управляющие последовательности
В редакторе CODESYS для ввода спецсимволов используется знак ‘$’. Полный список спецсимволов приведен в документе CODESYS V3.5. Визуализация.
sMessage := ‘Один$r$nДва’;
Строки и массивы
Как было сказано в начале статьи, строка представляет собой массив символов. CODESYS V3.5 позволяет осуществлять индексный доступ к строке – как к массиву значений типа BYTE (для STRING) или WORD (для WSTRING). Это удобно при работе с файлами и реализацией протоколов обмена. На рис. 6 приведен пример обработки строки в цикле FOR для определения позиций символов, разделяющих значения. Это может потребоваться при чтении информации из файлов формата .csv.
j := 0;
FOR i:= 0 TO LEN(sRecord) DO
IF sRecord[i] = sSeparatorChar[0] THEN
auiSeparatorPos[j] := i;
j := j + 1;
// TODO: добавить проверку
// для верхней границы массива
END_IF
END_FOR
В некоторых случаях требуется очистить строку. Для этого достаточно присвоить ей «пустое» значение. Но следует учитывать, что эта операция не очищает строку полностью – она только записывает NUL-терминатор в ее начальный символ. На рис. 7 приведен пример, в котором переменной сначала присваивается значение ‘ABCD’, которое потом перезаписывается пустой строкой. Но фактически происходит только обнуление начального символа строки, а коды остальных символов остаются на своих местах. Поэтому, записав значение в начальный элемент через индексный доступ, вы получите строку не из одного символа (как могли ожидать), а из четырех. Обычно такие проблемы проявляются при реализации строкового протокола обмена. Чтобы избежать их, надо очищать строку с помощью специальных функций (например, MemFill).
Заключение
© Автоматизация и Производство, 2021. Все права защищены. Любое использование материалов допускается только с согласия редакции. За достоверность сведений, представленных в журнале, ответственность несут авторы статей.
В программной среде CoDeSyS перестановка байт требуется для правильных показаний датчиков при сопряжении двух устройств (Master и Slave), или когда на одном устройстве один порядок байт в слове, а втором другой. Компьютеры и оборудование, как и люди, разговаривают на разных языках. Одни хранят данные «слева направо», другие «справа налево». трудности возникают, когда требуется считать данные.
Всем привет!! Я решил написать небольшой минипост по теме перестановки байтов данных. Так как пытаюсь помочь себе разобраться в этом вопросе и считаю, что для вас эта информация будет не лишней. Честно говоря, я учился на энергетика, так что базовых знаний по программированию у меня к сожалению нет.
Всё приходится делать своими силами, и доходить приходится самому. Так что, где-то я могу ошибаться, но это ничего страшного. итак продолжим.
Циферки, числа, данные
Основная мысль заключается в понимании разницы между числами и данными вообще. Числа — это некие абстрактные понятия, исчисление чего-либо.
Возьмём число 10. Десять пальцев, десять яблок, десять корзинок, булочек и т.д. Понятие этого числа не изменяется, изменяется только его представление, римская цифра Х, машинная цифра в двоичной системе исчисления 1010 тоже «10».
А данные — это набор чисел, а так же и символов. Это некое машинное письмо. Ведь десять можно выразить и символами IO, и в форме записи на любом языке, или всё-таки значение в цифрах.
Другими словами данные — это последовательность битов и байтов, хранящихся на компьютере. Некая физическая величина. Процессор хранит данные в бинарной форме 0 и 1.
Процессоры говорят на разных языках, они имеют различные способы хранения абстрактного понятия числа «10».
Что хранит ПЛК?
В школе на уроках информатики нам говорили, что компьютер хранит данные в двоичной системе счисления. В виде нулей и единичек. Как происходит хранение данных.
- Самая первая и маленькая единица это Бит, он имеет два состояния 0 или 1.
- Байт это последовательность из 0 и 1. Байт состоит из 8 битов. То есть двоичная последовательность 10 является вот такой 00001010.
Биты нумеруются справа налево Бит 0 является младшим — это крайний правый, а бит 7 является старшим — это крайний левый.
А дальше мы с байтами поступаем как хотим, можно получить число Word — это два байта, или число Float — это 4 байта и т.д.
Машины отлично понимают, где находится «0» байт. И в каком порядке они начинают считаться. Ведь вроде бы все понятно с однобайтовыми системами. Но нет никакого соглашения в какой последовательности машины будут считать — в прямой или обратной.
Понятие указателя
Указатели являются ключевой частью программирования. Указатель представляет собой число, являющееся адресом в памяти. И это зависит только от нас (программистов), как интерпретировать данные по этому адресу.
В языке ST на CoDeSyS, когда вы приводите указатель к конкретному типу, это говорит компьютеру, как именно интерпретировать данные по этому адресу. Например, давайте объявим:
Читайте также: