asbald - 2011-06-30

Es geht um die DPV1 Diagnose von Slaves (z.B. Wago 750-333 etc.) an einem Beckhoff Master mit Codesys V2.3.
Der Baustein gibt mir jedoch nach Ausführung ein "DoneWithError" aus.
Die Werte im Array machen auch nicht wirklich sinn. Analog zu einer Tabelle zur DPV1 Diagnose steht an keiner Stelle der 64 Byte eine brauchbare Information.
In der Dokumentation gibt es folgende Hilfe zur Libary SysLibFCDPV1.sys

3.2.1 Die Bibliothek SysLibFCDPV1.sys
Die Bibliothek SysLibFCDPV1.lib kann nur zusammen mit dem RTIOdrvFC310x und einer entsprechenden PB-Karte verwendet werden. Die Bibliothek enthält 2 Bausteine:
FC_DPV1_Read
FC_DPV1_Write
Mit diesen Bausteinen können azyklische Datenübertragungsdienste der Klasse 1 benutzt werden (MSAC_C1). Die Bausteine haben beide die Eingangsparameter:
ENABLE:BOOL;
Mit diesem Eingang wird der Baustein aktiviert, ein Auftrag gestartet.
Device:INT;
Mit Device wird die Karte ausgewählt. Bei nur einer FC310x im System immer 0.
StationAddr:INT;
Die Stationsadresse des angesprochenen Slaves.
Slot:INT;
Index:INT;
Slot und Index sind in der Definition der DPV1-Dienste beschrieben und haben je nach Slave unterschiedliche Bedeutungen.
Len:INT;
Die Anzahl zu schreibender Bytes (bei WRITE), bzw. die Größe des lokalen Lesepuffers (bei READ).
buffer:DWORD;
Die Adresse des Lesepuffers. Sie muss mit ADR() ermittelt werden. Typischerweise die Adresse eines ARRAY OF BYTE.
Beim Aufruf der FBs muss einmal am ENABLE-Eingang eine steigende Flanke angelegt werden (Wechsel von FALSE auf TRUE) und dann müssen die Bausteine mit ENABLE gleich TRUE solange zyklisch aufgerufen werden, bis der READY-Ausgang TRUE meldet.
Mit dem Ausgang STATE des Bausteins kann die erfolgreiche Ausführung überprüft werden.
Bei Ausführung des Lesebausteins werden im Fehlerfall in Buffer die einige Fehlercodes eingetragen.
Diese Fehlercodes entsprechen den Fehlercodes der FC310x und können in der Dokumentation der Karte nachgeschlagen werden.
Die Funktion FC_ClearMessageBox kann benutzt werden, um das Messagebox-Interface der FC-Karte auszuräumen. Das wird z.B. nach einem Reset der Steuerung benötigt, wenn keine gültigen Job-Ids dem Programm mehr bekannt sind. Die Funktion sollte (z.B.) wie folgt benutzt werden (aus einem zyklisch aufgerufenen Programm heraus, für die erste FC-Karte):
IF ClearFCMessageBox THEN dwMsgBoxState := FC_ClearMessageBox(0); IF dwMsgBoxState = 0 THEN ClearFCMessageBox := FALSE; END_IF END_IF

Dazu verwende ich folgenden Code:

IF Startread THEN
   CASE iStatePB_Diag OF
         (* Array löschen *)
      0   :   FOR i := 0 TO 63 DO
               aBuffer[i] := 0;
            END_FOR
            iStatePB_Diag := 1;
         (* Messagebox-Interface ausräumen *)
      1   :   dwMsgBoxState := FC_ClearMessageBox(0);
            IF dwMsgBoxState = 0 THEN
               iStatePB_Diag := 2;
            END_IF
         (* Diagnose Anfrage *)
      2   :   PB_Diag.Device := 0;
            PB_Diag.StationAddr := nStationAdress;
            PB_Diag.Index := nStationIndex;
            PB_Diag.Slot := nStationSlot;
            PB_Diag.LEN := 64;
            PB_Diag.buffer := ADR(aBuffer);
            CASE PB_Diag.State OF
               0 :   strLastState := 'NotEnabled';
               1 :   strLastState := 'InvalidParam';
               2 :   strLastState := 'Started';
               3 :   strLastState := 'Done';
               4 :   strLastState := 'DoneWithError';
            END_CASE
            PB_Diag.ENABLE := NOT PB_Diag.Ready;
            IF PB_Diag.Ready THEN
               PB_Diag.ENABLE := FALSE;
               iStatePB_Diag := 3;
            END_IF
   END_CASE
ELSE
   iStatePB_Diag := 0;
END_IF

Grüße
Asbald