bin ich jetzt ganz bekloppt? Schnelle Hilfe für einfache Sachen gesucht. Danke!!!!

KingHelmer

Level-1
Beiträge
1.076
Reaktionspunkte
139
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

ich habe ein Problem, für welches mich alle für blöd halten werden.

Hier ist der Code meines Simulationsprogrammes:

(*Analogwertverarbeitung / Klimasteuerung*)
(*Erstellungsdatum: 01.03.2012*)

(*Steuerung Raumtemperatur*)

Instanz1_Analogsimulation_ST(
Sollwert_WORD:=Merkerwort_TEMP_SOLL ,
Impulsdauer_Hochzaehlen:= Laufzeit_Hoch,
Pausendauer_Hochzaehlen:=Laufzeit_Hoch ,
Impulsdauer_Runterzaehlen:=Laufzeit_Runter ,
Pausendauer_Runterzaehlen:= Laufzeit_Runter,
Zaehler_Reset:= FALSE,
Initialwert_setzen:= Initialwert_Setzen,
Merker_Initialwert:=Merkerwort_INITIAL ,
Ausgabe_Istwert=>Zwischenwert_TEMP );
Ausgabewert_TEMP:=( WORD_TO_REAL(Zwischenwert_TEMP)/10.0);

(*Steuerung Luftfeuchte*)

Instanz2_Analogsimulation_ST(
Sollwert_WORD:=Merkerwort_FEU_SOLL ,
Impulsdauer_Hochzaehlen:= Laufzeit_Hoch,
Pausendauer_Hochzaehlen:=Laufzeit_Hoch ,
Impulsdauer_Runterzaehlen:=Laufzeit_Runter ,
Pausendauer_Runterzaehlen:= Laufzeit_Runter,
Zaehler_Reset:= FALSE,
Initialwert_setzen:= Initialwert_Setzen,
Merker_Initialwert:=Merkerwort_INITIAL ,
Ausgabe_Istwert=>Zwischenwert_FEU );
Ausgabewert_FEU:=( WORD_TO_REAL(Zwischenwert_TEMP)/10.0);

(*Programmende*)




So, nun seht ihr in der letzten Zeile der beiden Programmteile die Zeile:
Ausgabewert_FEU:=( WORD_TO_REAL(Zwischenwert_TEMP)/10.0);

Diesen Ausgabewert lasse ich im PLC_PRG auf einen Merker schreiben.
Ich weiß gerade ums verecken nicht, welche Art von Merker für diese REAL-Zahl benutzt werden muss.

Die REAL-Zahl wird ja mit 32bit Speicher belegt, deshalb dachte ich, ich nehme ein Doppelwort, sprich: %MD8
Der angezeigte Fehler: Fehler 4010: Unverträgliche Typen, kann REAL nicht in DWORD konvertieren.

Alles andere, was mir eingefallen ist, hat auch nichzt wirklich gut funktioniert.

Könnt ihr mir weiterhelfen??

VIELEN Dank schon mal!

Verzweifelte Grüße, Florian
 
wie hast du die Variable denn komplett deklariert?
so sollte es aussehen
Ausgabewert_FEU AT%MD8:REAL;
sonst erkennt er ja nicht, dass es sich um ne Real-Zahl handelt..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Die Variable ist in der Deklarationstabelle sieht wie folgt aus:

VAR_OUTPUT
Ausgabewert_Temp: REAL;
Ausgabewert_FEU: REAL;
END_VAR


Diese Deklaration findet ja im Baustein Analogwertsimulation statt.
Die Adressvergabe dann im PLC_PRG. Bisher hatte ich nie Probleme, dort einfach
einen Merker z.B. %MW2 anzubinden.
Dass es mit REAL jetzt nicht klappt, ist mir ein vollkommenes Rätsel.....
 
Hallo,
so wie Rheumakay schon schrieb, deklarier doch im Plc_Prg eine Variable mit AT%MD8:REAL.
Wenn du das nicht möchtest kannst du es auch mit einem Pointer machen:
Code:
(*Deklaration*)

pdw:POINTER TO DWORD;

(*Implemantation*)

pdw:=ADR(Ausgabewert_FEU);
%MD8:=pdw^;

Dann geb ich mal noch das Stichwort UNION!

Aber du musst immer eine Variable deklarieren so das du auch gleich in der Deklaration auf den Merkerbereich mappen kannst.
 
Ich vermute mal:

du bekommst den Fehler nicht in dieser Zeile:
Ausgabewert_FEU:=( WORD_TO_REAL(Zwischenwert_TEMP)/10.0);

die ist nämlich komplett richtig, wenn die Deklaration richtig ist. So wie du das schreibst, machst du wohl in PLC_PRG:
%MD8 := instanz.Ausgabewert_FEU;

das kann dann natürlich nicht funktionieren. Wenn du den Wert wirklich im Merkerbereich brauchst (wozu eigentlich?) dann
musst du dir wie oben beschrieben eine Real-Variable deklarieren die mit AT %MD8 an diese Stelle gelegt wird.

Bernhard
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bernhard,

Wenn du den Wert wirklich im Merkerbereich brauchst (wozu eigentlich?)

Ich brauche für alle SIgnale, Rückmeldungen, Analogwerte usw. immer einen Merker, um die Daten an einen externen PC zur Visualisierung ausgeben zu können.

In diesem Fall wird die Software auf dem PC einen Zahlenwert von z.B. 265 auf das Merkerwort %MW2 schreiben, welches ich in der SPS dann in eine REAL-Zahl umwandeln kann und durch 10 teilen. Sprich ich werde dann den Wert 26,5 °C weiterverarbeiten als Sollwert.

Andersherum beim Istwert.

Ich werde das gleich mal testen und mich wieder melden!

Grüße und danke
 
Hallo nochmal,

Also es hat jetzt funktioniert, nachdem ich folgendes im Deklarationsteil von PLC_PRG eingetragen habe:

PROGRAM PLC_PRG
VAR
Instanz1_Analogwertverarbeitung: Analogwertverarbeitung;
Anzeige_TEMP AT %MD8:REAL;
Anzeige_FEU AT%MD12:REAL;
END_VAR


Ich werde nun grundsätzlich Variablen im PLC_PRG deklarieren und nicht wieder direkt auf Merker verweisen.
Es ist auch eine Spur übersichtlicher, finde ich.

Grüße, und danke nochmal!
 
@KingHelmer ->bin beleidigt bekomme ich keine Danke!?:confused:

Übrigens bist du dir im klaren, wenn du es nur im PLC_Prg deklarierst, ist das nur Lokal ! Wenn du die Daten doch an extern weitergibst, erstelle dir doch dafür eine Globale Liste...dies nur mal als Hinweis
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Danke hast du bekommen, sry :)

Ich dachte, dass Merker grundsätzlich global-ansprechbar sind.
In der Simulation mit anderen Programmen hat es zumindest geklappt, die Merker vom PC aus anzusprechen.

Normalerweile erstelle ich nur eine Liste in den globalen Variablen für alle Klemmen an der SPS.
zum Beispiel: DI1_1 AT%IX1.0 : BOOL;
DO1_1 AT%QX2.0 : BOOL;

usw... Hier allerdigs auch nur der EInfachheit halber. Man könnte hier ja auch wieder im Programm die Eingänge direkt ansprechen.
Nur kann sich ja kein Mensch merken, welcher Eingang welche Adresse hat.
 
Variablen/Merker/EAs habe ich immer in globalen Listen abgespeichert,das macht die Sache ja gerade erst so übersichtlich!
Wenn ich mit Sicherheit weiß, dass die Var ausschließlich nur in dem entsprechenden Baustein benötigt werden, deklariere ich die in diesem.
Eben nicht nur das eigentliche Programm/Ablauf STRUKTURIERT aufbauen sondern eben auch die Var, usw.
Wirst sehen,die Arbeit lohnt sich!!
 
Alles klar, werde ich mir merken.
Ich habe ja auch schon gemerkt, dass die Programmierung in ST statt FUP oder AWL einfach riesen Vorteile hat, obwohl ich erstmal viel Arbeit investieren muss, um diese "Sprache" zu lernen.

Kannst du mir eventuell ein Buch empfehlen, so in der Art "Grundkurs ST in Codesys" oder ähnlich?
Würde mir auch sehr weiterhelfen, den im Internet findet man immer nur Lösungen zu bestimmten, individuellen Problemen.

Grüße und Mahlzeit!
 
Genau so etwas habe ich gesucht, danke!

* weißt du, ob es vieleicht Sinn macht, da ich sowieso am Anfang des Lernens steht, gleich mit Codesys 3.5 zu arbeiten, oder macht dies keine Sinn und ich sollte lieber bei Version 2.3.x bleiben?

- Hat es Vorteile/Nachteile?
- sind die Programme und Bibliotheken kompatibel bzw. kann ich diese direkt übernehmen?

Sry für die vielen Fragen :D
 
Zuletzt bearbeitet:
Hallo,
dein Problem scheint ja gelöst, aber beim lesen einer deiner Antworte war ich doch etwas verwirrt.
...In diesem Fall wird die Software auf dem PC einen Zahlenwert von z.B. 265 auf das Merkerwort %MW2 schreiben, welches ich in der SPS dann in eine REAL-Zahl umwandeln kann und durch 10 teilen. Sprich ich werde dann den Wert 26,5 °C weiterverarbeiten als Sollwert.
Ich verstehe das so, das du auf dem PC mit "Festkommazahlen" arbeitest und diese in der SPS in REAL Werte umwandelst und weiterverarbeitest. Und demzufolge auch die REAL Werte in "Festkommazahlen" umwandelst und im PC verarbeitest. Wenn Du jetzt aber eine REAL Zahl in ein MD legst musst du dieses MD auch auf PC Seite als REAL Zahl behandeln.

Das bedeutet ja deine Zuweisung müsste so lauten:
Code:
(*Deklartion*)
Anzeige_TEMP AT %MD8:[B]DWORD[/B]; //Anzeige Temperatur auf PC
Anzeige_FEU AT%MD12:[B]DWORD[/B]; //Anzeige Feuchte auf PC
    
(*Implementierung*)
...
Anzeige_TEMP:=REAL_TO_DWORD(Instanz1_Analogsimulation_ST.Ausgabewert_TEMP*10.0);
Anzeige_FEU:=REAL_TO_DWORD(Instanz2_Analogsimulation_ST.Ausgabewert_FEU*10.0);

Zu deiner Frage nach der Einstiegsversion mit CoDeSys:
Das kommt natürlich darauf an mit welchem auf CoDeSys basierenden System du arbeitest. z.Bsp. Twincat(Beckhoff) ist noch mit der V2 unterwegs, SoMachine :s12:(Schneider Electric) hat die V3 integriert...

Wenn es darum geht das Programmieren zu erlernen würde ich sagen nutze die V3.5, die bietet viele Features, gerade hinsichtlich der Objekt Orientierten Programmierung (OOP).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Simatiker,

in diesem Fall gibt es ein kleines Missverständnis.
Normalerweise werden die Werte auf einem PC in der Visualisierungssoftware wiedergegeben.

Dann passiert es so:

Sollwert, z.B. 26.5°C wird vom PC als INT mit 265 auf MW2 geschrieben.
ich rechne dann mit der Zahl in meiner Simulationssoftware, und gebe die zahl wieder als INT zurück.

In diesem Fall hier aber ist es so, dass ich zur "Simulation des Simulationsprogrammes" den REAL-Wert speichern wollte.
Damit ich eine Gleitpunktzahl in der Visu anzeigen lassen kann.
Ist ein wenig verwirrend, da zwei Visus vorkommen, die nichts miteinander zu tun haben.
Für die PC-Software bin ich übrigens nicht zuständig, ich muss mich nur mit Codesys beschäftigen :)

Zur Einsteigerversion:

- Ich benutze einen WAGO-Controller, der meines Wissens mit beiden Version funktioniert.

Danke für die Anmerkungen
 
Zurück
Oben