NEWS
TA Daten über CAN-Bus lesen/schreiben
-
Etwas mehr Daten wären schon gut.
Was mir auffällt alle Spannungen (also alles was als Wert der letzten 4 Byte einen I32 LE ca. 23000 = 230 Volt zurück gibt) hat im 6. Byte 0D und im 5. Byte 00. Dann gibt es noch eine weitere Nachricht die hat 2C 2C. Könnte eines davon oder beides Zusammen eine Adresse sein?Ich hatte zum Testen immer Fixwerte definiert damit man eben solche kleinen Schwankungen nicht hat und dann mehrere Ausgänge mit unterschiedlichen Werten beobachtet und dann auch mal den Wert geändert und verglichen.
-
@rudi86 Ich baue mir mal eine „Steuerung“ mit Fixwerten 1-64 für Ausgänge 1-64 und schneide dann den Traffic mit. Wird etwas dauern, ist arg fricklig, selbst mit TAPPS2.
-
Hi Rudi, anbei ein dump mit den CAN-Ausgängen 1 bis 64, die korrespondierend mit den Werten 1 bis 64 belegt sind. Wenn ich die Ausgabe vom TPDO richtig interpretiere, dann zeigt Byte 2 den Ausgang (0-63) und Byte 4 (vermutlich 4 bis 8 ) den Wert an. Das würde meine initiale Vermutung bestätigen, dass nicht mehr jeder Ausgang fix einem TPDO zugeordnet ist, sondern nur noch ein TPDO existiert, dass "bedarfsweise" (nach Wertänderung oder per eingestellter Aktualisierungsrate, z.B. 1 Minute) mit Ausgangsnummer und entsprechenden Wert befüllt und übertragen wird. Das ist natürlich ein netter Trick, um die Übertragung von 4 Byte breiten Werten und faktisch unendlich vielen Ausgängen zu ermöglichen, aber macht jedes Skript kaputt, was auf der vorhergehenden statischen Adressierung beruht.
Von TA habe ich noch keine Antwort erhalten. Ich habe immer noch Hoffnung, dass man das alte Verhalten irgendwie erzwingen kann. Ansonsten muss ich dauerhaft zurück zur 1.29.
HINWEIS: Nach Durchsicht ist mir aufgefallen, dass manche Ausgänge nicht oder nicht korrekt belegt waren, das ist kein Fehler im Log. Die Ausgänge sollten eigentlich 1:1 mit dem TA-Ausgang entsprechendem Zahlenwert belegt sein aber scheinbar habe ich da ein paar Fehler eingebaut.
-
OK...
Zuerst dachte ich das geht mit dem CAN-Adapter, der gibt das aber leider nicht her.
Probier bitte mal folgendes:
-
Im CAN-Adapter den Knoten anlegen
-
Im Javascript-Adapter die Funktion setObject erlauben
-
Folgendes Script erstellen (ich arbeite gerne mit Blockly, geht aber in diesem Fall leider nicht 100%)
Das Objekt "CAN_Test" habe ich angelegt zum testen, das musst du ersetzen mit dem json-Objekt vom Knoten.
Der Code der beiden Funktionen:
create_update
let objectName = '0_userdata.0.canbus.40.' + obj; if(!existsState(objectName)){ await extendObject(objectName, {type: 'state', common: {name: 'test', type: 'number', role: 'value'}}, function() { setState(objectName, value); }); } else { setState(objectName, value); }
wert_berechnen
b1_hex = b1.toString(16); b2_hex = b2.toString(16); return parseInt(b2_hex + b1_hex, 16);
Oder als export:
CAN_Test.xmlDas Script sollte so laufen, wenn das klappt muss man die Funktion create_update noch erweitern um den CAN-Knoten damit man für einen neuen Knoten nur den Falls-Block kopieren muss...
-
-
Vielen Dank für deine umfangreiche Antwort und Zeit, die du investiert hast.
Ich habe mittlerweile noch herausgefunden, dass Byte 3 der Typ der Daten ist, der übertragen wird.
Ich bin derzeit noch garnicht soweit, iobroker einzusetzen, da ich die Daten erst auf einer SPS sammle und dort weiterverarbeite und dann Richtung iobroker senden möchte.
Ich konnte deinen Code aber nutzen, um meine Steuerung zu programmieren und das funktioniert hervorragend. Ich kann das serialisierte Array welches von der EZ3 kommt wieder einlesen.
Derzeit versuche ich mich daran, Daten zu senden. Ein RPDO mit exakt gleichem Inhalt (außer geänderter Node ID) zu erzeugen, bzw. zu befüllen, klappt nicht. Da werde ich wohl noch mal auf dem CAN-bus zwischen CMI und EZ3 lauschen müssen. Ggfs. hat es was mit dem ersten Byte zu tun.
Der Support von TA hat mittlerweile geantwortet. Das neue Datenformat geben sie nicht heraus aber man kann wohl das Senden des alten Formats erzwingen, wenn man einen bestimmten Heartbeat sendet:
Zitat:
MSG-ID = 0x700 + Node ID (irgendeine Knotennummer die Sie in Ihrem Netzwerk nicht verwenden)
Frame/Size = 1
Daten = 5Sobald ich Zeit habe, probiere ich das aus!
Ich melde mich, so bald ich mehr weiß.
-
Cool... Ich mache genau das beruflich (Eingänge auf über 200 SPSen sammeln, verarbeiten und an ein Leitstellensystem per IEC 104 senden). Was setzt du da für eine SPS ein?
-
Ich habe erst vor ein paar Wochen auf Hobby-Ebene damit angefangen. Ich muss Daten von einem Wechselrichter abholen und zur Steuerung eines Heizstabs verwenden. Die CMI ist einfach zu unflexibel, da man dort nur einzelne ModBus-Register auslesen kann
Ich habe eine alte Wago SPS im Einsatz. Die 750-8204 kann CAN-Bus und Modbus RTU. Modbus TCP kann man einfach über einen der Ethernet-Porta nutzen, grandios. Bleiben halt die nicht unerheblichen Kosten für die Codesys-Runtime aber ich habe am Ende alles in einem Gerät.Außerdem bringt mich ST zurück in die alten Pascal-Zeiten. Das Abrufen von Daten vom Modbus und weiterleiten auf den CAN-Bus ging fast ohne Code - mit dem neuen Format ist es etwa Arbeit.
An 200 SPSen würde mich allerdings nicht ran wagen
- ST-Programmierung lasse ich mir derzeit von ChatGPT beibringen - ich denke, um
mehrere Steuerungen zu kontrollieren, reicht das Halbwissen nicht aus.Zum Thema: den entscheidenden Hinweis, um Daten senden zu können, hat TA in seiner Antwort geliefert. Meine Ergebnisse:
Schreiben an die alten COB-IDs funktioniert weiterhin. Das halt den Nachteil, dass man nicht 4 Byte nutzen kann.
Das aktivieren des alten Sendeformats via eines Fake-Heartbeats habe ich nicht ausprobiert, da ich gleich einen Schritt weitergegangen bin.
Das Problem war, dass das Senden im neuen Format mit einer COB-ID, die physisch nicht existiert, nicht funktioniert. Also Absende-Node 15 - COB-ID 0x1cf - wird von den existierenden Nodes einfach ignoriert.
Lösung: ich kopiere die Heartbeat-Nachricht des EZ3 einfach mit neuer COB-ID auf den Bus und die CMI zeigt daraufhin einen weiteren EZ3 im CAN-Netz an und nimmt von diesem Fake-Node auch endlich wieder Nachrichten an.
Jetzt muss ich nur noch die Serialisierung des Arrays mit den 64 Daten-Punkten einigermaßen sinnvoll implementieren. Ich denke, ich werde einfach alle 500 ms das ganze Array auf den Bus schreiben, bevor ich jetzt anfange kompliziert auszulesen, welcher Wert, den ich übertragen will, geändert wurde.
Sollte mir dabei noch was irreguläres über den Weg laufen, würde ich es hier dokumentieren. Auf jeden Fall herzlichen Dank für die Zusammenarbeit, das war wirklich hilfreich!
-
Wäre FUP nicht einfacher? Das ist ja quasi fast genauso wie mit TAPPS.
Wir machen das Meiste in FUP, nur Dinge die sich mit minimalen Änderungen hundertfach wiederholen (z.B. Mapping von Ein/Ausgängen) sind in ST geschrieben. -
Ja, FUP habe ich mir angeschaut, aber das hat mich für den Anfang etwas erschrocken. Mit ST habe ich das Gefühl, mehr Kontrolle über den Code zu haben.
Aber ich habe ja noch einige Programmteile zu bauen, vielleicht schaue ich mir das noch mal an.
Habe mittlerweile auch das zyklische Senden nach Timeout oder bei Werte-Aktualisierung hinbekommen. Die Basisadresse für das eine verbleibende RPDO ist auch 0x1C0. Wenn man vom
„Fake“-Knoten 15 senden möchte also 0x1CF.Mehr Schwierigkeiten sind mit derzeit nicht über den Weg gelaufen, bin hauptsächlich damit beschäftigt, den Code einigermaßen schön zu machen und meine ganzen Debug-Nachrichten und Haltepunkte zu entfernen
@Rudi86: nochmals herzlichen Dank, ohne deine Hilfe wäre ich nicht so weit gekommen!
-
Hallo,
ich bin auf diesen Thread gestoßen, weil ich ähnliche Absichten habe - nämlich den TA-CAN mittels Wago Controller auszulesen, und die Werte an andere Schnittstellen weiterzugeben...
Ich stehe aber noch ganz am Anfang - ehrlich gesagt, habe ich noch nicht mal angefangenUnd ich möchte mich bei euch beiden für die Weitergabe euerer Erfahrungen bedanken - jetzt weiß ich zumindest dass es grundsätzlich Möglich ist, und ich diese Idee wahrscheinlich weiter verfolgen werde!
@drrrz Ich frag mal ganz direkt und unverschämt- wärst du eventuell bereit deinen Code hier zu teilen?
mfg
hamnx