-> Hier kostenlos registrieren
Hallo zusammen,
ich habe eine spezielle Frage. Ich habe bereits eine Lösung für mein Problem gefunden, aber ich denke, dass es eine wesentlich einfachere und auch schönere Lösung gibt.
Die Situation:
Zum Datenaustausch bekomme ich von einer PhoenixContact-Steuerung verschiedene Daten mittels BCD-Code übermittelt. Dabei bekomme ich einmal das BCD-Signal mittels 4 Bits eines Ausgangsmoduls. Zusätzlich bekomme ich ein Senden-Signal und zwar immer zu Beginn des Datenaustauschs, sowie zwischen jeder einzelnen Zahl. Insgesamt werden 15 Zahlen übertragen, welche sich folgendermaßen gruppieren. Zahl 1 + 2 geben die Programmnummer an, Zahl 3-11 geben die Kundennummer an, Zahl 12-15 ist das Gewicht.
Ich habe das Ganze nun folgendermaßen gelöst. Zunächst einmal hab ich einen Zähler gemacht, welcher mir das Senden-Signal zählt. Bei der ersten positiven Flanke weiß ich dass der Übertragungsvorgang beginnt. Beim Zählwert 2 weiß ich, dass die erste Zahl der Programmnummer gesendet wird, beim Zählwert 3 kommt die zweite Stelle der Programmnummer, bei Zählwert 4 kommt die erste Zahl der Kundennummer usw.
Und so läuft der Zähler durch bis 16 und speichert mir dabei immer den jeweiligen Zählwert in ein Array of Dint und setzt sich anschließend selbst zurück.
Den Wert der Zahl ermittle ich über SCL. Ich könnte auch in FUP den Gather-Baustein verwenden, der mir aus den einzelnen BCR-Bits eine Zahlenreihe erstellt. Das wäre jetzt Geschmacksache was die schönere Variante ist.
Nun aber zur Zahlenbildung. Ich muss ja die Zahlen in eine richtige Reihe bekommen. Dazu habe ich nun einfach in SCL die einzelnen Zahlen mit Faktor 10 multipliziert. Beispiel Programmnummer: Für die erste Stelle wurde mir 6 übertragen, für die zweite Stelle 3. Also multipliziere ich 6 mit 10 (Ergebnis 60) und addiere die zweite Stelle, also 3 dazu. Ergebnis: 63
Bei der Kundennummer hab ich es genauso gemacht. Die erste Zahl der Kundennummer multipliziere ich mit 100000000 (8-Nullen), die zweite Zahl der Kundennummer mit 10000000 (7-Nullen) usw. Am Ende addiere ich wieder die letzte Zahl und habe somit meine 9-stellige Kundennummer in einer Reihe stehen.
Beim 4-stelligen Gewicht mach ich es genauso.
Es funktioniert zwar erstmal alles so wie es soll, aber mir kommt die Lösung etwas unorthodox vor. Gibt es da nicht einen einfacheren bzw. schöneren Weg? Ich habe bereits nach alternativen Lösungswegen gesucht, habe aber nichts gefunden.
Beste Grüße
ich habe eine spezielle Frage. Ich habe bereits eine Lösung für mein Problem gefunden, aber ich denke, dass es eine wesentlich einfachere und auch schönere Lösung gibt.
Die Situation:
Zum Datenaustausch bekomme ich von einer PhoenixContact-Steuerung verschiedene Daten mittels BCD-Code übermittelt. Dabei bekomme ich einmal das BCD-Signal mittels 4 Bits eines Ausgangsmoduls. Zusätzlich bekomme ich ein Senden-Signal und zwar immer zu Beginn des Datenaustauschs, sowie zwischen jeder einzelnen Zahl. Insgesamt werden 15 Zahlen übertragen, welche sich folgendermaßen gruppieren. Zahl 1 + 2 geben die Programmnummer an, Zahl 3-11 geben die Kundennummer an, Zahl 12-15 ist das Gewicht.
Ich habe das Ganze nun folgendermaßen gelöst. Zunächst einmal hab ich einen Zähler gemacht, welcher mir das Senden-Signal zählt. Bei der ersten positiven Flanke weiß ich dass der Übertragungsvorgang beginnt. Beim Zählwert 2 weiß ich, dass die erste Zahl der Programmnummer gesendet wird, beim Zählwert 3 kommt die zweite Stelle der Programmnummer, bei Zählwert 4 kommt die erste Zahl der Kundennummer usw.
Und so läuft der Zähler durch bis 16 und speichert mir dabei immer den jeweiligen Zählwert in ein Array of Dint und setzt sich anschließend selbst zurück.
Den Wert der Zahl ermittle ich über SCL. Ich könnte auch in FUP den Gather-Baustein verwenden, der mir aus den einzelnen BCR-Bits eine Zahlenreihe erstellt. Das wäre jetzt Geschmacksache was die schönere Variante ist.
Nun aber zur Zahlenbildung. Ich muss ja die Zahlen in eine richtige Reihe bekommen. Dazu habe ich nun einfach in SCL die einzelnen Zahlen mit Faktor 10 multipliziert. Beispiel Programmnummer: Für die erste Stelle wurde mir 6 übertragen, für die zweite Stelle 3. Also multipliziere ich 6 mit 10 (Ergebnis 60) und addiere die zweite Stelle, also 3 dazu. Ergebnis: 63
Bei der Kundennummer hab ich es genauso gemacht. Die erste Zahl der Kundennummer multipliziere ich mit 100000000 (8-Nullen), die zweite Zahl der Kundennummer mit 10000000 (7-Nullen) usw. Am Ende addiere ich wieder die letzte Zahl und habe somit meine 9-stellige Kundennummer in einer Reihe stehen.
Beim 4-stelligen Gewicht mach ich es genauso.
Es funktioniert zwar erstmal alles so wie es soll, aber mir kommt die Lösung etwas unorthodox vor. Gibt es da nicht einen einfacheren bzw. schöneren Weg? Ich habe bereits nach alternativen Lösungswegen gesucht, habe aber nichts gefunden.
Beste Grüße