Hilfe in Sachen VB

Move

Level-2
Beiträge
510
Reaktionspunkte
58
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich versuche über Excel Werte in meinem S7-Datenbaustein zu schreiben.
Mit dabei ist WinCC, das ganze läuft soweit über ein entsprechendes VB-Script. (Anhang)
Wenn ich in meiner Excel-Liste in Zelle "B2" einen Wert schreibe dann steht dieser Wert auch tatsächlich im DB in meiner S7-Steuerung, toll:D

Aber was muss ich jetzt im Script ändern/erweitern so das dies auch analog für eine zweite, dritte etc. Variable funktioniert

Ich habe schon einiges versucht, aber beim Versuch zusätzlich Variablen in Script zu definieren kommen immer Fehlermeldungen wie z.b. Namen nicht eindeutig etc.

Keine Ahnung wo ich da was falsch mache, habe auch kaum Erfahrung mit dieser Thematik.

Gruß
Move
 

Anhänge

  • Script_1VAR.txt
    2,9 KB · Aufrufe: 78
Hallo,

was genau willst Du machen? Aus einer anderen Excellzelle heraus schreiben oder in ein anderes DW?

Bei diesem Makro z.B. wird nur dann der Wert geschrieben, wenn die Zelle=B2 ist --> "If Selection <> Range("B2") Then Exit Sub"
D.h. wenn du aus einer anderen Zelle schreiben willst musst Du diese Zeile
entspr. abändern.

Code:
Private Sub worksheet_change(ByVal Selection As Range)

  '----------- Only if cell "B3" changes, write this value

  If Selection <> Range("B2") Then Exit Sub

  Values(1) = Selection.Cells.Value

  '----------- Write the new value in synchronous mode

  MyOPCGroup.SyncWrite 1, ServerHandles, Values, Errors

End Sub
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du must den Pointer erweitern. Derweilen kannst du nur ein Value schreiben.

Willst du 100 Variablen schreiben musst du das Array erweitern.

Dim Values(100) As Variant
Dim ItemIDs(100) As String

Geschrieben wird dann mit :

ItemIDs(2) = Range("A98").Value
ItemIDs(3) = Range("A99").Value
 
Hi,

ok danke jetzt hab ichs wohl verstanden, danke für den Tipp. Ich teste es dann die Tage mal aus.
Gruß
Move
 
Hallo Leute,

ich drehe mich irgendwie im Kreis weil es nicht funktionieren will.
Das Script (Anhang) läuft soweit, das ich in der Excel Zelle B2
einen Wert schreibe und dieser dann in meinem DB an der Stelle DBD0 landet.
Aber ich bekomme das Scriprt nicht lauffähig aufgebohrt so dass die nächste Variable in Zelle B3 in DBD4 landet usw.
Kann mir mal ein VB-Experte auf die Sprünge helfen? Wäre super.

Gruß
Move
 

Anhänge

  • Script_läuft_1VAR.txt
    2,8 KB · Aufrufe: 26
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
kann ja sein, dass ich ein totales Brett vor dem Kopf habe ... aber wo in deinem Script stellst du denn die Verbindung zwischen den Script-Variablen und den OPC-Items her ? Im OPC muss es eine Variable geben, die das gewünschte Datenwort adressiert. Die mußt du ansprechen und dann sollte es funktionieren ...

Gruß
Larry
 
Hi,

NodeName = Range("A1").Value
ItemIDs(1) = Range("A2").Value

A1 = Rechnername
A2 = Symbolischer Name der Variable = WinCC Variable

Gruß
Move

PS: Das Script ist ein Beispiel vom Siemens-Support

Gruß
Move
 
Hallo Move,
damit hast du mir jetzt nicht wirklich weiter geholfen.
Nach meiner Vorstellung müßte es (ich habe allerdings noch nie wirklich mit OPC gearbeitet) so aussehen, dass du im OPC (ähnlich wie in der Visu - z.B. Flex) eine Variable angelegt hast mit dem Namen "meineVariable", diese ist dann z.B. ein INT und im OPC ist auch hinterlegt, dass diese Variable (eigentlich mehr Link) auf die SPS und dort auf den DB1.DBW2 verweisst. Man möge mich da bitte korrigeren, da ich mich da jetzt m.E. ein wenig "aus dem Fenster lehne". Diese Beziehungs-Zuweisung muss es irgendwo geben und die fehlt mir in deinem Script komplett.

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

da fragst du denn richtigen :-D
Ja, so ist es aber. In WinCC habe ich eine Variable angelegt, heißt
Temp_01_Uhr als Realwert
In Excel habe ich dann wie gesagt in Zelle A1 den Rechnernamen stehen sowie in Zelle A2 den WinCC-Variablennamen
Wenn ich jetzt in Zelle B2 einen Wert eingebe z.B. 12.1 so steht der Wert auch im DB der S7 im DD0.
Das Script kommt aus der WinCC-Online Hilfe, nicht vom Support wie ich geschrieben habe
Gruß
Move
 
Ja hallo ... das geht doch dann genau in die von mir schon angebene Richtung ...
Jetzt macht das dann auch Sinn ... somit steht jetzt in der "ItemIDs(1)" der VariablenName im Klartext - also z.B. "Temp_01_Uhr" - du könntest den auch der Variablen direkt zurordnen - also :
Code:
ItemIDs(1) = "Temp_01_Uhr"
Du mußt dir nun eine weitere ItemID erzeugen, die auf eine andere/weitere Variable des OPC zeigt und die der Collection hinzufügen :
Code:
'----------- Add one item, ServerHandles are returned

  MyOPCItemColl.AddItems [SIZE=3][COLOR=Red][B]2[/B][/COLOR][/SIZE], ItemIDs, ClientHandles, ServerHandles, Errors
allerdings habe ich (in deinem Script) noch nicht gefunden, wie der Wert von "B2" in der OPC-Variablen landet. Vielleichst hilfst du mir auch da noch ein wenig auf die Sprünge - das muß auch noch irgendwo stehen ...

Gruß
Larry
 
Hi,

da bin ich wieder :)
Das müsste am Ende passieren:

Private Sub worksheet_change(ByVal Selection As Range)
'----------- Only if cell "B3" changes, write this value
If Selection <> Range("B2") Then Exit Sub
Values(1) = Selection.Cells.Value
'----------- Write the new value in synchronous mode
MyOPCGroup.SyncWrite 1, ServerHandles, Values, Errors
End Sub

Ok der Kommentar passt nicht, ursprünglich wurde der Wert in B3 geändert, dann wurde der Wert B3 übegeben und in B2 wieder ausgegeben.
Das habe ich geändert, ich ändere jetzt den Wert in B2 und er landet dann in der Variable.
Gruß
Move
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ... ich bin auch wieder da ... ;)

OK ... wenn das so ist dann würde ich den letzten Teil mal so ändern :
Code:
Private Sub worksheet_change(ByVal Selection As Range)
  Values(1) = Range("B[COLOR=Black]2[/COLOR]").Value
   Values(2) = Range("B[COLOR=Black]3[/COLOR]").Value  'ich habe deinen nächsten Wert hier einfach mal in B3 verwiesen ...
    MyOPCGroup.SyncWrite [COLOR=Red][B]2[/B][/COLOR], ServerHandles, Values, Errors
' die IF-Geschichte kannst du dir hier jetzt sparen - war sowieso "fragwürdig"
End Sub
versuch das mal ...
Vorausetzung ist aber, dass die schon genannte ItemID(2) auf die entsprechende andere Variable verweist ...

Schreib mal, was dabei heraus gekommen ist ...
Gruß
Larry
 
Hi,

danke für deinen Einsatz:), ich werde das ganze mal in den nächsten Tagen austesten und melde mich dann wieder was dabei rausgekommen ist.
Gruß
Move
 
das sollte so klappen:
1) Deklaration, die DIM Arrays entsprechend der Anzahl der Items vergrößern (schöner wäre hier die Spalte "A" zu durchsuchen ob sie <>"" ist und entsprechend mitzählen ob eine ItemID existiert. Diesen "NumberOfItems" kann man dann für Redim der Arrays nutzen und auch als Obergrenze in den for-Schleifen und in den OPC-Mengenaufrufen "AddItems" und "SyncWrite")
Code:
Dim ClientHandles(10) As Long
Dim Values(10) As Variant
Dim ItemIDs(10) As String
2) vor dem AddItems die ClientHandles und die ItemIDs zuweisen
Code:
Dim i as integer
for i=1 to 10
 ClientHandles(i) = i
 ItemIDs(i) = Range("A" & i+1).Value
next
3) dann den eigentlichen AddItems anpassen
Code:
MyOPCItemColl.AddItems 10, ItemIDs, ClientHandles, ServerHandles, Errors
4) im event handler erst alle Werte zuweisen und dann alle schreiben
Code:
Dim i as integer
for i=1 to 10
  Values(i) = Range("B" & i+1).Value
next
MyOPCGroup.SyncWrite 10, ServerHandles, Values, Errors
ACHTUNG: geschrieben wird nun ALLES (egal welche Zelle einen neuen Wert bekommen hat)
 
Zurück
Oben