CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions | A member of the CODESYS Group
Deutsche Version English version russian version 
Aktuelle Zeit: Do Nov 14, 2019 7:04 am

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Sep 24, 2015 6:23 pm 
Offline
Benutzeravatar

Registriert: Do Mai 07, 2009 12:22 pm
Beiträge: 4
Wohnort: Nürnberg
Hallo,

seit einiger Zeit bin ich auf der Suche, wie ich am besten eine Vielzahl an Feldbusvariablen beschreiben kann. Wobei eine "Vielzahl" relativ ist. Ich spreche von ca. 100-200 Variablen, die ich von außen via ModbusTCP abrufen möchte. Das Problem bei der Sache ist nur, dass ich entweder den Zugriff auf jede Adresse einzeln direkt Programmieren muss, oder indikret über die zuvor hinzugefüghte Feldbus-Variable (in der Steuerungskonfiguration, Unterelement anhängen, Variablen, grünes +, usw.). In beiden Fällen muss ich aber für jede Variable separat was programmieren.

Die große Frage ist nun: Wie bekomme ich ein Array aus 100 bis 200 (oder mehr) Werte auf meine Feldbusvariablen verteilt, ohne für jeden einzelnen Wert eine Anweisung zu schreiben?

Wenn ich die Zuordnung eines jeden Werts einzeln programmiere, würde es nämlich folgender Maßen aussehen:

Code:
    FeldVariable0:= myARRAY[0];
    FeldVariable1:= myARRAY[1];
    FeldVariable2:= myARRAY[2];
    ...
    FeldVariable255:= myARRAY[255];


oder, wenn ich direkt auf die Adresse zugreife (beispielsweise bei UNSIGNED DOUBLE INTEGER (DUINT)), so:

Code:
    %QD128:=  myARRAY[0];
    %QD129:=  myARRAY[1];
    %QD130:=  myARRAY[2];
    ...
    %QD383:=  myARRAY[255];


Allerdings würden alle Variablen so ständig beschrieben werden (das ist so, als würde man mit einer interorbitalen Laserkanone Ameisen tätowieren - andere sagen, mit Kanonen auf Spatzen geschossen). :wink:

Natürlich könnte ich das mit mehreren IF-Anweisungen auch lösen:

Code:
    IF ( %QD128 != myARRAY[0] ) THEN
        %QD128 := myARRAY[0];
    END_IF


Aber auch da müsste ich für jedes Array-Element eine schreiben. Den kleinsten Aufwand hätte man, wenn man direkt auf die Feldvariable zugreifen könnte, als wäre sie ein "FeldArray".

Code:
    FeldArray[index] := myARRAY[index];


bzw. innerhalb einer IF-Anweisung könnte man das alles komfortabel in eine FOR-Schleife packen:

Code:
    FOR index := 0 TO 200 DO
        IF ( FeldArray[index] != myARRAY[index] ) THEN
            FeldArray[index] := myARRAY[index];
        END_IF
    END_FOR


... und man muss nicht für 200 Elemente was schreiben.

Gibt es was, was ich bisher noch nicht gefunden habe? Hoffe ich habe mein Anliegen verständlich vorgestellt.

Grüße
Stoni

_________________
Der Computer: Mit ihnen ist man endlich in der Lage eine Vielzahl an Problemen verhältnismäßig sehr schnell zu lösen...
... die wir ohne sie erst gar nicht hätten. :(


Nach oben
   
BeitragVerfasst: Sa Sep 26, 2015 8:28 pm 
Offline

Registriert: Fr Mai 23, 2008 2:29 pm
Beiträge: 7
Hallo,
die Feldbusvariablen zu definieren wird dir vmtl. nicht erspart bleiben.
Aber wenn deine Feldbusvariablen bei %QD128 anfangen kannst du doch dein Array direkt an die Adresse legen.
myARRAY AT %QD128 : ARRAY[0..199] OF UDINT;


Nach oben
   
BeitragVerfasst: Sa Sep 26, 2015 10:45 pm 
Offline
Benutzeravatar

Registriert: Do Mai 07, 2009 12:22 pm
Beiträge: 4
Wohnort: Nürnberg
Hallo HeHo,

HeHo hat geschrieben:
myARRAY AT %QD128 : ARRAY[0..199] OF UDINT;


das könnte funktionieren. Werde ich am Montag gleich testen, danke vielmals!

Grüße
Stoni

_________________
Der Computer: Mit ihnen ist man endlich in der Lage eine Vielzahl an Problemen verhältnismäßig sehr schnell zu lösen...

... die wir ohne sie erst gar nicht hätten. :(


Nach oben
   
BeitragVerfasst: So Sep 27, 2015 7:57 am 
Offline

Registriert: Fr Mai 23, 2008 2:29 pm
Beiträge: 7
Hallo nochmal,
wenn du im deklarationsteil einen pointer definierst

myARRAY : POINTER TO ARRAY[0..199] OF UDINT;
dann kannst du zur laufzeit dein array auf unterschiedliche segmente legen (z.b. lesen bzw. schreiben)
myARRAY := ADR(FELDBUSVARIABLE);
oder
myARRAY := ADR(%QD128);
myARRAY := ADR(%ID128);
der zugriff erfolgt dann über den inhaltsoperator
myARRAY^[99] := 1234;

gruß heho


Nach oben
   
BeitragVerfasst: So Sep 27, 2015 11:35 am 
Offline
Benutzeravatar

Registriert: Do Mai 07, 2009 12:22 pm
Beiträge: 4
Wohnort: Nürnberg
Hallo HeHo,

danke nochmal für Deinen Nachtrag. Genau so habe ich mir das gedacht. Sieht sehr gut aus mit dem was ich mir vorgestellt habe. Wusste nur nicht, dass ich die Adressen einfach auf mein Array legen kann. Aber so von deiner Beschreibung her ist es genau das was ich gesucht habe.

Grüße
Stoni

_________________
Der Computer: Mit ihnen ist man endlich in der Lage eine Vielzahl an Problemen verhältnismäßig sehr schnell zu lösen...

... die wir ohne sie erst gar nicht hätten. :(


Nach oben
   
BeitragVerfasst: Mo Sep 28, 2015 1:18 pm 
Offline
Benutzeravatar

Registriert: Do Mai 07, 2009 12:22 pm
Beiträge: 4
Wohnort: Nürnberg
Hallo Heho,

hat soweit funktioniert, außer, dass man beim 750-841 nicht so viele Feldbus-Variablen beschreiben kann. Ich wollte (die maximal 255 DUINT) auf je 2 Hälften zu je (128x 32bit) in die Input- und Output-Area verteilen.

Eine Hälfte passt gerade so in den Bereich der PFC-OUT- und die andere Hälfte in den Bereich der PFC-IN-Variables:
* IEC61131 %QW256 ... %QW511 / Modbus# 256 ... 511 (PFC-OUT-Variables)
* IEC61131 %IW256 ... %IW511 / Modbus# 768 ... 1023 (PFC-IN-Variables)

Nur leider lassen sich die PLC-IN-Variables vom Prozessor nicht beschreiben.

Gibt es da noch "irgendwo" weitere Bereiche als PFC-OUT-Variables, oder jene, die als solche konfigurieren kann?

Grüße

_________________
Der Computer: Mit ihnen ist man endlich in der Lage eine Vielzahl an Problemen verhältnismäßig sehr schnell zu lösen...

... die wir ohne sie erst gar nicht hätten. :(


Nach oben
   
BeitragVerfasst: Mo Sep 28, 2015 4:34 pm 
Offline

Registriert: Fr Mai 23, 2008 2:29 pm
Beiträge: 7
feldbus-eingangsvariablen sind wie der name schon sagt "EINGÄNGE" in die plc


Nach oben
   
BeitragVerfasst: Do Dez 10, 2015 1:18 pm 
Offline

Registriert: Mo Jan 24, 2011 8:31 pm
Beiträge: 8
Hi Stonix
Zusätzlich zu den "virtuellen" Eingängen %IW256 ... 511 und "virtuellen" Ausgängen %QW256 ... 511
gibt es noch die Memorywörter (%MW0 ... %MW4096), sie können über Modbus von außen über die Adresse 12288 (oder glatt in Hex 16#3000) gelesen oder geschrieben werden. Dabei entspricht MW0 - 12288, MW1 - 12289 usw.
Du kannst Dein Array auch auf diese Adresse legen. (myARRAY AT %MD0 : ARRAY[0..199] OF UDINT;)
(Wobei bei der Größe des Datentypens aus MW4096 dann MD2048 wird. Will sagen bei der Adressierung hat man die Wahl nach dem Muster: MB100 = MW50 = MD25)
Bei dem Speicherbereich hast Du keine Platzprobleme mehr. ;-)
Gruß Ecki


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de