Transformation

Transformationen beschreiben den Zusammenhang zwischen Hardwareobjekt und der Darstellung in WinCC OA . Für jede Datenart der Peripherie sollte eine eigene Transformation implementiert werden, die beschreibt, wie die ankommenden Daten zu interpretieren sind (als integer oder als real oder auch bitweise), sowie die Umwandlung in Senderichtung durchführen (z.B. verschiedene Bits aufgrund ihres Subindex im Datenbuffer setzen).

Alle Transformationen werden von der Klasse Transformation des allgemeinen Treiber abgeleitet. Die folgenden virtuellen Methoden sollten dabei auf jeden Fall implementiert werden:

  • toPeriph(PVSSchar *dataPtr, len, const Variable &var, const subix) const dient der Umwandlung der Daten in Befehlsrichtung. Die Daten der Maximallänge len werden in den Buffer, auf den dataPtr zeigt, geschrieben. Die Variable var enthält das zu verschickende WinCC OA Datenelement, falls die Transformation sich auf Felder bezieht, gibt subix den Subindex dieser Variable im Feld an. Für jedes Feldelement (also jeden Subindex) wird diese Funktion extra aufgerufen (in einer Schleife des allgemeinen Treiber), das gesamte Feld steht dann am Ende kompakt im Buffer in der Form, wie sie von der Peripherie erwartet wird. Falls die Transformation erfolgreich durchgeführt werden kann, sollte die Funktion PVSS_TRUE zurückliefern, sonst PVSS_FALSE.

  • toPeriph(PVSSchar *dataPtr, len, const Variable &var, const subix, const RecVar &status) const entspricht der obigen Funktion. Zusätzlich enthält der letzte Parameter die Informationen, für die sich der Treiber beim Eventmanager angemeldet hat, wie z.B. die Quellzeit oder irgendwelche Statusbits.

  • toVar( const PVSSchar *dataPtr, const len, const subix) const dient der Umwandlung der Daten in Melderichtung. Es wird das Feldelement mit dem subix aus dem Buffer, auf den dataPtr zeigt (Mittels der Länge len, sollte überprüft werden ob der Datenpuffer die erforderliche Länge aufweist.) in eine WinCC OA Variable umgewandelt und von dieser Funktion als Rückgabewert geliefert. Im Fehlerfall wird 0 zurückgeliefert.

  • isA() liefert den Transformationstyp zurück.

Beispiel einer Transformation, die ein Bitmuster (mit 4 Bit, 0 bis 3) von der Peripherie den einzelnen Bits einer WinCC OA Bitstruktur zuordnet (auf entsprechende Fehlerbehandlung wurde hier verzichtet):

#include <BitVar.hxx>
#include <Variable.hxx>
PVSSboolean MyTransformation::toPeriph(PVSSchar *dataPtr, len, const Variable &var, const subindex) const
{
  if ((len != 1) || (subindex > 3) || (var.isA() != BIT_VAR))
  return PVSS_FALSE;
  if ( ((const BitVar &)var).getValue() )
  *dataPtr |= (1<<subindex);
  // setze entsprechendes Bit im Buffer
  return PVSS_TRUE;
}
VariablePtr MyTransformation::toVar(const PVSSchar *dataPtr, const len, const subindex) const
{
  if ((len != 1) || (subindex > 3))
  return PVSS_FALSE;
  return new BitVar( (*dataPtr & (1<<subindex)) ? PVSS_TRUE : PVSS_FALSE );
}