# Libnodave lernen



## Outrider (25 Juli 2013)

Hallo,
ich bin auf der Suche nach guten didaktischen Unterlagen um Libnodave zu lernen.
Mei Ziel ist eine einfache Verbindung zwische SPS und PC ( Sei es Excel oder C++ )
Die Unterlagen im Forum sind leider nur bruchstückhaft und setzen schon gewisse Dinge als bekannt voraus ! 
Habt Ihr etwas für mich ?
Vielleicht auch mit Bespielprogramm
Gruß und Danke


----------



## Jochen Kühner (25 Juli 2013)

Ich hatte hier mal 2 Beispiele gepostet! Ist aber C# und VB.NET, und nutzt meine ToolBoxLib, welche intern aber wieder LibNodave nutzt: 
http://www.sps-forum.de/hochsprache...en-aus-s7-mit-dotnetsiemensplctoolboxlib.html


----------



## PN/DP (25 Juli 2013)

In den FAQ gibt es ein Excel-Beispiel.

Harald


----------



## Zottel (25 Juli 2013)

Was ist für dich eine didaktisch gute Unterlage?
Vielleicht kannst du ja helfen, eine zu schaffen. Sag mir, was an den Beispielprogrammen etc. besser werden soll, wo du nicht weiterkommst und wie du es machen würdest.


----------



## voni_1 (7 November 2013)

Ich bin gerade dabei mich in die Materie einzuarbeiten! Langsam aber stetig .... 
Ich kann den Wunsch von Outrider nachvollziehen - auch wenn ich mir die Beispiele schon reingezogen habe und festgestellt habe, dass es mit ihnen durchaus möglich ist auf die Funktion zu schließen und das Gesuchte herauszulösen!
Schade ist jedoch, dass man eben "nur" Methoden die in dem jeweiligen Beispiel behandelt werden mitbekommt.
Ich würde mir eine Funktions/Methodenübersicht "wünschen" mit der man einen Überblick bekommt was alles mögich ist! Vielleicht sogar mit Code-Snippets! - GIBTS SOWAS?
Aktuell arbeite ich gerade die DotNetSiemensPLCToolBoxLibrary von Jochen Kühner durch!
Auf diesem Wege noch einmal ein *Chapeau*! an ihn für die Sammlung! Ich glaube ich habe noch einige schöne Stunden mit der Library!


----------



## funkey (7 November 2013)

Vielleicht schaust du dir auch mal Snap7 an. Da ist die Hilfe-Datei hervorragend ausgearbeitet und es sind auch einige Beispiele dabei.


----------



## voni_1 (7 November 2013)

Sehe mir gerade das \doc Verzeichnis von LibNoDave an und versuche mich zurechtzufinden... Bei DotNetSiemensPLCToolBoxLibrary hab ich sowas noch net gefunden.


----------



## voni_1 (7 November 2013)

funkey schrieb:


> Vielleicht schaust du dir auch mal Snap7 an. Da ist die Hilfe-Datei hervorragend ausgearbeitet und es sind auch einige Beispiele dabei.



werds auf die ToDo setzen


----------



## Zottel (7 November 2013)

Ich habe ja gefragt, was ihr haben wollt und keine Antwort bekommen.


voni_1 schrieb:


> Schade ist jedoch, dass man eben "nur" Methoden die in dem jeweiligen Beispiel behandelt werden mitbekommt.
> Ich würde mir eine Funktions/Methodenübersicht "wünschen" mit der man einen Überblick bekommt was alles mögich ist!
> Vielleicht sogar mit Code-Snippets! - GIBTS SOWAS?


Ja und nein. 
Ja, denn:
- alle Funktionen, Typen und Konstanten sind in der Header-Datei nodave.h aufgelistet.
- alle Funktionen, Typen und Konstanten werden gewöhnlich in dem Kopf der Beispiele für die Sprachanbindungen wiederholt (vollständig). ? 
- die Programme testMPI.c und testISO_TCP.c enthalten Code, um ALLES zutesten bis auf das Laden von Bausteinen in die SPS.
Nein, denn:
- es gibt jetzt nicht den kompletten Code von testMPI.c und testISO_TCP.c nochmal in jeder unterstützten Programmiersprache.

Wie schwer ist es für einen VB-Programmierer ein C-Programm zu lesen?


----------



## voni_1 (7 November 2013)

Zottel schrieb:


> Wie schwer ist es für einen VB-Programmierer ein C-Programm zu lesen?


Gar keins von Beiden - einfach S7-Programmierer der hoch motiviert in eine neue Umgebung einsteigen will!

@zottel - Mein Post mit den Beschreibungen richtete sich eher an die DotNetSiemensToolBox bei der ich eigentlich keine Dokumentation gefunden habe - dafür eine Vielzahl an hoch nützlichen Beispielen mit denen ich auch sehr gut zurecht komme...

Ich werde mich schon zurecht finden.... Ist nur alles verständlicherweise sehr komplex! Ich geb aber nicht schnell auf .
Möchte mit beiden (LibNoDave sowie DotNetSiemensToolBox) umgehen lernen!
Ich habe bis vor wenigen Tagen eigentlich "nur" S7 und Arduinos programmiert und schreibe gerade an meinen ersten C# Applikationen und bin mit meinem Fortschritt ganz zufrieden!

Nun ist es eben soweit, dass ich meine Applikationen mit der S7 und mySQL Welt sprechen lassen möchte. 
Nicht weil es konkret eine Anwendung gibt, nur weil ich es einfach können möchte wenn ich es brauche.
mySQL spreche ich schon mit C#  - Jetzt gehts an S7

Ich gebe mir echt Mühe mich umfassend zu Informieren und zu lesen, zu lesen und zu lesen bis ich für Profis vielleicht "unangebrachte" Fragen stelle. Ganz wird es sich jedoch leider nicht vermeiden lassen....
Aktuell arbeite ich mit der DotNetSiemensToolBox und bin schon bald dort wo ich hinmöchte... (Danke an Jochen für die Starthilfe)
Im Anschluss möchte ich das selbe "Projekt" auch mit der LibNoDave alleine machen...


----------



## Jochen Kühner (7 November 2013)

voni_1 schrieb:


> Sehe mir gerade das \doc Verzeichnis von LibNoDave an und versuche mich zurechtzufinden... Bei DotNetSiemensPLCToolBoxLibrary hab ich sowas noch net gefunden.



Jo, weil ich auch keine Doku habe... Und im Moment auch keine Zeit eine zu erstellen, aber es sind ja einige Beispiele dabei... Und wenn du Fragen hast, einfach n Thread hier starten, wenn's um meine Lib geht, antworte Ich dann schon. Nur bitte nicht per PN, da andere vielleicht ähnliche Probleme haben und denen ist dann mit einem öffentlichen Thread auch geholfen.

Meine Lib kannst ja auch nicht direkt mit LibNodave vergleichen, Ich nutze ja libNodave (wenn auch eine etwas geänderte Version). Aber meine Bib bietet ja auch noch Step7, Step5 Projektzugriff, Abstraktion der Kommunikation, etc...


----------



## voni_1 (7 November 2013)

War auch bitte NICHT als Kritik zu verstehen! Bis jetzt komm ich mit den Beispielen ganz gut zurecht! 


Jochen Kühner schrieb:


> Und wenn du Fragen hast, einfach n Thread hier starten, wenn's um meine Lib geht, antworte Ich dann schon.


Danke - ich werds beherzigen!


----------



## Tola-Emma (5 Dezember 2013)

Hallo,
ich bin ganz neu bei euch im Forum, meine SPS Kentnisse sind  mittelmäßig, nur mit Ethernet/ Internet Verknüpfung habe ich gar keine  Erfahrung. Habe mir eine S7-314 Steuerung mit Analogeingangen und einer  CP343-1 angeschaft und wollte mit dieser meine Heizung / Solaranlage  steuern. Das Programm ist soweit auch fertig. Nun habe ich soviel von  Libnodave gehört und zum teil auch gelesen, das meine Überlegung war,  Datenaufzeichnung und die Heizungssteuerung ( EIN / AUS, Temperaturen  anpassen) übers Heimnetz zu machen.

Nun zu meiner Frage:
Wenn  man mit Libnodave arbeitet muss auch was in die Steuerung eingetagen  werden,damit man die Daten auslesen, bzw Schreiben kann?

Mfg Tola- Emma

PS: ich hoffen ihr könnt meinen Wissenstand aufbessern.


----------



## Zottel (5 Dezember 2013)

Tola-Emma schrieb:


> ...
> Wenn  man mit Libnodave arbeitet muss auch was in die Steuerung eingetagen  werden,damit man die Daten auslesen, bzw Schreiben kann?
> ...


Nein.
...jetzt meckert die Forensoftware und zwingt mich, mindestens zehn Zeichen zu schreiben...


----------



## Burkhard (6 Dezember 2013)

*Frage an libnodave experten*

Wenn ich mich mit dem S7 Manager mit meiner S7300 verbinde, dann habe ich bei"Set PG/PC Interface" die Option TCP/IP Centrino (WLAN ueber Firmennetzwerk und Router zur SPS) ausgewaehlt.

Wenn ich jetzt eine Verbindung ueber libnodave aufbauen will, muss ich da beim Interface 

      DeviceInterface = daveNewInterface(PortHandle, PortHandle, "IF1", 0, daveProtoISOTCP, daveSpeed187k)

ISO TCP verwenden?

Ich frage nur, weil wenn ich beim S7 Manager die Option ISO Ind. Ethernet Centrino waehle, bekomme ich keine Verbindung. Libnodave bietet mir aber nur ISO TCP an, kein TPC/IP.

Bis jetzt habe ich folgendne Code


Private Sub CommandButton1_Click()
    Dim PortHandle As Long
    Dim DeviceInterface As Long
    Dim DeviceConnection As Long

    Dim Result As Long

    PortHandle = openSocket(102, "10.196.47.110")

    If PortHandle > 0 Then
        DeviceInterface = daveNewInterface(PortHandle, PortHandle, "IF1", 0, daveProtoISOTCP, daveSpeed187k)
        Result = daveInitAdapter(DeviceInterface)

        If Result = 0 Then
            DeviceConnection = daveNewConnection(DeviceInterface, 0, 0, 0)
            Result = daveConnectPLC(DeviceConnection)
        End If

        Result = closeSocket(PortHandle)
    End If
End Sub

PortHandle ist 3348
DeviceInterface ist 54201864
DeviceConnection ist 54206768

Result nach InitAdapter ist 0 und Result nach ConnectPLC ist ebenfalls 0. 
Das bedeutet doch, dass die Verbindung fehlerfrei aufgebaut worden ist, oder?


----------



## PN/DP (6 Dezember 2013)

Burkhard schrieb:


> Result nach InitAdapter ist 0 und Result nach ConnectPLC ist ebenfalls 0.
> Das bedeutet doch, dass die Verbindung fehlerfrei aufgebaut worden ist, oder?


Ja.

Hast Du Dir mal die in Beitrag #3 verlinkte FAQ angesehen?
Da findest Du fertigen Beispielcode in VBA.

Ein typischer Verbindungsaufbau sieht etwa so aus:

```
Private Function connect_Machine_1(ByRef ph As Long, ByRef di As Long, ByRef dc As Long) As Long
...
connect_Machine_1 = -1 ' Function-Rückgabewert bei Fehler beim Verbindungsaufbau
' Verbindungsparameter TCP: peer$, Rack, Slot (MpiPpi wird nicht genutzt)
peer$ = "192.168.2.11"
MpiPpi = 2: Rack = 0: slot = 2
' port-Handle erzeugen
ph = openSocket(102, peer$)
If (ph > 0) Then
    di = daveNewInterface(ph, ph, "IF1", 0, daveProtoISOTCP, daveSpeed187k)
    res = daveInitAdapter(di)
    If res = 0 Then
        dc = daveNewConnection(di, MpiPpi, Rack, slot)
        res = daveConnectPLC(dc)
        If res = 0 Then ' Verbindung zu PLC erfolgreich aufgebaut
            connect_Machine_1 = 0 ' Function-Rückgabewert bei Verbindungsaufbau OK
        Else ' Fehler daveNewConnection() oder daveConnectPLC()
            resmb = MsgBox("Keine Verbindung zur PLC Maschine_1!" & Chr(13) _
                         & "(" & peer$ & ":102, Rack 0, Slot " & slot & ")", vbExclamation, "Fehler bei Verbindungsaufbau")
        End If
    Else ' Fehler daveNewInterface() oder daveInitAdapter()
        resmb = MsgBox("Fehler beim Initialisieren TCP-Interface!", vbExclamation, "Fehler bei Verbindungsaufbau")
    End If
Else ' Fehler openSocket()
    resmb = MsgBox("Fehler beim Öffnen TCP-Socket!" & Chr(13) _
                 & "(" & peer$ & ":102)", vbExclamation, "Fehler bei Verbindungsaufbau")
End If
```

Für LibNodave ist es egal, was Du in "PG/PC-Schnittstelle" eingestellt hast. LibNodave verwendet es nicht. LibNodave benötigt kein installiertes Step7 oder Siemens-Treiber.
"DeviceInterface = daveNewInterface(PortHandle, PortHandle, "IF1", 0, daveProtoISOTCP, daveSpeed187k)" entspricht dem PG/PC-Schnittstelle einstellen, das dabei von LibNodave zu verwendende Protokoll wird durch daveProtoISOTCP angegeben.
Wenn Dein PC mehrere Netzwerkadapter hat, dann wählt Windows anhand der Routing-Regeln den zur Ziel-IP führenden Adapter.

Harald


----------



## Burkhard (6 Dezember 2013)

Ja, es klappt bei mir jetzt. Ich kann Werte aus einem DB auslesen. Es war ganz easy.

Jetzt habe ich eine andere Frage. Eine SPS hier ist etwas anders als die anderen. Sie hat keinen Netzwerkanschluss. Ich kann mich nur mit der Profibus-Schnittstelle vom Programmiergeraet ueber die CP5611 Schnittstelle verbinden. 

Welche Chancen habe ich hier Daten auszulesen und in meine Excelapplication zu uebertragen?


----------



## PN/DP (6 Dezember 2013)

Du könntest einen MPI/Profibus-Ethernet-Adapter wie Netlink, S7LAN, ... auf die PLC stecken.

Harald


----------



## PN/DP (6 Dezember 2013)

Oder die SPS per MPI oder Profibus mit einer anderen SPS verbinden, welche einen Netzwerkanschluß hat. LibNodave kann jetzt auch S7-Routing.

Harald


----------



## Burkhard (7 Dezember 2013)

Gibt es Erfahrungen zur Geschwindigkeit der Auslesung von Daten und zur Optimierung davon? Ich moechte gerne Zyklusgenau Daten aus der SPS erfassen. Es handelt sich um Kraftmesswerte. Die Zykluszeit der SPS muss ich noch ermitteln, ich vermute es ist ein Wert zwischen 10 und 50 Millisekunden.

Die Auslasung des Netzwerkes spielt hier sicher eine Rolle. Daneben auch die Geschwindigkeit des VBA Programmes, der Loop, welche die Daten einliest. Ich moechte gerne auf ein Triggersignal reagieren und dann zwei Sekunden lang Daten sammeln, ich denke dass dabei 1000 Real-Zahlen aus einem DB gelesen werden. 2ms zwischen jedem Datenwert. 

Da die Zeiterfassung, die Genauigkeit, sagen wir einfach mal der Jitter von VBA nicht so genau und praezise sind, macht es vielleicht Sinn zu jedem Messwert einen Zeitwert von einem Timer aus der SPS mit zu erfassen.

Eine weitere Alternative waere es, die Daten in der SPS in jedem Zyklus (index=index+1 in ein Array zu schreiben und nach erfolgter Messung das Array mit libnodave auszulesen.

Gibt es dazu Erfahrungen?


----------



## PN/DP (7 Dezember 2013)

Ich meine, das schafft noch nichtmal Step7, zyklusgenau alle 10ms auszulesen.
Puffere Deine Messdaten in einen DB, da bist Du auf der sicheren Seite, egal wie schnell Deine SPS ist.
Am Ende des Meßzyklus setze ein Triggerbit, dann kannst Du in aller Ruhe den Datenblock auslesen.

Zur Kommunikationsgeschwindigkeit gibt es Erfahrungen von Forumsmitgliedern, die werden sich sicher noch melden. Irgendwo gibt es hier im Forum auch schon Beiträge mit Zeitangaben.

Harald


----------



## Burkhard (10 Dezember 2013)

Wenn ich nur eine Fliesskommazahl aus der SPS lese mit ReadBytes und GetFloat dann ist die Zykluszeit in der VB6 Loop-Until-Schleife (gelesen mit timeGetTime aus der  (winmm.dll ) durchschnittlich 20ms. Lese ich aber drei Fliesskommazahlen aus der SPS schwillt die Zykluszeit in meiner Schleife auf 70-80ms an.

Ich moechte so wie das alle Programme machen, die Daten aus der SPS lesen, keine Veraenderungen am SPS Programm machen. Ich moechte eine Daten-Rate von 20-30ms erreichen, und dabei ungefaehr 8 Worte lesen.

Leider bekomme ich beim Execute-Befehl die Fehlermeldung 5, means the data address is beyond the CPUs address range.


----------



## Zottel (10 Dezember 2013)

Liest du ein- oder 3 mal mit ReadBytes? wenn du readmes und faqs gelesen hast, wirst du auch gelesen haben, daß ich dazu rate, möglichst viele Variablen en bloc zu lesen. Die Ausführungszeit von getFloat ist vernachlässigbar.


----------



## PN/DP (10 Dezember 2013)

Ich selber habe keine Zeitmessungen gemacht doch ich meine, es macht fast keinen Unterschied in der Geschwindigkeit, ob man 1 REAL oder 50 REAL aus einem Array mit ReadBytes liest. Wenn man jeden REAL in einer extra Anfrage liest, dann multipliziert sich natürlich die Auslesezeit. Wenn Deine Daten quer durch die ganze SPS verstreut liegen, dann solltest Du das Auslesen in einem Multiple Item Read zusammenfassen. Das beste ist aber, die Daten schon in der SPS "kommunikationsfreundlich" in einem DB zusammenzufassen.

Harald


----------



## Burkhard (10 Dezember 2013)

Danke dass ihr euch die Zeit genommen habt zu antworten. Ja, ich lese dreimal mit ReadBytes. Jedes mal lese ich vier Byte und wandle mit GetFloat in eine REAL-Zahl. Das Ziel ist es, wie mit einem handelsueblichen Data-Logging-Programm, die Verbindung zur SPS herzustellen, eine Anzahl an Daten aus zu waehlen und diese dann mit einer akzeptablen durchschnittlichen Zykluszeit zwischen 40ms und 50 ms auszulesen. Es sollen, wenn moeglich, keine Aenderungen an der SPS durchgefuehrt werden muessen!

Ja, ich habe die FAQ und Doku gelesen und weiss, dass meine Anfangsvariante mit einzelnen ReadBytes-Befehlen, die zu Testzwecken ganz gut war, verbesserungswuerdig ist. Darum habe ich gestern auch mit dem Multiple Item Read begonnen. Ich habe mich an das VBA Beispielprogramm gehalten: die PDU erzeugt, das Resultset erzeugt, den Request vorbereitet, Variablen zum Request hinzu gefuegt (die gleich Werte wie bei meinen Readbyte-Befehlen, die funktionieren), aber beim ExecuteRequest-Befehl bekomme ich den Fehler 5. Wenn ich die Meldung umwandle, erhalte ich "the data address is beyond the CPUs address range." Irgendwo habe ich was falsch gemacht. Ich probiere es heute noch mal aus und poste meine Code. 

Gruss aus Shanghai. Burkhard.


----------



## Burkhard (11 Dezember 2013)

```
Sub MyReadMultipleItemsFromPLC()
    Dim FloatResult1 As Single
    Dim FloatResult2 As Single
    Dim FloatResult3 As Single
    Dim ResultSet As Long
    Dim PDU As Long
    Dim Err As String
    
    'Establish Connection to PLC
    
    PortHandle = openSocket(102, "10.196.47.224")
    
    If PortHandle > 0 Then
        DeviceInterface = daveNewInterface(PortHandle, PortHandle, "IF1", 0, daveProtoISOTCP, daveSpeed187k)
        Result = daveInitAdapter(DeviceInterface)
       
        If Result = 0 Then
            DeviceConnection = daveNewConnection(DeviceInterface, 0, 0, 2)
            Result = daveConnectPLC(DeviceConnection)
            If Result = 0 Then
                MsgBox ("connectPLC successful")
            Else
                MsgBox ("connectPLC failed")
                End
            End If
        Else
            Call MsgBox("InitAdapter failed")
            End
        End If
    Else
        Call MsgBox("OpenSocket failed")
        End
    End If
    'Read Data as single requests from PLC

    Result = daveReadBytes(DeviceConnection, daveDB, 195, 80, 4, Empty)
    FloatResult1 = daveGetFloat(DeviceConnection)
        
    Result = daveReadBytes(DeviceConnection, daveDB, 199, 0, 4, Empty)
    FloatResult2 = daveGetFloat(DeviceConnection)
        
    Result = daveReadBytes(DeviceConnection, daveDB, 199, 4, 4, Empty)
    FloatResult3 = daveGetFloat(DeviceConnection)

    'Read Data as multiple item request from PLC
     PDU = daveNewPDU
     Call davePrepareReadRequest(DeviceConnection, PDU)
     Call daveAddVarToReadRequest(PDU, daveDB, 199, 0, 4)
     Call daveAddVarToReadRequest(PDU, daveDB, 199, 4, 4)
     Call daveAddVarToReadRequest(PDU, daveDB, 195, 80, 4)
       
    ResultSet = daveNewResultSet
    
    Result = daveExecReadRequest(DeviceConnection, PDU, ResultSet)
    
    If Result = 0 Then
        
        Result = daveUseResult(DeviceConnection, ResultSet, 0)
        FloatResult1 = daveGetFloat(DeviceConnection)
        
        Result = daveUseResult(DeviceConnection, ResultSet, 0)
        FloatResult2 = daveGetFloat(DeviceConnection)
        
        Result = daveUseResult(DeviceConnection, ResultSet, 0)
        FloatResult2 = daveGetFloat(DeviceConnection)
            
        daveFreeResults (ResultSet)
    Else
        Err = daveStrError(Result)
    End If
    
    daveFree (ResultSet)
    daveFree (PDU)
    Call CloseConnection
End Sub
```

Hier ist der mein Testcode. Ich bekomme bei ExecuteRequest, wie gesagt, den Fehler Nummer 5. Und weiss nicht was ich falsch mache... Bitte helft mir!!

Wenn ich statt daveDB, daveFlags verwende und die Merker MW0, MW2 und MW4 lese, dann bekomme ich keinen Fehler. Ich will aber keine Merker lesen, ich will Datenbausteine lesen.


----------



## funkey (11 Dezember 2013)

Und es gibt DB199 und DB195 in der SPS?


----------



## Burkhard (12 Dezember 2013)

Ja, natürlich, Wie du in meinem Test Code siehst, stelle ich ja die Verbindung zur SPS her, lese dann mit readbytes dreimal aus den DB 195 und 199. Ohne Fehler! 
Dann will ich aus den gleichen DB lesen, aber mit dem multiple Read request. Beim execute gibt's die Fehlermeldung. Da ist offenbar ein derber Bug in libnodave!


----------



## funkey (12 Dezember 2013)

Hab gerade noch einmal getestet, bei mir läufts einwandfrei.


----------



## Burkhard (12 Dezember 2013)

funkey schrieb:


> Hab gerade noch einmal getestet, bei mir läufts einwandfrei.



Oben im Programm siehst du das normale Lesen mit ReadBytes, aus genau den gleichen DBs wo ich dann auch unten mit dem Multiple Read lese. Siehst du denn einen Fehler in meinem Code?

Nutzt du auch VBA in Excel? Liest du auch aus DBs? Kannst du mal deinen Code posten? Danke!


----------



## Burkhard (12 Dezember 2013)

Auf einmal gehts! Ja, sakradi !!!!


----------



## emilio20 (16 Dezember 2013)

Hallo
gibt es eine Anleitung im libnodave besser kennenzulernen?
ich wurde gerne über Autoit eine Libnodave Verbindung zu meiner SPS 315 PN aufbauen. Hierzu gibt es schon ein Projekt. Allerdings verstehe ich noch nicht den Aufbau?

Wenn jemand Lust hat könnte er mir mal diesen Code erklären?


```
#include "LibNoDave.au3"

Global $IP_SPS1 = "10.1.3.105", $Socket_SPS1, $di_SPS1, $dc_SPS1, $Name_SPS1 = "SPS1"

_DaveInit()

_daveTCPConnect($IP_SPS1, $Socket_SPS1, $di_SPS1, $dc_SPS1, 0, 2, $Name_SPS1)
If @error Then
    MsgBox(16, "Error " & @error, "TCP connection parameter incorrect for SPS1!")
    DllClose($DLL)
    Exit
EndIf

Local $Anzahl_Bytes = 7
Local $StartByte = 220
; Schreibe 7 Bytes ausgehend vom MB 230

$Buffer = DllStructCreate("CHAR buf[" & $Anzahl_Bytes & "]")
$pBuffer = DllStructGetPtr($Buffer)

_davePut8($pBuffer, 127)
_davePut16($pBuffer, 3)
_davePutFloat($pBuffer, 644321.55)

_daveWriteBytes($dc_SPS1, $daveFlags, 0, $StartByte, $Anzahl_Bytes, $Buffer)

_daveTCPDisconnect($Socket_SPS1, $di_SPS1, $dc_SPS1)
_DaveDeInit()
```


----------



## funkey (17 Dezember 2013)

Wo liet genau das Problem?
Die LibNoDave-UDF wird initialisiert.
Es wird eine Netzwerk-Verbindung zur SPS mit der IP 10.1.3.105 auf Rack 0 und Slot 2 aufgebaut.
Es wird ein Speicherbereich von 7 Bytes vorbereitet.
Es wird die Zahl 127 in den Speicherbereich geschrieben (MB220).
Es wird die Integer-Zahl 3 in den Speicherbereich geschrieben (MW221).
Es wird die Float-Zahl 644321.55 in den Speicherbereich geschrieben (MD223).
Die sieben Bytes aus dem Speicherbereich werden auf die SPS geschrieben.
Die Netzwerkverbindung wird abgebaut.
Die LibNoDave-UDF wird deinitialisiert (nicht nötig, das geschieht automatisch).


----------



## emilio20 (17 Dezember 2013)

Hallo danke erst mal für die antwort.

folgendes ist mir noch unklar ? für was sind die anderen Variablen ? 

Golobale Variable ,       IP der SPS  ,             ???    ,        ??     ,    ???       , ?????
Global $IP_SPS1 = "10.1.3.105", $Socket_SPS1, $di_SPS1, $dc_SPS1, $Name_SPS1 = "SPS1"



ISt dies die Verbinfungsart ? ,  IP der SPS, Slocket ,         di ??,    ,    dc???? , 0 , 2,   ??  
daveTCPConnect                  ($IP_SPS1, $Socket_SPS1, $di_SPS1, $dc_SPS1, 0, 2, $Name_SPS1)


----------



## emilio20 (18 Dezember 2013)

Hallo, funkey

wenn ich das oben genante Script auf meinen Rechner mit der IP meiner SPS 315 PN Starte wird kein Bit in den bereichen 220 - 223 gesetzt.
Was müsste doch funktionieren oder ?

Ich wurde mal in der einfachsten ausführung ohne Variablen den Befehl benötigen um eine Verbindung zu einer 315 PN über ISO over TCP zu erhalten ?


```
_daveTCPConnect(192.168.178, ????,????,?????, 0, 2, $Name_SPS1)
oder
_openS7online
```

mir wäre sehr geholfen wenn du mir mal den Verbindungsaufbau mit Zeiten und den Verbindungsaabau beschreiben könntest


----------



## funkey (19 Dezember 2013)

Die ganzen Variablen werden von LibNoDave gebraucht. Das ist der einfachste Weg!


```
#include "LibNoDave.au3"Global $IP_SPS = "192.168.178"
Global $Socket_SPS ; Der Socket wird von _daveTCPConnect() beschrieben
Global $di_SPS ; Das Device Interface wird von _daveTCPConnect() beschrieben
Global $dc_SPS ; Die Device Connection wird von _daveTCPConnect() beschrieben
Global $Name_SPS = "SPS-Name" ; Name wird bei Logging und Debugging ausgegeben
Global $CPU_Rack = 0
Global $CPU_Slot = 2
_DaveInit()

_daveTCPConnect($IP_SPS, $Socket_SPS, $di_SPS, $dc_SPS, $CPU_Rack, $CPU_Slot, $Name_SPS)
If @error Then
 MsgBox(16, "Error " & @error, "TCP connection parameter incorrect for " & $Name_SPS & "!")
 Exit
Else
 MsgBox(64, "OK", "TCP connection established for " & $Name_SPS & "!")
EndIf
_daveTCPDisconnect($Socket_SPS, $di_SPS, $dc_SPS)
```


----------



## emilio20 (19 Dezember 2013)

Hallo funkey
super TCP verbindung geht. Es kommt der Text "OK TCP connection established for ..."

Wenn ich jetzt das Schreiben der Variablen anhänge wird keine Variable gesetzt ? An was kann das leigen ?
Das Lesen von Variablen funktioniert. Nur das Senden noch nicht.
Mir ist noch unklar wie das Schreiben von Byts funktioniert ? für was ist 
 $Buffer = DllStructCreate("CHAR buf[" & $hLine & "]")
$pBuffer = DllStructGetPtr($Buffer)



```
#include "LibNoDave.au3"
    Global $IP_SPS = "192.168.178.30"
    Global $Socket_SPS ; Der Socket wird von _daveTCPConnect() beschrieben
    Global $di_SPS ; Das Device Interface wird von _daveTCPConnect() beschrieben
    Global $dc_SPS ; Die Device Connection wird von _daveTCPConnect() beschrieben
    Global $Name_SPS = "SPS-Name" ; Name wird bei Logging und Debugging ausgegeben
    Global $CPU_Rack = 0
    Global $CPU_Slot = 2
    _DaveInit()

    _daveTCPConnect($IP_SPS, $Socket_SPS, $di_SPS, $dc_SPS, $CPU_Rack, $CPU_Slot, $Name_SPS)
    
    $hDB = 5
    $hOffset=4
    $hLine=4
    
    _daveReadManyBytes($dc_SPS, $daveDB, $hDB, $hOffset, $hLine)
    $Ausgabe=_daveGetFloat($dc_SPS)
    
    
    
    
     ; Schreibe 

    $Buffer = DllStructCreate("CHAR buf[" & $hLine & "]")
    $pBuffer = DllStructGetPtr($Buffer)


     _davePutFloat($pBuffer, 25.0)

      _daveWriteBytes($dc_SPS, $daveDB, $hDB, $hOffset, $hLine, $Buffer)
    
    
    If @error Then
     MsgBox(16, "Error " & @error, "TCP connection parameter incorrect for " & $Name_SPS & "!")
     Exit
    Else
     MsgBox(64, "OK", "TCP connection established for " & $Ausgabe & $Name_SPS & "!")
  EndIf
  
  
  Sleep(5000)
  
    _daveTCPDisconnect($Socket_SPS, $di_SPS, $dc_SPS)
```


----------



## funkey (20 Dezember 2013)

```
#include "LibNoDave.au3"
Global $Socket_SPS ; Der Socket wird von _daveTCPConnect() beschrieben
Global $di_SPS ; Das Device Interface wird von _daveTCPConnect() beschrieben
Global $dc_SPS ; Die Device Connection wird von _daveTCPConnect() beschrieben
Global $Name_SPS = "SPS-Name" ; Name wird bei Logging und Debugging ausgegeben
Global $IP_SPS = "192.168.178.30"
Global $CPU_Rack = 0
Global $CPU_Slot = 2
_DaveInit()
_daveTCPConnect($IP_SPS, $Socket_SPS, $di_SPS, $dc_SPS, $CPU_Rack, $CPU_Slot, $Name_SPS)
If @error Then
 MsgBox(16, "Error " & @error, "TCP connection parameter incorrect for " & $Name_SPS & "!")
 Exit
Else
 MsgBox(64, "OK", "TCP connection established for " & $Name_SPS & "!")
EndIf
Global $iDB = 5 ; Nummer des Datenbausteines
Global $iOffset = 4 ; Adress-Offset im Datenbaustein
Global $iBytes = 4 ; Anzahl der im Speicher vorzubereitenden Bytes
Global $Ausgabe
Global $iRet = _daveReadManyBytes($dc_SPS, $daveDB, $iDB, $iOffset, $iBytes)
If $iRet <> 0 Then
 MsgBox(16, "Error " & $iRet, "Cannot read " & $iBytes & " Bytes from DB " & $iDB & " at offset " & $iOffset & "!")
Else
 $Ausgabe = _daveGetFloat($dc_SPS)
 MsgBox(64, "Success", "You got value " & $Ausgabe & " from " & $Name_SPS)
EndIf
; Schreibe
Global $Buffer = DllStructCreate("CHAR buf[" & $iBytes & "]") ; Speicher vorbereiten auf den die bytes geschrieben werden
Global $fValue = 25.0
_davePutFloat($Buffer, $fValue)
$iRet = _daveWriteBytes($dc_SPS, $daveDB, $iDB, $iOffset, $iBytes, $Buffer)
If @error Or $iRet <> 0 Then
 MsgBox(16, "Error " & $iRet, "Cannot write " & $iBytes & " Bytes to DB " & $iDB & " at offset " & $iOffset & "!")
Else
 MsgBox(64, "Success", "You wrote " & $fValue & " to " & $Name_SPS)
EndIf
_daveTCPDisconnect($Socket_SPS, $di_SPS, $dc_SPS)
```


----------



## emilio20 (20 Dezember 2013)

Hallo
super vielen Dank funktioniert.
Jetzt kann ich erst mal ein bisschen spielen damit.

Eine Frage noch
Wenn ich ein Programm habe da ständig Variablen sendet und empfängt muss ich dann die Verbindung jedes Mal öffnen und schließen? Oder mach ich eine schleife innerhalb der Verbindung?


----------



## funkey (20 Dezember 2013)

emilio20 schrieb:


> Eine Frage noch
> Wenn ich ein Programm habe da ständig Variablen sendet und empfängt muss ich dann die Verbindung jedes Mal öffnen und schließen? Oder mach ich eine schleife innerhalb der Verbindung?



Ich würde sagen das ist Geschmackssache, aber der Auf- und Abbau einer Verbindung dauert auch seine Zeit. Also wenn ich Daten z.B. alle 2 Sekunden aus der SPS hole, dann öffne ich nur am Anfang die Verbindung und schließe sie erst wenn ich das Programm beende. wenn ich aber nur alle 60 Sekunden Werte brauche, dann öffne und schließe ich die Verbindung jedes Mal.


----------



## Deep Blue (6 Januar 2014)

Hallo,

wie kann ich ein Array aus der SPS auslesen? Bekomme das nicht hin. Ich muß dem Array doch noch irgendwie sagen können, ab wo es zu lesen ist und wie lange.


```
[FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] wrt5 = conn.ReadValue([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"DB0.DBW0"[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2], [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]TagDataType[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].ByteArray)
```

Würde gerne größere Blöcke auslesen und dann im VB-Code bearbeiten.

Danke schon mal für die Antwort![/SIZE][/FONT][/SIZE][/FONT]


----------



## Bapho (7 Januar 2014)

ich mach das immer so

```
_result = dc.readBytes(libnodave.daveDB, DBNr,Startbyte,Menge_Bytes, null);
```
dann dröselste das ganze über eine Schleife in ein Array wie du es willst und gut.
Allerdings hab ich euch keine riesigen Arrays und mit der readmutiple Geschichte hab ich mich noch nicht befassen müssen.


----------



## Burkhard (14 Januar 2014)

Lesen von Lokalen Variablen (gekennzeichnet mit dem Hash mark #)? Ist das moeglich?​


----------



## Burkhard (21 Januar 2014)

*Ist das Lesen aus Function Block (FB) moeglich?*

Ich habe in meiner S7 Steuerung Signale in einem Function Block (FB302). Das Signal ist definiert im Interface unter STAT. Dort taucht es mit einer Addresse auf (Typ bool, Address 70.1). Im Quellcode selber hat es ein Hashtag #vor dem Namen.

Wie kann ich dieses Signal mit Libnodave auslesen? Gibt es dazu eine Information?

In Libnodave finde ich folgende Konstanten:

Public Const daveInputs = &H81
Public Const daveOutputs = &H82
Public Const daveFlags = &H83
Public Const daveDB = &H84 '  data blocks
Public Const daveDI = &H85  '  instance data blocks
Public Const daveV = &H87      ' don't know what it is
Public Const daveCounter = 28  ' S7 counters
Public Const daveTimer = 29    ' S7 timers

Welche ich im Befehl

  Call daveAddBitVarToReadRequest(PDU, daveDB, 302, 70 * 8 + 1, 1)

verwenden kann.

Fuer daveDB geht das auch. Nun habe ich aber wie gesagt, den Fall dass ich aus einem FB lesen will. Es gibt aber kein daveFB in Analogie zum DB?


----------



## Bapho (21 Januar 2014)

1. Ein FB hat immer einen InstanzDB, der wird ihm beim Aufruf zugewiesen und da sind die Variablen drinne.
2. Mach dir einen globalen DB und kopier dir da alles rein was du auslesen willst und hol das dort in einem Rutsch raus.
3. erschließt sich mir nicht, warum man temp Variablen auslesen sollte


----------



## Burkhard (21 Januar 2014)

Bapho schrieb:


> 1. Ein FB hat immer einen InstanzDB, der wird ihm beim Aufruf zugewiesen und da sind die Variablen drinne.2. Mach dir einen globalen DB und kopier dir da alles rein was du auslesen willst und hol das dort in einem Rutsch raus.3. erschließt sich mir nicht, warum man temp Variablen auslesen sollte



Nicht TEMP Variablen, es handelt sich um STAT Variablen. Und ob sich dir was erschliesst oder steht hier nicht zur Diskussion! Produktive Antworten sind erwuenscht!  
Die Frage ist, ob es moeglich ist, ja oder nein!

Ich kann an dem Programm keine Aenderung vornehmen, da es eine Standardsoftware ist, die auf vielen Maschinen weltweit laeuft. Es muesste dann ueberall ein Update durchgefuehrt werden.

Die Aufgabe ist, hier in unserem Werk, aus dem Baustein die Daten der STAT-Variablen auszulesen. Der korresponiderende Datenbaustein ist mit KnowHow-Schutz versehen, ich sehe nicht was darin ist.

Wenn ein Signal eine Adresse hat, sollte es moeglich sein es zu lesen. Ob es nun in einem DB oder in einem FB drin ist, sollte doch keine Rolle spielen? Die Frage ist, wie kann ich das STAT signal auslesen?

Die Frage geht auch an die Anbieter von anderen Bibliotheken, wie zB von DELTALOGIG. Ich bitte um eine produktive Antwort! 

Wenn es nicht geht, dann geht es eben nicht. Dann muss ich an dem Programm eben doch eine Aenderung vornehmen. Dafuer muss ich erst die Erlaubnis der Programmaenderung einholen und weiterhin das Distributed Safety Package kaufen, denn im Moment ist der FB read-only.


----------



## scrolllkock (21 Januar 2014)

OK, du willst keine Diskussion, nur eine Antwort:
Nein, temporäre Daten können nicht ausgelesen werden. Programm muss geändert werden.


----------



## PN/DP (21 Januar 2014)

Burkhard schrieb:


> Nicht TEMP Variablen, es handelt sich um STAT Variablen. Und ob sich dir was erschliesst oder steht hier nicht zur Diskussion!
> [...]
> Die Aufgabe ist, hier in unserem Werk, aus dem Baustein die Daten der temp-Variablen auszulesen. Der korresponiderende Datenbaustein ist mit KnowHow-Schutz versehen, ich sehe nicht was darin ist.
> 
> Wenn ein Signal eine Adresse hat, sollte es moeglich sein es zu lesen. Ob es nun in einem DB oder in einem FB drin ist, sollte doch keine Rolle spielen? Die Frage ist, wie kann ich das STAT signal auslesen?


Ja was willst Du denn nun lesen? TEMP oder STAT? 

Zunächst: Statt die Helfer zu beschimpfen solltest Du Dir mal mehr Mühe bei der Formulierung Deiner Fragen geben und nicht die Fachbegriffe durcheinanderwürfeln. (Bist Du überhaupt ein SPS-Programmierer?)

Zweitens: TEMP-Variablen kann man nicht von außen lesen, weil TEMP-Variablen keine absolute Adresse haben. Sie haben nur einen relativen Offset zu einer nicht bekannten (möglicherweise dynamisch vergebenen) Anfangsadresse im Lokaldatenstack. Auch der Simatic Manager kann nicht von außen auf TEMP-Variablen zugreifen.
Ausnahme: ein Baustein B, der direkt vom Baustein A aufgerufen wird, kann auf die TEMP-Variablen des Bausteins A zugreifen (Stichwort: Vorgänger-Lokaldaten) - das ist allerdings höchst unsauber, weil der Baustein B nicht wirklich die Struktur der Lokaldaten des aufrufenden Bausteins A kennt; er weiß ja noch nichtmal, von welchem Baustein A,X,Y... er aufgerufen wurde.

Drittens: STAT-Variablen kann man von außerhalb lesen, indem man auf deren absolute Adresse im IDB zugreift: DB12.DBX34.5. Im SPS-Programm geht das sogar symbolisch: "IDB_Regler1".internes_Fehlerbit
Die absolute Adresse einer STAT-Variable kann man aus der Schnittstelle des FB oder aus dem IDB erfahren.
Sollte der FB als Multiinstanz aufgerufen werden, dann muß man etwas mehr rechnen, was die absolute Adresse der STAT-Variable der betreffenden Instanz ist; oder in den IDB desjenigen FB schauen, der den betreffenden FB als Multiinstanz enthält.
Wenn man die absolute Adresse aus irgendwelchen Gründen nicht rauskriegt, dann könnte man den original-Programmierer danach fragen...

Viertens: Dein FB302, an dem Du rumfummeln willst - ist das womöglich ein F-Baustein?

Deine sonstigen Äußerungen von vor und nach dem Ändern Deines Beitrags bezüglich KnowHow-Schutz und read-only ignoriere ich zunächst mal. Die empfinde ich als so verworren - wenn Du dazu Auskünfte willst, dann formuliere die Frage nochmal neu.

Harald


----------



## Bapho (21 Januar 2014)

Ist schon eine grausame Welt in der man vor dem Auslesen wissen muß was man wo auslesen will...


----------



## Burkhard (22 Januar 2014)

scrolllkock schrieb:


> Nein, temporäre Daten können nicht ausgelesen werden. Programm muss geändert werden.





PN/DP schrieb:


> Ja was willst Du denn nun lesen? TEMP oder STAT?
> 
> Zunächst: Statt die Helfer zu beschimpfen solltest Du Dir mal mehr Mühe bei der Formulierung Deiner Fragen geben und nicht die Fachbegriffe durcheinanderwürfeln. (Bist Du überhaupt ein SPS-Programmierer?)



Nach TEMP Variablen war von meiner Seite aus niemals gefragt worden. Ich habe klar formuliert, dass die Variablen unter STAT definiert sind. Wer hier TEMP und STAT durcheinander wuerfelt, war Bapho.

Von Beschimpfungen kann auch gar nicht die Rede sein. Ich habe schlicht und ergreifend gesagt, dass es nicht darum geht ob der Helfer etwas als sinnvoll erachtet, sondern nur ob es geht. 

Bapho aber hat STAT und TEMP Signale verwechselt! Das ist ein Fakt.

Dennoch kam ein interessanter und hilfreicher Beitrag, naemlich die Antwort, dass STAT Variablen aus einem FB in dem korrespondierenden DB zu finden sind. Ich bin ein Beckhoff-TwinCat Programmierer mit 12 Jahre Erfahrung mit Beckhoff und TwinCat. Mit Siemens S7 befasse ich mich zwangslaeufig und finde, das System kommt eben aus dem vorigen Jahrhundert. Was macht es fuer einen Sinn einen FB und einen DB zu haben? Damit blaeht man die Struktur nur unnoetig auf. Es reicht wenn man einem Signal einmal im FB adressiert. Ein weiterer DB ist unnoetig.

Ja, es handelt sich um einen F-DB. Es ist ein Safety Datablock!


----------



## scrolllkock (22 Januar 2014)

Wurden da Beiträge nachträglich geändert? War mir sicher in der ursprünglichen Frage was von temp gelesen zu haben. Naja, vielleicht habe ich mich getäuscht.


----------



## Burkhard (22 Januar 2014)

Im Beitrag #44 habe ich nichts nachtraeglich geaendert. Es war von Anfang an von STAT Variablen die Rede. Schwamm drueber.

Ja PN/DP die Datenbausteine DB aus denen ich etwas lesen will, sind F-DB Bausteine. Mit Libnodave kann ich nicht daraus lesen. Wenn ich die Adresse angebe und lese, bekomme ich Fehler 10.

Public Const daveResItemNotAvailable = 10         ' means a a piece of data is not available in the CPU, e.g.
                                                                        ' when trying to read a non existing DB


----------



## Bapho (22 Januar 2014)

Hmm, offensichtlich hab ich das ja nicht als einziger verwechselt, egal.

Ich denke mal Siemens nimmt gerne Beschwerden über das ganze S7 System entgegen, mir gefällt das auch nicht, aber wenn es der Kunde fordert bzw. solche Steuerungen vorhanden sind, haben wir ja nicht wirklich eine Wahl.

Sag uns doch mal die absolute Adresse der Daten die du abrufen willst und dann den Aufruf zum Auslesen von Libnodave, ich denke mal da liegt der Hase im Pfeffer, aber ohne bissle Code ist das nur was für die Kristallkugel.


----------



## bike (22 Januar 2014)

Burkhard schrieb:


> Ja PN/DP die Datenbausteine DB aus denen ich etwas lesen will, sind F-DB Bausteine. Mit Libnodave kann ich nicht daraus lesen. Wenn ich die Adresse angebe und lese, bekomme ich Fehler 10.



Denkst du es macht Sinn von außerhalb auf F-Bausteine zu zugreifen?
Also da musst du zuerst lernen was "F" bedeutet.
Grundlagen kennen hilft enorm, auch hier.

Ich würde auch nicht jeden auf meine sicheren Einstellung zugreifen lassen.


bike


----------



## Burkhard (23 Januar 2014)

Ich habe die falsche IP verwendet und von der falschen Steuerung gelesen, darum hab ich Fehler 10 bekommen.

Mit der richtigen IP kann ich auch fehlerfrei aus einem F-DB lesen. Muss nur mal schauen ob auch der richtige Wert ausgelesen wird. Das werde ich gleich heute ausprobieren.


----------



## Burkhard (23 Januar 2014)

Ich habe mir verschiedene F-DBs herausgesucht und innerhalb dieser verschiedene Signale identifiziert, die mich interessieren. Diese habe ich ausgelesen und jeweils den richtigen Wert erhalten. Damit ist klar dass es funktioniert. Mein Fehler war einfach nur die falsche IP-Addresse, wie dumm von mir 

Damit ist klar, dass "bike" sich geirrt hat, man kann sehr wohl auch aus F-DBs herauslesen. Warum auch nicht. Solange mit nicht hineinschreibt, ist doch alles IO.

PN/DP weisst du mehr uber das Lesen und Schreiben aus und in F-DBs?


----------



## Burkhard (23 Januar 2014)

F-DBs sind Failsafe DBs die Sicherheitsgerichteten Code enthalten. Dieser muss einige besondere Anforderungen erfuellen. Welche das sind weiss ich nicht. 

Man kann damit auf eine Sicherheits SPS wie zB die PNOZ von PILZ verzichten und normalen SPS code und Safety-SPS code in einer SPS laufen lassen.


----------



## bike (25 Januar 2014)

Irre ich mich wirklich?
Also wir haben versucht über OPC und DDE F. Bausteine zu lesen.
Das lesen geht bedingt, schreiben nicht, da das zweite Programm nicht aktualisiert werden und daher ein KDV auftritt.
Wer übernimmt die Verantwortung wenn durch solche Basteleien es zu einem Unfall kommt?


bike


----------



## Bapho (25 Januar 2014)

bike schrieb:


> Irre ich mich wirklich?
> Wer übernimmt die Verantwortung wenn durch solche Basteleien es zu einem Unfall kommt?
> bike



Ich würde mal sagen, da zieht dir der Staatsanwalt die Hosen runter, die Schlüpfer bis zum Kinn hoch und das zu Recht.


----------



## Thomas_v2.1 (25 Januar 2014)

Da sollte er aber Siemens die Hosen runterziehen, denn wenn man von einer Visu in Instanz DBs von F-Bausteinen schreiben kann ohne dass die Steuerung in den sicheren Zustand versetzt wird, ist an dem System was faul.
Lesender Zugriff auf F-DBs aus nicht F-Bausteinen ist zumindest auch im SPS-Programm möglich (explizit so in den Siemens Dokus erwähnt), warum also nicht von einer Visualisierung?


----------



## bike (25 Januar 2014)

Thomas_v2.1 schrieb:


> Lesender Zugriff auf F-DBs aus nicht F-Bausteinen ist zumindest auch im SPS-Programm möglich (explizit so in den Siemens Dokus erwähnt), warum also nicht von einer Visualisierung?



Nicht F-Bausteine ist das Zauberwort.
Du kannst nicht von einem HMI direkt einen F-IDB beschreiben. DU kannst lesen, doch ist es mit Vorsicht zu geniessen.
Doch wer kommt auch auf solch einen Mist? 


bike


----------



## Thomas_v2.1 (25 Januar 2014)

Also ich sehe da keinen Unterschied zwischen dem Lesen von Daten aus einem F-DB und einem normalen DB. Ob man aus einem Instanz-DB lesen soll ist reine Geschmackssache.
Schreibender Zugriff ist hingegen sicherheitsrelevant, und darum mit 100%iger Wahrscheinlichkeit nicht möglich.


----------

