OPC Daten schreiben und lesen

kpeter

Level-1
Beiträge
693
Reaktionspunkte
26
Zuviel Werbung?
-> Hier kostenlos registrieren
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

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.
 
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...)
 
Zuletzt bearbeitet:
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
 
Prüf mal nach ob es sich wirklich um Ansi-Strings handelt, ich könnte mir vorstellen, dass Excel Unicode- oder Wide-Strings verwendet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
Code:
Dim XYZ As String
XYZ = Space$(128)
TestFunc( ByVal XYZ )
oder
Code:
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 :ROFLMAO:.
 
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

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
 
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.
 
danke sehr
Bin mal froh das es so geht.

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