Twincat 3 Ads Kommunikation Array of Strings

Neuling2014

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe mich erst vor kurzem mit der Kommunikation über Twincat 3 ADS angefreundet.
Der aktuelle Stand ist, dass das Auslesen und Schreiben von einfachen Datentypen wie Bool, Integer, ... alles wunderbar klappt.
Das Auslesen von Arrays dagegen nicht :-?

Auf der Twincat Seite is folgendes implementiert:

Code:
LocationsGet : ARRAY [0..1] OF STRING := ['location1', 'location2'];

Auf der C# Seite kann ich den Array zwar auslesen, aber mit vielen Sonderzeichen.


Code:
int numberOfElements = 80;
int maxLengthOfNames = 20;
String[] testArray = new String[numberOfElements];

// AdsStream which gets the data
AdsStream dataStream = new AdsStream(numberOfElements * maxLengthOfNames);
BinaryReader binRead = new BinaryReader(dataStream,System.Text.Encoding.ASCII);

int length = _tcAdsClient.Read(handle, dataStream);
string text = new string(binRead.ReadChars(length));

//read comlpete Array 
int databytesRead = _tcAdsClient.Read(handle, dataStream);

dataStream.Position = 0;
Char[] testChar = binRead.ReadChars(length);

Beide Varianten den Array zu lesen sind nicht sehr praktikabel.

Kann ich mir jemand einen eleganteren Weg nennen?

Vielen Dank für die Hilfe!

Grüße
Neuling 2014
 
Hallo,
es gibt entweder eine Methode, die dir den Variablen-Bereich gleich als .Net-String einliesst ... oder du mußt dir eine Methode dafür erstellen, die dein Byte-Array entsprechend umwandelt ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

was verstehst du unter Variablen-Bereich? Die Werte aus dem Array ...? also "Location1, Location2"?
Wie sieht die entsprechende Methode aus?
... Schlimmstenfalls muß ich doch ein Byte-Array umwandeln ....

Hmm... der nächste Schritt auf meiner Agenda wäre gewesen, einzelne Elemente des Arrays zu setzen. Ist das möglich?
Alla
Code:
LocationsGet[10] = location10

Grüße
Neuling2014
 
Hallo,
ich kann dir hier nur auf .Net-Basis, nicht aber auf ADS-Basis helfen.
Es erstaunt mich nur ein bißchen, dass dir SPS-Strings nicht gleich als .Net-Strings importiert werden können - also dass es keine Methode gibt, die dir das passende Objekt zurückliefert.
Ein Array_of_String ist hier natürlich ein Sonderfall - müßte aber genauso gehen. Du fragst doch über ADS den Variablen-Namen an (auf den du dann einen Handle bekommst) ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

doch doch ... es ist möglich Strings über ADS auszulesen. Nur ein Array von Strings ist etwas problematisch.
Zumindest habe ich keine besseren Methoden gefunden.... sagen wir es mal so.

Ja genau. Über die ADS setze ich das handle für die zu lesende Variable.
Und dann versuche ich die Werte auszulesen ... mit mäßigen Erfolg.
 
Das Problem nachher ist nur, dass ich immer das komplette Array übergeben muss.
Ist es möglich, einzelne Array Elemente per ADS an die plc zu senden? Das ist nachher der springende Punkt, warum ich eigentlich den ganzen Terz hier mache :D
 
... dann muss ich doch noch einmal nachhaken :
Wenn du dir einen Handle auf 'LocationsGet' setzt - was bekommst du dann zurück ?
Ich könnte mir vorstellen, dass du dann ein Objekt erhältst, dass du auf dein .Net-String-Array umcasten kannst ...
 
Das Handle ist nicht wirklich großartig. Implementiert nach Anleitung ...
In der Regel gibt es ein <int> als Datentyp zurück.

Code:
                   int handle = 0;

                    try {
                        handle = _tcAdsClient.CreateVariableHandle(name);

                    } catch (AdsErrorException) {
                        
                    }

Anschließend der oben genannte Code
Code:
int numberOfElements = 80;
int maxLengthOfNames = 20;
String[] testArray = new String[numberOfElements];

// AdsStream which gets the data
AdsStream dataStream = new AdsStream(numberOfElements * maxLengthOfNames);
BinaryReader binRead = new BinaryReader(dataStream,System.Text.Encoding.ASCII);

int length = _tcAdsClient.Read(handle, dataStream);
string text = new string(binRead.ReadChars(length));

//read comlpete Array 
int databytesRead = _tcAdsClient.Read(handle, dataStream);

dataStream.Position = 0;
Char[] testChar = binRead.ReadChars(length);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein ... so meinte ich das nicht ... das Handle ist doch der festgelegte Zugriff auf die namentlich übergebene SPS-Variable - hier z.B. 'LocationsGet'. Über diesen Handle kannst du die Variable immer wieder einlesen. Dieser handle wird z.B. von der Methode "_tcAdsClient.Read" verwendet.
Gibt es nur die Methode, die das tut, oder noch andere ? Was gibt die dir für einen Typ zurück ?
Wenn es nur die eine Methode gibt - was für einen Daten-Typ erwartet die Methode an der Stelle, wo du DataStream übergibst ?

Gruß
Larry
 
Hallo!

"Read" erwartet an der Stelle einen "AdsStream", den man dann mit einem BinaryReader / BinaryWriter bearbeiten kann.
Auf diesen Datenstrom kann man dann mit entsprechenden Methoden zugreifen....u.a. auch mit einem ReadPlcString.
Dieses Beispiel hier: http://infosys.beckhoff.com/content/1031/tc3_adssamples_net/html/twincat.ads.sample01.html?id=15630 zeigt den Zugriff auf ein Array in der PLC (welchen Typs auch immer). Auch hier realisiert über einen Datenstrom.

Zum Thema Handle:
Das Handle wird immer auf die Variable (also das gesamte Array) angemeldet, sodass dann auch nicht einzelnen Elemente daraus separat übertragen werden können.
Wichtig auch: es können nur DIM 1 Arrays gehandelt werden.

Gruß,
mac203
 
Zurück
Oben