S7 Neuling - etwas frustriert

augenstern

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zunächst mal an alle im Forum!

Ich bin aboluter S7 Anfänger (komme aus dem Windows-Umfeld, mehrjährige Programmiertätigkeit in C/C++, auch Embedded-Realtime-System auf C-Basis).

Ich befasse mich mit SCL und soll eine C-Software, die auf einer Motorola-CPU läuft nach S7 portieren.
Randbedingung: auf der S7 läuft bereits eine andere Steuerungssoftware, ich bin also nicht alleine. Die bestehende SW macht heftig Gebrauch von C-üblichen Datenmanipulationen (Bitoperationen, Schiebungen, ...Pointeraritmethik....)

Als Schnittstelle nach außen fungiert eine TCP/IP-Socket-Verbindung.

Unter C recht einfach, stellen sich mir beim Studium von S7/SCL andauernd "Hindernisse" und "Beschränkungen" in den Weg.

Also ich fange mal an:
Sockets: ich will die AG_SEND/AG_RECEIVE benutzen, in SCL benutze ich die ANY-Pointer, das ist auch klar.
Der Anypointer braucht ja u.a. die Bausteinnummer (DB), die Anfangsadresse und den Offset des Datenbereiches.
Wenn ich "hardcoded" die Nummern, Längen und Adressen der Datenbereiche eintrage, dann stosse ich spätestens dann auf Schwierigkeiten, wenn sich meine Bausteinnummern ändern (davon ist auszugehen, wenn in ein bestehendes System integriert wird). Auch wenn sich die Daten des Bausteins ändern ist Sense.
In C gibt es die recht handlichen Direktiven sizeof()/offsetof() usw.

Genau sowas ähnliches suche ich.

Wenn ich alle meine Datein in einen einzigen (oder wenige DB) reinkriege, habe ich später weniger Aufwand (== Fehlerquellen).

Kann mir jemand einen Tipp geben, wie man sizef/offsetof in SCLK realisieren kann?

Wie sind im Allgemeinen die Erfahrungen, wenn man ein Zusatzprogramm auf eine bestehende Steuerung draufpackt.
Ich bin ehrlich: ich halte es für eine Katastrophe, aber leider will mein Chef das so (hat keine Ahnung von SPSs).

Ich fühle mich hier irgendwie auf einem Himmelfahrts-Projekt ....
 
Hallo,
du kannst (gerade unter SCL) die ANY-Pointer auch auf einen Bereich in deiner STAT-Deklaration verweisen lassen. Dann bleibst du in deinem FB und deinem (eigenem) Variablen-Pool.

Zum besseren Verständnis :
den Pufferbereich, den du aktuell an dem RCV-FB hast ist vermutlich irgendein DB. Du kannst nun genauso gut eine gleich lange (gleich dimensionierte) Variable deines FB's daran hängen.

Vielleicht hilft dir das jetzt schon weiter. Ansosnsten poste mal deinen Ansatz ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du mußt auch die Any-Pointer nicht "Hardcoded" verdrahten. Mit der AT-Anweisung kannst du in SCL jeden der "Teile" des Any-Pointers für dich im Programm zugänglich machen und beliebig manipulieren. So kannst du z.Bsp. als Inputparameter deines FC/FB die DB-Nummer (Int), den Beginn des Datenbereiches im DB (Int) usw. übergeben und dann den Any-Pointer entspechend zusammenbauen. Siehe dazu mal hier in der Forumssuche und der FAQ.

Hier mal ein Link: http://www.sps-forum.de/showthread.php?t=6194&highlight=AT
 
Hallo LarryLaffer

Hallo,

das hab ich mir schon gedacht, dass ich Variablen in meinem Instanz-DB (statische Daten) benutzen kann, aber was fülle ich in den ANY rein? Da brauch ich u.a. eine DB-Nummer, eine Adresse. Wie komme ich zu denen?

Ralle: Danke für Deinen Tipp mit dem AT!


An alle: in der Doku des Anypointer steht u.a. : für das Feld DB muß die DB Nummer oder 0 eingetragen werden.

Leider schreiben Sie nicht, was die 0 bedeutet. Weiß das jemand?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Volker!!

Danke für die Erläuterungen. Jetzt seh ich etwas klarer.

Bin eben noch blutiger Step7 und SCL Anfänger.

Ich hoffe ihr Leute hier entschuldigt meine Fragen (die für Euch wohl trivial sind).

Vielleicht hat der eine oder andere mal Fragen zu C/C++ oder Windows-Programmierung. Da helfe ich dann gerne aus ....
 
Hallo Larry et al.!

Ich habe mittlerweile Beispielcode für sizeof/offsetof gekriegt (falls es jemand interessiert: http://www.plctalk.net/qanda/showthread.php?p=241952#post241952)

Folgender Hintergrund zu meinen Fragen:
- mein SPS-Programm soll in bestehende Programme integriert werden.

Da habe ich dann natürlich das Problem, dass ich Bausteinnummern pflegen muß. Ich werde FCs/FBs/DBs natürlich symbolisch benamen, aber der Verwaltungsaufwand (und mögliche Fehlerquellen) ist nach wie vor da.

Also hab ich mir gedacht, ich packe meine Daten in ein oder zwei DBs. Meine DBs strukturiere ich selbst. Wenn ich jetzt meine Daten via ANYpointer (z.B.für AG_SEND ...) usw behandeln muß, brauch ich u.a. deren Byteadressen, und die DB-Nummern. (Sonst müsste ich die Daten in separate DBs legen, damit der Offset immer 0 sein wird. Und genau das will ich vermeiden).

Per BLOCK_DB_TO_WORD(...) krieg ich die DB-Nummer und über die Offset-FC die Adresse raus.

So spar ich mir die DB-Inflation und kann zur Laufzeit dynamisch auf meine Daten zugreifen.

- sizeof: man muß die Größen von Datenbereichen (bei mir: FiFo-Ringpuffer) leider harcoded machen (also z.B. puffer : array[0..127] of INT) da SCL leider keine #defines oder globalen CONST kennt (soweit ich zumindest bisher weiß). Also muß ich mein Programm überall da ändern, wo auf den Puffer zugegriffen wird (bei mir wird sich dieser Puffer kundenspezifisch ändern). Und das will ich soweit möglich vermeiden.


Gibt es nicht irgendwie Tricks um globale CONST zu "simulieren" ?

Ich hatte zwar einen 2-tägigen SCL-Kurs von einem "Siemens-Experten", aber ich muß schon sagen, die Leute hier in diesem Forum und in dem amerik. Forum (s.o.) sind weitaus kompetenter!!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
es gibt keine "globalen Konstanten" ... aber es gibt ja noch die Standard-DB's in die man alles Mögliche hineinschreiben kann.

Bei deinem FIFO könnte man es z.B. so machen, dass du dafür einen extra DB nimmst und in DW0 die Größe des ARRAY's schreibst. Eine andere Alternative wäre, wenn du das ARRAY immer für deine max. Befürfnisse erzeugst und ggf. nur Teile davon nutzt. Oder du übergibst das FIFO als ANY-Pointer (DB100.DBX0.0 Byte 200) = das bedeutet, dass das FIFO bei DB100 Byte 0 beginnt und 200 Bytes groß ist. Einen ANY kann man in SCL eigentlich problemlos verarbeiten.

Vielleicht hilft das Ansatz weiter ...
Gruß
LL
 
Hallo Larry!

Danke für Deine Anregungen!

Ich muß das ganze eben so machen, dass ich möglichst wenige Konflikte mit Bausteinnummern kriege. Sonst werde ich später wahnsinnig mit dem Verwaltungsaufwand und der Fehlersuche....

Problem ist eben, dass mein Prog in Programme von Kunden integriert werden soll (mein Chef will das eben so).

Gruß :)
 
Hallo,

ich versuche erfolglos eine inbound TCP-Verbindung aufzubauen und Daten zu lesen.

Die Daten kommen als structuren von 20 Bytes.

Das externe (PC) Programm schafft es die Verbindung aufzubauen, schreibt 20 Bytes Daten.

Der AG_RECV liefert aber bereits nach 10 Bytes DONE als TRUE zurück.
LEN wird dann auch mit 10 geliefert, ERROR = FALSE.

Im DB123 stehen aber keinerlei Daten drin.

Kann mir bitte jemand sagen, was ich da falsch mache?:confused:





TYPE AnyPointer
STRUCT
id : BYTE;
typ : BYTE;
count : INT;
db_nummer : INT;
speicherbereich : DWORD;
END_STRUCT;
END_TYPE

//
//-------------------------------------------
//

DATA_BLOCK Glob
STRUCT
tcp_rx_fsm : STRUCT
myany : AnyPointer;
bDone : BOOL;
bError : BOOL;
wStatus : WORD;
iLen : INT;
END_STRUCT;
END_DATA_BLOCK
//
//-------------------------------------------
//


//--- Datenblock für RX
DATA_BLOCK DB123
STRUCT
data : ARRAY[0..500] OF BYTE;
END_STRUCT
BEGIN
END_DATA_BLOCK





Glob.tcp_rx_fsm.myany.id := b#16#10;
Glob.tcp_rx_fsm.myany.typ := b#16#02;
Glob.tcp_rx_fsm.myany.count := 20;
Glob.tcp_rx_fsm.myany.db_nummer := 123;
Glob.tcp_rx_fsm.myany.speicherbereich := dw#16#84000000;

AG_RECV ( ID:= 2,
LADDR := W#16#0100,
RECV := Glob.tcp_rx_fsm.myany,
NDR := Glob.tcp_rx_fsm.bDone,
ERROR := Glob.tcp_rx_fsm.bError,
STATUS := Glob.tcp_rx_fsm.wStatus,
LEN := Glob.tcp_rx_fsm.iLen
);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich sehe in deinem Beispiel nicht wie der ANY-Pointer zustande kommt. Ich denke, der Schlüssel liegt im AT-Befehl. Kannst du die Zuweisung für :
Code:
Glob.tcp_rx_fsm.myany.id 
Glob.tcp_rx_fsm.myany.typ  
Glob.tcp_rx_fsm.myany.count 
Glob.tcp_rx_fsm.myany.db_nummer 
Glob.tcp_rx_fsm.myany.speicherbereich
nach
Code:
Glob.tcp_rx_fsm.myany
hier mal hereinstellen - nur mal spasseshalber ...

Gruß
LL
 
Hallo LL!

Oh weh, Larry!!

Du hast mir den entscheidenden Tipp gegeben!!

Ich bin wohl noch zu sehr auf C ausgerichtet:

Diese Anypointer MUSS man per AT zuweisen. An die AG_RECV wird dann tatsächlich ein pointer auf die gefüllte struct und nicht die struct übergeben (das war mein Fehler).

Danke, danke, danke!

:)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... nächste Frage ....

Hallo an alle,

ich will keinen neuen Thread aufmachen.

Eine generella Frage zur "Portierbarkeit" von Programmen.

Ich entwickle mit einer Siemens 314er CPU.

Unser Kunde setzt eine Vipa ein (Typ kenn ich nicht).
Gestern hatte ich Gelegenheit mit einem anderen Vipa-Programmierer zu unterhalten (bei einem Kunden).
Der hat mir gesagt, dass die TCP-Kommunikations-Bausteine AG_SEND/AG_RECEIVE bei Vipa SFCxxx Bausteine seien. Kann das sein?

Inwieweit sind die Vipa-SPSen kompatibel zu denen von Siemens?

Bei S7 muß ich die entsprechenden Bausteine ja in mein Projekt reinholen, (Vipa-) SFCs sind ja aber doch schon im ROM.

Ebenfalls: läuft der AWL-Code, den mein Compiler produziert anstandslos auf Vipa? (Ich brauch u.a. z.B. den SFC64 TIME_TCK(), über den ich hier schon manch schlechtes gelesen habe...)


Für mich stellt sich hier auch die Frage: wie entwickelt man mit der Siemens-Umgebung so, dass der Code auch bei anderen SPSen läuft?

Ich bin ganz schönn am grübeln....
 
Hatte bisher mit den VIPA-SPS noch nie große Kompatibilitätsprobleme. Für TCP/IP mußt du die VIPA-Bausteine nehmen, das stimmt. Die Beschaltung ist aber wie bei den Siemens-Bausteinen, wenn ich mich recht entsinne. (Weiß aber nicht mehr ganz genau). Größtes Problem war bisher, daß eine VIPA Speed7 einfach mal zu schnell war :ROFLMAO:. Da kamen ein paar Bausteine (Kommunikation mit Servos) gehörig ins Schwitzen. Das konnte aber alles gelöst werden.
 
Vipa

Ja, Vipa ist wirklich gut, sind ja alles Siemens-Leute, die mal was Gutes entwickeln wollten. Ich setze z.B. die 214 Serie als Alternative zu den 200CPU von Siemens ein, weil man VIPA mit dem S7-Manager programmieren kann und somit dieses "******" MicroWin nicht benutzen muss.

..und, der Support antwortet auf Fragen wie die SPEED7 - einfach schneller..

dp
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ralle, Dont_panic

Ralle, Dont_panic,

wenn man den S7 Manager benutzt um Programme zu entwickeln, muß ich (beim Beispiel AG_SEND & AG_RECV) die Bausteine aus der Bibliothek reinkopieren. Dann findet der Compiler die Bausteine.

Wenn der Code aber auf Vipa laufen soll, darf ich die S7-Bausteine ja nicht verwenden, sondern die Vipa-SFCs.

Wie mache ich das im S7-Manager?

Ich meine, auf meiner Test-S7 will ich das Programm testen, auf der Vipa dann laufen lassen. Da muß ich ja immer wieder (solange ich teste eben) Bausteine raus, Bausteine reinmachen, oder wie macht man das am besten?
 
Zurück
Oben