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:
IFStartreadTHEN
  CASEiStatePB_DiagOF
      (*Arraylöschen*)
    0  :  FORi :=0TO63DO
          aBuffer[i] :=0;
        END_FOR
        iStatePB_Diag :=1;
      (*Messagebox-Interfaceausräumen*)
    1  :  dwMsgBoxState :=FC_ClearMessageBox(0);
        IFdwMsgBoxState=0THEN
          iStatePB_Diag :=2;
        END_IF
      (*DiagnoseAnfrage*)
    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);
        CASEPB_Diag.StateOF
          0 :  strLastState :='NotEnabled';
          1 :  strLastState :='InvalidParam';
          2 :  strLastState :='Started';
          3 :  strLastState :='Done';
          4 :  strLastState :='DoneWithError';
        END_CASE
        PB_Diag.ENABLE :=NOTPB_Diag.Ready;
        IFPB_Diag.ReadyTHEN
          PB_Diag.ENABLE :=FALSE;
          iStatePB_Diag :=3;
        END_IF
  END_CASEELSE
  iStatePB_Diag :=0;END_IF
Grüße
Asbald
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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:
Grüße
Asbald