# OPC Daten schreiben und lesen



## kpeter (8 Februar 2012)

Guten Morgen allerseits

ich hätte da mal eine frage an euch opc spezis 
ich habe eine komminikation für excel geschrieben die *eigentlich *funktioniert wenn ich zahlen schreibe
ab denn zeitpunkt wo ich Strings schreibe gehts nicht mehr ( Laufzeitfehler / Automatesierungsfehler / unbekannter fehler )

ich weiss das ich denn wald voller bäume nicht mehr sehe 
wehr kann mir mal einen kleinen tipp geben

Einlesen kann ich alles auch die Strings


so hier der code


```
Dim S_NODE As String
 
 S_NODE = "[KZW_DO2]"
 'On Error GoTo ErrorHandler
'Exit Sub
 
 
 Set ServerObj = CreateObject("OPC.Automation.1") ' Server Objekt erzeugen
 ServerObj.Connect "RSLinx OPC Server"              ' Server connect erzeugen
 Set Groupobj = ServerObj.OPCGroups.Add("CLX_Schreiben")
 Groupobj.IsActive = True                           ' Aktivieren
 
 i_nummer = UserForm1.CB_Anummer.Value
 Set ItemObj = Groupobj.OPCItems.AddItem(S_NODE & "ANTRIEBE[" & i_nummer & "].LFZ", 1)
               Groupobj.OPCItems.AddItem S_NODE & "ANTRIEBE[" & i_nummer & "].EZV", 1
               Groupobj.OPCItems.AddItem S_NODE & "ANTRIEBE[" & i_nummer & "].ZEIT", 1
               Groupobj.OPCItems.AddItem S_NODE & "ANTRIEBE[" & i_nummer & "].DZWZ", 1
               Groupobj.OPCItems.AddItem S_NODE & "ANTRIEBE[" & i_nummer & "].INenn", 1
               Groupobj.OPCItems.AddItem S_NODE & "ANTRIEBE[" & i_nummer & "].GPNR", 1
               Groupobj.OPCItems.AddItem S_NODE & "ANTRIEBE[" & i_nummer & "].Motornr", 1
               Groupobj.OPCItems.AddItem S_NODE & "ANTRIEBE[" & i_nummer & "].bezeich1", 1
                
                Groupobj.OPCItems.Item(1).Write (UserForm1.tb_lvz.Value)
                Groupobj.OPCItems.Item(2).Write (UserForm1.tb_evz.Value)
                Groupobj.OPCItems.Item(3).Write (UserForm1.tb_zeit.Value)
                Groupobj.OPCItems.Item(4).Write (UserForm1.tb_dzwz.Value)
                Groupobj.OPCItems.Item(5).Write (UserForm1.tb_inenn.Value)
                Groupobj.OPCItems.Item(6).Write (UserForm1.tb_gnummer.Value)
[U]               Groupobj.OPCItems.Item(7).Write (UserForm1.TB_Name.Value) [B]' die sind die bösen strings
[/B]               Groupobj.OPCItems.Item(8).Write (UserForm1.tb_nummer)[/U]
                
    
ErrorHandler:
    On Error Resume Next
    Set ItemObj = Nothing
    ServerObj.OPCGroups.RemoveAll
    Set Groupobj = Nothing
    ServerObj.Disconnect
    Set ServerObj = Nothing
Exit Sub
End Sub
```

Ja ich weis das es keine Siemens Steuerung ist.


----------



## Schnick und Schnack (8 Februar 2012)

Bin nicht sicher wie VBA reagiert..... aber es wär nen Versuch wert es mit....

_UserForm1.TB_Name.*Text
*_
zu versuchen......

(Ist nur eine Idee, habs selber noch nie gemacht....)

Die üblichen Verdächtigen sind natürlich auch die Variabeln auf der Steuerung (Auch als String deklariert? Länge beachtet? usw...)


----------



## Oberchefe (8 Februar 2012)

der Text den Du da schreiben willst ist aber schon ein "normaler" Text (1 Byte pro Zeichen)?


----------



## kpeter (9 Februar 2012)

Oberchefe schrieb:


> der Text den Du da schreiben willst ist aber schon ein "normaler" Text (1 Byte pro Zeichen)?



das wird glaub ich eine grundsatz diskussion was ist "normal"

also was ich weiss und was ich seit jahren mache besteht ein string aus vielen char und das sollte dann 1 byte sein pro zeichen am schluss noch die endzeichen und fertig ist der string

genau gesagt ist ein string aus .data -> denn zeichen plus endzeichen und .len der länge festgelegt
normalerweise reicht es dann wenn ich auf die gesamt verabel zugreife



> Bin nicht sicher wie VBA reagiert..... aber es wär nen Versuch wert es mit....
> _UserForm1.TB_Name.*Text
> *_



das punkt value stimmt


----------



## marcengbarth (9 Februar 2012)

Prüf mal nach ob es sich wirklich um Ansi-Strings handelt, ich könnte mir vorstellen, dass Excel Unicode- oder Wide-Strings verwendet.


----------



## kpeter (10 Februar 2012)

marcengbarth schrieb:


> Prüf mal nach ob es sich wirklich um Ansi-Strings handelt, ich könnte mir vorstellen, dass Excel Unicode- oder Wide-Strings verwendet.



mal eine dumme antwort dazu
sieht die strings nicht gleich aus nur die codierung ist anders
also müsste es doch egal sein

zu meiner entschuldigung ich habs nicht gegoogelt wenn ich jetzt einen blödsinn gesprochen habe

mfg


----------



## marcengbarth (10 Februar 2012)

In einem Ansi-String hat ein 1 Zeichen eine länge von 1 Byte. In einem Unicode-String kann ein Zeichen eine Länge von 2-Byte oder auch 4-Byte haben.

Der AnsiString "Test" hat die Länge von 4 Byte, der Unicode-String "Test" hat z.B. die Länge von 8 Byte und sieht dann so aus: 'T'#0'e'#0's'#0't'#0


----------



## kpeter (22 Februar 2012)

Guten Morgen

Allso ihr habt recht VBA macht das mit denn strings anscheinend wirklich anders
und zwar gibts da kein stringentzeichen sondern es wird am anfang des strings festgelegt wieviel zeichen das kommen

und das tut anscheinend meiner api weh :-(

einer eine idee wie ich denn string richtig übergeben kann


----------



## Rainer Hönle (22 Februar 2012)

Ich weiß nicht wie VBA die Strings behandelt, ich kenne nur die Vorgehensweise von VB. Hier ist der String eigentlich ein Stringdescriptor der aus der Länge und einem Zeiger auf die Daten besteht. Wenn ein String (besser ein Array of Char) an eine Nicht-VB-Funktion übergeben werden muss, dann musst eich früher den Platz für die Daten erst anlegen und dann den Zeiger auf den Datenbereich übergeben. Dies konnte z. B. durch 

```
Dim XYZ As String
XYZ = Space$(128)
TestFunc( ByVal XYZ )
```
oder

```
Dim XYZ As String
XYZ = "Dies ist nur ein Platzhalter"
TestFunc( ByVal XYZ )
```
geschehen. Es ist sicherzustellen, dass der Speicherplatz, in den die Funktion eventuell schreibt, acuh wirklich vorhanden ist. Sonst gibt es mehr oder weniger lustige Ergebnisse .


----------



## Eleu (22 Februar 2012)

kpeter schrieb:


> Guten Morgen
> 
> Allso ihr habt recht VBA macht das mit denn strings anscheinend wirklich anders
> und zwar gibts da kein stringentzeichen sondern es wird am anfang des strings festgelegt wieviel zeichen das kommen
> ...



Moin,

wichtig ist nur, dass wenn Du ein Char Array einer Variable übergibst, dass diese Variable auch groß genug ist, 
so dass es das Endzeichen mit aufnehmen kann.
Wenn Du den Char Array als Literal einem Pointer übergibst, darfst Du nur lesen darauf zugreifen.
Willst Du den Inhalt verändern, musst Du in eine Variable die genügend groß ist, umkopieren. Sonst gibt es einen Fehler.
D.h. falls Du in C Programmierst. VBS oder VBA kümmert das nicht. 


Gruß
Eleu


----------



## kpeter (23 Januar 2014)

Guten Morgen

Also ich hab das problem gelöst !!!!
Ich übergebe jetzt jedes Zeichen einzeln an die Steuerung und schreib dann die Anzahl der Zeichen in die längen angaben und es geht.


----------



## marcengbarth (23 Januar 2014)

Hallo,
ist das nicht zu lahm? Du könntest auch die beiden Längenangaben und ASCII-Werte in ein Byte-Array packen und dieses geschlossen in die SPS übertragen. MSDN.


----------



## kpeter (27 Januar 2014)

danke sehr
Bin mal froh das es so geht.

Aber bin mir im moment nicht sicher ob deine problemlösung unter vba auch geht


----------

