Allen Bradley Word in Bool-Array kopieren

mazoellner

Level-1
Beiträge
33
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe unter einer Allen Bradley SPS (Rev 17) ein Problem. Und zwar möchte ich die Werte eines EtherNet/IP Slaves auf ein Boolsches Array kopieren. Das ganze sollte ungefähr so aussehen:

Code:
a200[0] := CPX_PS4:I.Data[0];
Wobei a200 ein Boolarray mit 255 und CPX_PS4:I.Data[0] ein SINT ist.
Diese Anweisung akzeptiert RsLogix 5000 nicht. Gibt es eine möglichkeit einen SINT, INT, DINT Wert einfach ab einen bestimmten Array Index in ein Array zu kopieren? Also das a200[5] im Prinzip CPX_PS4:I.Data[0].5 wäre?
PS: Muss nicht in ST passieren, wenn es in Ladder leichter gehen sollte. Bloß Funktionsplan möchte ich nicht verwenden.

Gruß
Matthias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
CPS hatte ich auch schon angedacht, aber
Code:
cps(CPX_MCP1:I.Data[0].0, a200[0],8);
cps(CPX_MCP1:I.Data[0], a200[0],8);
funktionieren auch beide nicht. Die Syntax an für sich sollte ja stimmen, oder?
Gibt es denn noch weitere Möglichkeiten? Ich hatte noch das Bitfeld probiert, aber bei dem meckert er auch, wegen unpassendem Typ.

Gruß
Matthias
 
CPS hatte ich auch schon angedacht, aber
Code:
cps(CPX_MCP1:I.Data[0].0, a200[0],8);
cps(CPX_MCP1:I.Data[0], a200[0],8);
funktionieren auch beide nicht. Die Syntax an für sich sollte ja stimmen, oder?
Gibt es denn noch weitere Möglichkeiten? Ich hatte noch das Bitfeld probiert, aber bei dem meckert er auch, wegen unpassendem Typ.

Gruß
Matthias

Leider ist das CPS COP nicht zu vergleichen mit einem Blockmove aus der S7.
Und leider ist den Array mit 255 Elementen nunmal nicht durch 8 teilbar.
Sonst konnte man die gesamte Struktur, also ohne DATA[0] kopieren.
Das ist aber auch für mich immer etwas Herumprobiererei wenn man
vorher lange mit S7 programmiert hat.

Frank
 
Oha, da ist natürlich ein Tippfehler drin, es handelt sich um ein Array mit 256 Werten. Wobei die 256 auch nur ein versuch waren, eigentlich ist es immer der Wert x*8.
Das bedeutet, ich könnte das ganze eigentlich nur mit einer Schleife lösen, oder? Wobei mir das nicht gefallen würde, da mit Bitzugriffen natürlich ordentlich CPU Leistung verbraucht wird.
Eine Konvertierungsfunktion wie BoolArray to int oder in der art gibt es auch nicht, oder?

Gruß
Matthias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn das bis Montag Zeit hat, schaue ich mal drüber!
Ideal wäre ein Rumpfprojekt von dir. Die Geheimnisse kannst du
vorher herauslöschen.

Gruß

Frank
 
Im Prinzip ist in dem Projekt eigentlich noch nichts drin. Konfiguration für Ethernet/IP Teilnehmer und ein paar Variablen.

Eigentlich lässt sich mein Problem ja in einer Zeile zusammenfassen:
Ich will einen (S/D)INT wert auf ein Bool-Array kopieren und anders herum.

Aber wenns ist, dann erstell ich natürlich gerne ein Rumpfprojekt, bin natürlich für jede Hilfe dankbar. Allerdings dann erst am Montag.
Danke schon einmal.

Gruß
Matthias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
memcpy(adr(Ziel), adr(Quelle), sizeof(Ziel)); ?

Allen Bradley ist gefragt, nicht Codesys.

COP oder CPS geht nicht auf BOOL (siehe auch "F1"), wenn's unbedingt BOOLs sein sollen (warum auch immer verstehe ich nicht, wozu kann man jedes einzelne Bit eines SINT/INT/DINT direkt ansprechen oder aber einen BOOL anlegen als Alias auf ein Bit eines SINT/INT/DINT), dann geht's nur über einen UDT.
 
Also vielleicht nochmal kurz zu dem Hintergrund meines Problems. Ich habe von EPLAN generierte E/A Bezeichnungen, z.B. E5.40. Das E5 steht in dem Fall für ein bestimmtes Gerät, also eigentlich so etwas wie ein Ortskennzeichen. Die Überlegung war jetzt diese Eingänge auch irgendwie so ähnlich in der SPS zu benennen. Also entweder direkt mit dem E5.40 oder als Alternative E5[40] <-- Darum auch das bool Array.
Eigentlich ja noch kein Problem, aber jetzt müsste ich natürlich noch die Variablen aus den Peripherie Abbildern auf die entsprechenden Arrays legen und genau das ist mein Problem.

Gruß
Matthias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also vielleicht nochmal kurz zu dem Hintergrund meines Problems. Ich habe von EPLAN generierte E/A Bezeichnungen, z.B. E5.40. Das E5 steht in dem Fall für ein bestimmtes Gerät, also eigentlich so etwas wie ein Ortskennzeichen. Die Überlegung war jetzt diese Eingänge auch irgendwie so ähnlich in der SPS zu benennen. Also entweder direkt mit dem E5.40 oder als Alternative E5[40] <-- Darum auch das bool Array.
Eigentlich ja noch kein Problem, aber jetzt müsste ich natürlich noch die Variablen aus den Peripherie Abbildern auf die entsprechenden Arrays legen und genau das ist mein Problem.

Gruß
Matthias


Alle rein binären EAs in eine äquvivalente Struktur
-PIN- für Eingänge
-POUT- für Ausgänge
packen.
Dann ist das kopieren ganz einfach.

Antriebe und analoge EAs werden separat behandelt.

PIN (ähnlich POUT) ist natürlich eine benutzerdefinierte Struktur - heißt bei mir UDT_PIN und muss genauso aufgebaut sein wie die passenden EAs.
Der Trick beginnt aber schon bei der Bezeichung der dezentralen IOs.



EINGÄNGE binär:

Code:
// Lokale Karten umkopieren
PIN.I00 := Local:1:I.Data;
PIN.I01 := Local:2:I.Data;
PIN.I02 := Local:3:I.Data;
PIN.I03 := Local:4:I.Data;
PIN.I04 := Local:5:I.Data;
PIN.I05 := Local:6:I.Data;




//  INSEL A30 +PP1
PIN.I30.0 := A30:1:I.0;        //Kommentar
PIN.I30.1 := A30:1:I.1;
PIN.I30.2 := A30:2:I.0;
PIN.I30.3 := A30:2:I.1;
PIN.I30.4 := A30:3:I.0;
PIN.I30.5 := A30:3:I.1;
PIN.I30.6 := A30:4:I.0;
PIN.I30.7 := A30:4:I.1;

AUSGÄNGE - Binär:

Code:
// Lokale Karten umkopieren
Local:7:O.Data := POUT.O00;
Local:8:O.Data := POUT.O01;
Local:9:O.Data := POUT.O02;
Local:10:O.Data := POUT.O03;
Local:11:O.Data := POUT.O04;
Local:12:O.Data := POUT.O05;



//  INSEL A30
A30:18:O.0 := POUT.O30.0;     
A30:18:O.1 := POUT.O30.1;  
A30:19:O.0 := POUT.O30.2;     
A30:19:O.1 := POUT.O30.3;  
A30:20:O.0 := POUT.O30.4;     
A30:20:O.1 := POUT.O30.5;  
A30:21:O.0 := POUT.O30.6;     
A30:21:O.1 := POUT.O30.7;
 

Anhänge

  • RS5000_EA.jpg
    RS5000_EA.jpg
    106,4 KB · Aufrufe: 7
  • RS5000_EA_UDT.jpg
    RS5000_EA_UDT.jpg
    127,3 KB · Aufrufe: 11
Diese Mölichkeit kam mir auch in den Sinn, allerdings hatte ich da bedenken wegen der Zykluszeit. Es handelt sich ja um lauter Bitzugriffe. Vielleicht sollte ich noch erwähnen das ich relativ viele E/A's habe. Insgesamt ungefähr 100 Byte.
Sind die Zykluszeitkosten so gering, das diese nicht ins Gewicht fallen, oder ist von so einer Lösung dann generell Abstand zu nehmen?

Gruß
Matthias
 
Diese Mölichkeit kam mir auch in den Sinn, allerdings hatte ich da bedenken wegen der Zykluszeit. Es handelt sich ja um lauter Bitzugriffe. Vielleicht sollte ich noch erwähnen das ich relativ viele E/A's habe. Insgesamt ungefähr 100 Byte.
Sind die Zykluszeitkosten so gering, das diese nicht ins Gewicht fallen, oder ist von so einer Lösung dann generell Abstand zu nehmen?

Gruß
Matthias

Wenn eine SPS so ein bisschen Umkopieren nicht schnell genug schaffen
würde, könntest du sie gleich entsorgen.

Ich habe mir auch sehr lange Gedanken um die Art des Umkopierens gemacht.
Leider ist das ja notwenig, weil ein in der CompactLogix keinen "OB1"-Abbildzyklus gibt.

Daher war die vorgestellt Image-Struktur-Variante am Ende die beste Lösung.

Blöd bei AB ist nur, das man zwar das Programm und die Symbolik zurücklesen "könnte".
Das hat aber leider keinen Sinn, weil die Kommentare in der UDT_PIN-Struktur dann auch entsorgt sind.

Alle regen sich über SIEMENS auf, aber das RS-Zeug ist viel nerviger.

Fazit: Wenn die die Struktur gefällt, mache es so und dir keine Kopf, das passt schon von der Geschwindigkeit.

Frank
 
Zurück
Oben