Herstellerneutrale Programmierung von Steuerungen

ekki

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

hat sich schonmal jemand von euch mit Herstellerneutraler Programmierung von Steuerungen beschäftigt?
Ich Arbeit mich gerade in das Thema ein und mein Ziel ist es:

1. Eine vorhandene Applikation von Siemens auf WAGO zu exportieren (leicht gesagt)
2. Probleme der Herstellerneutralen Programmierung herauszufinden
3. Vorraussetzungen für die Herstellerneutralen Programmierung festzuhalten
4. Lösungskonzept für die Herstellerneutralen Programmierung
5. Punkt 1. zu realisieren anhand der ganzen Voraussetzungen und vielleicht einen sogennanten Kommunikationsbaustein zu entwickeln oder halt einen Interpreter.

Ich würde mich über jegliche Quellen, Anregungen, Diskussionen und Denkanstöße freuen!

Mit besten Grüßen
ekki
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann dir bei Siemens zu B&R sagen das der Code minimal anders aussieht. Du kannst also nicht einfach hin und her kopieren. Man muss bei B&R da immer die # wegmachen die Siemens bei lokalen Variablen dazuschreibt. Wir arbeiten inzwischen eher mit ähnlichen/gleichen Strukturen aber der Code ist teilweise unterschiedlich aber auch ähnlich aufgebaut.

Z.b. MC Bausteine arbeiten bei Siemens ein kleines bisschen anders als bei B&R
 
  • Es muss auf Hersteller-Bibliotheken verzichtet werden
  • Sonderzeichen, wie sie gewisse Hersteller erlauben, müssen vermieden werden
  • Alles was nur an IEC 61131 „angelehnt“ ist, ist in Frage zu stellen
  • Für die HMI gibt es meines Wissens noch keine Vernünftige Basis, die Herstellerübergreifend funktioniert
 
Hallo Ekki,

Herstellerneutral wäre :
Programmieren in SCL und nur als reinen Code. Nicht Herstellerspezifische Funktionen benutzen.

Bram

richtig, dennoch kann es ja zu Problemen kommen, bei z.B. Typenkonvetierungen oder?
wäre es nicht möglich einen FUP Baustein in in eine Bibliothek zu kapseln und dass man diese dann exportiert bzw. "einfach" importiert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann dir bei Siemens zu B&R sagen das der Code minimal anders aussieht. Du kannst also nicht einfach hin und her kopieren. Man muss bei B&R da immer die # wegmachen die Siemens bei lokalen Variablen dazuschreibt. Wir arbeiten inzwischen eher mit ähnlichen/gleichen Strukturen aber der Code ist teilweise unterschiedlich aber auch ähnlich aufgebaut.

Z.b. MC Bausteine arbeiten bei Siemens ein kleines bisschen anders als bei B&R

weißt du z.B. woran das liegt, dass der anders aussieht? ist ja die gleich norm IEC 61131-3...?
heißt es ich muss wirklich händisch ran gehen und die vorhandene Application von Siemens der WAGO Steuerung anpassen?

es wäre ja interessant einen Interpreten zu erstellen, der dann die Siemens Application in eine geeignete WAGO Application umwandelt bzw. übersetzt?
 
  • Es muss auf Hersteller-Bibliotheken verzichtet werden
  • Sonderzeichen, wie sie gewisse Hersteller erlauben, müssen vermieden werden
  • Alles was nur an IEC 61131 „angelehnt“ ist, ist in Frage zu stellen
  • Für die HMI gibt es meines Wissens noch keine Vernünftige Basis, die Herstellerübergreifend funktioniert

Bei der Erstellung der Siemens Application, die mir zur verfügung steht, wurden keine Siemens spezifischen Funktionen benutzt.

Zur HMI da gibt es ja schon das Whitepaper für MTP's was auch schon relativ gut funktioniert. Also beispielsweise der Export von einer HMI WAGO Steuerung und der Import in das YOKOGAWA Leitsystem ist schon möglich.
 
richtig, dennoch kann es ja zu Problemen kommen, bei z.B. Typenkonvetierungen oder?
wäre es nicht möglich einen FUP Baustein in in eine Bibliothek zu kapseln und dass man diese dann exportiert bzw. "einfach" importiert?

Die Typkonvertierungen der von Bram vorgeschlagenen SCL-Basis sollten identisch funktionieren.
Der SCL-Code wird dann von dem jeweiligen Entwicklungssystem passend für die SPS übersetzt.
Bei FUP wird das nicht funktionieren da FUP (oder KOP) ja nur eine "Malerei" ist - im Hintergrund gibt es dazu dann wieder Befehle, die in den jeweiligen Systemen auch durchaus schon anderes heißen können.
Das Gleiche gilt für Graph / AS. Bei AWL / IL kannst du dann sehen, dass bzw. wie die Befehle anders lauten ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
es wäre ja interessant einen Interpreten zu erstellen, der dann die Siemens Application in eine geeignete WAGO Application umwandelt bzw. übersetzt?

Das wäre auf Basis von Befehlen (AWL / IL) durchaus vorstellbar. Dummerweise werden aber zumindestens auf Siemens-Seite die AWL-Anweisungen nicht als Textdatei gespeichert ...

Gruß
Larry
 
Die Typkonvertierungen der von Bram vorgeschlagenen SCL-Basis sollten identisch funktionieren.
Der SCL-Code wird dann von dem jeweiligen Entwicklungssystem passend für die SPS übersetzt.

Gruß
Larry

Ich höre gerade zum ersten mal von "Bram" kannst du mir da vielleicht ein paar mehr Infos zu geben oder vielleich auch paar Quellen?



Das wäre auf Basis von Befehlen (AWL / IL) durchaus vorstellbar. Dummerweise werden aber zumindestens auf Siemens-Seite die AWL-Anweisungen nicht als Textdatei gespeichert ...

Gruß
Larry

Wieso wäre es denn nicht als ST vorstellbar?
 
Ich höre gerade zum ersten mal von "Bram" kannst du mir da vielleicht ein paar mehr Infos zu geben oder vielleich auch paar Quellen?

QUOTE]

Also ein paar Infos zu mir..
Bram, 43 Jahr, Niederländer... oder meinst du das nicht.;)

Hier mal ein Beispiel der Gleiche Code für 2 "Hersteller, SPS-Baureihe".

S7-Classic
Code:
  // MAX OUT
    IF MAX_OUT THEN
        Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := AV_intern_Channel_A, IN2 := AV_intern_Channel_B, IN3 := AV_intern_Channel_C);
        IF MF_AL_Intern_Channel_A THEN
            Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := AV_intern_Channel_B, IN2 := AV_intern_Channel_C);
        END_IF;
        IF MF_AL_Intern_Channel_B THEN
            Cache_ACT_VAL_2oo3_OUT := MAX(IN1 := AV_intern_Channel_A, IN2 := AV_intern_Channel_C);
        END_IF;
        IF MF_AL_Intern_Channel_C THEN
            Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := AV_intern_Channel_A, IN2 := AV_intern_Channel_B);
        END_IF;
    END_IF;

TIA-Portal
Code:
  // MAX OUT
IF #MAX_OUT THEN
    #Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := #AV_intern_Channel_A, IN2 := #AV_intern_Channel_B, IN3 := #AV_intern_Channel_C);
    IF #MF_AL_Intern_Channel_A THEN
        #Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := #AV_intern_Channel_B, IN2 := #AV_intern_Channel_C);
    END_IF;
    IF #MF_AL_Intern_Channel_B THEN
        #Cache_ACT_VAL_2oo3_OUT := MAX(IN1 := #AV_intern_Channel_A, IN2 := #AV_intern_Channel_C);
    END_IF;
    IF #MF_AL_Intern_Channel_C THEN
        #Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := #AV_intern_Channel_A, IN2 := #AV_intern_Channel_B);
    END_IF;
END_IF;

Mit Ausnahme vom # der gleiche Code.
Im Classic wird der Code anders Übersetzt (Zum AWL, M7) als bei TIA.
Jeweils für der passende SPS.

Bram
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich höre gerade zum ersten mal von "Bram" kannst du mir da vielleicht ein paar mehr Infos zu geben oder vielleich auch paar Quellen?

QUOTE]

Also ein paar Infos zu mir..
Bram, 43 Jahr, Niederländer... oder meinst du das nicht.;)

Hier mal ein Beispiel der Gleiche Code für 2 "Hersteller, SPS-Baureihe".

S7-Classic
Code:
  // MAX OUT
    IF MAX_OUT THEN
        Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := AV_intern_Channel_A, IN2 := AV_intern_Channel_B, IN3 := AV_intern_Channel_C);
        IF MF_AL_Intern_Channel_A THEN
            Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := AV_intern_Channel_B, IN2 := AV_intern_Channel_C);
        END_IF;
        IF MF_AL_Intern_Channel_B THEN
            Cache_ACT_VAL_2oo3_OUT := MAX(IN1 := AV_intern_Channel_A, IN2 := AV_intern_Channel_C);
        END_IF;
        IF MF_AL_Intern_Channel_C THEN
            Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := AV_intern_Channel_A, IN2 := AV_intern_Channel_B);
        END_IF;
    END_IF;

TIA-Portal
Code:
  // MAX OUT
IF #MAX_OUT THEN
    #Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := #AV_intern_Channel_A, IN2 := #AV_intern_Channel_B, IN3 := #AV_intern_Channel_C);
    IF #MF_AL_Intern_Channel_A THEN
        #Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := #AV_intern_Channel_B, IN2 := #AV_intern_Channel_C);
    END_IF;
    IF #MF_AL_Intern_Channel_B THEN
        #Cache_ACT_VAL_2oo3_OUT := MAX(IN1 := #AV_intern_Channel_A, IN2 := #AV_intern_Channel_C);
    END_IF;
    IF #MF_AL_Intern_Channel_C THEN
        #Cache_ACT_VAL_2oo3_OUT:= MAX(IN1 := #AV_intern_Channel_A, IN2 := #AV_intern_Channel_B);
    END_IF;
END_IF;

Mit Ausnahme vom # der gleiche Code.
Im Classic wird der Code anders Übersetzt (Zum AWL, M7) als bei TIA.
Jeweils für der passende SPS.

Bram



Haha gerade komm ich mir etwas doof vor :D
Danke Bram, hast du mehr Beispiele vielleicht auch eins noch von WAGO?

Also muss ich wirklich Händisch die Application vom TIA-Portal anpassen und alle '#' usw. löschen? oder gibts da schon ein Programm?
 
@Ekki:
Sorry mit dem 'Bram' ... aber das hat sich ja jetzt geklärt. Wenn man ein bißchen länger (und öfter) im Forum aktiv dann weiß man von dem Einen oder Anderen den Namen. Beim Fliegenden Holländer steht sein Name aber auch unter jedem seiner Beiträge ...

Zu deinem Thema : besser als 'Bram' weiß ich es auch nicht. Ich kann mir aber vorstellen, ass . das direkte Portieren / Migrieren von Code(-Teilen) von deinem Einen zum Anderen weder von dem Einen noch dem Anderen gewünscht ist. Im Falle von Siemens kann ich mir darüber hinaus auch noch vorstellen, dass die sich das auch noch rechtlich haben schützen lassen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vom Wago hab ich nichts.

Muss aber ähnlich sein.

Da ich schon verschiedenlich ST-Fragen hier im Forum (ob für Wago oder Beckhoff ist erstmal egal) mit SCL-Code beantwortet habe scheint da der Unterschied nicht so gravierend zu sein. Das mit dem Doppelkreuz (Hashtag) ist dann auch mal so und mal so ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab doch das Handbuch verlinkt...

Aber nagut, mal die Kurzform für Laien:

"sed" ist ein Kommandozeilenprogramm, das Streams (z.B. Textdateien) einlesen kann, darauf Veränderungen durchführen kann und in neue Streams schreiben kann.

so kann man Beispielsweise mit dem Kommando
Code:
sed -i "s/Text/NeuerText/g" Textdatei.txt
alle Vorkommen von "Text" durch "NeuerText" ersetzen

hierbei bedeuten die einzelnen Teile:

  • sed - Programmname
  • -i - Datei bearbeiten (anstatt neue Datei zu erstellen)
  • "" - Anführungszeichen sind hilfreich, wenn du Leerzeichen ö.ä. verwendest
  • s - Ersetzung durchführen
  • / - Trennzeichen
  • Text - Suchtext (kann auch Reguläre Ausdrücke)
  • NeuerText - Ersetzungstext
  • g - "global" - Alle Vorkommen ersetzen (statt nur das erste Vorkommen in jeder Zeile)
  • Dateiname.txt - Dateiname
 
Also muss ich wirklich Händisch die Application vom TIA-Portal anpassen und alle '#' usw. löschen?
Wenn der TIA-Programmierer solchen Schwachsinn wie Leerzeichen in Variablennamen macht :roll: dann wird der Name zusätzlich zum # auch noch in doppelte " gesetzt, z.B. #"meine lokale Variable"


Eine Auswahl weiterer Unterschiede:
- Schreibweise der Slice-Zugriffe ist unterschiedlich
- im Codesys- und Twincat-Universum gibt es bei Functions kein VAR_TEMP, was bei Siemens SCL aber viel genutzt wird. Dafür gibt es in Codesys/Twincat VAR_...-Deklarationen, die es bei Siemens so nicht gibt
- Siemens SCL kennt kein "AT %I*" und "AT %Q*"
- Codesys/Twincat kann mit "AT" nicht Variablen übereinanderlegen so wie Siemens SCL - Codesys/Twincat hat dafür "UNION", was Siemens SCL aber nicht versteht
- direkte Adressierung von Eingängen/Ausgängen/Merkern (z.b. %MW2) funktioniert in Codesys/Twincat/Siemens unterschiedlich
- in Siemens SCL gibt es keine Adressoperatoren und kein SIZEOF, kein INDEXOF, kein UNION, kein Pointer, kein REFERENCE, kein AND_THEN, kein OR_ELSE, kein MEMCPY, ...
- HMI/Visu/Komm.-Zugriffe auf Variablen finden zu unterschiedlichen Zeitpunkten statt
- Parameterübergaben an Functions oder FB sind teilweise unterschiedlich "per Value" und "per Reference", und das bei Siemens sogar zwischen den S7-Familien oder gar innerhalb einer Familie (z.B. S7-1500) je nachdem ob der angeschaltete Aktualparameter in "optimiertem" oder Standard-Speicher liegt
- in Twincat können VAR_IN_OUT-Variablen nicht direkt via <FBInstanz>.<EinAusgabevariable> von außen gelesen oder geschrieben werden
- Twincat: Bei Operationen mit Gleitkomma-Datentypen ist das Rechenergebnis abhängig von der verwendeten Zielsystem-Hardware.
- der BOOL-Datentyp belegt bei Codesys/Twincat ein Byte, bei Siemens nur ein Bit
- ...

- Vorsicht bei (impliziten und expliziten) Typkonvertierungen, besonders bei Bitstring-Datentypen zu REAL! Da kocht jeder Hersteller sein eigenes Süppchen. Da kann man Berechnungen programmieren, die auf einer anderen Plattform ein anderes Ergebnis haben oder gar nicht fehlerfrei übersetzbar sind.


Meine Einschätzung: nur wirklich einfache Programmierung ist relativ kompatibel und automatisch konvertierbar - doch solche "Snippets" konvertiert kaum jemand. Kompliziertere Programme sind nur mit höherem Aufwand und manueller Nacharbeit und Nachkontrolle konvertierbar - da hilft ein automatischer Konvertierer nicht wirklich.

Harald
 
Absicht

@Ekki:
... Ich kann mir aber vorstellen, ass . das direkte Portieren / Migrieren von Code(-Teilen) von deinem Einen zum Anderen weder von dem Einen noch dem Anderen gewünscht ist. Im Falle von Siemens kann ich mir darüber hinaus auch noch vorstellen, dass die sich das auch noch rechtlich haben schützen lassen ...

Gruß
Larry

Stimmt so, man will die Leute fest an sein Produkt binden. "Customer lock in" nennt man das bei den Kaufleuten.

Das ist auch der Grund, warum man von "upgedateten" Projekten nicht mehr zurück kann.

Es gibt auch keinen ST "Konverter" Codesys 3.x zurück auf 2.x oder bei TIA auf eine frühere Version.

Kennt man überall auch sonst, der Kunde soll das neueste fressen, ob es passt oder nicht.
 
Zurück
Oben