# Variablenübergabe C++ - TwinCat PLC Control



## AndiM (19 Juni 2009)

Hallo zusammen,

dies ist mein erster Besuch im SPS-Forum und bin gespannt ob man mir helfen kann.

Ich habe im TwinCat PLC Control ein lauffähiges Programm, welches ich gerne im C++ Code realisieren will (soll in eine bestehende C++ Anwendung eingebunden werden).

Dafür habe ich das machine-Beispielprogramm von Beckhoff angeschaut und in diesem eine "Testvariable" (Bool) eingefügt, die ich ans PLC Control übergeben möchte.

Im Beispiel "machine" ist bereits eine Variable "switch" vorhanden, welche ich testweise auch in mein PLC-Control-Programm eingefügt habe, diese switch Variable lässt sich problemlos über die C++-Oberfläche verändern.

Im C++ Code habe ich meine Testvariable parallel zur Switch-Variablen laufen, (alle Zeilen mit Anweisungen für die Switch-Variable kopiert und mit TestVariable ausgetauscht).

Leider wird die TestVariable nicht übermittelt, während die Switch-Variable problemlos läuft.

Ich vermute, dass ich irgendwo übersehen habe wo die Testvariable übermittelt wird.

Für eine Hilfe wie ich eigene Variablen aus dem C++ ins PLC Control übermittel wäre ich sehr dankbar.


Viele Grüße

Andreas


----------



## Fx64 (19 Juni 2009)

Hallo,

vielleicht postest Du Deinen Code?

Viele Grüße


----------



## AndiM (19 Juni 2009)

...mit einem anderen Namen für die Testvariable funktioniert es.
Falls jemand weiß, was an dem Namen "TestVariable" nicht stimmt, wäre es interessant zu wissen.

Somit hat sich mein Problem durch den anderen Variablennamen gelöst, falls doch noch Interesse an dem Code besteht, kann ich ihn noch posten.


----------



## Fx64 (19 Juni 2009)

Hallo,

Du machst sicher einen AdsWrite per Symbol oder per Adresse, liefert doch dann bestimmt einen Fehler? Den mal auswerten...

Viele Grüße


----------



## AndiM (19 Juni 2009)

hier der Code vom RadioButton des Beispiels:


```

```
void CMachineDlg::OnBnClickedRadio1()
{    
    // Anpassen der "Switch"-Variable, bei klick auf Radio Button "fast"
    // Fits the switch variable if the radio button "fast" was clicked


    bTestVariable = true;
    nTestVariable = AdsSyncReadWriteReq( pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(ULONG), &hTestVariable, 8, ".TestVariable" );
    nTestVariable = AdsSyncWriteReq( pAddr, ADSIGRP_SYM_VALBYHND, hTestVariable, 0x1, &bTestVariable );
    nTestVariable = AdsSyncWriteReq( pAddr, ADSIGRP_SYM_RELEASEHND, 0x0, sizeof(ULONG), &hTestVariable);

    bSwitch = true;
    nSwitch = AdsSyncReadWriteReq( pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(ULONG), &hSwitch, 8, ".switch" );
    nSwitch = AdsSyncWriteReq( pAddr, ADSIGRP_SYM_VALBYHND, hSwitch, 0x1, &bSwitch );
    nSwitch = AdsSyncWriteReq( pAddr, ADSIGRP_SYM_RELEASEHND, 0x0, sizeof(ULONG), &hSwitch );

    bisella = true;
    nisella = AdsSyncReadWriteReq( pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(ULONG), &hisella, 8, ".isella" );
    nisella = AdsSyncWriteReq( pAddr, ADSIGRP_SYM_VALBYHND, hisella, 0x1, &bisella );
    nisella = AdsSyncWriteReq( pAddr, ADSIGRP_SYM_RELEASEHND, 0x0, sizeof(ULONG), &hisella );
}

Variablen wurden deklariert, Variablen "Switch" und "isella" funktionieren, Variable "TestVariable" nicht.

Einen Fehler bekomme ich nicht ausgegeben, daher weiß ich auch nicht wo oder wie ich die Übermittlung der Testvariable auswerten kann.

Da es aber mit dem Variablennamen "isella" funktioniert, sollte ich erstmal vorankommen.

Vielen Dank

Andreas


----------



## Fx64 (19 Juni 2009)

Hallo,

kann ich nicht glauben, dass es ohne Fehlermeldung nicht gehen soll!? Mal durchgesteppt? Ist "nTestVariable" step-für-step" immer Null? Hast Du ein Handle bekommen? Ist ".TestVariable" eine globale Variable in der SPS mit der richtigen Größe zum C++ Def?

Viele Grüße


----------



## AndiM (19 Juni 2009)

ich bin nun beim Debuggen die Einzelschritte durchgegangen (F11). Bekomme dabei keine Fehlermeldungen in der Ausgabe.

Ich weiß nicht wo ich sehen kann ob "nTestVariable" step-für-step immer null ist. 

Auch weiß ich nicht ob ich ein Handle bekommen habe, da ich nicht weiß wo ich das sehe.

"TestVariable" wurde im PLC Control als globale Variable (BOOL) deklariert. Was meinst du mit "richtige Größe zum C++ Def?



Entschuldigung für mein Nichtwissen, bin ziemlich unerfahren - finde es aber klasse, dass einem trotzdem versucht wird zu helfen!

Schöne Grüße


----------



## Fx64 (19 Juni 2009)

Hallo,

muss ja doch einen Unterschied geben..."nTestVariable" siehst Du je nach DeVStudio im WatchWindow oder im QuickWatch. Da kannst Du auch schauen, ob "hTestVariable" != NULL ist.

Viele Grüße


----------



## MasterOhh (19 Juni 2009)

Füge doch einfach diese Zeile ein, nachdem du den/das Handle geholt hast :


```
if (nTestVariable) cerr << "Error: AdsSyncReadWriteReq: " << nTestVariable << '\n';
```
und nochmal:


```
if (nTestVariable) cerr << "Error: AdsSyncWriteReq " << nTestVariable << '\n';
```
Nachdem du die Variable holst.


dann bekommst du die Fehlermeldung wenn da irgendwas faul ist.


----------



## AndiM (22 Juni 2009)

Hallo,

vielen Dank für die schnellen Antworten - da die Variablenübergabe mit einem anderen Variablennamen ja funktioniert werde ich nun nicht mehr weiter forschen warum es vorher nicht ging. Das Projekt soll nun weiter vorangebracht werden.

Ich bin begeistert von den vielen schnellen Antworten die mir als Anfänger Hilfe gegeben haben. 

Somit wünsche ich noch einen erfolgreichen Wochenstart und nochmals "DankeSchön" !

Viele Grüße

Andreas


----------

