0

プログラムをトレースすると(ブレークポイントとシングルステップを使用してオンラインで) 、行に到達するとVARSOpenが" * INVALID:16#02*Step:=Step+1; "になることがわかります。

トレースをもっと注意深く見ると、「0:」の最初の呼び出しでステップが0から1に変わることがわかりました。2つのVARは初期化された2つであり、互いにリンクされているように見えます。追加の増加により、ステップが2に設定され(最初の実行で!)、SOpenが無効に設定されます。

PROGRAM PLC_PRG
VAR
    SerIO: SERCOMM;
    Step: BYTE := 0;
    Input: ARRAY [0..50] OF DWORD;
    SOpen: BOOL := FALSE;
END_VAR

IF Eingang1 THEN
    CASE Step OF
    0:
        IF NOT SOpen THEN
            SerIO.FB_ACTION := Open;
            SerIO.RECEIVE_BUFFER:=Input[0];
            SerIO.COMPORT:=1;
            SerIO.EN:=TRUE;
            Ausgang1 := NOT SerIO.ERROR;
            SOpen :=TRUE;
            SerIO.EN:=FALSE;
        END_IF;
    1:
        IF SOpen THEN
            SerIO.FB_ACTION:=Read;
            SerIO.EN:=TRUE;
            Ausgang1 := NOT SerIO.ERROR;
            Ausgang2 := (SerIO.BYTES_DONE>3);
            SerIO.EN:=FALSE;
        END_IF;
    2:
        IF SOpen THEN
            SerIO.FB_ACTION:=Close;
            SerIO.EN:=TRUE;
            Ausgang1 := NOT SerIO.ERROR;
            SOpen :=FALSE;
            SerIO.EN:=FALSE;
        END_IF;
    END_CASE
    Step:=Step+1;
    IF Step>2 THEN Step :=0; END_IF;
ELSIF SOpen THEN
    SerIO.FB_ACTION:=Close;
    SerIO.EN:=TRUE;
    SerIO.EN:=FALSE;
    SOpen :=FALSE;
    Step:=0;
END_IF;
4

2 に答える 2

0

VARをVAR_GLOBALに転送しました。それは私が本当に望んでいることではありませんが、今ではうまくいきます。より良い解決策は歓迎され、受け入れられます:)

于 2011-12-02T16:59:16.803 に答える
0

質問なぜCASEステートメントをIFステートメントに配置するのですか?IFステートメントはあなたのステップを呼び出す必要がありますか?

If something then
  step = 10; (* start processing *)
else
  step = 0;
end_if

case step of

  0:
    Kill your enable or an idle state here stop state.
  10: (* Start *)
    step = step +1;
  20:
       Call FB
  40: (*continue *)
   step = 10;

  30: (* End *)
   step = 0;
   else (* catch something here *)

  end_case

上記のコードから入力を取得するFBをここで呼び出します。

すべてをクリーンアップしないと、変数リストが発生する可能性のある異常な状態から抜け出すと、INVALIDを判断するのが難しい場合があります。申し訳ありませんが、私が無効なものを見たのはあまり助けになりませんでした。それはクリーンなプロジェクトから来ており、まだ呼び出されていない無効なポインタを調べています。

于 2015-11-14T01:27:28.703 に答える