Page 1 of 1

Manuelles Senden einer Symbol-Nachricht über VBScript

Posted: Wed 30. Jan 2013, 10:45
by AndreasZ
Hallo,

ich möchte aus meiner Symboldatei eine Nachricht setzen (Variablen bearbeiten) und manuell über einen timestamp versenden. Beispiele dafür sind wohl in der Hilfe vorhanden.
Meine Nachricht aus der Symboldatei konnte ich schon einbinden.

Hier der Code:

Code: Select all

Dim objSymbol
   Dim objMsg
   If SymbolsManager.Count > 0 Then
     	Set objSymbol = SymbolsManager("CAN Message V5").Item("S_Mode_501h")
	PrintToOutputWindow objSymbol.Name & " - ID: " & Hex(objSymbol.CanId) &"h - "
	 
	objMsg = Connections.TransmitMessages.FindSymbol(objSymbol)
	MsgBox objMsg.Count & " messages found"
   End IF
	
Meine Ausgabe zeigt mir schonmal den Namen und die richtige ID an. Nun möchte ich diese Nachricht als Message Objekt haben um diese manuall über mein VBScript zu senden. Die einzelnen Signale kann ich schon anpassen. Da ich nicht möchte, dass die Nachricht bei jeder Signal-Änderung versendet wird, habe ich das AutoTransmit über "Signals("S_Mode_501h.S_Response").Source.AutoTransmit = FALSE" ausgeschaltet.

Bei der Zeile "objMsg = Connections.TransmitMessages.FindSymbol(objSymbol)" bekomme ich eine Fehlermeldung:
"Falsche Anzahl an Argumenten oder ungültige Eigenschaftenzuweisung"
Leider finde über die Hilfe nicht heraus was ich falsch mache. Bit auch nicht so fit in VBScript.

Kann mir jemand weiterhelfen?
Danke

MfG Andi

Re: Manuelles Senden einer Symbol-Nachricht über VBScript

Posted: Wed 30. Jan 2013, 11:44
by K.Wolf
Hallo,

bei Objektzuweisungen muss immer ein "Set" vor dem Variablennamen stehen:

Code: Select all

Set objMsg = Connections.TransmitMessages.FindSymbol(objSymbol)

Re: Manuelles Senden einer Symbol-Nachricht über VBScript

Posted: Wed 30. Jan 2013, 13:02
by AndreasZ
Hallo,

danke für die Hilfe. Das habe ich übersehen...

Mir ist noch nicht ganz klar welches Objekt ich hierbei übergeben bekomme. Das sollte ja eine TransmitMessage sein.
Auf .Count kann ich schonmal zugreifen.
Wenn ich nun hinter ".FindSymbol(objSymbol)" ein ".Item(1)" dranhäng (also : .FindSymbol(objSymbol).Item(1))
müsste ich ja eine Message zurück bekommen. Von dieser kann ich mit "obj.ID" die CAN Id lesen.

Wie kann ich diese verändern?
Ich möchte über eine Virtuelle Variable mittels Panel die CanId verändern. Geht das so? Oder gibt es eine andere Möglichkeit?
Die Möglichkeit mir eine Message einfach zu generieren und hierbei eine CAN Id zuzuweisen habe ich in Betracht gezogen. Möcht aber meine Symboldatei nutzen und hierdurch die Signale manipulieren/ einstellen.

MfG

Andi

Re: Manuelles Senden einer Symbol-Nachricht über VBScript

Posted: Fri 1. Feb 2013, 10:49
by K.Wolf
Hallo,

die Methode FindSymbol liefert eine Messages-Kollektion zurück. Es kann ja immer mehr als eine TransmitMessage mit dem gleichen Symbol in der Sendeliste geben, die zurückgegebene Kollektion enthält dann alle diese Botschaften.

Item(1) liefert dann das erste gefundene TransmitMessage-Objekt zurück. Verändern der CAN ID geht dann ganz einfach durch Setzen der ID-Eigenschaft:

Code: Select all

  Set objMsgs = Connections.TransmitMessages.FindSymbol(objSymbol)
  If objMsgs.Count > 0 Then
    Set objMsg = objMsgs(1)   ' Identisch zu objMsgs.Item(1)
    objMsg.ID = &H123
  End If
Nach dem Verändern der CAN-ID passt aber das Symbol nicht mehr dazu, die Botschaft wird in diesem Fall nur noch in Hex angezeigt (es sei denn, ein anderes Symbol passt zufällig). Das dynamische Verändern der CAN-ID des Symbols selbst ist nicht so einfach möglich, das geht nur über den Umweg der Symboldatei.

Re: Manuelles Senden einer Symbol-Nachricht über VBScript

Posted: Tue 5. Feb 2013, 12:52
by AndreasZ
Hallo,

danke für die Antwort.
Ich habe das nun folgendermaßen gelöst:

-habe die Signale der Symboldatei normal bearbeitet.
-das Senden bei Änderung habe ich ausgeschaltet.
also: Signals("S_CellMode_50Ah.S_SelectCell_4").Source.AutoTransmit = FALSE
bis auf das letzte Signal das geschrieben wird. Hier wird es nach dem schreiben dann gesendet....

Über die Transmit-List hole ich die versendete Nachricht mit
"Set objTxMsg = Connections.TransmitMessages.FindSymbol(objTxSymbol).Item(1)"
in mein Objekt und setze die Daten in meine vordefinierte Nachricht.
->"Set TxMsg = MyClient.Messages.Add"

Code: Select all

With TxMsg
		.ID = IntCardId.Value 'gewünschte ID
		.DLC = 8
		.MsgType = pcanMsgTypeStandard  			'wichtig!!: Standard Nachrichtentyp verwenden :)'
		
		.Data(0) = objTxMsg.Data(0)
		.Data(1) = objTxMsg.Data(1)
		.Data(2) = objTxMsg.Data(2)
		.Data(3) = objTxMsg.Data(3)
		.Data(4) = objTxMsg.Data(4)
		.Data(5) = objTxMsg.Data(5)
		.Data(6) = objTxMsg.Data(6)
		.Data(7) = objTxMsg.Data(7)
	End With
Hierbei kann ich dann auch die gewünschte ID vergeben.
Dann kann ich die Nachricht auch versenden.

Einzigster Nachteil hierbei ist, dass ich eine Leerlauf-Nachricht versende die an keine bestimmte Addresse geht. Zudem darf diese Addresse nicht vorhanden sein.

Das wäre meine vorläufige Lösung... etwas aufwendiger ;)


MfG

Andi