Beispiel für einen C-Baustein

In diesem Artikel finden Sie ein Beispiel für einen C-Baustein, der in logi.CAD 3 erstellt wurde. Der C-Baustein berechnet Parameter für einen Regler aus der OSCAT-Bibliothek.

ST-Schnittstelle für C-Baustein

Siehe "Schnittstelle für C-Baustein oder C++-Baustein erstellen" für Informationen, wie eine ST-Schnittstelle erstellt wird.

Beispiel: Inhalt der ST-Schnittstelle
{extern_c}
FUNCTION_BLOCK CONTROL_SET2
VAR_INPUT
	KS : REAL;
	TU : REAL;
	TG : REAL;
	PI : BOOL;
	PID : BOOL;
END_VAR
VAR_INPUT CONSTANT
	P_K : REAL := 1.0;
	PI_K : REAL := 0.9;
	PI_TN : REAL := 3.33;
	PID_K : REAL := 1.2;
	PID_TN : REAL := 2.0;
	PID_TV : REAL := 0.5;
END_VAR
VAR_OUTPUT
	KP : REAL;
	TN : REAL;
	TV : REAL;
	KI : REAL;
	KD : REAL;
END_VAR
END_FUNCTION_BLOCK

Code im C-Baustein

Siehe "Code im C-Baustein oder C++-Baustein erstellen" für Informationen zum C-Baustein.

Beispiel: Inhalt der C-Datei
#ifndef LC_PROT_LCFU___CONTROL_SET2__C
#define LC_PROT_LCFU___CONTROL_SET2__C

#include <lcfu___control_set2.h>

#define V(VAR) (LC_this->LC_VD_##VAR)

void lcfu___CONTROL_SET2(LC_TD_FunctionBlock_CONTROL_SET2* LC_this,
		struct _lcoplck_epdb_1_impl* pEPDB)
{
	LC_TD_REAL TX;

	if (V(TU) > 0.0 && V(KS) > 0.0)
	{
		TX = V(TG) / V(TU) / V(KS);
	}
	if (V(PI) && V(PID))
	{
		V(KP) = 0.0;
		V(TN) = 0.0;
		V(TV) = 0.0;
	}
	else
	{
		if (V(PID))
		{
			V(KP) = V(PID_K) * TX;
			V(TN) = V(PID_TN) * V(TU);
			V(TV) = V(PID_TV) * V(TU);
		}
		else
		{
			if (V(PI))
			{
				V(KP) = V(PI_K) * TX;
				V(TN) = V(PI_TN) * V(TU);
			}
			else
			{
				V(KP) = V(P_K) * TX;
			}
		}
	}

	/* KI and KD are calculated */
	if (V(TN) > 0.0)
	{
		V(KI) = V(KP) / V(TN);
	}
	else
	{
		V(KI) = 0.0;
	}
	V(KD) = V(KP) * V(TV);
}
#endif