Değişken: VAR_IN_OUT Permalink

‎VAR_IN_OUT‎ değişkeni, bir POU arayüzünün parçası olan ve resmi bir pass-by-reference parametresi olarak hizmet veren bir girdi/çıktı değişkenidir.

Sözdizimi

<keyword> <POU name>
VAR_IN_OUT
    <variable name> : <data type>;
END_VAR

<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG

‎PRG‎, ‎FUNCTION_BLOCK‎, ‎METHOD‎ veya ‎FUNCTION‎ POU’larında ‎VAR_IN_OUT‎ beyan bölümünde bir giriş/çıkış değişkeni tanımlayabilirsiniz. ‎VAR_IN_OUT‎ değişkeni okunabilir ve yazılabilir.

Kullanım

  • adresini arayın: Bir POU çağrıldığında, resmi ‎VAR_IN_OUT‎ değişkeni argüman olarak gerçek değişkeni ("pass-by-reference variable") alır. Çalışma zamanında, parametreler aktarıldığında hiçbir kopya oluşturulmaz. Bunun yerine, resmi değişken uzaktan aktarılan gerçek değişkene bir referans alır. Referans değişkenleri, gerçek değere değer olarak dahili bir bellek adresi içerir (pass as pointer, call-by reference). Bir sabiti (değişmez) veya bir bit değişkenini doğrudan argüman olarak belirtmek mümkün değildir.

  • POU içinde okuma/yazma erişimi: Değişken POU içinde yazılırsa, bu durum geçirilen değişkeni etkiler. POU'dan çıkıldığında, gerçekleştirilen tüm değişiklikler korunur. Bu, bir POU'nun ‎VAR_IN_OUT‎ değişkenlerini tıpkı çağıran POU'nun değişkenlerini kullandığı gibi kullandığı anlamına gelir. Okuma erişimine her zaman izin verilir.

  • Uzaktan okuma/yazma erişimi: ‎VAR_IN_OUT‎ değişkenleri doğrudan ‎<function block instance name>.<variable name>‎ aracılığıyla uzaktan okunamaz veya yazılamaz. Bu yalnızca ‎VAR_INPUT‎ ve ‎VAR_OUTPUT‎ değişkenleri için çalışır.

  • Dize değişkenlerini geçirme: Bir dize değişkeni argüman olarak geçirilirse, gerçek değişken ve biçimsel değişken aynı uzunlukta olmalıdır. Aksi takdirde aktarılan dize istenmeden değiştirilebilir. Bu sorun ‎VAR_OUTPUT CONSTANT‎ parametreleri söz konusu olduğunda ortaya çıkmaz.

  • Bit değişkenlerinin aktarılması: Bir bit değişkeni doğrudan bir ‎VAR_IN_OUT‎ değişkenine aktarılamaz çünkü bir ara değişkene ihtiyaç duyar.

  • Özelliklerin aktarılması: İzin verilmez

Bir dize bir değişken veya sabit olarak resmi bir ‎VAR_IN_OUT CONSTANT‎ değişkenine geçirilirse, dize otomatik olarak tamamen geçirilir. Dize uzunluğunu kontrol etmeniz gerekmez.

Daha fazla bilgi için bkz: "VAR_IN_OUT CONSTANT" Aktarım Değişkeni

Örnek

Dizileri geçirme

TYPE DUT_A :
STRUCT
        xA: BOOL;
        iB: INT;
END_STRUCT
END_TYPE

FUNCTION_BLOCK FB_SetArray
VAR_IN_OUT
        aData_A : ARRAY[0..1] OF DUT_A; // Formal variable
END_VAR
aData_A[0].xA := TRUE;
aData_A[0].iB := 100;

PROGRAM PLC_PRG
VAR
        fbSetA : FB_SetArray;
        aSpecialData : ARRAY[0..1] OF DUT_A; // Actual variable
END_VAR
fbSetA(aData_A := aSpecialData);
_cds_varinouts_array.png

Dizeleri geçirme

{attribute 'qualified_only'}
VAR_GLOBAL
        g_sDEV_STATUS : STRING(25) := 'Device_A';
END_VAR

FUNCTION_BLOCK FB_SetStatus
VAR_IN_OUT
        sDeviceStatus : STRING(25); // Formal parameter
END_VAR
sDeviceStatus := CONCAT(sDeviceStatus, ' Activ');

PROGRAM PLC_PRG
VAR
        fbDoB : FB_SetStatus;
END_VAR
fbDoB(sDeviceStatus := GVL.g_sDEV_STATUS); //Call with actual parameter

‎sDeviceStatus‎ değişkeni ‎FB_B‎ POU arayüzünün bir parçasıdır. ‎fbDoB‎ adresini çağırırken, önce dizeye bir cihaz adı atanır ve ardından dize manipüle edilir.

_cds_varinouts_string.png

Bit değişkenleri geçirme

VAR_GLOBAL
        xBit0 AT %MX0.1 : BOOL;
        xTemp : BOOL;
END_VAR

FUNCTION_BLOCK FB_DoSomething
VAR_INPUT
        xIn : BOOL;
END_VAR
VAR_IN_OUT
        xInOut : BOOL;
END_VAR
IF xIn THEN
        xInOut := TRUE;
END_IF

PROGRAM PLC_PRG
VAR
        xIn : BOOL;
        DoSomething_1  : FB_DoSomething;
        DoSomething_2  : FB_DoSomething;
END_VAR

// The following line of code causes a compiler error:
// C0201: Typ 'BIT' is not equal to type 'BOOL' of VAR_IN_OUT 'xInOut'
DoSomething_1(xIn := xIn, xInOut := xBit0);

// Workaround
xTemp := xBit0;
DoSomething_2(xIn := xIn, xInOut := xTemp);
xBit0 := xTemp;

Program, ‎DoSomething_1‎ ve ‎DoSomething_2‎ fonksiyon bloğu örneklerini çağırır. ‎xBit0‎ bit değişkeninin ‎VAR_IN_OUT‎ girişine doğrudan atanmasının bir sonucu olarak, ‎DoSomething_1‎ örneği çağrıldığında bir derleyici hatası üretilir. Buna karşılık, ‎DoSomething_2‎ örneğini bir ara değişken atamasıyla çağırmak doğru koddur.