2015-07-26 5 views
0

Я пытаюсь выполнить очень простую задачу, но похоже, что я не могу понять, как это сделать.Как работать с реальным временем в пользовательском функциональном блоке на ST в Codesys 3.5

Моя задача - ежедневное расписание. выход Q1 должен быть HIGH каждый день с 1:00 до 2:00. Я не мог найти функциональный блок, который бы мне помог. Я решил создать свою собственную.

Вот мои определения.

FUNCTION_BLOCK Shedule 
VAR_INPUT 
    EN: BOOL; 

    MO: INT; 
    TU: INT; 
    WE: INT; 
    TH: INT; 
    FR: INT; 
    SA: INT; 
    SU: INT; 

    T1: STRING; 
END_VAR 
VAR_OUTPUT 
    Q: BOOL; 
END_VAR 

Идея заключается в следующем. EN - вход. Он должен быть HIGH для вывода Q, чтобы стать HIGH тоже.

Другие - это дни недели. Я могу установить 1 или 0, если я хочу, чтобы работа по расписанию была в этот день. Довольно универсальный функциональный блок для создания любого типа расписаний.

Вопрос 1: Когда я делаю переменные дня недели, BOOL, когда я добавляю блок в линию LD, он создает контакт для каждого параметра дня недели.

enter image description here

Что я могу сделать, чтобы сделать только EN контакт подключен к линии?

Если я пытаюсь добавить функциональный блок с EN/ENO, то я не знаю

1) Как я знаю, что внутри функционального блока, который EN является HIGh или как получить доступ к этой переменной? 2) Я не могу подключить катушку к моему Q выходам. он подключается только к ENO. как я могу управлять состоянием ENO?

Но это еще не все. Я добавил даты и времени библиотека

enter image description here

Но единственное, что я нашел, чтобы работать со временем это RTCLK.GetDateAndTime функциональный блок. И я не могу понять, как с этим работать.

Моя простая задача, чтобы получить только и текущий день недели, и если на этой неделе включена и текущее время в диапазоне на входе T1 текущее время - сделать Q = HIGH иначе LOW.

Какие-нибудь намеки на это?

ответ

1

Написать функциональный блок следующим образом, который будет вызываться циклически (например, каждый 60с):

  1. Сброс бита управления в начале (вы будете устанавливать этот бит слишком высок, если текущий день и время находится внутри указанного интервала)
  2. Прочитать текущую дату и время работы системных часов CPU (контроллер)
  3. Извлечь фактическое время и фактический день. Проверьте, действительно ли фактическое время составляет внутри указанного интервала (например,С 1:00 до 2:00) и установить контрольный бит

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

+0

Наконец-то у меня это работает. Ключевым предложением было OSACT BASIC. Мне удалось получить битку в реальном времени. Думаю, я ошибаюсь. Не могли бы вы показать пример, как читать ПЛК в реальном времени? –

0

Этот пример используется для чтения времени plc и преобразования его в строку. Этот код был разработан для PLC Siemens с SCL (язык структурированного управления):

(*************************************************************************************) 

FUNCTION FC11 : STRING 

TITLE = 'Convert date and time to string' 


(******************************************************************************* 

FUNCTION: Convert date and time to string 

*******************************************************************************) 

// ------------------------------------------------------------------------------ 
// parameter 
// ------------------------------------------------------------------------------ 

VAR_TEMP 

DTAsString   : STRING[14]; 

DateTime   : DATE_AND_TIME; 
DateTimeAsByteArray AT DateTime 
        : ARRAY[0..7] OF BYTE; 

ReturnValue   : INT; 

Year    : INT; 
Month    : INT; 
Day     : INT; 
Hours    : INT; 
Minutes    : INT; 
Seconds    : INT; 

END_VAR 

// ------------------------------------------------------------------------------ 
// ------------------------------------------------------------------------------ 

//Inizialize 
DTAsString := ''; 

//Read PLC date and time 
ReturnValue := READ_CLK(CDT := DateTime // OUT: DATE_AND_TIME 
         ); 

//Split data and time value  
Year  := BCD_TO_INT(DateTimeAsByteArray[0]); 
Month  := BCD_TO_INT(DateTimeAsByteArray[1]); 
Day   := BCD_TO_INT(DateTimeAsByteArray[2]); 
Hours  := BCD_TO_INT(DateTimeAsByteArray[3]); 
Minutes  := BCD_TO_INT(DateTimeAsByteArray[4]); 
Seconds  := BCD_TO_INT(DateTimeAsByteArray[5]); 

//Build string 
//------------ 

//Year 
//---- 
IF (Year >= 10) THEN 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= '20'); 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= INT_TO_STRING(Year),L:=2)); 
ELSE 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= '200'); 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= INT_TO_STRING(Year),L:=1));  
END_IF;  

//Month 
//----- 
IF (Month >= 10) THEN  
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= INT_TO_STRING(Month),L:=2)); 
ELSE 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= '0'); 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= INT_TO_STRING(Month),L:=1));   
END_IF; 

//Day 
//--- 
IF (Day >= 10) THEN 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= I_STRNG(Day),L:=2)); 
ELSE 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= '0'); 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= I_STRNG(Day),L:=1)); 
END_IF; 

//Hours 
//----- 
IF (Hours >= 10) THEN 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= I_STRNG(Hours),L:=2)); 
ELSE 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= '0'); 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= I_STRNG(Hours),L:=1)); 
END_IF; 

//Minutes 
//------- 
IF (Minutes >= 10) THEN 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= I_STRNG(Minutes),L:=2)); 
ELSE 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= '0'); 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= I_STRNG(Minutes),L:=1)); 
END_IF; 

//Seconds 
//------- 
IF (Seconds >= 10) THEN 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= I_STRNG(Seconds),L:=2)); 
ELSE 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= '0'); 
    DTAsString := CONCAT (IN1:= DTAsString, IN2:= RIGHT(IN:= I_STRNG(Seconds),L:=1)); 
END_IF; 

//Return Date and Time as String 
//------------------------------  
FC11 := DTAsString; 

END_FUNCTION 

//******************************************************************************* 

(* Nothing beyond this *) 
+0

Что такое READ_CLK? Где вы взяли эту функцию? –

+0

Системные функции (SFC) SFC 1 «READ_CLK» содержится в операционных системах центральных процессоров Siemens S7-300 и S7-400. С помощью SFC 1 «READ_CLK» (считывание системных часов) вы считываете текущую дату или текущее время системных часов процессора. С другой стороны, с помощью SFC 0 «SET_CLK» (установить системные часы) вы устанавливаете время и дату тактовых импульсов ЦП. Обычно такие функции должны предоставляться производителем ПЛК и являются частью операционной системы, которая работает на ПЛК. Какую систему (ПЛК) вы используете? – dergroncki

+0

Теперь я понял. Это поддерживается siemens. К сожалению, не может ПЛК, который является OWEN. –

Смежные вопросы