--- a
+++ b/trunk/SPI_Template.library.md
@@ -0,0 +1,110 @@
+---
+
+~~~ST
+FUNCTION_BLOCK SPITemplate EXTENDS spi
+VAR_OUTPUT
+    dwRaw: DWORD;
+    rValue: REAL;
+END_VAR
+VAR
+    usiBitWidth: USINT;
+    rResolution: REAL;
+END_VAR
+
+~~~
+~~~ST
+SUPER^();
+
+CASE _iState OF
+0:
+	IF SUPER^.init() THEN
+		_iState := 1;
+	END_IF	
+1:
+	_iState := 10;
+END_CASE
+
+~~~
+---
+~~~ST
+METHOD AfterReadInputs: INT
+VAR
+    aby: ARRAY [..] OF ;
+    usiChannel: USINT;
+END_VAR
+
+~~~
+~~~ST
+SUPER^.AfterReadInputs();
+
+IF _iState = 10 THEN
+
+	FOR usiChannel := 0 TO 0 DO
+		aby[0] := 1;
+		aby[1] := 16#80 + SHL(usiChannel AND 7, 4);
+		aby[2] := 0;
+		aby[3] := 0;
+		
+		IF NOT transfer(pabyTxBuffer:=ADR(aby) , pabyRxBuffer:=ADR(aby) , udiLen:=3 , uiDelayus:=0) THEN
+			_iState := 1000;
+		END_IF
+
+		CASE usiChannel OF
+			0:		
+				dwRaw := aby[3];
+				dwRaw := SHL(dwRaw,8) OR aby[2];
+				dwRaw := SHL(dwRaw,8) OR aby[1];
+				dwRaw := SHL(dwRaw,8) OR aby[0];
+				
+				rValue := DWORD_TO_REAL(SHR(dwRaw, usiBitWidth));
+				rValue := rValue * rResolution;
+		END_CASE
+	END_FOR		
+END_IF
+
+~~~
+---
+~~~ST
+METHOD BeforeWriteOutputs: INT
+VAR
+    i: USINT;
+END_VAR
+
+~~~
+~~~ST
+SUPER^.BeforeWriteOutputs();
+
+~~~
+---
+~~~ST
+METHOD Initialize: UDINT
+VAR_INPUT
+    wModuleType: UINT;
+    dwInstance: UDINT;
+    pConnector: pointer;
+END_VAR
+VAR
+    pParam: pointer;
+    udiResult: UDINT;
+    pusiBitWidth: pointer;
+    prResolution: pointer;
+END_VAR
+
+~~~
+~~~ST
+SUPER^.Initialize(wModuleType, dwInstance, pConnector);
+pParam := ConfigGetParameter(_pConnector, 1000);
+IF pParam <> 0 THEN
+	pusiBitWidth := IoStandard.ConfigGetParameterValuePointer(pParam, ADR(udiResult));
+	usiBitWidth := pusiBitWidth^;
+END_IF
+
+pParam := ConfigGetParameter(_pConnector, 1001);
+IF pParam <> 0 THEN
+	prResolution := IoStandard.ConfigGetParameterValuePointer(pParam, ADR(udiResult));
+	rResolution := prResolution^;
+END_IF
+
+
+
+~~~