Startseite > Forum > IEC 61131-Programmierung (LogicLab) > Verwalten Sie einen Zähler mit einem remanenten Wert
- Dieses Thema hat 9 Antworten, 2 Teilnehmer und wurde zuletzt aktualisiert 5 Jahre, 7 Monate da Sergio Bertana.
-
AutorPost
-
Oktober 31, 2017 bei 8: 56 #36161Alessandro CampodonicoPartecipante
Ich sollte eine Zählung verwalten, indem ich den Wert auf eine remanente Variable (RETAIN) setze. Für die Zählung habe ich meinen eigenen FB erstellt, der die verschiedenen Überprüfungen durchführt und einen Zähler erhöht. Dann platziere ich die Ausgabe auf einer remanenten Variablen (In DB100.2048). Aber wenn ich das System aus- und wieder einschalte, wird der Zählwert auf Null zurückgesetzt. Was kann ich tun?
Oktober 31, 2017 bei 9: 04 #40003Sergio BertanaAdministrator des ForumsIhr Problem ist, dass beim Einschalten des FB alle internen Variablen zurückgesetzt werden und daher auch der Ausgabewert zurückgesetzt wird. Da Sie den Ausgabewert auf die Puffervariable setzen, setzen Sie auch die Variable zurück.
Um Variablen zu verwenden, die im Pufferspeicher (Backup oder Retain) innerhalb von Funktionen oder Funktionsblöcken zugeordnet sind, müssen Sie Zeiger verwenden, die die Adresse der Variablen übergeben. Auf diese Weise bearbeiten wir den tatsächlichen Wert der Variablen, die gepuffert den Wert beibehält, den sie beim Ausschalten hatte. In LogicLab werden die Zeiger mit dem Symbol gekennzeichnet @Eine Variable vom Typ @UINT ist also eigentlich ein Zeiger auf eine UINT-Variable.
Ich habe das Projekt gemacht RetainCounter (Programm drucken), die mit drei verschiedenen FBs in den Sprachen LD, IL und ST den Umgang mit den RETAIN-Variablen eines FBs veranschaulicht (Projektdownload).
Juli 18, 2018 bei 6: 08 #45121Alessandro CampodonicoPartecipanteGuten Abend, ich habe immer noch Probleme mit meinem FB-Zähler, bis heute habe ich es geschafft, ein kleines Programm im Task-Boot zu erstellen, das den Wert einer remanenten Variablen in die Eingabe meines FB kopiert, also wenn ich die plc my starte FB nimmt den Wert der remanenten Variablen und setzt mich daher nicht zurück.
Das Problem ist, dass dieses System das Programm sowohl als Code- als auch als variablen Speicherplatz "beschwert". Daher muss ich heute den FB ändern, um die Remanenzwerte korrekt beizubehalten und diesen Teil des überflüssigen Codes zu entfernen.
Ich habe einige Tests mit dem von Ihnen geladenen Programm durchgeführt. Mein erstes Problem ist, dass mein gesamtes Programm in IL-Sprache geschrieben ist und ich immer noch nicht die Möglichkeit gefunden habe, die ADR-Funktion in dieser Sprache zu verwenden, wie ich es tun muss ?
Wie ändere ich meinen FB, um ihn an den Zeiger anzupassen? Ich muss nur die Variable mit dem @ setzen und sie als Eingangsvariable setzen? Die externe Support-Variable muss immer ein @ oder ein normales sein.
Juli 19, 2018 bei 6: 36 #45124Sergio BertanaAdministrator des ForumsUm die Variable nicht kopieren zu müssen, besteht die einzige Möglichkeit darin, ihre Adresse an die Funktion oder den Funktionsblock zu übergeben, da sie die IL-Sprache verwendet. Hier erfahren Sie, wie Sie das Programm schreiben, das den ILRetainCtr-FB verwendet. Ich habe die Variable im Programm deklariert Counter vom Typ ILRetainCtr.
VAR
Zähler: ILRetainCtr;
END_VARUnd hier ist eine einfache Auflistung IL, wie Sie sehen können, ist der Di00CPU-Eingang mit dem Zählertakt verbunden, und Value wird die Adresse der Variablen Counters [0] übergeben, die vom Typ RETAIN ist.
LD Di00CPU
ST Counter.Clk
ADR-Zähler [0]
ST Counter.Value
CAL CounterIch lege das LogicLab-Projekt für die herunterladen.
Juli 20, 2018 bei 6: 26 #45125Alessandro CampodonicoPartecipanteIch wurde durch die Tatsache getäuscht, dass das Schreiben des ADR-Befehls (in IL) nicht blau war, was zum Beispiel vorkommt (LD ST ADD SUB GT ETC), also dachte ich, dass es nicht funktioniert. Ich nutze diese Gelegenheit, um dich noch etwas zu fragen (sorry, wenn ich OT gehe)
Wie verwendet man die "Funktionen" in der IL-Sprache, wenn ich versuche, eine Variable zuzuordnen, aktiviert es nicht das Funktionsfeld, sondern nur Funktionsblöcke, und wenn ich versuche, CAL FUNCTIONNAME zu schreiben, sagt mir der Compiler offensichtlich, dass es keine Variable ist.
Juli 20, 2018 bei 6: 47 #45135Sergio BertanaAdministrator des ForumsDie Antwort auf Ihre Frage finden Sie im LogicLab-Handbuch. Bei LogicLab gibt es zwei Handbücher, eines, das die Funktionsweise des Programms erklärt (F1 in einem beliebigen Programmfenster), und das andere, das Verweise auf alle Funktionen und enthält Mit unseren Produkten gelieferte FBs (F1 auf einem Funktionsnamen oder FB).
Wenn Sie jedoch zu Ihrer Frage kommen, eine Funktion von IL auszuführen, geben Sie einfach ihren Namen als ersten Operanden einer Programmzeile ein. Denken Sie daran, dass der erste Parameter der Funktion durch den Akkumulator geleitet wird, während die anderen gemäß der Definition platziert werden. Das Ergebnis der Funktion wird an den Akkumulator zurückgegeben. Da ist er Screenshot mit einem Beispiel.
Juli 20, 2018 bei 2: 01 pm #45136Alessandro CampodonicoPartecipanteIch habe zum Beispiel versucht, die ValueScale-Funktion zu verwenden, aber der Compiler meldet mir einen Fehler:
G0001 Numero di operandi non valido.
Und er gibt es mir zurück, indem er nur schreibt
LD-Temperatur
ValueScaleWas kann ich tun, um das Problem zu lösen?
Juli 20, 2018 bei 2: 05 pm #45138Sergio BertanaAdministrator des ForumsDie Antwort ist falsch, die ValueScale-Funktion hat mehrere Operanden
Input (REAL) Eingangswert, der skaliert werden soll.
ILow (REAL) Mindestgrenze des zu skalierenden Eingabewerts.
IHigh (REAL) Maximale Grenze des zu skalierenden Eingabewerts.
OLow (REAL) Mindestgrenze des skalierten Ausgabewerts.
OHigh (REAL) Maximale Grenze des skalierten Ausgabewerts.Und du hast sie nicht gesetzt. Sie müssen beispielsweise schreiben, wenn Sie einen 4-20-mA-Eingang in einen 10-50-PSI umwandeln möchten:
LD-Sensor (* Eingang, zu skalierender Eingangswert *)
Wertskala 4.0, 20.0, 10.0, 50.0
ST DruckSeptember 12, 2018 bei 3: 17 pm #45361Alessandro CampodonicoPartecipanteGuten Morgen, ich habe meine FB wieder in den Griff bekommen und die Betriebsstunden und Zeiger gezählt. Ich habe versucht, meinen Baustein zu aktualisieren, um nicht immer die Werte kopieren zu müssen, sondern einen SPS-Baustein zu finden, ich erkläre mich selbst besser.
Dann zählt mein Block die Aktivierungszeit seiner Eingabe, geteilt durch Sekunden, Minuten und Stunden, und führt dann darin alle Anweisungen für diese Variable 3 aus (ausgehend von dem Block).
Wenn ich nicht falsch verstanden habe, den Block mit Zeigern korrekt zu aktualisieren, sollte ich sie durch Hinzufügen des @ in der Liste dieser 3 Variablen korrekt "zuordnen". Fügen Sie dann immer das @ in die Anweisungsliste ein, in der diese Variablen verwendet werden, und weisen Sie schließlich die 3 Variablen als Eingabe und zu nicht als Ausgabe, theoretisch hätte ich auf diese Weise korrekt aktualisieren sollen (wieder, wenn ich nicht falsch verstanden habe). Aber um das Programm auf die SPS zu laden, habe ich einen Block, die Protokolldatei gibt mir diesen Text
[E] SFR050 [05/09/2018 10:24:06] 1020, Except: IVECTOR At:0x00000000
[L] SFR050 [05/09/2018 10:24:06] 1000, System power on
[L] SFW184 [05/09/2018 10:24:06] 5005, Starting Op. System SFW184B080
[E] SFW184 [05/09/2018 10:24:06] 6030, LLab Cn, ApplID:0x364F53D4September 12, 2018 bei 3: 23 pm #45377Sergio BertanaAdministrator des ForumsDie Verwendung von Zeigern bietet eine beträchtliche Leistung bei der Entwicklung von Programmen, ist jedoch SEHR GEFÄHRLICH. Wenn Sie eine falsche Adresse an den Zeiger übergeben, können Sie auf den gesamten Systemspeicher zugreifen, der auch in Bereichen des Betriebssystems ausgeführt werden soll.
In Ihrem Fall haben Sie wahrscheinlich eine Fehlleitung durchgeführt, die das System mit einer Ausnahme zum Absturz bringt. Nach dem Fehler wird das System neu gestartet. Wenn LogicLab verbunden war, wird es gestoppt. Wenn LogicLab jedoch nicht verbunden ist, versucht das System einige Male neu zu starten, bis es im Ruhezustand stoppt.
In Ihrem Fall haben Sie also definitiv einen Fehler in dem an den Zeiger übergebenen Wert. Sehen Sie sich das Beispielprojekt der vorherigen Beiträge an und klonen Sie das Programm für Ihre Verwendung.
-
AutorPost
- Sie müssen angemeldet sein, um auf dieses Thema antworten zu können.