Marino2012
Level-1
- Beiträge
- 2
- Reaktionspunkte
- 0
-> 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 auf Clientseite>
<Code auf Server Seite>
</Code auf Server Seite>
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 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
Zuletzt bearbeitet: