我正在努力完成非常简单的任务,但看起来我无法弄清楚我们是怎么做的。
我的任务是每日安排。输出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行时,它会为每个工作日参数创建联系人。
如何才能使BOOL
个联系人与该线路相关联?
如果我尝试使用EN / ENO添加功能块,那么我不知道
1)我如何知道EN
是EN
的内部功能块,或者我如何访问该变量?
2)我无法将线圈连接到我的HIGh
输出。它只连接到Q
。我如何控制ENO
的状态?
但这不是全部。我添加了时间和日期库
但我发现只能使用ENO
功能块。我无法弄清楚如何使用它。
我的简单任务是获取当前时间和当前的当前日期,如果本周已启用且当前时间在输入RTCLK.GetDateAndTime
范围内 - 请T1
= Q
否则HIGH
。
有关于此的任何提示吗?
答案 0 :(得分:1)
按如下方式编写一个功能块,它将被循环调用(例如每60秒):
您应该使用库函数来处理日期和时间值。也许你应该看一下免费的图书馆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 *)