# S5 Code schreiben mit VB



## kolibree (4 Februar 2008)

Hallo zusammen,

ich versuche eine Loesung zu finden mit der ich in VB einen PB erstellen,ein paar Zeilen code eintragen und das ganze mit libnodave oder anderen Treiber in die S5-115U schicken kann. (Ueber Ethernet mit IBH oder PI Hardware)

Irgendwelche Vorschlaege?


----------



## argv_user (7 Februar 2008)

Das wäre eine Änderung des SPS-Programmes.
Willst Du das wirklich?
Genügt es nicht, der SPS Daten in einen Datenbaustein
zu schreiben?


----------



## kolibree (7 Februar 2008)

Da ich  Abfragen ueber die gesamten Datenbereiche (E,I,A,T,Z,DB) der SPS machen moechte mit Entscheidungen in Zykluszeit muss ich dies in der SPS hinterlegen. 
Ich habe schon angefangen meine Abfragen in mnemonischem Code in DB's abzulegen und dann ueber indirekten Zugriff meine Datenwoerter abzuarbeiten. Dies wird nur viel zu aufwendig sobald ich aufwendige Netzwerke mit UND und ODER Verknuepfungen nachbilden will. 
Deshalb moechte ich dies in einem PB oder FB umsetzten den ich in VB generiere , auf Syntax checke und dann den im AG befindlichen mit dem neuen ueberscheibe.

Danke fuer die Hilfe.


----------



## bs (7 Februar 2008)

Hallo,

Du redest von der Simatic S5?
Dort gibt es ein BR-Register (jedenfalls bei den größeren CPU's). Das BR-Register kannst Du auf die Anfangsadresse jedes Bausteins stellen. Du kannst damit Maschinencode von Codebausteinen verändern.  Transfer von Maschinencode in die Speicherzellen. Bedenke, dass Du mit einen sehr sehr scharfen Messer arbeitest!


----------



## kolibree (7 Februar 2008)

Ja, soll mit CPU945 funktionieren.

Wie ermittle ich die Startadresse des Blocks? Von wo faengt der eigentliche code dann an (Header)? 
Das ganze hoert sich auch nicht ganz einfach an.

Ich hatte auf eine Loesung mit libnodave gehofft. Allerdings habe ich bis jetzt nur die "daveGetProgramBlock" Funktion gefunden. 
Kann libnodave auch Bloecke schreiben?

Noch was anderes.
Ich habe etwas Erfahrung mit libnodave und S7. Gerade versuche ich die Verindung mit einer S5 aufzunehmen und bleibe iregenwie beim daveConnectPLC (-21)  haengen.


----------



## bs (7 Februar 2008)

>>Wie ermittle ich die Startadresse des Blocks? Von wo faengt der eigentliche code dann an (Header)?

Für die Startadresse gibt es Systemdatenworte. Das ist ganz gut in den Berger-Büchern (Automatisieren mit Step 5 AWL o.s.ä.) beschrieben. Du brauchst außerdem noch eine Maschinencode Tabelle, die gab es damals als Heft und ist auch im  Berger-Buch enthalten.


----------



## kolibree (7 Februar 2008)

Danke bs. 
Buecher von Berger wurden mir schon frueher als gute Quelle empfohlen. 
Ich werde mir eins zulegen.


----------



## Question_mark (7 Februar 2008)

*Daran beisst Du Dir die Zähne aus ...*

Hallo,



			
				bs schrieb:
			
		

> Für die Startadresse gibt es Systemdatenworte.



Also in meiner S5 stehen die Startadressen im DB 0.



			
				Kolibree schrieb:
			
		

> Von wo faengt der eigentliche code dann an (Header)?



Der Header ist 5 Worte lang, danach folgt der S5 Code. Und viel Spass beim Erstellen des Bausteines mit MC5 Code in VB. 
Zum Laden des Bausteines in die S5 musst Du den Baustein an einer Speicheradresse in der S5 ablegen (ohne Lücke zu anderen Bausteine) und das Adressregister DB0 manipulieren. 
Ok, es ist möglich. Aber nur mit entsprechenden Kenntnissen über die Speicherstruktur der S5 und den Maschinencode MC5.
Aber meine Meinung dazu : Wer so etwas macht, gehört standrechtlich erschossen :sw14: 
Und nein, ich bin kein Instandhalter ...:sm10: 
Vergiss es einfach, ok ??

Gruß

Question_mark


----------



## Question_mark (7 Februar 2008)

*Db 0*

Hallo,



			
				Kolibree schrieb:
			
		

> und das ganze mit libnodave



Vielleicht über libnodave mit AS511-Protokoll, der würde dir den Baustein  richtig in die S5 Speicherverwaltung einbinden.
Trotzdem brauchst Du gute MC5 Kenntnisse, um den Baustein in VB zu erstellen.

Gruß

Question_mark


----------



## Zottel (7 Februar 2008)

kolibree schrieb:


> Ich hatte auf eine Loesung mit libnodave gehofft. Allerdings habe ich bis jetzt nur die "daveGetProgramBlock" Funktion gefunden.
> Kann libnodave auch Bloecke schreiben?


Im Prinzip ja. Problem: wohin? Die S5 hat im Prinzip einen linearen Speicher. Wenn du einen Baustein mit Step5 änderst, wird er in freien Speicher geschrieben. Anschließend wird die neue Adresse in eine Liste eingetragen. Im nächsten Zyklus wird die neue Adresse zum Bausteinaufruf benutzt.
Nach etlichen Änderungen gibt es keinen freien Speicher mehr. Dann rufst du "Speicher komprimieren" auf und die SPS legt die gültigen Blöcke hintereinander so daß dahinter oder davor wieder freier Speicher am Stück vorhanden ist.
Probleme bzw. offene Fragen:
- Wo darf der nächste Baustein hingeschrieben werden? Vermutung: egal.
- Wer manipuliert die Bausteinliste, PG oder CPU? Weiß ich nicht.
- Wo ist die Bausteinliste? Weiß ich nicht mehr, aber mit etwas stöbern findet man sie.
- Wie ist die Bausteinliste aufgebaut? Lauter Word-Einträge. Im 1. Wort steht die Adresse der niedrigsten Bausteinnummer. Für nicht vorhandene Bausteine steht ein Platzhalter (0000?). Für jede BS Art (PB,FB,...) gibt es eine Liste mit 256 Einträgen.
- Wie schreibt man eine beliebige Adresse mit Libnodave? Bei S5-Protokoll ruft daveWriteBytes() daveWriteS5Bytes() auf. daveWriteS5Bytes() addiert je nach Speicherbereich (Parameter area) die Anfangsadresse der Merker, des PAE/PAA oder des Datenbausteins. Zusätzlich gibt es die area-Konstante daveRawMemoryS5. In diesem Fall wird nichts addiert, sondern der Parameter start liefert direkt die Anfangsadresse im Speicher.
Gleiches gilt für Lesen.


			
				Question_mark schrieb:
			
		

> Vielleicht über libnodave mit AS511-Protokoll, der würde dir den Baustein  richtig in die S5 Speicherverwaltung einbinden.


Nein, dieses Einbinden ist nicht implementiert. Für S7 ja, da übergibt man der CPU einige Informationen über den Baustein und dann lädt sie ihn vom PG und bindet ihn ein. Für S5 ist auch "daveGetProgramBlock" nicht implementiert...

Wie lang der header ist, habe ich vergessen. Einfach mal einen Baustein mit bekanntem Code (Codetabelle) schreiben, dann siehst du´s schon.


kolibree schrieb:


> Noch was anderes.
> Ich habe etwas Erfahrung mit libnodave und S7. Gerade versuche ich die Verindung mit einer S5 aufzunehmen und bleibe iregenwie beim daveConnectPLC (-21) haengen.


Funktioniert S7 seriell? Durch eine Anfrage gestern oder vorgestern habe ich gesehen, daß ich in 0.8.4 einen Patch "in gutem Glauben" übernommen habe, der möglicherweise jede serielle Verbindung unter Windows stört...
Trotz 9840 Downloads hat sich keiner gemeldet (oder nicht deutlich genug)...


----------



## Question_mark (7 Februar 2008)

*AS 511 Protokoll*

Hallo,



			
				Zottel schrieb:
			
		

> Nein, dieses Einbinden ist nicht implementiert.



Ok, vielleicht nicht in libnodave. Aber das AS511-Protokoll kann Dir den Baustein herunterladen und in das AG linken. Aber dann ist das AS511-Protokoll eben in libnodave nicht vollständig implementiert.


Gruß

Question_mark


----------



## Question_mark (7 Februar 2008)

*Da fehlt doch noch was ....*

Hallo,



			
				Zottel schrieb:
			
		

> S5 ist auch "daveGetProgramBlock" nicht implementiert...


Das sollte dann auch eher "daveSetProgramBlock" heissen.



			
				Zottel schrieb:
			
		

> Wo ist die Bausteinliste? Weiß ich nicht mehr, aber mit etwas stöbern findet man sie.



Hatte ich vorher schon erwähnt, das ist der DB 0.

Gruß

Question_mark


----------



## Question_mark (8 Februar 2008)

*Adressliste manipulieren*

Hallo,



			
				Zottel schrieb:
			
		

> - Wo darf der nächste Baustein hingeschrieben werden? Vermutung: egal.


Fast richtig. Bei alten Steuerungen mit 16-Bit Adressierung wirklich egal, solange lückenlos im Speicher. Bei neuen Steuerungen (z.B. CPU 948)) mit 20-Bit Adressierung muss u.U. eine Adresslücke eingefügt werden, damit Bausteinanfangsadressen ein bestimmtes Raster einhalten.



			
				Zottel schrieb:
			
		

> - Wer manipuliert die Bausteinliste, PG oder CPU? Weiß ich nicht.


Das macht im allgemeinen die CPU. Oder Kolibree. 
Beim Bausteintransfer von PC/PG --> S5 über das AS511-Protokoll bindet die CPU den neuen Baustein automatisch in die S5 Bausteinverwaltung ein.



			
				Zottel schrieb:
			
		

> - Wo ist die Bausteinliste? Weiß ich nicht mehr, aber mit etwas stöbern findet man sie.



DB0 ist die Adressliste.



			
				Zottel schrieb:
			
		

> - Wie ist die Bausteinliste aufgebaut? Lauter Word-Einträge. Im 1. Wort steht die Adresse der niedrigsten Bausteinnummer. Für nicht vorhandene Bausteine steht ein Platzhalter (0000?). Für jede BS Art (PB,FB,...) gibt es eine Liste mit 256 Einträgen.



Stimmt fast. Es gibt nur eine Liste, aber die hat für jede Bausteinart jeweils 256 Einträge.



			
				Zottel schrieb:
			
		

> Nach etlichen Änderungen gibt es keinen freien Speicher mehr.



Genau deshalb habe ich nach dem Beitrag von Kolibree ganz schön gegrinst ...

Fazit : Wenn man das AS511 Protokoll verwendet (und es richtig implementiert ist), kann man durchaus Bausteine in die S5 korrekt einbinden. 
Ach ja, Blocktransfer heisst das ganze.

Gruß

Question_mark


----------



## Zottel (8 Februar 2008)

Question_mark schrieb:


> DB0 ist die Adressliste.
> Stimmt fast. Es gibt nur eine Liste, aber die hat für jede Bausteinart jeweils 256 Einträge.


Ist das durchgängig so? Habe gerade Zweifel, ob so eine kleine 100U CPU102 überhaupt DBs kann. Geschweige denn DBs mit 4*256 Worten für OBs, PBs, FBs, DBs.



Question_mark schrieb:


> Genau deshalb habe ich nach dem Beitrag von Kolibree ganz schön gegrinst
> ...
> Fazit : Wenn man das AS511 Protokoll verwendet (und es richtig implementiert ist), kann man durchaus Bausteine in die S5 korrekt einbinden.
> Ach ja, Blocktransfer heisst das ganze.


Wenn denn die PG-Funktionen des Protokolls implementiert WÄREN könnte Kolibree auch einfach Speicher komprimieren aufrufen....

Gruß an Dich!


----------



## kolibree (8 Februar 2008)

Ich war doch nur kurz was essen und hab schon das beste verpasst.(6 z.T. lange Beitraege in 2 Stunden! 

Anyhow, danke an alle fuer die Beitraege und auf zur Zusammenfassung.

Bs: Danke fuer die aufmunternden Worte. 
Aber ich denke die Leute die 3rd party Software fuer’s S5 programmieren geschrieben haben leben auch noch und haben eine gute, wirtschaftliche lohnende Weise gefunden Bloecke zu lesen, zu editieren und zurueckzuschreiben. Ich moechte natuerlich weder eine solche Swr schreiben noch das Rad neu erfinden und hoffte deshalb dass es in libnodave eine Moeglichkeit gibt diese Funktionweise nachzubilden.    


Zottel & Question_mark: 
Soweit ich das nun sehe, kann libnodave mir in diesem Fall nicht weiterhelfen.(Fuer Standard S7 Lese/Schreib Anwendngen finde ich es uebrigens sehr gut)
Koennt Ihr mir eine Quelle (Berger ist schon bestellt) nennen in der ich mehr (vor allem in der Tiefe) ueber das AS511 Protokoll erfahren kann? Dann kann ich immer noch sehen ob mir das Ganze ueber den Kopf waechst und gehe zurueck zu der Loesung mit der indirekter Addressierung und reduziere die Verknuepfungsmoeglichkeiten. 

Im Uebrigen haenge ich immer noch an meinem S5 Verbindungsaufbau-Problem (daveConnectPLC  Ergebnis = -21) mit libnodave (brauche ich trotzdem fuer andere Projekte).

Bis morgen.


----------



## Question_mark (8 Februar 2008)

*As 511*

Hallo,



			
				Zottel schrieb:
			
		

> Habe gerade Zweifel, ob so eine kleine 100U CPU102 überhaupt DBs kann. Geschweige denn DBs mit 4*256 Worten für OBs, PBs, FBs, DBs.



Das Konzept mit der Bausteinverwaltung ist bei der S5 durchgängig. Allerdings haben die kleineren CPU's weniger Anwenderbausteine. Die CPU 102 hat dann keine 256 Bausteine je Bausteinart (DB, PB, FB) sondern nur maximal 64 Bausteine. 
Bei obigen Posts bin ich davon ausgegangen, dass der Bausteintransfer, Bausteinverlinkung und Komprimierung in libnodave AS511 enthalten ist. Ich hatte mich noch nicht mit libnodave AS511 beschäftigt und das wegen dem Namen 'AS511' vorausgesetzt.

Gruß an Zottel

Question_mark


----------



## Question_mark (8 Februar 2008)

*Bausteintransfer AS511*

Hallo,



			
				Kolibree schrieb:
			
		

> Ich war doch nur kurz was essen und hab schon das beste verpasst.(6 z.T. lange Beitraege in 2 Stunden!



Kurz essen ? Nach 2 Stunden essen könnte ich den Rest des Tages nicht mehr arbeiten  



			
				Kolibree schrieb:
			
		

> Koennt Ihr mir eine Quelle (Berger ist schon bestellt) nennen in der ich mehr (vor allem in der Tiefe) ueber das AS511 Protokoll erfahren kann?



Der Berger wird bei AS511 auch nicht weiterhelfen. Das Protokoll wurde von Siemens nicht offengelegt. Du kannst höchstens mal googeln, ob Du einen AS511 Treiber in den Tiefen des INet findest.

Gruß

Question_mark


----------



## lorenz2512 (8 Februar 2008)

hallo,
schau mal hier vielleicht hilft es was http://www.runmode.com/usefulstuff.html


----------



## Ralle (8 Februar 2008)

lorenz2512 schrieb:


> hallo,
> schau mal hier vielleicht hilft es was http://www.runmode.com/usefulstuff.html



YEP und hier: http://www.runmode.com/usefulstuff_files/AS511protocol_description.pdf

Von Runmode hab ich auch die Komponente. Hab sie aber nie getestet, da ich eine eigene DLL hab, die für den Zugriff auf DB und M ausreicht. Mit ein wenig Nacharbeit konnte ich die Komponente zumindest mit Delphi7 übersetzen. Ich werd mal eine 95U dranhängen und die DEMO testen. Aber die VCL-Komponente ist Free, also kannst du wenigstens reinschauen !


----------



## kolibree (9 Februar 2008)

Hallo,


Question_mark schrieb:


> Kurz essen ? Nach 2 Stunden essen könnte ich den Rest des Tages nicht mehr arbeiten


 
Haette ich wahrscheinlich auch nicht tun sollen (wir haben nicht nur gegessen) denn bei meinen Antworten im letzten Beitrag hatte ich aus versehen an BS geschrieben was an Dich haette gehen sollen. Sorry BS.

So, dass mit der Delphi Komponente scheint z.T. ganz gut zu funktionieren (Dank an Ralle und Lorenz2512). Das mitgelieferte Testprogramm liest z.B. schon mal die Bloecke von meiner CPU945.
In der Definition der Komponente sind auch jede Menge andere Funktionen implementiert u.a. auch das Block schreiben und komprimieren. Allderdings hat der Verfasser der Test App. diesen Teil nicht umgessetzt. (Hinweis auf Zeitmangel nach Aufruf der Funktion, sei aber in der Komponente vorhanden und getestet). 
Da ich mich in Delphi nicht gut auskenne hat ein Feund von mir das ganze in D5 in eine ocx gewandelt die ich aber bis jetzt nicht in VS2005 einbinden konnte. Mal sehen wie es weitergeht. Da ich jetzt erstmal fuer 3 Wochen weg muss um meine Broetchen zu verdienen kann ich vorerst auf weiter Beitraege nicht antworten.

Bis dann.


----------



## Question_mark (10 Februar 2008)

*Die Brötchen sind wichtiger*

Hallo,



			
				kiolibree schrieb:
			
		

> jetzt erstmal fuer 3 Wochen weg muss um meine Broetchen zu verdienen



Na dann melde Dich einfach wieder, vielleicht kriegen wir das Problem ja noch irgendwie gelöst ...

Gruß

Question_mark


----------

