{"id":2201,"date":"2008-10-09T09:34:00","date_gmt":"2008-10-09T09:34:00","guid":{"rendered":"http:\/\/www.b.shuttle.de\/hayek\/Hayek\/Jochen\/wp\/blog-de\/2008\/10\/09\/xml-migration-meines-canopen-projekts-abgeschlossen\/"},"modified":"2008-10-09T09:34:00","modified_gmt":"2008-10-09T09:34:00","slug":"xml-migration-meines-canopen-projekts-abgeschlossen","status":"publish","type":"post","link":"https:\/\/wp.jochen.hayek.name\/blog-de\/2008\/10\/09\/xml-migration-meines-canopen-projekts-abgeschlossen\/","title":{"rendered":"XML-Migration meines CANopen-Projekts abgeschlossen"},"content":{"rendered":"<p>\t\t\t\tIm Mai wurde ich vor die Aufgabe gestellt, in Ada geschriebene Software zu erweitern, welche in ihrer urspr\u00fcnglichen Form von einem B\u00fcndel von Generatoren erzeugt, aber seit Jahren von Hand erweitert worden war.<\/p>\n<p>Klar, dass der Gedanke von mir Besitz ergriff, kein generierbares St\u00fcck Code von Hand zu schreiben und vielmehr die quasi verloren gegangenen Generatoren neu zu schreiben.<\/p>\n<p>Am liebsten h\u00e4tte ich das mit ruby und xml erledigt, aber ich hatte zu diesem Zeitpunkt noch keine in ruby unter Zurhilfenahme von XML geschriebene Software, die nahe genug an dieser Aufgabe dran war, um daraus die Software f\u00fcr dieses Projekt abzuleiten.<\/p>\n<p>Ich stand unter ziemlichem Druck, Ergebnisse abzuliefern, und so erledigte ich die Aufgabe in den darauf folgenden Wochen erst einmal in perl und baute die zentrale Datenstruktur einfach als perl-Datenstruktur.<br \/>\nNach wenigen Wochen konnte ich alle generierbaren Code-St\u00fccke wirklich aus dieser zentralen Datenstruktur erzeugen, und f\u00fcr den weiteren Verlauf des Projektes stand praktisch nur noch die Weiterentwicklung dieser zentralen Datenstruktur und nat\u00fcrlich das Arbeiten mit ihn in Ada auf dem &#8220;embedded system&#8221; an.<\/p>\n<p>Nun es stellte sich schon noch heraus, dass mehr als urspr\u00fcnglich erwartet generiert werden konnte. Der Erwartungsdruck hier war aber nicht mehr so gro\u00df wie der am Anfang, und ich wollte nach M\u00f6glichkeit mit XML-Techniken weiterarbeiten. Ich baute also einen Converter, um die perl-Datenstruktur in eine &#8220;en passant&#8221; zu definierende XML-Datenstruktur zu transformieren, nat\u00fcrlich ist die Spezifikations-Sprache dazu &#8220;RELAX NG&#8221; und die Datenstruktur wird seit dem im emacs im nxml-mode editiert. Das neue XML bekam dann h\u00fcbsche Extra-Features mit eigenen Code-Generatoren, immer noch in perl. Der bittere Aspekt war jedoch selbstverst\u00e4ndlich, dass ich bis auf weiteres alle \u00c4nderungen im Bereich der in perl gehaltenen Datenstruktur in der XML-Variante nachziehen musste. Es stellte sich heraus, dass sich in diesem Bereich wochenlang keine \u00c4nderungen bzw. Erweiterungen ergaben. Aber mittelfristig sollten aus meiner Sicht schon alle generierbaren Code-St\u00fccke nur aus der XML-Variante erzeugt werden.<\/p>\n<p>Nun gestern erreichte ich dieses Ziel, und dar\u00fcber bin ich sehr zufrieden. Die Code-Generatoren sind zwar immer noch in perl geschrieben (nur die Datenstruktur-Zugriffe mussten schlie\u00dflich angepasst werden) und werden das vermutlich zeitlebens auch bleiben, aber sie funktionieren und sie sind auch ganz gut zu lesen und zu pflegen.<\/p>\n<p>Mittlerweile habe ich jedoch auch f\u00fcr ein paar kleine Anwendungsgebiete neue Code-Generatoren entwickelt, und die sind in ruby geschrieben. F\u00fcr die n\u00e4chsten gr\u00f6\u00dferen und kleineren Aufgaben werden sie bestimmt als Vorlage dienen.<br \/>\nSelbstverst\u00e4ndlich benutzen auch die neuen XML-Spezifikationen wieder &#8220;RELAX NG&#8221;.<\/p>\n<p>Mittlerweile ist das CANopen-Kommunikationsprofil f\u00fcr ein zweites Fahrzeug in diesem CANopen-XML begonnen worden, und die Zweifel an der N\u00fctzlichkeit werden zumindest nicht mehr lautstark diskutiert.<\/p>\n<p>Zu den erw\u00e4hnten Extra-Features dieses CANopen-XMLs z\u00e4hlen Records mit &#8220;representation specifications&#8221; und Aufz\u00e4hlungstypen (ebenso mit rep. specs), aus welchen die Ada-Records und -Aufz\u00e4hlungstypen generiert werden.<br \/>\nDie Unterprogramme, mit welchen in Ada die CANopen-PDOs zusammengebaut und abgeschickt werden, sind sozusagen halb-automatisch erstellt.<br \/>\nDiejenigen Unterprogramme, welche ankommende PDOs zerlegen, sind noch g\u00e4nzlich handgeschrieben, die XML-m\u00e4\u00dfigen Spezifikationen der PDOs werden darin aber als hilfreiche Kommentare verwendet.<\/p>\n<p>Wer wei\u00df, vielleicht verlangt ja mal ein Auftraggeber &#8220;Traceability&#8221;, die Grundlagen daf\u00fcr w\u00e4ren schon gelegt.<br \/>\nAlle XML-Tags bek\u00e4men passende Attribute und Werte dazu,<br \/>\nund diese w\u00fcrden \u00fcberallhin durchgeschleift.\t\t\t\t<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Mai wurde ich vor die Aufgabe gestellt, in Ada geschriebene Software zu erweitern, welche in ihrer urspr\u00fcnglichen Form von einem B\u00fcndel von Generatoren erzeugt, aber seit Jahren von Hand erweitert worden war. Klar, dass der Gedanke von mir Besitz ergriff, kein generierbares St\u00fcck Code von Hand zu schreiben und vielmehr die quasi verloren gegangenen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_share_on_mastodon":"0"},"categories":[669,438,604],"tags":[],"class_list":["post-2201","post","type-post","status-publish","format-standard","hentry","category-die-programmiersprache-perl","category-relax-ng","category-xml"],"share_on_mastodon":{"url":"","error":""},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/paO0l8-zv","jetpack_likes_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/posts\/2201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/comments?post=2201"}],"version-history":[{"count":0,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/posts\/2201\/revisions"}],"wp:attachment":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/media?parent=2201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/categories?post=2201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/tags?post=2201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}