0

非常に単純なタスクを実行しようとしていますが、どうすればよいかわかりません。

私の仕事は毎日のスケジュールです。出力は毎日 1:00 から 2:00 までQ1でなければなりません。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が入力されます。HIGHアウトプットにもQなるはずHIGHです。

その他は曜日です。その日に仕事をスケジュールしたい場合は、1 または 0 を設定できます。あらゆるタイプのスケジュールを作成するための、ほぼ普遍的な機能ブロック。

質問 1 : 曜日変数を型BOOLにすると、LD ラインにブロックを追加すると、曜日パラメータごとに連絡先が作成されます。

ここに画像の説明を入力

EN連絡先のみを回線に接続するにはどうすればよいですか?

EN/ENOでファンクションブロックを追加しようとしてもわからない

1) 関数ブロックの内部を知るにはどうすればよいですENHIGh、またはその変数にアクセスするにはどうすればよいですか? 2) コイルをQ出力に接続できません。にのみ接続しENOます。の状態を制御するにはどうすればよいENOですか?

しかし、それだけではありません。日時ライブラリを追加しました

ここに画像の説明を入力

しかし、私が時間をかけて機能することがわかったのは、RTCLK.GetDateAndTime関数ブロックだけです。そして、私はそれを扱う方法を理解できません。

私の単純なタスクは、現在の TIME のみと現在の曜日を取得することです。今週が有効な場合、現在の時刻は input T1-make Q=HIGHそうでない場合の範囲内LOWです。

それに関するヒントはありますか?

4

2 に答える 2

1

次のように関数ブロックを記述します。これは周期的に (たとえば 60 秒ごとに) 呼び出されます。

  1. 最初に制御ビットをリセットします (現在の日時が指定した間隔内にある場合、このビットを高く設定しすぎます)。
  2. CPU(コントローラ)のシステムクロックの現在の日付と現在時刻を読み取る
  3. 実際の時間と実際の日を抽出します。実際の時間が指定した間隔 (1:00 から 2:00 など) 内にあるかどうかを確認し、制御ビットを適切に設定します。

日時の値の処理には、ライブラリ関数を使用する必要があります。無料のライブラリOSCAT BASICをチェックしてみてください。Web サイトはドイツ語ですが、ドキュメントとソフトウェアは英語です。

于 2015-07-28T06:01:53.567 に答える
0

この例は、plc 時間を読み取り、文字列に変換するために使用されます。このコードは、SCL (Structured Control Language) を使用する 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 に答える