如何在Codesys 3.5

时间:2015-07-26 14:34:52

标签: plc st codesys

我正在努力完成非常简单的任务,但看起来我无法弄清楚我们是怎么做的。

我的任务是每日安排。输出Q1必须每天从1:00到2:00 HIGH。我找不到能帮助我的功能块。我决定创建自己的。

以下是我的定义。

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。 <{1}}输出HIGH也应为Q

其他人是一周中的几天。如果我想在那天安排工作,我可以设置1或0。几乎是通用功能块,用于创建任何类型的计划。

问题1 :当我将工作日变量设为HIGH时,当我将块添加到LD行时,它会为每个工作日参数创建联系人。

enter image description here

如何才能使BOOL个联系人与该线路相关联?

如果我尝试使用EN / ENO添加功能块,那么我不知道

1)我如何知道ENEN的内部功能块,或者我如何访问该变量? 2)我无法将线圈连接到我的HIGh输出。它只连接到Q。我如何控制ENO的状态?

但这不是全部。我添加了时间和日期库

enter image description here

但我发现只能使用ENO功能块。我无法弄清楚如何使用它。

我的简单任务是获取当前时间和当前的当前日期,如果本周已启用且当前时间在输入RTCLK.GetDateAndTime范围内 - 请T1 = Q否则HIGH

有关于此的任何提示吗?

2 个答案:

答案 0 :(得分:1)

按如下方式编写一个功能块,它将被循环调用(例如每60秒):

  1. 在开头重置控制位(如果是,则将此位设置得太高 当前日期和时间在指定的时间间隔内)
  2. 读取系统时钟的当前日期和当前时间 CPU(控制器)
  3. 提取实际时间和实际日期。检查实际时间是否正确 在指定的时间间隔内(例如1:00到2:00)并设置控制位 适当
  4. 您应该使用库函数来处理日期和时间值。也许你应该看一下免费的图书馆OSCAT BASIC。该网站是德语,但文档和软件是英文。

答案 1 :(得分:0)

此示例用于读取plc时间并将其转换为字符串。此代码是为具有SCL(结构化控制语言)的西门子PLC开发的:

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

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 *)