Страница 7 из 58 ПерваяПервая ... 567891757 ... ПоследняяПоследняя
Показано с 61 по 70 из 579

Тема: Создать функцию на ST

  1. #61

    По умолчанию

    Цитата Сообщение от gmz_001 Посмотреть сообщение
    Браво!
    Но да, выходных переменных нехватает. Конечного автомата не сделаешь. Только для расчетов годится.
    Как пример - кусок кода. Не знаю как правильно его вставлять:
    FUNCTION State: udint; //имя функции и тип данных выхода

    VAR_INPUT //объявление входных переменных
    SaveState : udint; // сохраненное значения состояния в предыдущем цикле
    MdRevKM : bool; // режим работы реверсивных контакторов 0=ручной / 1=автомат
    MdFuelVlv : bool; // режим работы топливного крана 0=ручной / 1=автомат
    MdGen : bool; // режим работы генератора 0=ручной / 1=автомат
    InSplOk : bool; // сетевое питание в норме
    GenSplOk : bool; // питание от генератора в норме
    FuelVlvOpn : bool; // топливный кран 1=открыт
    FuelVlvCls : bool; // топливный кран 1=закрыт
    Start : bool; // импульс первого выполнения программы после загрузки
    S0_Tmr : bool; // таймер состояния (загрузка)
    S6_Tmr : bool; // таймер состояния (закрытие топливного клапана)
    S7_Tmr : bool; // таймер состояния (команда остановки генератора)
    S24_Tmr : bool; // таймер состояния (заполнение бензином поплавковой камеры)
    END_VAR

    VAR //объявление локальных переменных
    boolVAR : bool := FALSE;
    END_VAR

    IF Start THEN
    State := 0;
    ELSE
    CASE SaveState OF
    0: // запуск графа, пауза для срабатывания реле контроля напряжения (должно быть более TON19/20)
    IF S0_Tmr THEN
    State := 1;
    ELSE
    State := 0; // остаемся в текущем состоянии
    END_IF

    1: // запуск графа, проверка режима работы реверсивных контакторов
    IF MdRevKM THEN
    State := 2;
    ELSE
    State := 1; // остаемся в текущем состоянии
    end_if

    2: // проверка наличия сетевого питания
    IF InSplOk THEN
    State := 3;
    ELSE
    State := 4;
    END_IF

    3: // включение контактора питания от сети КМ1
    IF InSplOk = FALSE THEN // если сетевое напряжение пропало
    State := 2;
    ELSE
    State := 3; // остаемся в текущем состоянии
    END_IF

    4: // проверка наличия питания от генератора
    IF GenSplOk THEN
    State := 5;
    ELSE
    // уходим на запуск генератора
    State := 20;
    END_IF

  2. #62

    По умолчанию

    Важно, чтобы в каждом состоянии в любом случае выполнялась команда присвоения State := ... . Тогда все будет работать.

  3. #63
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,115

    По умолчанию

    Цитата Сообщение от CORSAR1500 Посмотреть сообщение
    Как пример - кусок кода. Не знаю как правильно его вставлять:
    FUNCTION State: udint; //имя функции и тип данных выхода

    VAR_INPUT //объявление входных переменных
    SaveState : udint; // сохраненное значения состояния в предыдущем цикле
    MdRevKM : bool; // режим работы реверсивных контакторов 0=ручной / 1=автомат
    MdFuelVlv : bool; // режим работы топливного крана 0=ручной / 1=автомат
    MdGen : bool; // режим работы генератора 0=ручной / 1=автомат
    InSplOk : bool; // сетевое питание в норме
    GenSplOk : bool; // питание от генератора в норме
    FuelVlvOpn : bool; // топливный кран 1=открыт
    FuelVlvCls : bool; // топливный кран 1=закрыт
    Start : bool; // импульс первого выполнения программы после загрузки
    S0_Tmr : bool; // таймер состояния (загрузка)
    S6_Tmr : bool; // таймер состояния (закрытие топливного клапана)
    S7_Tmr : bool; // таймер состояния (команда остановки генератора)
    S24_Tmr : bool; // таймер состояния (заполнение бензином поплавковой камеры)
    END_VAR

    VAR //объявление локальных переменных
    boolVAR : bool := FALSE;
    END_VAR

    IF Start THEN
    State := 0;
    ELSE
    CASE SaveState OF
    0: // запуск графа, пауза для срабатывания реле контроля напряжения (должно быть более TON19/20)
    IF S0_Tmr THEN
    State := 1;
    ELSE
    State := 0; // остаемся в текущем состоянии
    END_IF

    1: // запуск графа, проверка режима работы реверсивных контакторов
    IF MdRevKM THEN
    State := 2;
    ELSE
    State := 1; // остаемся в текущем состоянии
    end_if

    2: // проверка наличия сетевого питания
    IF InSplOk THEN
    State := 3;
    ELSE
    State := 4;
    END_IF

    3: // включение контактора питания от сети КМ1
    IF InSplOk = FALSE THEN // если сетевое напряжение пропало
    State := 2;
    ELSE
    State := 3; // остаемся в текущем состоянии
    END_IF

    4: // проверка наличия питания от генератора
    IF GenSplOk THEN
    State := 5;
    ELSE
    // уходим на запуск генератора
    State := 20;
    END_IF
    Целое сочинение ,которое заменяется несколькими квадратиками
    электронщик до мозга костей и не только

  4. #64
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    8,167

    По умолчанию

    Цитата Сообщение от rovki Посмотреть сообщение
    Целое сочинение ,которое заменяется несколькими квадратиками
    Согласен: исписали два карандаша!
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  5. #65
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,115

    По умолчанию

    Цитата Сообщение от Сергей0308 Посмотреть сообщение
    Согласен: исписали два карандаша!
    Для формул, расчетов еще туда-сюда ...
    электронщик до мозга костей и не только

  6. #66

    По умолчанию

    Цитата Сообщение от rovki Посмотреть сообщение
    Целое сочинение ,которое заменяется несколькими квадратиками
    Конечный автомат очень удобен для проектирования - сразу продумываешь состояния, удобен на этапе отладки - она практически и не нужна, вся отладка прошла еще на листочке на этапе проектирования. Работа КА предсказуема, точно известно состояние ситемы в целом в любой момент времени. Да, он более громоздкий чем переплетения из комбинационной логики.
    Вообще, его можно и на fbd и на lad делать, для ПР200 писал. Но st с его CASE of - просто идеальный язык, но опять вылазят ограничения конкретной реализации и вновь нужны костыли.

  7. #67

    По умолчанию

    Код:
    // Вычисление по графику Тпрям(Тнар)
    function get_t_dir:REAL;
    var_input
    //Вход Тнаружн
    	t_ext:REAL;
    	max_points:UDINT;
    end_var
    var
    // Итератор
    	iter:UDINT;
    	// Т наружнего воздуха
    	t_extern:array [1..3] of real:=[-25.0,0.0,15.0];
    	// Т прямой - в сеть
    	t_direct:array [1..3] of real:=[80.0,55.0,30.0];
    end_var
    // Если Меньше = Нижней точки
    	if t_ext<=t_extern[1] then
    		get_t_dir:=t_direct[1];
    	ELSE
    		if t_ext>=t_extern[max_points] then
    			get_t_dir:=t_direct[max_points];
    		ELSE
    			iter:=1;
    		    // Вычисляем в цикле
    			while iter<max_points do
    				if t_ext>=t_extern[iter] then // Нашли 
    					// вычисление по формуле Y(x)=Y1+(Y2-Y1)*( (x-x1) / (x2-x1))
    					get_t_dir:=t_direct[iter]+(t_direct[iter+1]-t_direct[iter])*(t_ext-t_extern[iter])/(t_extern[iter+1]-t_extern[iter]);
    					iter:=100;
    				end_if
    				iter:=iter+1;
    			end_while
    		end_if
    	end_if
    	
    // Если больше = верхней точки	
    
    	
    end_function
    Последний раз редактировалось Малышев Олег; 03.12.2021 в 10:06.
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  8. #68

    По умолчанию

    Код:
    // Вычисление дискриминанта
    function Discr:real;
    var_input
    a,b,c:REAL;
    end_var
    Discr:=pow(b,2.0) - 4.0*a*c;
    end_function
    
    
    // Вычисление корня 1 квадратного уравнения
    FUNCTION Get_Roots : bool;
    VAR_INPUT
    a,b,c:REAL;
    end_var
    var
    d:real;
    x1,x2:REAL;
    end_var
    d:=Discr(a,b,c );
    if (d<0.0) then
    Get_Roots:=false;
    ELSE
    x1:=((-b)+pow(d,0.5))/(2.0*a);
    x2:=((-b)-pow(d,0.5))/(2.0*a);
    Get_Roots:=true;
    end_if
    END_FUNCTION
    Последний раз редактировалось Малышев Олег; 03.12.2021 в 10:06.
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  9. #69
    Ельцов Андрей
    Гость

    По умолчанию

    Здравствуйте!
    Сделаю несколько комментариев по поводу основных предложений и замечаний.
    1. Функциям нужны ещё выходы.
    Мы будем это реализовывать в будущих версиях. Это не простая задачка, там будет и сохранение переменных. По сути это ФБ.
    2. Использовать функцию в функции или в макросе.
    Тоже есть в планах, но ФБ в приоритете.
    3. Экспорт импорт в файл. Тоже реализуем, задачка не сложная. Пока отказались, т.к. много чего не поддержано в СТ.

    Если что-то упустил, прокомментируйте, пожалуйста.
    Последний раз редактировалось Ельцов Андрей; 03.12.2021 в 13:51.

  10. #70

    По умолчанию

    Цитата Сообщение от Ельцов Андрей Посмотреть сообщение
    Здравствуйте!
    Сделаю несколько комментариев по поводу основных предложений и замечаний.
    1. Функциям нужны ещё выходы.
    Мы будем это реализовывать в будущих версиях. Это не простая задачка, там будет и сохранение переменных. По сути это ФБ.
    2. Использовать функцию в функции или в макросе.
    Тоже есть в планах, но ФБ в приоритете.
    3. Экспорт импорт в файл. Тоже реализуем, задачка не сложная. Пока отказались, т.к. много чего не поддержано в СТ.

    Если что-то упустил, прокомментируйте, пожалуйста.
    Очень радует, что будут ФБ, несколько выходов и применение одного в другом)
    А вопросы у меня такие:
    1) В языке ST будут поддержаны другие команды и функции, сейчас не поддержанные, например TIME( ) ?
    2) Будут ли введены типы данных BYTE, INT, WORD, DINT, DWORD и TIME ? И преобразование одного в другое?
    Или минимум, вместо UDINT сделать DINT и DWORD и их преобразования в REAL и обратно.
    Последний раз редактировалось kondor3000; 03.12.2021 в 23:04.

Страница 7 из 58 ПерваяПервая ... 567891757 ... ПоследняяПоследняя

Похожие темы

  1. Ответов: 14
    Последнее сообщение: 01.07.2023, 21:30
  2. Ответов: 6
    Последнее сообщение: 22.12.2021, 10:50
  3. Ответов: 3
    Последнее сообщение: 13.09.2021, 13:31
  4. ПЛК160. Чем заменить функцию записи 0x05?
    от FallenDAY в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 26.08.2017, 13:19
  5. Как написать собственную функцию wait()
    от PavelKazakov в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 23.07.2009, 12:37

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •