0

我正在尝试完成非常简单的任务,但看起来我无法弄清楚我们的方法。

我的任务是每日计划。输出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输出。QHIGH

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

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

在此处输入图像描述

我该怎么做才能使EN联系人仅连接到线路?

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

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

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

在此处输入图像描述

但我发现唯一能与时间一起工作的是RTCLK.GetDateAndTime功能块。而且我无法弄清楚如何使用它。

我的简单任务是仅获取当前时间和一周中的当前日期,如果启用了本周,并且当前时间在 input T1-make Q= HIGHelse的范围内LOW

有什么提示吗?

4

2 回答 2

1

编写如下函数块,它将被循环调用(例如每 60 秒):

  1. 在开始时重置您的控制位(如果当前日期和时间在您指定的时间间隔内,您将将此位设置得太高)
  2. 读取 CPU(控制器)系统时钟的当前日期和当前时间
  3. 提取实际时间和实际日期。检查实际时间是否在您指定的时间间隔内(例如 1:00 到 2:00)并适当设置您的控制位

您应该使用库函数来处理日期和时间值。也许您应该查看免费库OSCAT BASIC。该网站是德文的,但文档和软件是英文的。

于 2015-07-28T06:01:53.567 回答
0

此示例用于读取 plc 时间并将其转换为字符串。此代码是为带有 SCL(结构化控制语言)的 Siemens 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 *)
于 2015-09-18T06:47:10.537 回答