erweiterten ADS Befehle

Marino2012

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle miteinander,

mit den erweiterten ADS Befehlen ADSWRITEIND und ADSWRITERESBC möchte ich eine Server/Client Verbindung zwischen mehrere Beckhoff SPS`en aufbauen.

Bei der standard ADS Kommunikation muß man bei Verbindungsbau dem FB: „ADSRDWRT“ den Namen der Zielvariable angeben. Dann erhält man eine Handlenumber , welche man dem FB „ADSWrite“ mit den zu sendenden Daten mitgibt.
Der Nachteil ist, dass der Client den Namen der Zielvariable auf dem Server kennen muß. Dies möchte ich dynamisieren. Dazu habe ich aus dem Beckhoff Information System den unten anhängenden Code rausgesucht.

Auf Clientseite schickt man mit dem FB: „ADSWRITE“ die Daten mit einer GroupIndex und OffsetIndex an die NetID des Servers. Auf Serverseite wird mit dem FB: „ADSWRITEIND” diese Anfrage durch eine Indication registriert. Anschließend die GroupIndex und OffsetIndex ausgewertet und die Daten in die Zieladresse kopiert.

Die Auswertung des GroupIndex und OffsetIndex möchte ich durch eine Funktion ersetzen. Auf Clientseite soll durch eine Funktion der GroupIndex und OffsetIndex aus dem Pointer der Adresse der Quelldaten ermittelt werden. Auf Serverseite soll durch eine Funktion die Zielspeicheradresse aus den mitgeschickten GroupIndex und OffsetIndex ermittelt werden.

Wie können diese Funktionen aussehen?
Client: Aus Pointer der Adresse der Quelldaten generiere die GroupIndex und OffsetIndex.
Server: Aus GroupIndex und OffsetIndex generiere den Pointer der Zieladresse.

Danke im Voraus für eure Mühen und schönes WE.
Grüße Marino

<Code auf Client Seite>
Code:
PROGRAM MAIN
VAR
                state                      : UINT;
                trigger                   : R_TRIG;
                bExecute             : BOOL;
                bBusy                    : BOOL;
                bError                    : BOOL;
                uErrorID               : UDINT;
                sErrorText           : STRING (80);
                uRESULT              : UDINT;
                fbWRI                    : ADSWRITE;                                                    
Tasknummer      : GETCURTASKINDEX;                  
 
END_VAR
 
trigger(CLK := bExecute);
 IF trigger.Q THEN
    state    := 1;
END_IF
 
CASE state OF
 
    0: ;(* Wait state *)
                1:
                               fbWRI.WRITE    := FALSE;                                            
 
                               (* mit dem Baustein werden die Daten zum Empfänger übertragen *)
                               fbWRI(   NETID                 := 'xxx.xx.xx.xx.1.1',
                                               PORT                    := (801 + Tasknummer.index),
                                               IDXGRP               := 16#80000005,
                                               IDXOFFS              := 16#00000007,
                                               LEN                       := SIZEOF(stValueToServer),
                                               SRCADDR            :=  ADR(stValueToServer),                                         
                                               WRITE                 := TRUE,              
                                               TMOUT               := t#2s,
                                               BUSY                    => );
 
                               state := 2;
 
                2:
                               fbWRI(WRITE := FALSE); 
                               IF not fbWRI.BUSY  THEN
                                               bError := fbWRI.ERR;
                                               uErrorID :=fbWRI.ERRID;
 
                                               state := 3;
                               END_IF
 
                3:
                               CASE uErrorID OF
 
                               ELSE
                               END_CASE
 
                               state := 0;
                100:       ;
                               (* Errorbehandlung *)
END_CASE
</Code auf Clientseite>

<Code auf Server Seite>
Code:
PROGRAM MAIN
VAR
        fbWRITEIND                     : ADSWRITEIND;
        fbWRITERESBC                   : ADSWRITERESBC;
        szNetId                        : STRING(23);
        Port                           : UINT;
        InvokeId                       : UDINT;
        idxGrp                         : UDINT;
        idxOffs                        : UDINT;
        cbLength                       : UDINT;
        ErrorNumber                    : UDINT;
 
END_VAR
fbWRITEIND( );
fbWRITERESBC( );
 
IF ( fbWRITEIND.VALID ) THEN
        szNetId        := fbWRITEIND.NETID;
        Port           := fbWRITEIND.PORT;
        InvokeId       := fbWRITEIND.INVOKEID;
        idxGrp         := fbWRITEIND.IDXGRP;
        idxOffs        := fbWRITEIND.IDXOFFS;
        cbLength       := fbWRITEIND.LENGTH;
        ErrorNumber    := 0;
 
 
        CASE idxGrp OF
               16#80000005:
                       CASE idxOffs OF
                               16#00000007:
                                      IF  cbLength <= SIZEOF( arrInt ) THEN
                                              IF ( MEMCPY( ADR( arrInt  ), fbWRITEIND.DATAADDR, UDINT_TO_INT(cbLength) ) =  0 ) THEN
                                                     ErrorNumber := 4000; (*MEMCPY fail*)
                                              END_IF
                                      ELSE
                                              ErrorNumber := 1798;  (* ADS error: invalid parameter value(s)*)
                                      END_IF
                       ELSE
                               ErrorNumber := 1795;   (*ADS error: Invalid index offset*)
                       END_CASE
 
        ELSE
               ErrorNumber := 1794; (*ADS error: invalid index group*)
        END_CASE
 
 
        fbWRITEIND(  CLEAR := TRUE );         (*clear indication entry*)
 
 
        fbWRITERESBC.NETID := szNetId;
        fbWRITERESBC.PORT := Port;
        fbWRITERESBC.INVOKEID := InvokeId;
        fbWRITERESBC.RESULT := ErrorNumber;
        fbWRITERESBC( RESPOND :=  TRUE );     (*send response*)
 
END_IF
 
(*reset fb's*)
IF NOT fbWRITERESBC.BUSY THEN
        fbWRITEIND( CLEAR := FALSE );
        fbWRITERESBC( RESPOND := FALSE );
END_IF
</Code auf Server Seite>
 
Zuletzt bearbeitet:
Hallo Marino2012!
leider wurde Deine Anfrage abgeschnitten. Wie geht sie nach "Ziel soll es sein, beim Verbindungsaufbau" weiter?
 
Zurück
Oben