Hilfe ! ----> Probleme mit Pointern / Wago 841 ..

Begonnen von SHendrik, 18. Februar 2008, 11:58:25

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

SHendrik

Hallo.

Verwende einen 841er die Haussteuerung. Als Visu habe ich eine CodeSys HMI laufen.
Da ich jede Funktion sowohl vom Hardwareeingang als auch vom Panel schalten will,
muss ich vor jedem Baustein immer ein OR mit beiden Eingängen einfügen.

Nun kam mir die Idee, dass über Pointer zu realisieren.
Dazu habe ich 3 Variablentabellen angelegt:

1. Eingänge (Hardware) z.B.
WZ_Taster_Terrasse_Licht_Terrasse   AT%IX16.0 :BOOL;      (*Wohnzimmer Terrasse Licht Terrasse*)
WZ_Taster_Terrasse_Licht_Dachkasten_Terrasse AT%IX16.1 :BOOL;      (*Wohnzimmer Terrasse Licht DK Terrasse*)

2. HMI Eingänge z.B.
TP_WZ_Taster_Terrasse_Licht_Terrasse AT%MX16.0 :BOOL;      (*Touch Panel Wohnzimmer Terrasse Licht Terrasse*)
TP_WZ_Taster_Terrasse_Licht_Dachkasten_Terrasse AT%MX16.1 :BOOL;   (*Touch Panel Wohnzimmer Terrasse Licht DK Terrasse*)

3. Virt Eingänge z.B.
Virt_WZ_Taster_Terrasse_Licht_Terrasse AT%MX66.0 :BOOL;      (*Virt Wohnzimmer Terrasse Licht Terrasse*)
Virt_WZ_Taster_Terrasse_Licht_Dachkasten_Terrasse AT%MX66.1    :BOOL;      (*Virt Wohnzimmer Terrasse Licht DK Terrasse*)

Jetzt habe ich folgende Funktion geschrieben, die diese Speicherbereicht per Wordzugriff verodern soll ..

PROGRAM CalcVirtualInputs
VAR
   pSource1:POINTER TO WORD;
   pSource2:POINTER TO WORD;
   pDest:POINTER TO WORD;
   Zaehler: INT;

END_VAR

FOR Zaehler:=0 TO 5  BY 1 DO
  pSource1:=ADR(WZ_Taster_Terrasse_Licht_Terrasse)+Zaehler;
  pSource2:=ADR(TP_WZ_Boden_Temp_ist)+Zaehler;
  pDest:=ADR(Virt_WZ_Taster_Terrasse_Licht_Terrasse)+Zaehler;
  pDest^:=pSource1^ OR pSource2^;
END_FOR;

Damit soll die SPS alle 10ms die Hardwareeingänge mit den Touchpaneleingängen verodern und das Ergebnis in den Merkbereich schreiben.
Dann würde ich ja nur noch die virtuellen Eingänge im Programm benutzen.

Beim ersten Durchlauf bei Zaehler=0 geht auch alles noch. Dann wird der Zaehler inkrementiert und die SPS steht ..

Was kann das sein ?? ( bin nicht der große Pointer Experte ... )
Oder kann man die Aufgabe noch anders lösen ?

Danke

Gruß

Hendrik

hugo

grundsätzlich würde ich diese aufgabe nicht über pointer lösen sondern mit simplen oder gattern.
du bearbeitest einen datenbereich mit pointern, hast aber ausserhalb deiner funktion die das tut die möglichkeit die speicherbereiche zu verändern, das wird irgendwann bei späteren änderungen zur kathastrophe führen. schneller wird es ohnehin kaum sein.

zum beispiel unten solltest du auf keinen fall eine variable zum popinter addieren, das verwesit dann auf einen undefinierten speicherbereich und würde memeory überschreiben.
wenn du word bearbeitest musst du um zum nächsten word im speicher zu gelangen 2 bytes addieren, für dword 4 bytes und für bytes eben 1.

grundsätzlich verstehe ich aber deinen zähler gar nicht, denn du hast ja nur ein einziges word und das bearbeitest du bereits im ersten durchlauf.
streng genommen darfst du das gar nicht denn du hast im word ja nur 2 bits (0,1) belegt.

nochmnals ich würde hier auf keinen fall pointer verwenden viel zu gefährlich und unsicher eine veränderung ausserhalb deiner routine kann die sps abstürzen lassen.
pointer sollte man nur dann einsetzen wenn innerhalb der routine sichergestellt werden kann das man nie ins leere greift, egal was sich ausserhalb der routine verändert.

SHendrik

Danke für Deine Infos.

Die Variablentabellen sind natürlich ca. 20 Wörder lang.
Das es sich nur um digitale Eingänge handelt, gibt es meiner Meinung nach auch keine Probleme
mit gleichzeitigen Zugriffen.

Warum stürzt der Controller ab ??
Muss ich einfach den Zähler um 2 erhöhen ??

Gruß

hendrik

hugo

ein zugriff bearbeitet in deinem fall ja 16 bits glkeichzeitig, also musst du um 2 bytes erhöhen, um das nächste word zu bearbeiten, aber wie gesagt du musst auch sicherstellen das alle bits im ersten word und alle bist im nächsten word komplett belegt sind sonst wird der compiler den zugriff verhindern, oder schlimmes passieren.

nochmal ich würde in diesem fall unter gar keinen umständen pointer verwenden

SHendrik

hast Du eventuell eine andere Idee ??

Ist sehr umständlich, immer für jeden Funktionseingang Oder Bausteine mit beiden Eingangsarten einzufügen.

Sieht halt dann so aus :

[gelöscht durch Administrator]

hugo

nun die ganzen oder und visualisierung kannst du doch in einen funktionsblock packen, der hat dann mehrere tastereingänge und die zugehärigen ausgänge, die visu wird intern erledigt

SHendrik

Naja, hatte mir das halt einfacher vorgestellt.

Wenn diese Copy Routine funktioniert hätte, bräuchte ich nicht alle Eingänge verodern ...

Hendrik

hugo

bedenke aber wie anfällig dein programm auf änderungen dadurch wird.
die zeit die du jetzt sparst wirst du bei späteren änderungen wieder bereuen