Страница 473 из 1044 ПерваяПервая ... 373423463471472473474475483523573973 ... ПоследняяПоследняя
Показано с 4,721 по 4,730 из 10436

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #4721

    По умолчанию

    Здравствуйте, нужно сделать регулятор соотношения в Codesys (теоретически). Имеется два расходомера переменного перепада давления для воздуха (Fv) и газа (Fg). Соотношение должно регулироваться в пропорции 1:10 к расходу газа. Правильно ли я изобразил это? Сначала сигнал дифманометра газа и воздуха в квадратической зависимости преобразуется через блок вычисления кв.корня. Затем газа умножается в 10 раз и подается на вход задания ПИД-регулятора, который уже регулирует подачу воздуха. Меня что-то смущает или это верный алгоритм? Возможно, у кого-то есть примеры такого регулятора.
    Вложение 22901

  2. #4722
    Пользователь Аватар для uni
    Регистрация
    01.03.2016
    Адрес
    Екатеринбург
    Сообщений
    17

    По умолчанию

    ПЛК63. Как создать переменную типа BYTE, ссылающуюся на все дискретные выходы (входы)?

  3. #4723
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,251

    По умолчанию

    Покликать по буковкам AT в конфигурации которые обозваны "Битовая маска входов" и вбить имя

  4. #4724
    Пользователь Аватар для uni
    Регистрация
    01.03.2016
    Адрес
    Екатеринбург
    Сообщений
    17

    По умолчанию

    Спасибо, сам что-то не догадался. Со входами это сработало, а что делать с выходами, если я также хочу с ними работать? Как их объединить одной целой переменной?

    И ещё вопрос. Можно ли в ST от CoDeSys использовать стандартные блоки с расширенными параметрами, например так:

    MOV( btmp, 0, Outputs );

    где btmp - это булевая переменная. Очень неудобно в условные блоки оборачивать. В некоторых других ST такой способ используется для всех стандартных наборов функций.

  5. #4725
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    а зачем в ST такие блоки как mov использовать, Вы точно сейчас про паскалеподобный язык говорите?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  6. #4726
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    а что делать с выходами, если я также хочу с ними работать? Как их объединить одной целой переменной?
    Подписать каждый выход (outN), где-нибудь создать байтовую переменную (outs) и в конце программы сделать что-то вроде out0 := SEL(outs.0, 0, 1); out1 := SEL(outs.1, 0, 1); ... например.

  7. #4727
    Пользователь Аватар для uni
    Регистрация
    01.03.2016
    Адрес
    Екатеринбург
    Сообщений
    17

    По умолчанию

    Я раньше программировал на ST от Mitsubishi и привык к конструкциям вроде таких:

    Код:
    319 (* Задержка. *)
    320 TON_1( IN := NOT btmp, PT := T#1s, Q := btmp, ET := ttmp );
    321
    322 (* Меняем текущее состояние выходов на обратное. *)
    323 CML( btmp, Выходы, Выходы );
    324
    325 (* Переходим к тесту связи. *)
    326 MOV( btmp, ТЕСТ_СВЯЗИ, Шаг );
    Выходы инвертируются только когда btmp = TRUE. Переход к другому шагу также. Если вспомнить LAD, то там обязательно слева должен быть какой-нибудь контакт (источник). Так вот этот MOV используется в исходном виде, с учётом входа EN. Мне это удобно. И так со всеми функциями.

  8. #4728
    Пользователь Аватар для uni
    Регистрация
    01.03.2016
    Адрес
    Екатеринбург
    Сообщений
    17

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Подписать каждый выход (outN), где-нибудь создать байтовую переменную (outs) и в конце программы сделать что-то вроде out0 := SEL(outs.0, 0, 1); out1 := SEL(outs.1, 0, 1); ... например.
    Вариант, конечно, но я должен буду всегда пользоваться только outs, т.к. любое использование outN будет перезаписано. Нда, такие простые вещи и уже костыли. Буду думать.

  9. #4729
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    Цитата Сообщение от uni Посмотреть сообщение
    Я раньше программировал на ST от Mitsubishi и привык к конструкциям вроде таких:

    Код:
    319 (* Задержка. *)
    320 TON_1( IN := NOT btmp, PT := T#1s, Q := btmp, ET := ttmp );
    321
    322 (* Меняем текущее состояние выходов на обратное. *)
    323 CML( btmp, Выходы, Выходы );
    324
    325 (* Переходим к тесту связи. *)
    326 MOV( btmp, ТЕСТ_СВЯЗИ, Шаг );
    Выходы инвертируются только когда btmp = TRUE. Переход к другому шагу также. Если вспомнить LAD, то там обязательно слева должен быть какой-нибудь контакт (источник). Так вот этот MOV используется в исходном виде, с учётом входа EN. Мне это удобно. И так со всеми функциями.
    я правильно понял, что Вы называете приведенные функции CML и MOV стандартным набором языка МЭК?
    такой способ используется для всех стандартных наборов функций
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  10. #4730
    Пользователь Аватар для uni
    Регистрация
    01.03.2016
    Адрес
    Екатеринбург
    Сообщений
    17

    По умолчанию

    Я хочу просто сократить запись (ПЛК63):

    Код:
    (* Тест светодиодов. *)
    ELSIF Step = TEST_LEDS THEN
    
    	(* Включаем все светодиоды. *)
    	LedGreen1 := 1;
    	LedGreen2 := 1;
    	LedRed1 := 1;
    	LedRed2 := 1;
    
    	(* Задержка 2 секунды. *)
    	TON_1( IN := TRUE, PT := T#2s, Q => btmp, ET => ttmp );
    
    	(* Выключаем все светодиоды. *)
    	IF btmp THEN
    
    		LedGreen1 := 0;
    		LedGreen2 := 0;
    		LedRed1 := 0;
    		LedRed2 := 0;
    
    		(* Переходим к тесту входов. *)
    		Step := TEST_CHECKINPUTS;
    
    	END_IF;
    Ну и такую вещь тоже хотел бы сократить:
    Код:
    	(* Меняем текущее состояние светодиодов на обратное. *)
    	IF btmp THEN
    
    		LedGreen1 := BOOL_TO_REAL( NOT REAL_TO_BOOL( LedGreen1 ) );
    		LedGreen2 := BOOL_TO_REAL( NOT REAL_TO_BOOL( LedGreen2 ) );
    		LedRed1 := BOOL_TO_REAL( NOT REAL_TO_BOOL( LedRed1 ) );
    		LedRed2 := BOOL_TO_REAL( NOT REAL_TO_BOOL( LedRed2 ) );
    
    		(* Переходим к тесту входов. *)
    		Step := TEST_CHECKINPUTS;
    
    	END_IF;
    Наверняка это можно сделать как-то попроще.

Страница 473 из 1044 ПерваяПервая ... 373423463471472473474475483523573973 ... ПоследняяПоследняя

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

Ваши права

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