# LibNoDave und S7Online Datenstruktur....



## Jochen Kühner (27 Mai 2010)

Ich wollte versuchen ein bischen an der S7Online Schnittstelle zu arbeiten (Ethernet ermöglichen, Routing).

Nun habe Ich versuch die S7Oexchangeblock Struktur an die in dieser PDF angegeben anzupassen (https://a248.e.akamai.net/cache.aut...nl/Tg/Tg1MzIzNzEA_1653427_HB/mn_fdl-api_0.pdf), muss jedoch feststellen das dies nicht so einfach möglich ist, da einige werte nicht zu der struktur passen, beispielsweise würde der short wert functionCode dann in application_block_id und application_block_service aufgeteilt werden...

Gibts da noch andere Strukturen oder sind die in dem PDF schon gültig??


----------



## Zottel (27 Mai 2010)

Jochen Kühner schrieb:


> ...jedoch feststellen das dies nicht so einfach möglich ist, da einige werte nicht zu der struktur passen, beispielsweise würde der short wert functionCode dann in application_block_id und application_block_service aufgeteilt werden...




Entweder gar nicht darum kümmern und functionCode rausschmeißen. Ich habe die Felder nach Gutdünken eingeteilt und benannt.

oder so was machen:

struct {
char application_block_id;
char application_block_service;
} app_struct;

union {
short functionCode;
struct app_struct apps:
} fc_or_apps;


----------



## Jochen Kühner (27 Mai 2010)

Zottel schrieb:


> Entweder gar nicht darum kümmern und functionCode rausschmeißen. Ich habe die Felder nach Gutdünken eingeteilt und benannt.
> 
> oder so was machen:
> 
> ...



nee, ich meine du schreibst im programmcode einen wert in function code (ein word), wenn ich nun aber den richtigen struckt aus der doku nehme dann würde ein teil von dem wert den du reinschreibst bspw ein byte in block_id und das zweite byte in block_service stehen...

auch würde sich das ganze userdatafeld mit 520 bytes weiter nach vorne verschieben, da laut doku weinger bytes als bei dir davor sind.... (das unknown feld mit einer länge von [35])

Es macht eigendlich alles sinn, und passt auch noch schön,  bis der application block anfängt... Dann passt es mit der Struktur in libnodave nicht mehr so recht..

Vieleicht hab Ich ja such einen Fehler gemacht, hier mal mein Strukt:


```
typedef struct {
    us		unknown [2];
    uc		headerlength;
    us		number;
    uc		rb_type;		//Request Block type (2)
    uc		priority;		//Priority of the Task, identical like serv_class in the application block
    uc		reserved_1;		//Reserved
	us		reserved_2;		//Reserved
    uc		subsystem;		//For FDL Communication this is 22h = 34
    uc		opcode;			//request, confirm, indication => same as opcode in application block
    us		response;		//return-parameter => same as l_status in application block
    us		fill_length_1;
    uc      reserved_3;		//Reserved
    us      seg_length_1;
    us		offset_1;

	us		reserved_4;
	us		fill_length_2;
    uc      reserved_5;		//Reserved
    us      seg_length_2;
    us		offset_2;
	us		reserved_6;	
	uc		application_block_opcode;         // class of communication   (00 = request, 01=confirm, 02=indication)                                             
    uc		application_block_subsystem;      // number of source-task (only necessary for MTK-user !!!!!)             
    us		application_block_id;             // identification of FDL-USER                                            
    us		application_block_service;        // identification of service                                            
    uc		application_block_local_address_station;        // only for network-connection !!!                                       
	uc		application_block_local_address_segment;        // only for network-connection !!!                                      
    uc		application_block_ssap;								// source-service-access-point                                          
    uc		application_block_dsap;								// destination-service-access-point                                      
    uc		application_block_remote_address_station;     // address of the remote-station                                        
	uc		application_block_remote_address_segment;        // only for network-connection !!!                                      
    us		application_block_service_class;							// priority of service                                  
	void*	application_block_receive_l_sdu_buffer_ptr; // address and length of received netto-data, exception:                
    uc		application_block_receive_l_sdu_length; // address and length of received netto-data, exception:                
    
    uc		application_block_reserved_1;      // (reserved for FDL !!!!!!!!!!)                                        
    uc		application_block_reserved;      // (reserved for FDL !!!!!!!!!!) 
	void*	application_block_send_l_sdu_buffer_ptr;// address and length of send-netto-data, exception:                    
    uc		application_block_send_l_sdu_length; // address and length of send-netto-data, exception:                        
                           // 1. csrd                 : length means number of POLL-elements       
                           // 2. await_indication     : concatenation of application-blocks and   
                           //    withdraw_indication  : number of application-blocks               
    us		application_block_l_status;       // link-status of service or update_state for srd-indication           
    us		application_block_reserved_2[2];   // for concatenated lists       (reserved for FDL !!!!!!!!!!)          

	uc			user_data_1[260];
	uc			user_data_2[260];
} S7OexchangeBlock;
```


----------



## Jochen Kühner (28 Mai 2010)

*So...*

Ich hab das ganze jetzt mal in eine excel Tabelle gepackt und analysiere es...

Ich werde die Struktur in libnodave anpassen wenn das denn recht ist.

Auch habe Ich vor Routing und TCP/IP über S7Online zu implementieren..

Das Problem ist nur wie Ich die IP an S7Online bringe... Da bei davenewinterface ja nur eine mpi adresse erlaubt ist... 

Würde mal eine neue Funktion davenewinterface machen, welche auch noch die IP als Parameter bekommt, oder hat jm. eine andere Idee??

Es würde dann auch einen neuen Verbindungstype (51 S7Online TCP/IP) geben.

Das routing würde dann wieder über davenewrouting connection aktiviert werden!

Oder hat jemand Vorschläge?


----------



## Jochen Kühner (28 Mai 2010)

*So nochmal...*

So, denke Ich hab's mal soweit realisiert... Kanns im Moment aber nicht testen, keine SPS zur Hand. Was mir aber noch nicht gefällt: Hab jetzt meine Funktion daveNewRoutingConnection in daveNewExtenedConnection umbenannt, da S7Online bei einer TCP/IP Verbdindung ja auch noch die Quell IP Adresse braucht und diese dann auch noch mitgegeben werden muss... Mir gefällt das aber nicht wie Ich das jetzt alles in die Funktion gepackt habe... Vielleicht schaut jemand ja mal drüber und gibt mir ne gute Idee (Vieleicht Zottel, mir wäre es ja auch recht wenn die Änderungen nachher in das Orginal einfließen) ... Testen werde Ich das ganze im lauf der nächsten Woche...

Mfg.


----------



## bool (30 Mai 2010)

Mal eine prinzipielle Frage zu TCP/IP über S7Online.
Wenn ich unter "PG/PC Schnittstelle einstellen" TCP/IP meines Netzwerkadapters auswähle und mit dem SIMATIC Manager eine Verbindung zur SPS aufbau, dann zeigt mir "netstat" in der DOS Box dass es sich hier um eine "iso-tsap" Verbindung handelt, wie auch bei einer ISO on TCP Verbindung via libnodave.
Stellt sich für mich nun die Frage ob es sich hier dann nicht doch auch um eine ISO on TCO Verbindung handelt und wie ich dann eine echte TCP/IP Verbindung aubfbauen kann, grade wenn z.B. alle möglichen ISO on TCP Verbindungen einer CP343-1 LEAN bereits in Benutzung sind.

Gruss,

bool


----------



## Jochen Kühner (31 Mai 2010)

*So...*

So, bin immer noch am arbeiten an der S7Online Schnittstelle, aber das wird wohl noch ne weile dauern... Ich meld mich wenns geht...

Werde wohl auch beim Connecten jetzt noch eine Auswertung des Recieve Blocks in LibNoDave einbauen...


----------



## Jochen Kühner (31 Mai 2010)

*So...*

So... habe in meiner jetzigen version das Routing über S7Online, genauso wie den Ethernetzugriff über S7Online am laufen. PLC Starten und Stoppen funktioniert im Moment auch (Auch über Routing). Hab nur irgendwie das Variablen lesen zerschossen... Aber das grieg Ich auch wieder hin... Da Ich aber nun auf Montage bin, gibt wahrscheinlich erst nächste Woche neueres...


----------



## PN/DP (31 Mai 2010)

*iso-tsap = port 102*



bool schrieb:


> Wenn ich unter "PG/PC Schnittstelle einstellen" TCP/IP meines Netzwerkadapters auswähle und mit dem SIMATIC Manager eine Verbindung zur SPS aufbau, dann zeigt mir "netstat" in der DOS Box dass es sich hier um eine "iso-tsap" Verbindung handelt


Bei allen Verbindungen mit dem "well-known" Zielport 102 zeigt netstat "iso-tsap".
http://www.iana.org/assignments/port-numbers
http://tools.ietf.org/html/rfc1006

Gruß
Harald


----------



## bool (31 Mai 2010)

PN/DP schrieb:


> Bei allen Verbindungen mit dem "well-known" Zielport 102 zeigt netstat "iso-tsap".
> http://www.iana.org/assignments/port-numbers
> http://tools.ietf.org/html/rfc1006
> 
> ...


 
Hallo Harald,

Danke für die Info. 
Mir war tatsächlich gar nicht aufgefallen, dass iso-tsap ja eigentlich nur der port alias des Zielpunktes (hier CP der S7 Steuerung) ist und nicht der Protokolltyp selbst.

Gibt es eigentlich auch Windows/DOS bordeigene Mittel welche es erlauben die lokalen Verbindungen (von/zum eigenen PC) protokollgenau zu prüfen ohne dass ein zusätzliches Tool installiert werden muss? Oder gibt es ggf. ein Tool welches nicht installiert werden muss und zur Lokal-Analyse z.B. vom USB Stick läuft?

Danke schon mal im voraus.

Gruss,

bool


----------

