Bagaimana saya bisa membuang pengecualian sistem standar (dan jika mungkin, membuat pengecualian khusus dan membuangnya juga).

Hal paling sederhana yang terlintas dalam pikiran, adalah hanya membagi variabel dengan nol, tapi itu hanya retasan terbaik.

Saya memang menemukan penyebutan fungsi AppGenerateException di perpustakaan CmpApp, tetapi saya tidak dapat menemukan dokumentasi apa pun untuknya, atau contoh apa pun. Adakah yang bisa mengarahkan saya ke beberapa dokumentasi untuk ini?

0
Guiorgy 2 Juni 2020, 17:26

1 menjawab

Jawaban Terbaik

Karena penasaran, saya memeriksa AppGenerateException dan membuatnya berfungsi. Dapatkan bantuan dari halaman bantuan Codesys ini.

Saya masih berpikir ini bukan cara terbaik untuk mencapai apa yang Anda butuhkan, tetapi ini bisa berhasil.

Sayangnya, saya memiliki sistem 64 bit dan TRY..CATCH belum bekerja di sistem 32 bit lain sejauh yang saya tahu, jadi saya tidak bisa menguji penangkapan.

Tambahkan perpustakaan berikut:

  • CmpApp
  • SistemKecuali

Kemudian kode berikut tampaknya berfungsi. Setel ThrowErr ke true untuk mendapatkan pengecualian sistem.

PROGRAM PRG_TestThrow
VAR CONSTANT
    MY_PRIVATE_EXCEPTION : DWORD := 32001;
END_VAR
VAR
    ThrowErr    : BOOL; //Set this to TRUE to throw an error

    //The next two are for getting App instance
    _pApp       : POINTER TO CmpApp.APPLICATION;
    _Result     : SysExcept.SysTypes.RTS_IEC_RESULT;
END_VAR



//Get App instance
_pApp := AppGetCurrent(pResult := ADR(_Result));

IF ThrowErr THEN
    ThrowErr := FALSE;

    IF _pApp <> 0 THEN
        //Throw divide by zero exception
        AppGenerateException(pApp:=_pApp,   ulException:=RtsExceptions.RTSEXCPT_DIVIDEBYZERO);

        //You could use probably any available number as your own custom exception. 
        //For example the following works BUT not sure if it's ok to this.
        //AppGenerateException(pApp:=_pApp,   ulException:=MY_PRIVATE_EXCEPTION);

        //See RtsExceptions type for available exception codes. 
        //For my Codesys version, it has largest exception number of 0x2000 so all larger number are free (for now...)
    END_IF
END_IF

Tampaknya mungkin menggunakan kode pengecualian khusus seperti:

AppGenerateException(pApp:=_pApp,   ulException:=MY_PRIVATE_EXCEPTION);

Tapi itu tidak didokumentasikan jadi saya akan berhati-hati.

1
Quirzo 4 Juni 2020, 05:48