Probleme mit Instanzen

Terminus

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

ich soll die Füllstandssensoren von drei Tanks in FBS programmieren.

Meine Überlegung ist: Einen Funktionsbaustein mit drei Instanzen.

So weit so gut, jetzt bekomme ich immer folgende Fehlermeldung:

------ Übersetzungslauf gestartet: Applikation: Device.Sim.Device.Application -------
Code typisieren ...
[FEHLER] 3Tanks: MainTask [Device: SPS-Logik: Application: Taskkonfiguration]: C0080: Funktionsbaustein 'PLC_PRG' muss für den Zugriff instanziert werden
[INFORMATION] 3Tanks: PLC_PRG [Device: SPS-Logik: Application](Unknown Position (Impl)): C0181: Verwandte Position
Kompilierung abgeschlossen -- 1 Fehler, 0 Warnungen

Wo ist der Fehler? Meinen geistigen Erguss findet Ihr im Anhang. Wäre echt super wenn jemand helfen könnte!!!

Gruß
 

Anhänge

Hi Terminus,

Du hast dein Hauptprogramm PLC_PRG genannt und den Baustein auch. Deshalb kann der Compiler damit nichts anfangen.
Außerdem werden Funktionen oder Funktionsbausteine in separaten Objekten Deklariert.
Die Variablen der Instanzen müssen ebenfalls nicht erneut Deklariert werden. Mit jeder Instanz werden auch alle internen Variablen automatisch erstellt unter Instanzname.Variablenname

Hoffe das hilft dir erst Mal weiter. Wenn nicht nochmal melden [emoji6]

Gruß

Mavorkit

Gesendet von meinem SM-G389F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Mavorkit,

ehrlich gesagt habe ich nicht so viel verstanden...

Ich habe den Funktionsbaustein jetzt FUB genannt und einen leeren Baustein reingeladen. Diesen habe ich dann auch so benannt und siehe da, das Programm lädt automatisch die Variablen - super.
Die Geschichte mit den Instanzen habe ich nicht nicht verstanden. Ich habe die INPUT_VAR rausgeschmissen und drei Aufrufe für die Instanzen drin gelassen. Aber woher weiß das Programm wie es darauf zugreifen soll?

Zum Beispiel: Für Tank1 soll die Instanz1 nur auf folgende Variablen zugreifen Input--> L11,L12,L13 Output-->F_LEVEL_T1,W_LEVEL_T,LEVEL_T1_OK

Werden die Instanz-DB nicht visuell angezeigt?

Hast Du mal ein Beispielprogramm. Dann könnte ich mir den Aufbau mal ansehen...

Gruß
 

Anhänge

Ich weiß nicht ob das am Thema vorbei geht, versuche aber mal aus der Hüfte zu antworten.

In deinem Fall würde ich 1 Funktion schreiben, diese dann mit Variablen versehen (Input für z. B. Füllstand, Fehler, Sensoren..., Output für Pumpen etc.) und diese Funktion dann z. B. im PLC_Prg jeweils 1 x pro Tank aufrufen. Dort machst du dann die entsprechenden IO's für jeden Tank ran und Fertig.

Somit instanzierst du dann 3 x deine Funktion und brauchst nur 1 x die Logik verwalten.

Sofern du Variablen benutzt, welche nur in der Funktion gültig sind, benötigst du diese Temporärvariablen dann auch noch zusätzlich.
 
Am meisten würde mir ein Beispiel weiterhelfen. Ich müsste einfach mal sehen wie die Variablen, Instanzen usw. deklariert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Terminus,
Hier zunächst zwei Tipps:
- Codesys ist nicht Siemens, also versuch eine Codesys basierte Steuerung nicht wie eine Siemens zu programmieren
- RTFM

PLC_PRG ist, soweit Du keine weiteren Einstellungen vornimmst, das dem OB1 vergleichbare Programm und wird alle 10ms ausgeführt. Funktionsbausteine (FB) erstellst Du einzeln, wobei der FB einen allgemeinen Namen erhält. Jede Instanz des FBs erhält dann nochmals einen individuellen Namen. Hast Du z.B. einen FB erstellt der FB_GREATER heißt, dann würde die Erstellung einer Instanz in PLC_PRG mit dem Namen fb_Grt01 so aussehen.
Code:
VAR
   fb_Grt01 : FB_GREATER;
END_VAR
Das Konzept der DBs gibt es bei Codesys nicht. Alles was ein FB an Ein-/Ausgängen und lokalen Variablen benötigt wird im FB deklariert und muss sonst nirgendwo angegeben werden. Gut, Eingänge müssen natürlich irgendwo an den FB übergeben werden und die Werte von Ausgängen abgeholt werden, aber das ist was Anderes.
Angenommen Dein FB hat zwei Eingangsvariablen (i16_In01, i168_In02) vom Typ INT und zwei Ausgangsvariablen (b_Greater, b_GreaterLastCycle) vom Typ BOOL und zwei lokale Variablen (b_Init, i16_LastVal) vom Typ BOOL und INT, dann würde der Deklarationsteil des FB so aussehen:
Code:
FUNCTION_BLOCK FB_GREATER
VAR_INPUT
   i16_In01 : INT;
   i16_In02 : INT;
END_VAR

VAR_OUTPUT
  b_Greater : BOOL
  b_GreaterLastCycle : BOOL
END_VAR

VAR
   b_Init : BOOL := FALSE;
   i16_LastVal : INT;
END_VAR

Die Implementierung des FB könnte z.B. so aussehen:
Code:
IF NOT b_Init THEN
   b_GreaterLastCycle := FALSE;
   b_Init := TRUE;
ELSE
   b_Greater := i16_In02 > i16_In01;
   b_GreaterLastCycle := i16_In02 > i16_LastVal;
END_IF

i16_LastVal := i16_In01;
Der FB ist jetzt nicht sonderlich toll und soll nur als Beispiel dienen. Hier mal ein Beispiel wie Du den FB im Programm PLC_PRG deklarierst und aufrufst.
Code:
VAR
   fb_Grt01 : FB_GREATER;
   i16_Val01 : INT := 100;
   i16_Val02 : INT := 200;
   b_Grt : BOOL;
   b_GrtLst : BOOL;
END_VAR

fb_Grt01(i16_In01 := i16_Val01, i16_In02 := i16_Val02, b_Greater => b_Grt, b_GreaterLastCycle => b_GrtLst);
 
Zurück
Oben