Codesys примеры программ ld

Случается программировать контроллеры (ПЛК) в среде CODESYS. Все, кто имел дело с этой системой, знают, что в любом проекте присутствует библиотека Standard.lib, в которой реализованы базовые таймеры, триггеры, счетчики и некоторое кол-во других функций и функциональных блоков. Многие из этих блоков постоянно используются в программах для ПЛК. А сама библиотека, как и языки программирования CODESYS, является воплощением стандарта IEC 61131-3, т.е. призвана помочь при программировании классических ПЛК задач.

Одна из особенностей программ для ПЛК в том, что основной цикл программы должен выполняться без существенных задержек, в нем не должно быть внутренних циклов с неопределенным временем выхода или синхронных вызовов «задумчивых» функций, особенно это касается коммуникаций по медленным каналам. Обновление входных и выходным образов процесса происходит только на границе основного цикла, и чем дольше мы будем «сидеть» внутри одной итерации цикла, тем меньше мы будет знать о реальном состоянии объекта управления, в конечном итоге сработает watchdog переполнения времени выполнения цикла.

Часть 5: Язык программирования LD

Многие могут мне возразить, сказав, что современные ПЛК многозначны, есть с поддержкой аппаратных прерываний. Согласен, но разговор о таких системах не входит в мои планы, я же хочу поговорить о (квази, псевдо — выбирайте) ПЛК однозадачной реализации (без прерываний) на базе микропроцессорной платформы Arduino, в котором есть только один основной цикл. Кстати, не лишним будет сказать, что на написание данной заметки меня сподвигла статья Ардуино-совместимый ПЛК CONTROLLINO, часть 1 о попытке аппаратного воплощения Arduino в пром. ПЛК.

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

Когда программа проста и сводится к выполнению последовательных операций, регуляторов, без параллельных событий, то достаточно чередовать операции бесконечными вложенными циклами проверки условий и синхронными задержками типа delay(). Последовательные шаги такой программы будут выполняться буквально построчно, просто и логично. Но, как только возникает необходимость в программировании параллельных операций, необходимо менять парадигму программы.

В однозадачной системе добиться видимой параллельности можно только очень быстрым последовательным сканированием параллельных состояний, не задерживаясь подолгу на каждом вызове функции или проверке условия. С физическими входами-выходами проблем нет, функции отрабатывают достаточно быстро, а вот delay() становится неоправданным тормозом. И вот тут на смену приходят неблокирующие таймеры, те самые, которые в программировании ПЛК являются классикой. Суть в том, что для их работы используется миллисекундный счетчик времени, и все действия привязаны к значениям этого глобального счетчика.

Программирование ПЛК. Как понять язык LADDER за 5 минут!

А теперь давайте вспомним ту самую Standard.lib из CODESYS. В ней как раз реализованы МЭК-овские неблокирующие таймеры. Я взял ее за основу и портировал функции таймеров и триггеров в библиотечный код Arduino (С++). Т.е. попытался приблизить Arduino к классическому ПЛК.

Ниже я приведу краткое описание портированных функциональных блоков (FB) CODESYS и их аналоги в моей библиотеке plcStandardLib, все временные диаграммы верны для новой библиотеки Arduino. Подробнее описание исходных блоков можно посмотреть, например, в русскоязычной справке по CODESYS.

TON — функциональный блок «таймер с задержкой включения»

TON(IN, PT, Q, ET)

Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. Как только IN становится TRUE, начинается отсчет времени (в миллисекундах) на выходе ET до значения, равного PT. Далее счетчик не увеличивается. Q равен TRUE, когда IN равен TRUE, а ET равен PT, иначе FALSE. Таким
образом, выход Q устанавливается с задержкой PT от фронта входа IN.

В Arduino IDE:

TON TON1(); TON TON1(unsigned long PT); // с заданием интервала времени PT
Q = TON1.Run(boolean IN); // вызов «все в одном» TON1.IN = IN; TON1.Run(); Q = TON1.Q;

Временная диаграмма работы TON:

TOF — функциональный блок «таймер с задержкой выключения»

TOF(IN, PT, Q, ET)

Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Если IN равен TRUE, то выход Q = TRUE и выход ET = 0. Как только IN переходит в FALSE, начинается отсчет времени (в миллисекундах) на выходе ET. При достижении заданной длительности отсчет останавливается. Выход Q равен FALSE, если IN равен FALSE и ET равен PT, иначе — TRUE.

Таким образом, выход Q сбрасывается с задержкой PT от спада входа IN.

В Arduino IDE:

Очень похоже на TON, для краткости:

TOF TOF1(unsigned long PT); // с заданием интервала времени PT Q = TOF1.Run(boolean IN); // вызов «все в одном»

Временная диаграмма работы TOF:

TP — функциональный блок «импульс-таймер»

TP(IN, PT, Q, ET)

Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени (в миллисекундах) на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается.

Читайте также:
Как переделать формат программы

Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN.

В Arduino IDE:

Очень похоже на TON, для краткости:

TP TP1(unsigned long PT); // с заданием интервала времени PT Q = TP1.Run(boolean IN); // вызов «все в одном»

Временная диаграмма работы TP:

R_TRIG — функциональный блок «дeтектор фронта»

Функциональный блок R_TRIG генерирует импульс по переднему фронту входного сигнала. Выход Q равен FALSE до тех пор, пока вход CLK равен FALSE. Как только CLK получает значение TRUE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из FALSE в TRUE.

Пример CODEDESYS на языке ST:

RTRIGInst : R_TRIG ; RTRIGInst(CLK:= VarBOOL1); VarBOOL2 := RTRIGInst.Q;

В Arduino IDE:

R_TRIG R_TRIG1;
Q = R_TRIG1.Run(boolean CLK); // вызов «все в одном» R_TRIG1.CLK = CLK; R_TRIG1.Run(); Q = R_TRIG1.Q;

F_TRIG — функциональный блок «дeтектор спада»

Функциональный блок F_TRIG генерирует импульс по заднему фронту входного сигнала.
Выход Q равен FALSE до тех пор, пока вход CLK равен TRUE. Как только CLK получает значение FALSE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из TRUE в FALSE.

В Arduino IDE:

F_TRIG F_TRIG1; Q = F_TRIG1.Run(boolean CLK); // вызов «все в одном»

RS_TRIG — функциональный блок RS-триггер / SR_TRIG — функциональный блок SR-триггер

Переключатель с доминантой выключения, RS-триггер:

Q1 = RS (SET, RESET1)

Переключатель с доминантой включения:

Q1 = SR (SET1, RESET)

Входные переменные SET и RESET1 — как и выходная переменная Q1 типа BOOL.

В Arduino IDE:

RS_TRIG RS_TRIG1; Q = RS_TRIG1.Run(boolean SET, boolean RESET); // вызов «все в одном»
SR_TRIG SR_TRIG1; Q = SR_TRIG1.Run(boolean SET, boolean RESET); // вызов «все в одном»

Исходный код и пример

plcStandardLib_1.h

/* * plcStandardLib_1.h * * Created on: 01.01.2017 * Author: Admin */ #ifndef PLCSTANDARDLIB_1_H_ #define PLCSTANDARDLIB_1_H_ #if ARDUINO >= 100 #include #else #include #endif /* ——————- TON ——————- */ class TON < public: TON(); TON(unsigned long PT); boolean Run(boolean IN); boolean Q; // выходная переменная boolean IN; // входная переменная unsigned long PT; // входная переменная unsigned long ET; // выходная переменная — текущее значение таймера private: boolean _M; // внутренний флаг unsigned long _StartTime; >; /* ——————- TOF ——————- */ class TOF < public: TOF(); TOF(unsigned long PT); boolean Run(boolean IN); boolean Q; // выходная переменная boolean IN; // входная переменная unsigned long PT; // входная переменная unsigned long ET; // выходная переменная — текущее значение таймера private: boolean _M; // внутренний флаг unsigned long _StartTime; >; /* ——————- TP ——————- */ class TP < public: TP(); TP(unsigned long PT); boolean Run(boolean IN); boolean Q; // выходная переменная boolean IN; // входная переменная unsigned long PT; // входная переменная unsigned long ET; // выходная переменная — текущее значение таймера private: boolean _M; // внутренний флаг unsigned long _StartTime; >; /* ——————- R_TRIG ——————- */ class R_TRIG // детектор фронта сигнала < public: R_TRIG(); boolean Run(boolean CLK); boolean CLK; // входная переменная boolean Q; // выходная переменная private: boolean _M; // внутренний флаг >; /* ——————- F_TRIG ——————- */ class F_TRIG // детектор спада сигнала < public: F_TRIG(); boolean Run(boolean CLK); boolean CLK; // входная переменная boolean Q; // выходная переменная private: boolean _M; // внутренний флаг >; /* ——————- RS_TRIG ——————- */ class RS_TRIG // детектор спада сигнала < public: RS_TRIG(); boolean Run(); boolean Run(boolean SET, boolean RESET); boolean SET; // установка триггера boolean RESET; // сброс триггера boolean Q; // выходная переменная //private: >; /* ——————- SR_TRIG ——————- */ class SR_TRIG // детектор спада сигнала < public: SR_TRIG(); boolean Run(); boolean Run(boolean SET, boolean RESET); boolean SET; // установка триггера boolean RESET; // сброс триггера boolean Q; // выходная переменная //private: >; #endif /* PLCSTANDARDLIB_H_ */
plcStandardLib_1.cpp

/* * plcStandardLib_1.h * * Created on: 01.01.2017 * Author: Admin */ #include «plcStandardLib_1.h» /* ——————- TON ——————- */ TON::TON() < IN = false; PT = 0; _M = false; _StartTime = 0; Q = false; ET = 0; >TON::TON(unsigned long PT) < IN = false; TON::PT = PT; _M = false; _StartTime = 0; Q = false; ET = 0; >boolean TON::Run(boolean IN) < TON::IN = IN; if (!TON::IN) < Q = false; ET = 0; _M = false; >else < if (!_M) < _M = true; // взводим флаг М _StartTime = millis(); // ET = 0; // сразу = 0 >else < if (!Q) ET = millis() — _StartTime; // вычисляем время >if (ET >= PT) Q = true; > return Q; > /* ——————- TOF ——————- */ TOF::TOF() < IN = false; PT = 0; _M = false; _StartTime = 0; Q = false; ET = 0; >TOF::TOF(unsigned long PT) < IN = false; TOF::PT = PT; _M = false; _StartTime = 0; Q = false; ET = 0; >boolean TOF::Run(boolean IN) < TOF::IN = IN; if (TOF::IN) < Q = true; ET = 0; _M = true; >else < if (_M) < _M = false; // сбрасываем флаг М _StartTime = millis(); // ET = 0; // сразу = 0 >else < if (Q) ET = millis() — _StartTime; // вычисляем время >if (ET >= PT) Q = false; > return Q; > /* ——————- TP ——————- */ TP::TP() < IN = false; PT = 0; _M = false; _StartTime = 0; Q = false; ET = 0; >TP::TP(unsigned long PT) < IN = false; TP::PT = PT; _M = false; _StartTime = 0; Q = false; ET = 0; >boolean TP::Run(boolean IN) < TP::IN = IN; if (!_M) < if (TP::IN) < _M = true; // взводим флаг М _StartTime = millis(); if (ET < PT) Q = true; >> else < if (Q) < ET = millis() — _StartTime; // вычисляем время if (ET >= PT) Q = false; > else < if (!TP::IN) < _M = false; ET = 0; >> > return Q; > /* ——————- R_TRIG ——————- */ R_TRIG::R_TRIG() < CLK = false; _M = false; Q = false; >boolean R_TRIG::Run(boolean CLK) < R_TRIG::CLK = CLK; Q = R_TRIG::CLK !_M; _M = R_TRIG::CLK; return Q; >F_TRIG::F_TRIG() < CLK = false; _M = true; Q = false; >boolean F_TRIG::Run(boolean CLK) < F_TRIG::CLK = CLK; Q = !F_TRIG::CLK !_M; _M = !F_TRIG::CLK; return Q; >/* ——————- RS_TRIG ——————- */ RS_TRIG::RS_TRIG() < SET = false; RESET = false; Q = false; >boolean RS_TRIG::Run(boolean SET, boolean RESET) < RS_TRIG::SET = SET; RS_TRIG::RESET = RESET; Q = !RESET and (SET or Q); return Q; >boolean RS_TRIG::Run() < Q = !RESET and (SET or Q); return Q; >/* ——————- SR_TRIG ——————- */ SR_TRIG::SR_TRIG() < SET = false; RESET = false; Q = false; >boolean SR_TRIG::Run(boolean SET, boolean RESET) < SR_TRIG::SET = SET; SR_TRIG::RESET = RESET; Q = SET or (!RESET and Q); return Q; >boolean SR_TRIG::Run()
plcStandardLib_1_example.ino

Читайте также:
Как удалить программу ufiler с ПК

#include «plcStandardLib_1.h» #define LED 13 #define ButtonIn 7 TON TON1(500); // Инициализация задержки включения, 500мс. TON TON2(1000); // Инициализация задержки включения, 1000мс. TOF TOF1(500); // Инициализация задержки выключения, 500мс. TP TP1(300); // Инициализация единичного импульса, 300мс. TP TP2(200); // Инициализация единичного импульса, 200мс.

R_TRIG R_TRIG1; // Инициализация триггера фронта для кнопки void setup() < pinMode(ButtonIn, INPUT_PULLUP); pinMode(LED, OUTPUT); >void loop() < digitalWrite(LED, TP1.Run(R_TRIG1.Run(TON1.Run(digitalRead(ButtonIn))))); // TON1 — фильтрует дребезг контакта // R_TRIG1 — детектирует фронт сигнала // TP1 — генерирует импульс по фронту digitalWrite(LED, TP2.Run(TON2.Run(!TON2.Q))); // генератор импульса на базе TON и TP // TON2.Run(!TON2.Q)) — генератор единичного импульса // TP2 — генерирует импульс по фронту digitalWrite(LED, TOF1.Run(TON1.Run(digitalRead(ButtonIn)))); // Задержка включения и отключения >

Например, чтобы отфильтровать дребезг контактов кнопки (при размыкании тоже!) достаточно вот такого кода:

FiltredButtonIn = TON1.Run(digitalRead(ButtonIn))

В качестве заключения: вот так в CODESYS выглядит работа генератора импульса на базе цепочки таймеров TON и TP. В начале TON охватывается обратной связью с инверсией, и из него получается генератор единичного импульса, который запускает работу импульс-генератора TP. В моем примере Arduino аналог этого выглядит так:

digitalWrite(LED, TP2.Run(TON2.Run(!TON2.Q)));

Источник: habr.com

Работа с портами ввода – вывода в CodeSys

Откройте CodeSys и создайте новый проект на языке LD. Язык релейных или релейно-контактных схем (РКС) — графический язык, реализующий структуры электрических цепей. Лучше всего LD подходит для построения логических переключателей, но достаточно легко можно создавать и сложные цепи.

Для получения информации о доступных портах ввода – вывода необходимо щелкнуть на значке «Конфигурация ПЛК» на вкладке «Ресурсы» (рисунок 2.1). В открывшемся окне «Конфигурация ПЛК» будут отображаться доступные порты ввода вывода и их адреса для обращения из программы (Рисунок 2.2). Анализируя содержимое окна конфигурации можно сказать, что ПЛК 150 обладает шестью дискретными входами (Discrete input) и четырьмя дискретными выходами (Discrete output). Чтобы обратиться к порту необходимо в программе объявить переменную, значение которой будет равно состоянию порта.

Получение информации о портах ввода – вывода ПЛК.

Окно конфигурации ПЛК

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

Пустой проект на языке LD

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

Слева любая цепь начинается набором контактов, которые посылают слева направо состояние «ON» или «OFF», соответствующие логическим значениям ИСТИНА или ЛОЖЬ. Каждому контакту соответствует логическая переменная. Если переменная имеет значение ИСТИНА, то состояние передается через контакт. Иначе правое соединение получает значение выключено («OFF»).

Пунктирной областью CodeSys обозначает активную зону, куда можно вставить какой-либо функциональный блок из панели инструментов. Активную зону можно изменять с помощью мышки.

Простейшая релейная схема на языке LD.

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

Вызов функции авто объявления.

Необходимо указать имя и тип переменной, и если переменная присваивается какому-либо порту ввода – вывода, то необходимо в поле «Адрес» указать адрес порта.

Окно объявления переменной.

Тип переменной можно указать вручную или воспользоваться ассистентом ввода, нажав на кнопку правее окна

Окно ассистента ввода.

Пусть необходимо нормально разомкнутый контакт соединить с дискретным входом 1, а катушку реле с дискретным выходом 1. Для этого нужно объявить две переменные «А», связанную с дискретным входом, и «B», связанную с 1 дискретным выходом.

Если необходимо работать с другими портами, адреса портов можно посмотреть в окне конфигурации ПЛК

Объявление переменной «А»

Объявление переменной «B»

В окне объявления переменных появились две переменных ,теперь необходимо присвоить их элементам релейной цепи

Присвоение элементам релейной цепи переменных. Теперь можно загрузить программу в ПЛК и проверить ее работу.

Источник: promtechautomat.ru

Codesys примеры программ ld

  • О Школе Fine Start
  • Профессии
  • Блог и Медиа

Codesys как средство реализации МЭК 61131-3

к.т.н., эксперт по автоматизации производства,

Школа Fine Start

В данной статье продолжим рассмотри

CoDeSys (Controller Development System) — один из самых популярных в мире аппаратно независимых комплексов для прикладного программирования ПЛК и встраиваемых контроллеров.

Читайте также:
Как вычислить программы майнеры

Итак, начнём!

CoDeSys (Controller Development System)

Основным его компонентом является среда программирования на языках стандарта МЭК 61131 — 3. Комплекс работает на компьютере. Программы компилируются в машинный код и загружаются в контроллер. Любую задачу, которая имеет решение в виде программы, можно реализовать в CoDeSys.

Изначально CoDeSys был нацелен на задачи, требующие автономности, надежности и предельного быстродействия при минимизации аппаратных средств. Благодаря этому он вышел далеко за рамки традиционных для МЭК 61131 — 3 систем ПЛК. Сегодня автомобили, краны, экскаваторы, самосвалы, яхты, печатные машины, деревообрабатывающие станки, литейные и прокатные машины, сборочные автоматы крупнейших мировых брендов включают один или группу встроенных контроллеров с CoDeSys.

На сегодняшний день CoDeSys успешно применяется во всех без исключения областях промышленности. В мире более 350 компаний, изготавливают контроллеры с CoDeSys в качестве штатного инструмента программирования.

Как продукт, CoDeSys ориентирован на изготовителей контроллеров. Разрабатывая новый контроллер, они устанавливают в него систему исполнения CoDeSys Control. Собирают из ее компонентов требуемую конфигурацию, добавляют собственные ноу-хау и специфические компоненты и получают собственное инструментальное ПО.

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

Среда программирования — это та часть, с которой непосредственно имеет дело пользователь (рис.1). Она функционирует на ПК и является основным компонентом комплекса. Она включает редакторы для девяти языков программирования ПЛК, в том числе стандартные языки МЭК 61131 — 3.

Рис. 1. Редактирование программы в CoDeSys

Рис. 1. Редактирование программы в CoDeSys

Пользователь может выбрать один из них и программировать простыми средствами либо задействовать всю мощь новейших инструментов CoDeSys. На выходе CoDeSys непосредственно дает быстрый машинный код. Поддержаны все распространенные семейства микропроцессоров от 16 до 64 — разрядных.

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

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

Для отладки пользователю не нужно открывать специальных отладочных окон или составлять каких — либо списков переменных. Непосредственно в редакторах отображаются значения всех видимых на экране переменных. Причем в сложных выражениях видны все промежуточные результаты.

В CoDeSys V3 впервые в мире была реализована поддержка объектно-ориентированного программирования (ООП) в языках стандарта МЭК 61131 — 3.

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

Пользователь может по своему усмотрению писать программы привычным образом или использовать объекты. Такой подход не создает лишних проблем «старым» прикладным программистам. В тоже время молодые специалисты, изучившие ООП в вузе и уже не представляющие себе серьезную работу без данной технологии, смогут реализовать свой потенциал. Предложенные расширения ООП прошли проверку временем в CoDeSys, получили широкое одобрение и будут включены в стандарт.

Из новшеств CoDeSys следует отметить странично — ориентированный FBD и поддержку языка Python для автоматизации работы в среде программирования.

Использование Python снимает все мыслимые ограничения. CoDeSys включает конфигураторы ввода/вывода с поддержкой полевых сетей Modbus, PROFIBUS, PROFINET, DeviceNet, CANopen, EtherCAT, Ethernet IP и большое число сервисных модулей.

Система исполнения CoDeSys Control

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

В общей сложности CoDeSys Control включает более 200 компонентов. Каждая «сборка» под конкретную модель ПЛК будет отличаться. Ее состав определяется возможностями аппаратуры и типом ПЛК. Включение абсолютно всех компонентов, на всякий случай, привело бы к неоправданному росту аппаратных ресурсов и стоимости.

Например, включение функции «горячей» правки кода без остановки ПЛК удваивает требования к ОЗУ.

Некоторые компоненты представлены в нескольких вариантах. Например, компонент «менеджер задач». Самый дешевый ПЛК может иметь единственный аппаратный таймер, «тикающий» каждые 10 мс, и не иметь ОС. Для него подойдет простой планировщик циклических задач без вытеснения.

С ним не смогут работать некоторые другие компоненты, например, ЧПУ или стек CANopen, но они и не требуются в ПЛК такого уровня. Для ПЛК с мощным 32 — или 64 — битным процессором и ОС РВ разумно включить наиболее совершенный «менеджер задач» с поддержкой событий, реального времени и нескольких приложений в одном устройстве. С каждым таким приложением можно работать как с независимым ПЛК: загружать, запускать, останавливать и отлаживать программы, не влияя на работу других приложений.

CoDeSys Control может функционировать под управлением любой ОС или даже без нее. Наиболее часто используют ОС VxWorks, Windows CE и Linux. Имеются адаптации под RT — OS32 (RTKernel), QNX, Nucleus, pSOS, OS9, TenAsys INtime. Изготовитель оборудования может самостоятельно адаптировать CoDeSys Control под другую ОС.

Источник: finestart.school

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru