Verändern der Werte einer SPN

Comprehensive CAN monitor for Windows® and its add-ins: Plotter, CANdb Import, Instruments Panel, and J1939
Post Reply
Chr.Lahr
Posts: 3
Joined: Mon 17. Jun 2013, 08:08

Verändern der Werte einer SPN

Post by Chr.Lahr » Mon 17. Jun 2013, 10:09

Guten Tag,

zunächst möchte ich mich nochmal für den freundlichen Telefonkontakt mit Herrn Lang und Herrn Wolf bedanken. Mit VBS zu skripten war ein guter Rat. Bei einigen Details benötige ich aber nochmal ihre Hilfe. Vorab, ich benutze den PCAN-Explorer 5 in der Version 5.3.1.794 mit J1939 Add-in und Instruments Panel 3 Add-in.

Zu meinen Problemen:
1) Ich möchte die Werte von SPNs im Fenster Senden/Empfangen automatisiert verändern können.

Zur Zeit erledigt mir folgende Prozedur das Suchen einer SPN und das Ändern eines Wertes:
Image
Die Prozedur erledigt genau das, was ich brauche. Ich kann aus meiner Main-Prozedur heraus die Prozedur aufrufen und ihr als Parameter den Namen einer SPN als String sowie den zu setzenden Wert übergeben. Für den derzeitigen Simulator ist das auch völlig ausreichend, jedoch könnte es Probleme geben, wenn der Simulator erweitert werden soll. Im Speziellen werde ich Probleme bekommen, falls mehrere SPNs den selben Namen haben (z.B. "Location"). Dann würde meine Prozedur ja allen SPNs mit dem Namen Location den angegebenen Wert zuweisen. Ich müsste zusätzlich noch die korrekte PGN angeben können, weiß aber nicht, wie ich das umsetzen soll. Besteht vielleicht auch die Möglichkeit, direkt mit der Nummer einer SPN zu suchen anstatt deren Namen zu nutzen?

2) Wie sollte ich die Makros strukturieren, wenn ich mehrere Makros im Simulator benutzen will?

Mit dem Simulator sollen mehrere "Testbedingungen" simuliert werden können, beispielsweise eine mehrstündige Autobahnfahrt oder eine Fahrt durch unwegsames Gelände. Ausserdem will ich noch ein drittes Makro bauen, in dem ich Abhängigkeiten zwischen den Signalen implementiere (z.B: Geschwindigkeit, Motordrehzahl und Gang mit Äbhängigkeiten versehen). Zur Zeit sieht meine Struktur noch so aus:
Image
Ich würde am liebsten alle drei Simualtoren in die selbe Makro.pem Datei schreiben. Dann könnte ich problemlos mit dem Projekt-Browser->Makro Rechtsklick->Makro starten zwischen den drei Makros wechseln. Allerdings befürchte ich, dass beim Wechseln von "Autobahn" auf "Gelände" plötzlich beide Makros aktiv sind. Liege ich mit der Befürchtung richtig oder kann ich meine Struktur so beibehalten und 3 Hauptprozeduren in eine Datei schreiben?

Mit freundlichen Grüßen
Lahr

K.Wolf
Software Development
Software Development
Posts: 141
Joined: Wed 22. Sep 2010, 15:37

Re: Verändern der Werte einer SPN

Post by K.Wolf » Mon 17. Jun 2013, 11:57

Hallo,

zu 1) Es ist sehr einfach, auch noch die PGN auszuwerten, da ein TransmitMessage-Objekt direkt eine PGN-Eigenschaft besitzt:

Code: Select all

Sub SearchSigSetValue(pgn, sig, value)
    Dim msg
    For Each msg In Connections.TransmitMessages
        If msg.PGN = pgn Then
            msg.VariableValue(sig) = value
        End If
    Next
End Sub
zu 2) Sie können beliebig viele (Haupt-)Prozeduren in eine Datei schreiben, mit unterschiedlichen Namen. Da immer nur ein Makro bzw. eine Makroprozedur gleichzeitig laufen kann, müssen Sie aber immer erst ein laufendes Makro anhalten, bevor Sie ein neues starten können. Zum Stoppen gibt es in der Symbolleiste eine spezielle Schaltfläche, oder Sie klicken in der Windows-Taskleiste doppelt auf das animierte Makrosymbol.

Mit freundlichen Grüßen,
K.Wolf

Chr.Lahr
Posts: 3
Joined: Mon 17. Jun 2013, 08:08

Re: Verändern der Werte einer SPN

Post by Chr.Lahr » Tue 18. Jun 2013, 14:08

Hallo,

vielen Dank für die schnelle Hilfe. Kann ich mir auch eine Funktion schreiben, mit der ich den Wert einer SPN auslesen, in einer Variablen zwischenspeichern und dann in einer anderen Prozedur als Rückgabewert weiternutzen kann?

Code: Select all

'The function SerachSigGetValue searches a J1939 SPN in the
'TransmitMessages-List and returns the value:
'	-sig:	the name (String) of a message (SPN) to search
Function SearchSigGetValue(sig)
	Dim msg
	For Each msg In Connections.TransmitMessages
		SearchSigGetValue = msg.VariableValue(sig)
	Next
End Function
Die Funktion soll mir als Rückgabewert die aktuellen Daten einer SPN liefern. Die gewünschte SPN wird als String im Parameter übergeben.

Aus einer Prozedur heraus soll mit dieser Funktion dann weiter gerabeitet werden, etwa in der Art:

Code: Select all

Sub Irgendwas
'hier steht noch mehr
   if directionID = 1 then
		Dim actualEngineSpeed
		actualEngineSpeed = SearchSigGetValue "EngineSpeed"
		SearchSigSetValue "PercentLoadAtCurrentSpeed", actualEngineSpeed/100 +50
	elseif directionID = -1 then
		SearchSigSetValue "PercentLoadAtCurrentSpeed", 0
	end if
End Sub
Als Fehlermeldung erhalte ich:

Code: Select all

Zeile 108: Anweisungsende erwartet; 		actualEngineSpeed = SearchSigGetValue "EngineSpeed"
Wenn ich in der der Zeile Klammern um den Parameter setze, verschwindet zwar die Fehlermeldung, aber die Funktion scheint trotzdem noch einen Fehler zu enthalten.

Code: Select all

actualEngineSpeed = SearchSigGetValue ("EngineSpeed")

Weil ich mit VBS erst seit ein paar Tagen arbeite, habe ich leider diese Anfängerprobleme. Ich kann mein Problem zwar auch umgehen, aber es wäre schon sehr hilfreich, wenn ich in etwa auf diese Art arbeiten könnte. Für eine Korrektur wäre ich sehr dankbar.

Mit freundlichen Grüßen,
Lahr

K.Wolf
Software Development
Software Development
Posts: 141
Joined: Wed 22. Sep 2010, 15:37

Re: Verändern der Werte einer SPN

Post by K.Wolf » Tue 18. Jun 2013, 17:10

Hallo,

Auslesen eines SPN-Werts geht am einfachsten über die Signale-Kollektion. Alle SPNs in der J1939-Datenbank sind über die Signale-Kollektion erreichbar. Das geht zwar nicht über die SPN als Nummer, aber über den Syntax "BotschaftsName.ParameterName". Die Werte aller Signale sind immer auf dem aktuellen Stand, d.h. wenn eine CAN-Botschaft empfangen wird, werden die Werte aller Signale, die daran enthalten sind, aktualisiert.
Als Beispiel die EngineSpeed (SPN 190) in der Botschaft EEC1 ausgeben:

Code: Select all

PrintToOutputWindow Signals("EEC1.EngineSpeed").Value
Da hier im Hintergrund String-Vergleiche über die Namen von ein paar Tausend Signalen durchgeführt wird, sollte man sich das Signal vielleicht erst in einer Variablen merken, um später dann damit den Wert zu holen, falls man den öfters abfragen möchte:

Code: Select all

Dim sig, EngineSpeed
Set sig = Signals("EEC1.EngineSpeed")
...
EngineSpeed = sig.Value
Wenn man eine Funktion aufruft und den Rückgabewert bekommen möchte, muss man die Parameter immer in Klammern schreiben.

Viele Grüße
K.Wolf

Chr.Lahr
Posts: 3
Joined: Mon 17. Jun 2013, 08:08

Re: Verändern der Werte einer SPN

Post by Chr.Lahr » Mon 24. Jun 2013, 14:41

Hallo,

dank ihrer Unterstützung habe ich die Automatisierung der Simulatoren erfolgreich fertiggestellt. Inzwischen bin ich aber noch auf einige Ideen gekommen, um die ich meine bisherige Arbeit erweitern möchte: das Erstellen und Auswerten von Logfiles.

Mir schwebt vor, den PCAN Explorer mit meinem Simulator an ein Fahrzeug anzuschließen, um die J1939 Mitteilungen des Gateways abzufragen und anzuzeigen. Darüber hinaus möchte ich die Meldungen, die im Betrieb des Fahrzeugs auftreten, aufbereitet in eine Logfile schreiben. Zusätzlich dazu soll die Logfile auch ausgewertet werden können, damit im Labor die Fahrt immer und immer wieder mit dem Simulator "abgespult" werden kann.

Den Forenbeitrag von AndreasZ, "Erstellen einer Textdatei über ein Skript", sowie die Antwort von Herrn Wilhelm habe ich gelesen. Obwohl ich vermutlich das identische Problem habe, stelle ich meine Frage hier nochmal ganz bewusst neu. Ist meine Idee, eine solch umfassende Erstellung und Auswertung einer Logfile mit VBS-Makros im PCAN Explorer 5 durchzuführen, überhaupt noch realisierbar bzw. sinnvoll? Es fallen ja Unmengen von Daten an, die chronologisch (via Zeitstempel?) gespeichert werden müssen. Wenn ja, wie gehe ich dabei am besten vor? Ich vermute mal, dass ich mich damit etwas übernehme, vor allem, weil es noch diese Woche fertig werden müsste...

Vielen Dank für die bisherige Hilfe!
MfG Lahr

K.Wolf
Software Development
Software Development
Posts: 141
Joined: Wed 22. Sep 2010, 15:37

Re: Verändern der Werte einer SPN

Post by K.Wolf » Tue 25. Jun 2013, 16:27

Hallo,

das Erstellen des Logfiles kann ich mir mit VBScript gerade noch vorstellen. Ich weiß jetzt zwar nicht, was dann alles an Daten drinsteckt und in welcher Form, aber spätestens das Wiedereinlesen und Auswerten der Files würde ich selber nicht mehr mit Makros bzw. VBScript machen.
Ob das mit VBScript überhaupt realisierbar oder sinnvoll ist, kann ich nicht wirklich beurteilen, das hängt von der Komplexität des Aufgabenstellung ab. Einen allgemeinen Vorschlag für eine Vorgehensweise habe ich leider auch nicht parat.

Mfg
K.Wolf

Post Reply