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> ( := <initialization value> )? ;
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
PRG, FUNCTION_BLOCK, METHOD veya FUNCTION POU'larındaki VAR_IN_OUT bildirim bölümünde bir girdi/çıktı değişkeni bildirebilirsiniz. Bir seçenek olarak,
bildirilen veri türünün bir sabiti başlatma değeri olarak atanabilir. VAR_IN_OUT değişkeni okunabilir ve yazılabilir.
Kullanım
-
adresini arayın: Bir POU çağrıldığında, resmi
VAR_IN_OUTdeğ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_OUTdeğ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_OUTdeğişkenleri doğrudan<function block instance name>.<variable name>aracılığıyla uzaktan okunamaz veya yazılamaz. Bu yalnızcaVAR_INPUTveVAR_OUTPUTdeğ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 CONSTANTparametreleri söz konusu olduğunda ortaya çıkmaz. -
Bit değişkenlerinin aktarılması: Bir bit değişkeni doğrudan bir
VAR_IN_OUTdeğ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);

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.

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.
-
Transfer değişkeni
VAR_IN_OUT CONSTANT