Fehler beim CTRL_PID??

Begonnen von Glüh, 01. Mai 2011, 15:12:02

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Glüh

Hallo zusammen,

erstmal vielen Dank an die Oscat-"Betreiber".
Die Bibliothek hat mir schon viel Zeit und Nerven erspart.

Aber nun zu meinen eigentlichen Problem.
Ich habe die Oscat Lin 3.32 im Einsatz.
Wenn ich  CTRL_PID Baustein einfüge kann ich meine SPS (Advantech 5510EKW/TP) nicht mehr laden und es kommt zur folgenden Fehlermeldung:


Anweisung nicht implementiert oder falscher Datentyp an WN 72!
Fehler in POE 'FT_DERIV' bei Codeerzeugung aufgetreten!
Interner Fehler! Nicht alle POEs gesendet!


Beim Anlicken auf den Fehler führt mich das Programm an die folgende Codezeile (rot markiert)

(* read system time *)
T_PLC_US();
tx:= T_PLC_US.T_PLC_US;

(* init on firsat startup *)
IF NOT init THEN
   init := TRUE;
ELSIF run AND tx - last > UDINT#0 THEN
   out := (in - old) / UDINT_TO_REAL(tx - last) * 1000000.0 * K;
ELSE
   out := 0.0;
END_IF;
old := in;
last := tx;


Was kann ich machen damit der Fehler nicht mehr kommt?
Beim Baustein CTRL_PI taucht übrigens kein Fehler auf.


Jetzt noch eine allgemeine Verständnisfrage zur Oscat-Lib.

Wenn ich auf den Baustein z.B. CTRL_PI klicke wird mir der Quellcode angezeigt, so wie es aussieht werden in diesem Baustein andere Bausteine aufgerufen und dann zugeordnet.
Aber ich blick nicht so ganz wie das ganze verschachtelt ist.
Code CTRL_PI:

DIFF := CTRL_IN(SET, ACT, SUP);--> hier wird der Baustein CTRL_IN aufgerufen, den ich wiederum in der Lib finde
pi(in := DIFF, kp := KP, ki := KI, lim_l := LL, lim_h := LH, rst := RST);----> aber welcher Baustein wird hier aufgerufen pi ?? finde ich nicht in der Lib
co(ci := pi.Y, OFFSET := OFS, man_in := M_I, lim_l := LL, lim_h := LH, manual := MAN); ----> aber welcher Baustein wird hier aufgerufen pi ?? finde ich nicht in der Lib
Y := co.Y;
LIM := co.LIM;

Ich hoffe Ihr könnt mir weterhelfen


Danke im voraus

Glüh

 

peewit

hallo

so wie es aussieht kannst du fehlerfrei compilieren , jedoch beim download gibt es die probleme
zumindest gibt es das problem anscheinend nur bei dir !

-----
die als fehlerhaft dargestellte zeile würde ich nicht wirklich ernst nehmen !
kann mir überhaupt nicht vorstellen das dies der wirkliche grund ist.
----

zu deiner frage woher "pi" beim baustein ctrl_pi kommt

wenn man einen funktionsbaustein benutzt (instanziert) dann legt man eine variable vom typ funktionsbaustein xx an
dieser variable kann man einen beliebigen namen geben, aber auch den gleichen wie die type selber

in der variablentabelle findest du folgenden eintrag
pi   FT_PIWL

das bedeutet das die variable "pi" vom type baustein FT_PIWL ist
so einfach ist das
---

den code von baustein ft_deriv denn du hier zeigst ist nicht der aktuelle FT_DERIV von oscat_basic 3.32

---

bezüglich deinem problem habe ich eine vermutung

im baustein ctrl_pid wird die variable pid vom type FT_PIDWL angelegt

der name pid ist aber auch schon von eine systemfunktion benutzt.

ich habe dir im anhang einen geänderten CTRL_PID gemacht wo der name der instanz anders ist
probiere dies mal aus ....

die oscat_basic_332 lib als projekt öffnen , und diesen baustein unter datei -> import in die lib übernehmen und compilieren

---
ansonsten kannst du nur durch probieren ,also stückweise code deaktivieren herausfinden was wirklich dein system durcheinander bringt

---
gruss peewit
   


[gelöscht durch Administrator]

Glüh

Hallo peewit,
erstmal Danke für die  schnelle Unterstützung und das am 1.Mai.

Habe den geänderten Baustein bei mir eingefügt.
Leider kommt immer noch der gleiche Fehler.
Werde mal in Ruhe, wie du bereits vorgeschlagen hast, verschiedene Codeschnipsel deaktivieren und versuchen den Fehler einzugrenzen.

Und zu:
Zitat von: peewit in 01. Mai 2011, 21:37:20

den code von baustein ft_deriv denn du hier zeigst ist nicht der aktuelle FT_DERIV von oscat_basic 3.32

Ich habe mir die komplette Oscat Lib 3.32 ins Projekt geholt, inkl. dem FT_DERIV.Ich habe also nichts verändert ???
Werde morgen Abend die Lib nochmal komplett löschen und neu einbinden


Und zu:
Zitat von: peewit in 01. Mai 2011, 21:37:20
zu deiner frage woher "pi" beim baustein ctrl_pi kommt

wenn man einen funktionsbaustein benutzt (instanziert) dann legt man eine variable vom typ funktionsbaustein xx an
dieser variable kann man einen beliebigen namen geben, aber auch den gleichen wie die type selber

in der variablentabelle findest du folgenden eintrag
pi   FT_PIWL

das bedeutet das die variable "pi" vom type baustein FT_PIWL ist
so einfach ist das

Danke , jetzt geht mir ein Licht auf :), Habe leider nie direkt in das Projekt der Oscat- Lib geschaut wo die Bezeichnungen herkommen.

Wenn man die Oscat als Bibliothek ins Projekt einbindet und die Bausteine verwendet sehe ich nie die Variablendeklartion des Bausteins.


Danke nochmal, das ist mein 1.tes Projekt mit Multiprog & IEC 61.. & der Oscat-Lib) und stehe noch so ziemlich am Anfang .Darf ansonsten nur Siemens programmieren

Gruß aus dem Pott

Glüh

Glüh

Hallo,

hat nun doch ein bissel länger gedauert, den Baustein mit verschiedenen Codeausschnitten zu testen:

Habe mir nun ein leeres Projekt genommen Advantech KW5510EKW und nur den Baustein FT_Deriv reingenommen.
Ich kann in dieser Konstellation den Baustein nicht laden. Es kommt immer zu der bereits o.g.Fehlermeldung.

Um den Fehler einzugrenzen habe ich nun angefangen einzelne Codeteile auszukommentieren, zu kompilieren und dann erneut versucht zu laden.

Die  Tests habe folgende Erkenntnisse gebracht:

Funktioniert  -> Programm lässt sich laden

* init on firsat startup*)


ELSIF run AND tx - last > UDINT#0 THEN
   out := (in - old);                    (*/  UDINT_TO_REAL  (tx - last) * 1000000.0 * K;*)
oder

ELSIF run  THEN
   out := (in - old) /  1000000.0 * K;


Die folgenden Varianten funktionieren nicht:


(* init on firsat startup*)

ELSIF run  THEN
   out := (in - old) /  UDINT_TO_REAL  (tx - last) * 1000000.0 * K;


ELSIF run AND tx - last > UDINT#0 THEN
   out := (in - old) /  UDINT_TO_REAL  (tx - last);
   
   
ELSIF run AND tx - last > UDINT#0 THEN
   out := (in - old) /   1000000.0  * K;
       
   
ELSIF run AND tx - last > UDINT#0 THEN
   out := (in - old) /   K;
   
ELSIF run AND tx - last > UDINT#0 THEN
   out := (in - old) /   1000000.0;


ELSIF run AND tx - last > UDINT#0 THEN
   out := (in - old) /1.0;


ELSIF run  THEN
   out := (in - old) /  UDINT_TO_REAL  (tx - last) * 1000000.0 * K;



ELSIF run AND tx - last > UDINT#0 THEN
out := (in - old) / tc * 1000000.0 * K;

Irgendwie verstehe ich nicht woran das jetzt genau liegt.

Ich hoffe Ihr könnt mir weiterhelfen.

   Gruß Glüh

peewit

da können wir dir nur sehr schwer von der ferne helfen

ich kann auch deinen test nicht ganz folgen, gibt es ein system ?

du hast als ausgangsbasis eine codezeile die nicht läuft
dann nimmst du immer nur einen arbeitsschritt weg bis es funktioniert !

dann sieht man: vorher ging es nicht , dann schon...

aber primär würde ich deinen lieferanten (Steuerungshersteller) mal belästigen
wenn die eine steuerung verkaufen, dann sollten sie auch einen support haben , der solche probleme analysieren kann.