HllHandler.h - Donnerstag, 24. März 2005

#
HllHandler.h

Index

- HllHandler.h
  - Datentypen
    - class HllANYPTR
    - class HllDATE_AND_TIME
    - class HllHandler
    - class HllPTR32
    - class PluginHandler
    - enum BLOCK_TYPE
    - enum SOURCE_WIDTH

###### toc

## HllHandler.h

###### toc

## Datentypen

###### toc • >>

## class HllANYPTR

`#include "HllHandler.h"`

Die Daten eines HllANYPTR bestehen genau aus den 10 Bytes eines STEP7-ANYPTRs. Die Peripherie, Timer und Zähler werden hier nicht unterstützt. Es werden Funktionen zur Verfügung gestellt, die die einzelnen Teilinformationen zurückgeben und solche, die bei richtiger Anwendung die Zieldaten liefern.

### Public Interface

GetBlockType | GetSourceWidth | GetBlockNumber
GetRepetition | GetPointer | GetAddress
GetSourceBit | GetSourceByte | GetSourceWORD
GetSourceDWORD | SetSourceBit | SetSourceByte
SetSourceWORD | SetSourceDWORD

### Public Interface

`BLOCK_TYPE GetBlockType` | `() ;`

  Liefert den Bausteintypen.

`SOURCE_WIDTH GetSourceWidth` | `() ;`

  Liefert die Breite des Quell-Datentypen.

`WORD GetBlockNumber` | `() ;`

  Liefert die Nummer des Datenbausteins, wenn ein solcher angegeben ist.

`WORD GetRepetition` | `() ;`

  Liefert die Anzahl der Wiederholungen, wenn ein Array angegeben ist.

`void GetPointer` | `( long& lAddr , long& lBit ) ;`

  Extrahiert die Adresse und setzt die Variablen lAddr und lBit. Die Adresse ist dann "lAddr.lBit".

`WORD GetAddress` | `() ;`

  Extrahiert die letzten 2 Bytes. Bei Blöcken wird <Adresse>*8 + <Bit> zurückgegeben. Bei Zählern und Timern wird die Nummer zurückgegeben.

`bool GetSourceBit` | `( HllHandler* pHandler ) ;`

  Liefert ein Bit aus dem Ziel-Operanden.

`BYTE GetSourceByte` | `( HllHandler* pHandler ) ;`

  Liefert ein Byte aus dem Ziel-Operanden.

`WORD GetSourceWORD` | `( HllHandler* pHandler ) ;`

  Liefert ein Wort aus dem Ziel-Operanden. Steht im Speicher aufsteigend 0x12, 0x34, so wird 0x1234 zurückgegeben.

`DWORD GetSourceDWORD` | `( HllHandler* pHandler ) ;`

  Liefert ein Doppelwort aus dem Ziel-Operanden. Steht im Speicher austeigend 0x12, 0x34, 0x56, 0x78, so wird 0x12345678 zurückgegeben.

`void SetSourceBit` | `( HllHandler* pHandler , bool bBit ) ;`

  Setzt ein Bit im Ziel-Baustein.

`void SetSourceByte` | `( HllHandler* pHandler , BYTE byte ) ;`

  Setzt ein Byte im Ziel-Baustein.

`void SetSourceWORD` | `( HllHandler* pHandler , WORD w ) ;`

  Setzt ein Wort im Ziel-Baustein. Wenn der Parameter w == 0x1234 ist, so werden aufsteigend die Byte-Werte 0x12, 0x34 geschrieben.

`void SetSourceDWORD` | `( HllHandler* pHandler , DWORD dw ) ;`

  Setzt ein Doppelwort im Ziel-Baustein. Wenn der Parameter dw == 0x12345678 ist, so werden aufsteigend die Byte-Werte 0x12, 0x34, 0x56, 0x78 geschrieben.

### Protected Interface

#### Protected Data

    BYTE m_bData [ 10 ];

  10 Bytes STEP7-ANYPTR.

###### << • toc • >>

## class HllDATE_AND_TIME

`#include "HllHandler.h"`

Diese Klasse beschreibt den Datentyp DATE_AND_TIME. Es werden Funktionen zur Verfügung gestellt, die die einzelnen Teilinformationen zurückgeben und solche, die bei richtiger Anwendung die Zieldaten liefern.

### Public Interface

GetMillisecond | SetMillisecond | GetDayOfWeek
SetDayOfWeek | ToSYSTEMTIME | FromSYSTEMTIME
GetMillisecondsOfDay

### Public Interface

`WORD GetMillisecond` | `() ;`

  Liefert die Millisekunden, Wertebereich 0..999.

`void SetMillisecond` | `( WORD wMillisecond ) ;`

  Setzt die Millisekunden, Wertebereich 0..999.

`BYTE GetDayOfWeek` | `() ;`

  Liefert die Codierung für den Wochentag (Sonntag=1, Montag=2, ...).

`void SetDayOfWeek` | `( BYTE bDayOfWeek ) ;`

  Setzt den Code für den Wochentag (Sonntag=1, Montag=2, ...).

`SYSTEMTIME ToSYSTEMTIME` | `() ;`

  Konvertiert nach SYSTEMTIME.

`void FromSYSTEMTIME` | `( SYSTEMTIME st ) ;`

  Übernimmt den Wert aus einer SYSTEMTIME.

`DWORD GetMillisecondsOfDay` | `() ;`

  Liefert die Millisekunden seit Mitternacht.

#### Public Data

    BYTE bYear;

  Jahr, BCD-kodiert.

    BYTE bMonth;

  Monat, BCD-kodiert.

    BYTE bDay;

  Tag, BCD-kodiert.

    BYTE bHour;

  Stunde, BCD-kodiert.

    BYTE bMinute;

  Minute, BCD-kodiert.

    BYTE bSecond;

  Sekunde, BCD-kodiert.

    BYTE bMSD;

  Millisekunden (höchste 2 Nibble aus BCD-Kodierung).

    BYTE bLSDandDayOfWeek;

  Millisekunden (unterstes Nibble aus BCD-Kodierung, im oberen Nibble) und Wochentag (Sonntag=1, unteres Nibble).

###### << • toc • >>

## class HllHandler

`#include "HllHandler.h"`

Hll-Funktionen, die einen FC oder FB ersetzen, erhalten einen Zeiger auf einen HllHandler. Über diesen können die Aktualparameter ausgelesen werden und auf Operandenbereiche in der CPU zugegriffen werden.

### Public Interface

HllHandler | GetThread | GetFCParams
GetFBParams | GetAkkuAsDWORD | GetAkkuAsFloat
GetAR | GetActDBNumber | GetActDINumber
GetInitialOBNumber | GetStartupOBNumber | SetAkku
SetAkku | SetAR1 | SetActDBNumber
SetActDINumber | GetTimerCount | GetCounterCount
GetFlagCount | GetPEByteCount | GetPAByteCount
GetRemanentTimerCount | GetRemanentCounterCount | GetRemanentFlagCount
GetTimerValue | GetTimerValueUnitBCD | GetCounterValue
SetTimerValue | SetCounterValue | GetBytes
SetBytes | GetDBBytes | SetDBBytes
CPUIsInitialized | CPUIsFrozen | CPUIsTerminating
CPUIsRunning

### Public Interface

`HllHandler` | `( void* pThread = NULL ) ;`

  Ein HllHandler wird nur im SoftPlc7Kernel erzeugt und erhält einen Zeiger auf den aktuellen S7Thread. Ist pThread == NULL, so können nur globale Daten (Zähler, Timer, DBs) geschrieben und gelesen werden, nicht dagegen thread-abhängige Daten wie Register, aufgeschlagener Datenbaustein und initielle OB-Nummer.

`void* GetThread` | `() ;`

  Liefert den Zeiger auf den S7Thread zurück.

`void* GetFCParams` | `() ;`

  Liefert bei (S)FC-Aufruf die Parameter als HllPTR32-Array. Nach Casten auf (HllPTR32*) kann auf die einzelnen Parameter zugegriffen werden.

`void* GetFBParams` | `() ;`

  Liefert bei (S)FB-Aufruf die Parameter im Instanz-DB. Die Parameter müssen entsprechend dem Typ aus dem Speicher gelesen werden.

`DWORD GetAkkuAsDWORD` | `( long lAkku ) ;`

  Liefert den Wert des gewünschten Akkus (1 bis 4 erlaubt) als DWORD oder 0.

`float GetAkkuAsFloat` | `( long lAkku ) ;`

  Liefert den Wert des gewünschten Akkus (1 bis 4 erlaubt) als float oder 0.0.

`DWORD GetAR` | `( long lAR ) ;`

  Liefert den Wert des gewünschten Adressregisters (1 und 2 erlaubt) oder 0.

`WORD GetActDBNumber` | `() ;`

  Liefert die Nummer des aufgeschlagenen Datenbausteins oder 0.

`WORD GetActDINumber` | `() ;`

  Liefert die Nummer des aufgeschlagenen Instanz-Datenbausteins oder 0.

`WORD GetInitialOBNumber` | `() ;`

  Liefert die Nummer des Organisationsbausteins, von dem aus die Hll-Funktion aufgerufen wurde (oberster Callstack-Eintrag).

`WORD GetStartupOBNumber` | `() ;`

  Liefert die Nummer des Anlauf-Organisationsbausteins, der zuletzt aufgerufen wurde.

`bool SetAkku` | `( long lAkku , DWORD dwValue ) ;`

  Setzt den gewünschten Akku (1 bis 4 erlaubt) auf den Wert dwValue und gibt an, ob die Funktion durchgeführt werden konnte.

`bool SetAkku` | `( long lAkku , float fltValue ) ;`

  Setzt den gewünschten Akku (1 bis 4 erlaubt) auf den Wert fltValue und gibt an, ob die Funktion durchgeführt werden konnte.

`void SetAR1` | `( DWORD dwValue ) ;`

  Setzt das Adressregister AR1 auf den Wert dwValue.

`bool SetActDBNumber` | `( WORD wNumber ) ;`

  Schlägt den angegebenen Datenbausteins auf und gibt an, ob die Funktion durchgeführt werden konnte.

`bool SetActDINumber` | `( WORD wNumber ) ;`

  Schlägt den angegebenen Instanz-Datenbausteins auf und gibt an, ob die Funktion durchgeführt werden konnte.

`WORD GetTimerCount` | `() ;`

  Liefert die Anzahl der Timer innerhalb der CPU.

`WORD GetCounterCount` | `() ;`

  Liefert die Anzahl der Zähler innerhalb der CPU.

`WORD GetFlagCount` | `() ;`

  Liefert die Anzahl der Merker innerhalb der CPU.

`WORD GetPEByteCount` | `() ;`

  Liefert die Anzahl der Peripherie-Eingangs-Bytes innerhalb der CPU.

`WORD GetPAByteCount` | `() ;`

  Liefert die Anzahl der Peripherie-Ausgangs-Bytes innerhalb der CPU.

`WORD GetRemanentTimerCount` | `() ;`

  Liefert die Anzahl der remanenten Timer innerhalb der CPU.

`WORD GetRemanentCounterCount` | `() ;`

  Liefert die Anzahl der remanenten Zähler innerhalb der CPU.

`WORD GetRemanentFlagCount` | `() ;`

  Liefert die Anzahl der remanenten Merker innerhalb der CPU.

`WORD GetTimerValue` | `( WORD wTimer ) ;`

  Liefert den Wert des Timers mit der Nummer wTimer. Entspricht dem AWL-Befehl "L T<number>".

`WORD GetTimerValueUnitBCD` | `( WORD wTimer ) ;`

  Liefert den Wert des Timers BCD-kodiert und dem Code für die Zeiteinheit. Entspricht dem AWL-Befehl "LC T<number>".

`WORD GetCounterValue` | `( WORD wCounter ) ;`

  Liefert den Wert des Zählers mit der Nummer wCounter.

`bool SetTimerValue` | `( WORD wTimer , WORD wValue ) ;`

  Setzt den Wert des Timers mit der Nummer wTimer auf den Wert wValue und gibt an, ob die Funktion durchgeführt werden konnte. Der Wert wValue ist dabei BCD-kodiert und enthält auch die Zeiteinheit.

`bool SetCounterValue` | `( WORD wCounter , WORD wValue ) ;`

  Setzt den Wert des Zählers mit der Nummer wCounter auf den Wert wValue und gibt an, ob die Funktion durchgeführt werden konnte.

`WORD GetBytes` | `( BLOCK_TYPE eType , WORD wAddr , BYTE* pbDest , WORD wLen ) ;`

  Kopiert maximal wLen Bytes aus dem Quell-Baustein ab Adresse wAddr in den durch pbDest bestimmten Zielpuffer. Gibt an, wieviele Bytes kopiert werden konnten. Es werden weniger als wLen Bytes kopiert, wenn der angegebene Bereich nicht vollständig im Datenbaustein liegt.
  eType
    Typ des Quell-Bausteins.
  wAddr
    Anfangsadresse im Quell-Baustein.
  pbDest
    Zieladresse.
  wLen
    Anzahl der zu kopierenden Bytes.

`WORD SetBytes` | `( BLOCK_TYPE eType , WORD wAddr , BYTE* pbSrc , WORD wLen ) ;`

  Kopiert maximal wLen Bytes aus dem durch pbSrc bestimmten Quellpuffer in den Ziel-Baustein ab Adresse wAddr. Gibt an, wieviele Bytes kopiert werden konnten. Es werden weniger als wLen Bytes kopiert, wenn der angegebene Bereich nicht vollständig im Datenbaustein liegt.
  eType
    Typ des Ziel-Bausteins.
  wAddr
    Anfangsadresse im Ziel-Baustein.
  pbSrc
    Quelladresse.
  wLen
    Anzahl der zu kopierenden Bytes.

`WORD GetDBBytes` | `( WORD wDBNumber , WORD wAddr , BYTE* pbDest , WORD wLen ) ;`

  Kopiert maximal wLen Bytes aus dem Quell-Datenbaustein mit der Nummer wDBNumber in den durch pbDest bestimmten Zielpuffer. Gibt an, wieviele Bytes kopiert werden konnten. Es werden weniger als wLen Bytes kopiert, wenn der angegebene Bereich nicht vollständig im Datenbaustein liegt.
  wDBNumber
    Nummer des Datenbausteins.
  wAddr
    Anfangsadresse im Datenbaustein.
  pbDest
    Zieladresse.
  wLen
    Anzahl der zu kopierenden Bytes.

`WORD SetDBBytes` | `( WORD wDBNumber , WORD wAddr , BYTE* pbSrc , WORD wLen ) ;`

  Kopiert maximal wLen Bytes aus dem durch pbSrc bestimmten Quellpuffer in den Ziel-Datenbaustein ab Adresse wAddr. Gibt an, wieviele Bytes kopiert werden konnten. Es werden weniger als wLen Bytes kopiert, wenn der angegebene Bereich nicht vollständig im Datenbaustein liegt.
  wDBNumber
    Nummer des Datenbausteins.
  wAddr
    Anfangsadresse im Datenbaustein.
  pbSrc
    Quelladresse.
  wLen
    Anzahl der zu kopierenden Bytes.

`bool CPUIsInitialized` | `() ;`

  Gibt an, ob die CPU schon initialisiert ist.

`bool CPUIsFrozen` | `() ;`

  Gibt an, ob die CPU gerade im FREEZE-Zustand ist.

`bool CPUIsTerminating` | `() ;`

  Gibt an, ob die CPU sich beendet.

`bool CPUIsRunning` | `() ;`

  Gibt an, ob die CPU ein Programm ausführt.

### Protected Interface

#### Protected Data

    void* m_pThread;

  Zeiger auf SoftPlc7Kernel-interne Struktur.

###### << • toc • >>

## class HllPTR32

`#include "HllHandler.h"`

Die Daten eines HllPTR32 repräsentieren genau die 4 Bytes, über die ein bereichsübergreifender Zeiger definiert wird. Es werden Funktionen zur Verfügung gestellt, die die einzelnen Teilinformationen zurückgeben und solche, die bei richtiger Anwendung die Zieldaten liefern.

### Public Interface

HllPTR32 | HllPTR32 | HllPTR32
GetBlockType | GetPointer | GetSourceBit
GetSourceByte | GetSourceWORD | GetSourceDWORD
GetSourceBytes | GetSourceSTRUCT | GetSourceHllANYPTR
SetSourceBit | SetSourceByte | SetSourceWORD
SetSourceBytes | SetSourceDWORD | SetSourceSTRUCT

### Public Interface

`HllPTR32` | `() ;`

  Konstruiert einen noch ungültigen bereichsübergreifenden Zeiger.

`HllPTR32` | `( const DWORD& dw ) ;`

  Konstruiert einen bereichsübergreifenden Zeiger, der durch dw bestimmt ist. Es wird dw nach m_dwData kopiert. D.h. Wenn der Operand "M 0.4" kodiert wird, muss dw == 0x04000083 sein. Im Speicher steht dann aufsteigend 0x83, 0x00, 0x00, 0x04, was der Codierung von "M 0.4" entspricht.

`HllPTR32` | `( BLOCK_TYPE eType , long lAddr , long lBit ) ;`

  Konstruiert einen bereichsübergreifenden Zeiger, der durch den Typ eType, und den Pointer "lAddr.lBit" bestimmt ist.

`BLOCK_TYPE GetBlockType` | `() ;`

  Liefert den Typ des Ziel-Bausteins.

`void GetPointer` | `( long& lAddr , long& lBit ) ;`

  Extrahiert den bereichsinternen Zeiger und setzt die Variablen lAddr und lBit.

`bool GetSourceBit` | `( HllHandler* pHandler ) ;`

  Liefert ein Bit aus dem Ziel-Baustein.

`BYTE GetSourceByte` | `( HllHandler* pHandler ) ;`

  Liefert ein Byte aus dem Ziel-Baustein.

`WORD GetSourceWORD` | `( HllHandler* pHandler ) ;`

  Liefert ein Wort aus dem Ziel-Baustein. Wenn im Speicher aufsteigend die Byte-Werte 0x12, 0x34 stehen, so wird 0x1234 zurückgegeben.

`DWORD GetSourceDWORD` | `( HllHandler* pHandler ) ;`

  Liefert ein Doppelwort aus dem Ziel-Baustein. Wenn im Speicher aufsteigend die Byte-Werte 0x12, 0x34, 0x56, 0x78 stehen, so wird 0x12345678 zurückgegeben.

`bool GetSourceBytes` | `( HllHandler* pHandler , BYTE* pbDest , WORD wCount ) ;`

  Liefert wCount Bytes aus dem Ziel-Baustein und gibt an, ob die Funktion ausgeführt werden konnte.

`bool GetSourceSTRUCT` | `( HllHandler* pHandler , BYTE* pbDest , WORD wLen ) ;`

  Versucht, einen zusammengesetzten Datentyp mit Länge wLen nach pbDest zu kopieren und gibt an, ob die Funktion ohne Fehler ausgeführt werden konnte.

`bool GetSourceHllANYPTR` | `( HllHandler* pHandler , HllANYPTR* pAny ) ;`

  Kopiert 10 Bytes aus dem Ziel-Baustein als HllANYPTR und gibt an, ob die Funktion ausgeführt werden konnte.

`void SetSourceBit` | `( HllHandler* pHandler , bool bBit ) ;`

  Setzt ein Bit im Ziel-Baustein.

`void SetSourceByte` | `( HllHandler* pHandler , BYTE byte ) ;`

  Setzt ein Byte im Ziel-Baustein.

`void SetSourceWORD` | `( HllHandler* pHandler , WORD w ) ;`

  Setzt ein Wort im Ziel-Baustein. Wenn der Parameter w == 0x1234 ist, so werden aufsteigend die Byte-Werte 0x12, 0x34 geschrieben.

`bool SetSourceBytes` | `( HllHandler* pHandler , BYTE* pbSrc , WORD wCount ) ;`

  Kopiert wCount Bytes in den Ziel-Baustein und gibt an, ob die Funktion ausgeführt werden konnte.

`void SetSourceDWORD` | `( HllHandler* pHandler , DWORD dw ) ;`

  Setzt ein Doppelwort im Ziel-Baustein. Wenn der Parameter dw == 0x12345678 ist, so werden aufsteigend die Byte-Werte 0x12, 0x34, 0x56, 0x78 geschrieben.

`bool SetSourceSTRUCT` | `( HllHandler* pHandler , BYTE* pbSrc , WORD wLen ) ;`

  Versucht, von pbSrc in einen zusammengesetzten Datentyp der Länge wLen zu kopieren und gibt an, ob die Funktion ohne Fehler ausgeführt werden konnte.

### Protected Interface

#### Protected Data

    DWORD m_dwData;

  4 Bytes bereichsübergreifender Zeiger.

###### << • toc

## class PluginHandler

`#include "HllHandler.h"`

Diese Klasse kapselt alle Funktionalitäten, die nötig sind, die SoftPlc7 um eine Plugin-Schnittstelle zu erweitern. Man kann zwei Funktionen angeben. Die eine wird am Anfang einer jeden Zeitscheibe ausgeführt, also noch bevor OB-Zyklen erneut anlaufen. Die zweite Funktion wird ausgeführt, nachdem innerhalb der Zeitscheibe alle OB-Zyklen abgearbeitet wurden.

### Public Interface

`PluginHandler` | `( HANDLE hReady , HANDLE hContinue , void (* pFunc1 ) ( ) , void (* pFunc2 ) ( ) ) ;`

  Instanziiert einen PluginHandler und erzeugt einen Thread. Benötigt werden: 1. Zwei Events, die im SoftPlc7Kernel erzeugt und an die Plugin-Funktion übergeben werden. 2. Eine Funktion, die am Anfang einer Zeitscheibe ausgeführt werden soll, also bevor OBs gestartet werden. 3. Eine Funktion, die innerhalb einer Zeitscheibe ausgeführt werden soll, nachdem alle OB-Zyklen abgearbeitet sind. Beide Funktionszeiger dürfen auch NULL sein, dann wird an der entsprechenden Stelle keine Funktion ausgeführt.

`virtual ~PluginHandler` | `() ;`

  Zerstört den PluginHandler und beendet den Thread.

`void Start` | `() ;`

  Setzt intern ein Event, sodass der erzeugte Thread den Anfang einer Zeitscheibe erkennt.

### Protected Interface

`static void ThreadFunction` | `( PluginHandler* pHandler ) ;`

#### Protected Data

    HANDLE m_hStart;

    HANDLE m_hReady;

    HANDLE m_hContinue;

    HANDLE m_hThread;

    void (* m_pFunc1 ) ( );

    void (* m_pFunc2 ) ( );

## enum BLOCK_TYPE

  Der enum BLOCK_TYPE bestimmt den Baustein-Typen innerhalb der CPU und stimmt in der Regel mit der Codierung bei ANYPTR überein. Die Peripherie, Timer und Zähler werden hier nicht unterstützt.

  TYPE_NONE=0
    Nicht definiert oder noch nicht unterstützt.
  TYPE_DBDB=1
    Datenbaustein mit Nummer.
  TYPE_E=0x81
    Eingang.
  TYPE_A=0x82
    Ausgang.
  TYPE_M=0x83
    Merker.
  TYPE_DB=0x84
    Aufgeschlagener Datenbaustein.
  TYPE_DI=0x85
    Aufgeschlagener Instanz-Datenbaustein.
  TYPE_L=0x86
    Lokaldaten.
  TYPE_VL=0x87
    Vorgänger-Lokaldaten.
  TYPE_Z=0x1c
    Zähler.
  TYPE_T=0x1d
    Timer.
    Timer.

`#include "HllHandler.h"`

## enum SOURCE_WIDTH

  Der enum SOURCE_WIDTH liefert gleichzeitig die Anzahl der benötigten Bytes bzw. 0 für Bitoperanden.

  WIDTH_X=0
    Bit.
  WIDTH_B=1
    Byte.
  WIDTH_W=2
    Wort.
  WIDTH_DW=4
    Doppelwort.

`#include "HllHandler.h"`

###### toc

## Index

Classes and Structs
HllANYPTR | HllDATE_AND_TIME | HllHandler
HllPTR32 | PluginHandler