Discussion:
S7 ansteuern
(zu alt für eine Antwort)
Dimitri Alberto
2008-09-28 22:12:11 UTC
Permalink
Hallo,

weiss jemand, wie man eine Siemens SPS S7 per TCP/IP ansteuert? Gibts da ein
Protokoll oder dar ein paar Klassen dazu oder so?

Danke
Klaus Vietzke
2008-09-29 08:24:55 UTC
Permalink
Hallo Dimitri,
Post by Dimitri Alberto
Hallo,
weiss jemand, wie man eine Siemens SPS S7 per TCP/IP ansteuert? Gibts da ein
Protokoll oder dar ein paar Klassen dazu oder so?
Wir verwenden dafür ein Bibliothek von Traeger (IP-S7-Link).
Sie ist relativ günstig. Zu der Performance kann ich Dir noch nichts
sagen, da wir das Projekt noch nicht fertig haben. Ist aber von
unserem Projektpartner schon öfter erfolgreich eingesetzt worden (aber
nicht unter C# bisher, sondern unter C++/MFC).

Grüße,
Klaus
--
www.zertrox.de
Bildverarbeitung, Messtechnik, Programmierung aus Aachen.
Michael Böckinghoff
2008-09-29 08:36:36 UTC
Permalink
Post by Dimitri Alberto
weiss jemand, wie man eine Siemens SPS S7 per TCP/IP ansteuert? Gibts da ein
Protokoll oder dar ein paar Klassen dazu oder so?
Wenn es S7 / 315 2PN ist
kann man der per Sockets direkt Bytes schicken.

Also quasi so als wenn man mit nem Windows PC komuniziert...

Gruß

Michael
Dimitri Alberto
2008-09-29 08:55:39 UTC
Permalink
Post by Michael Böckinghoff
Post by Dimitri Alberto
weiss jemand, wie man eine Siemens SPS S7 per TCP/IP ansteuert? Gibts da ein
Protokoll oder dar ein paar Klassen dazu oder so?
Wenn es S7 / 315 2PN ist
kann man der per Sockets direkt Bytes schicken.
Also quasi so als wenn man mit nem Windows PC komuniziert...
Gibts dafür ne Beschreibung? Da soll irgendwie ein kurioses Protokoll sein
RFC1006 bzw. ISO on TCP was immer das ist.


Besten Dank
Frank Dzaebel
2008-09-29 17:57:08 UTC
Permalink
Hallo Dimitri,
Post by Michael Böckinghoff
Wenn es S7 / 315 2PN ist
kann man der per Sockets direkt Bytes schicken.
also das geht in der Theorie, aber aus der Praxis
heraus, nimm lieber die 3rd Parties.
Hier sind schon einige genannt, wir haben
noch andere genommen.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Michael Böckinghoff
2008-09-30 08:51:04 UTC
Permalink
Post by Dimitri Alberto
Gibts dafür ne Beschreibung? Da soll irgendwie ein kurioses Protokoll sein
RFC1006 bzw. ISO on TCP was immer das ist.
Hier die Beschreibung von Siemens:
http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=de&objid=18843927&caller=view




Und hier die Klasse die ich im CompactFramework dafür benutze (warscheinlich
hässlich umgebrochen jetzt):

Dafür braucht mal also kein 3rd party Treiber usw... geht alles bequem per
sockets (allerdings nur mit bestimmten CPU's)

Gruß

Michael
#################################################


using System;

using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;




namespace CFTerminalLib.ComProtokoll {
/// <summary>
/// ReadWriteToSocketServer
/// </summary>
public class ReadWriteToS7PLCSocketServer {


public ReadWriteToS7PLCSocketServer(string strServerName, int
iServerPort, int iLenghtDummy)
{
_strServerName = strServerName;
_iServerPort = iServerPort;
_iLenghtDummy = iLenghtDummy;
}


public bool Connect() {
try {
ConnectToServer(false);
}
catch{
_bExceptionAufgetreten=true;
return false;
}
return true;
}

public void Close() {
_tcpClient.Close();
}

public void SendDataToServer(Byte[] data) {
try {

if(_bExceptionAufgetreten) {
// Com Alive ist in den ersten 2 byte, zu null
schreiben...
data[0] = 0;
data[1] = 0;

ConnectToServer(true);
}


NetworkStream stream =_tcpClient.GetStream();
stream.Write(data, 0, data.Length);

}catch{
_bExceptionAufgetreten = true;
}
}

public byte[] ReadDataFromServer() {

byte[] returnBuffer = null;
try {

if(_bExceptionAufgetreten) {
ConnectToServer(true);
}

NetworkStream stream =_tcpClient.GetStream();

if (stream.DataAvailable)
{
_LastReadLength = stream.Read(_ReadBuffer, 0,
_ReadBuffer.Length);
byte[] ReadBuffer = new byte[_LastReadLength];
Array.Copy(_ReadBuffer, 0, ReadBuffer, 0,
_LastReadLength);
returnBuffer = ReadBuffer;
}

}catch(Exception exc){
System.Diagnostics.Debug.WriteLine("ERROR:ReadWriteToS7PLCSocketServer.ReadDataFromServer
" + exc.Message);
_bExceptionAufgetreten = true;
}

return returnBuffer;
}// End ReadDataFromServer




/// <summary>
/// Verbindung zum Server herstellen
/// </summary>
/// <param name="bCloseBeforeOpen"></param>
/// <returns></returns>
private bool ConnectToServer(bool bCloseBeforeOpen) {
if(bCloseBeforeOpen) {
try {

_tcpClient.Close();
NetworkStream stream = _tcpClient.GetStream();
stream.Close();

}
catch {
bCloseBeforeOpen=false;
}
}
_tcpClient = new TcpClient();
_tcpClient.Connect(IPAddress.Parse(_strServerName),_iServerPort);

// Nach dem Connect direkt einmal etwas
// Schicken damit der Ping Pong losgehen kann
System.Threading.Thread.Sleep(500);

byte[] data = new byte[_iLenghtDummy];

NetworkStream stream2 = _tcpClient.GetStream();
stream2.Write(data, 0, data.Length);

System.Threading.Thread.Sleep(500);

_bExceptionAufgetreten = false;
return true;
}// End ConnectToServer




TcpClient _tcpClient;

// Connect To Server ?
private string _strServerName;
private int _iServerPort;

/// <summary>
/// _ReadBuffer , ist der Empfangsbuffer
/// </summary>
private byte[] _ReadBuffer = new byte[64000];

bool _bExceptionAufgetreten = false;
int _LastReadLength=0;
int _iLenghtDummy = 0;



}// End Class
}//End Namespace
Ralf Lenfers
2008-09-30 11:26:28 UTC
Permalink
Hallo Michael.
Post by Michael Böckinghoff
Und hier die Klasse die ich im CompactFramework dafür benutze
Dafür braucht mal also kein 3rd party Treiber usw... geht alles bequem per
sockets (allerdings nur mit bestimmten CPU's)
[...]

Sieht interessant aus.
Wie wandelst du denn einen S7 Gleitpunktwert (Real) z.B. nach double?

Gruß,

Ralf
Michael Böckinghoff
2008-10-01 06:29:36 UTC
Permalink
Post by Ralf Lenfers
Hallo Michael.
Post by Michael Böckinghoff
Und hier die Klasse die ich im CompactFramework dafür benutze
Dafür braucht mal also kein 3rd party Treiber usw... geht alles bequem
per sockets (allerdings nur mit bestimmten CPU's)
[...]
Sieht interessant aus.
Wie wandelst du denn einen S7 Gleitpunktwert (Real) z.B. nach double?
Das ganze kommt als Bytestrom. du musst ntürlich wissen welcher variablentyp
an welchem Byte steht und dann die entsprechenden bytes umwandeln per

zb:
BitConverter.ToSingle(ab4ByteVector, 0);

Gruß

Michael
Michael Böckinghoff
2008-10-01 06:45:15 UTC
Permalink
hier nochmal nen codeschnipsel dazu, (bei siemens udn allenbreadly ist die
reihenfolge der bytes bei uns immer seltsamer weise verdreht):
für die standart datentypen geht das dann entprechend....

private string GetRealConvert(byte[] receiveArray, Symbolik sym,
bool bAllenBreadley)
{
Single fl32 = 0;
Byte[] fl32Array = new byte[4];

if (bAllenBreadley)
{
fl32Array[0] = receiveArray[sym.bytePos];
fl32Array[1] = receiveArray[sym.bytePos + 1];
fl32Array[2] = receiveArray[sym.bytePos + 2];
fl32Array[3] = receiveArray[sym.bytePos + 3];
}
else
{
fl32Array[3] = receiveArray[sym.bytePos];
fl32Array[2] = receiveArray[sym.bytePos + 1];
fl32Array[1] = receiveArray[sym.bytePos + 2];
fl32Array[0] = receiveArray[sym.bytePos + 3];
}

fl32 = BitConverter.ToSingle(fl32Array, 0);

return
fl32.ToString(System.Globalization.CultureInfo.InvariantCulture);
}

oder umgekehrt:

private void SetReal(byte[] sendByteArray, Symbolik sym, string
strValue, bool bAllenBreadley)
{
float fl32 = float.Parse(strValue,
System.Globalization.CultureInfo.InvariantCulture);
Byte[] fl32Array = BitConverter.GetBytes(fl32);

if (bAllenBreadley)
{
sendByteArray[sym.bytePos] = fl32Array[0];
sendByteArray[sym.bytePos + 1] = fl32Array[1];
sendByteArray[sym.bytePos + 2] = fl32Array[2];
sendByteArray[sym.bytePos + 3] = fl32Array[3];
}
else
{
sendByteArray[sym.bytePos] = fl32Array[3];
sendByteArray[sym.bytePos + 1] = fl32Array[2];
sendByteArray[sym.bytePos + 2] = fl32Array[1];
sendByteArray[sym.bytePos + 3] = fl32Array[0];
}
}
Dimitri Alberto
2008-09-30 22:00:48 UTC
Permalink
Post by Michael Böckinghoff
Und hier die Klasse
Besten Dank, werde ich sicher baldigst testen.

Ich hätte nicht gedacht hier sooo viele Infos zu bekommen. Da wurde aus
einer fast unmöglichen Herausforderung, doch recht schnell ein kleines
Problemchen ;-)

Besten Dank, auch an die anderen.
Axel Arnold Bangert
2010-12-26 14:49:53 UTC
Permalink
Hi Michael,
aus Kostengr?nden (ich kann mir keine S7 leisten) habe ich deinen Code mit dem ACcontrol von Deltalogic ausprobiert. Alles funktioniert gut bis zu -> stream.DataAvailable.

Leider ist im Stream Nichts drin, so dass ich nicht qweiter komme. Ich hatte auch schon mal ein S7 Programm (*.s7p) in das ACcontrol geladen, aber leider auch ohne Erfolg.

H?ttest Du da einen Tipp?
Beste Gr??e
Axel Arnold Bangert - Herzogenrath 2010
Post by Dimitri Alberto
Hallo,
weiss jemand, wie man eine Siemens SPS S7 per TCP/IP ansteuert? Gibts da ein
Protokoll oder dar ein paar Klassen dazu oder so?
Danke
Post by Klaus Vietzke
Hallo Dimitri,
Wir verwenden daf?r ein Bibliothek von Traeger (IP-S7-Link).
Sie ist relativ g?nstig. Zu der Performance kann ich Dir noch nichts
sagen, da wir das Projekt noch nicht fertig haben. Ist aber von
unserem Projektpartner schon ?fter erfolgreich eingesetzt worden (aber
nicht unter C# bisher, sondern unter C++/MFC).
Gr??e,
Klaus
--
www.zertrox.de
Bildverarbeitung, Messtechnik, Programmierung aus Aachen.
Post by Michael Böckinghoff
Wenn es S7 / 315 2PN ist
kann man der per Sockets direkt Bytes schicken.
Also quasi so als wenn man mit nem Windows PC komuniziert...
Gru?
Michael
Gibts daf?r ne Beschreibung? Da soll irgendwie ein kurioses Protokoll sein
RFC1006 bzw. ISO on TCP was immer das ist.
Besten Dank
Post by Ralf Lenfers
Hallo Dimitri.
Geht es dir dabei um die Einsparung irgendwelcher Lizenzkosten?
Ich wei? zwar nicht was du machen willst, und welche Voraussetzungen du auf
deinem
PC hast, aber hast du schon mal OPC in Betracht gezogen?
Das Protokoll spielt dabei eine untergeordnete Rolle. K?nnte auch ISO sein.
Wenn du die SW von Siemens f?r deinen PC hast, kannst du den OPC-Server
von Siemens einsetzen. Die haben auch einige Beispiele auf der CD.
Ansonsten k?nnte ich dir den OPC-Server von Advosol empfehlen.
Gru?,
Ralf
Post by Klaus Vietzke
Hallo Dimitri,
http://www.ibhsoftec-sps.de/german/first.htm
Der Adapter setzt den MPI-Bus auf TCP/IP um. Die Treiber / API wird
mitgeliefert.
Gruss,
Uwe
Post by Klaus Vietzke
Hallo Dimitri,
also das geht in der Theorie, aber aus der Praxis
heraus, nimm lieber die 3rd Parties.
Hier sind schon einige genannt, wir haben
noch andere genommen.
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
?hm ...
Ist OPC schnell genug f?r 1MB pro Sekunde?
Post by Klaus Vietzke
Hallo Dimitri
dies d?rfte [u.a.] stark von der Art/Struktur
der Datenpunkte/Datenzugriff abh?ngen,
also ob es um viele, diskrete Datenpunkte geht
oder gr?ssere Datenbl?cke/Arrays....
[softing] S7 OPC Server Performance-Test
(absolut ohne Gew?hr!)
<URL:http://www.softing.com/home/en/pdf/ia/tests/opc/S7_Performance_en.pdf>
--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/
Post by Ralf Lenfers
Hallo Dimitri.
Der einzige Grund f?r mich, dass "Lowlevelst" zu programmieren, w?re der,
dass ich dadurch Lizenzkosten f?r die Komponenten von Drittanbietern
einsparen k?nnte. Bei den zu erwartenden Kosten w?rde ich mir das allerdings
schwer ?berlegen. In dem Umfeld, wo solche Sachen ?blicherweise eingesetzt
werden, w?rde ich das als "Peanuts" abtun.
[...]
Ich hoffe, die Datenmenge brauchst du nur f?r irgendwelche Berechnungen
und musst sie nicht auch noch langfristig abspeichern;-)
Schreib doch einfach mal, was du ?berhaupt machen willst. Dann k?nnen
dir auch die anderen Poster bestimmt besser helfen.
Wenn du ?ber einen Testaufbau verf?gst, wovon ich mal schwer ausgehe,
dann mach doch einfach mal einen Test.
Die SW von Drittanbietern kannst du in der Regel meistens f?r 30 Tage
testen und mit den Beispielprogrammen bekommst du bestimmt ziemlich
schnell etwas auf die Beine gestellt.
Gru?,
Ralf
Post by Michael Böckinghoff
http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=de&objid=18843927&caller=view
Und hier die Klasse die ich im CompactFramework daf?r benutze (warscheinlich
Daf?r braucht mal also kein 3rd party Treiber usw... geht alles bequem per
sockets (allerdings nur mit bestimmten CPU's)
Gru?
Michael
using System;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
namespace CFTerminalLib.ComProtokoll {
/// <summary>
/// ReadWriteToSocketServer
/// </summary>
public class ReadWriteToS7PLCSocketServer {
public ReadWriteToS7PLCSocketServer(string strServerName, int
iServerPort, int iLenghtDummy)
{
_strServerName = strServerName;
_iServerPort = iServerPort;
_iLenghtDummy = iLenghtDummy;
}
public bool Connect() {
try {
ConnectToServer(false);
}
catch{
_bExceptionAufgetreten=true;
return false;
}
return true;
}
public void Close() {
_tcpClient.Close();
}
public void SendDataToServer(Byte[] data) {
try {
if(_bExceptionAufgetreten) {
// Com Alive ist in den ersten 2 byte, zu null
schreiben...
data[0] = 0;
data[1] = 0;
ConnectToServer(true);
}
NetworkStream stream =_tcpClient.GetStream();
stream.Write(data, 0, data.Length);
}catch{
_bExceptionAufgetreten = true;
}
}
public byte[] ReadDataFromServer() {
byte[] returnBuffer = null;
try {
if(_bExceptionAufgetreten) {
ConnectToServer(true);
}
NetworkStream stream =_tcpClient.GetStream();
if (stream.DataAvailable)
{
_LastReadLength = stream.Read(_ReadBuffer, 0,
_ReadBuffer.Length);
byte[] ReadBuffer = new byte[_LastReadLength];
Array.Copy(_ReadBuffer, 0, ReadBuffer, 0,
_LastReadLength);
returnBuffer = ReadBuffer;
}
}catch(Exception exc){
System.Diagnostics.Debug.WriteLine("ERROR:ReadWriteToS7PLCSocketServer.ReadDataFromServer
" + exc.Message);
_bExceptionAufgetreten = true;
}
return returnBuffer;
}// End ReadDataFromServer
/// <summary>
/// Verbindung zum Server herstellen
/// </summary>
/// <param name="bCloseBeforeOpen"></param>
/// <returns></returns>
private bool ConnectToServer(bool bCloseBeforeOpen) {
if(bCloseBeforeOpen) {
try {
_tcpClient.Close();
NetworkStream stream = _tcpClient.GetStream();
stream.Close();
}
catch {
bCloseBeforeOpen=false;
}
}
_tcpClient = new TcpClient();
_tcpClient.Connect(IPAddress.Parse(_strServerName),_iServerPort);
// Nach dem Connect direkt einmal etwas
// Schicken damit der Ping Pong losgehen kann
System.Threading.Thread.Sleep(500);
byte[] data = new byte[_iLenghtDummy];
NetworkStream stream2 = _tcpClient.GetStream();
stream2.Write(data, 0, data.Length);
System.Threading.Thread.Sleep(500);
_bExceptionAufgetreten = false;
return true;
}// End ConnectToServer
TcpClient _tcpClient;
// Connect To Server ?
private string _strServerName;
private int _iServerPort;
/// <summary>
/// _ReadBuffer , ist der Empfangsbuffer
/// </summary>
private byte[] _ReadBuffer = new byte[64000];
bool _bExceptionAufgetreten = false;
int _LastReadLength=0;
int _iLenghtDummy = 0;
}// End Class
}//End Namespace
Post by Ralf Lenfers
Hallo Michael.
[...]
Sieht interessant aus.
Wie wandelst du denn einen S7 Gleitpunktwert (Real) z.B. nach double?
Gru?,
Ralf
...w?rde nur bei Massenfertigung Sinn machen, aber das ist kaum vorstellbar.
Ansonnsten ist die eigene Arbeitsleistung wohl immer teurer als der Zukauf.
Testaufbau? Der war gut - ich soll das fertig haben, bevor die wissen was
sie wollen.
Post by Dimitri Alberto
Besten Dank, werde ich sicher baldigst testen.
Ich h?tte nicht gedacht hier sooo viele Infos zu bekommen. Da wurde aus
einer fast unm?glichen Herausforderung, doch recht schnell ein kleines
Problemchen ;-)
Besten Dank, auch an die anderen.
Das ganze kommt als Bytestrom. du musst nt?rlich wissen welcher variablentyp
an welchem Byte steht und dann die entsprechenden bytes umwandeln per
BitConverter.ToSingle(ab4ByteVector, 0);
Gru?
Michael
Post by Michael Böckinghoff
hier nochmal nen codeschnipsel dazu, (bei siemens udn allenbreadly ist die
f?r die standart datentypen geht das dann entprechend....
private string GetRealConvert(byte[] receiveArray, Symbolik sym,
bool bAllenBreadley)
{
Single fl32 = 0;
Byte[] fl32Array = new byte[4];
if (bAllenBreadley)
{
fl32Array[0] = receiveArray[sym.bytePos];
fl32Array[1] = receiveArray[sym.bytePos + 1];
fl32Array[2] = receiveArray[sym.bytePos + 2];
fl32Array[3] = receiveArray[sym.bytePos + 3];
}
else
{
fl32Array[3] = receiveArray[sym.bytePos];
fl32Array[2] = receiveArray[sym.bytePos + 1];
fl32Array[1] = receiveArray[sym.bytePos + 2];
fl32Array[0] = receiveArray[sym.bytePos + 3];
}
fl32 = BitConverter.ToSingle(fl32Array, 0);
return
fl32.ToString(System.Globalization.CultureInfo.InvariantCulture);
}
private void SetReal(byte[] sendByteArray, Symbolik sym, string
strValue, bool bAllenBreadley)
{
float fl32 = float.Parse(strValue,
System.Globalization.CultureInfo.InvariantCulture);
Byte[] fl32Array = BitConverter.GetBytes(fl32);
if (bAllenBreadley)
{
sendByteArray[sym.bytePos] = fl32Array[0];
sendByteArray[sym.bytePos + 1] = fl32Array[1];
sendByteArray[sym.bytePos + 2] = fl32Array[2];
sendByteArray[sym.bytePos + 3] = fl32Array[3];
}
else
{
sendByteArray[sym.bytePos] = fl32Array[3];
sendByteArray[sym.bytePos + 1] = fl32Array[2];
sendByteArray[sym.bytePos + 2] = fl32Array[1];
sendByteArray[sym.bytePos + 3] = fl32Array[0];
}
}
Post by Ralf Lenfers
Hallo Dimitri.
Generell kenne ich die Problematik. Aber ich bin kein Freund davon, die
Software w?hrend der Inbetriebnahme zu entwickeln.
Ich pers?nlich w?rde dir wirklich empfehlen, dich mal mit OPC auseinander
zu setzen. Die OPC-Server, die ich so kenne, verf?gen alle ?ber einen
"Demo-Server". Mit dem kannst du deine Anwendung testen, ohne das du
daf?r ein St?ck Hardware brauchst.Das liefert nat?rlich keine Ergebnisse f?r
den Durchsatz in einer Produktivumgebung, aber bis deine Chefs "wissen
was sie wollen", kannst du dir schon mal einen kleinen Wissensvorsprung
erarbeiten.
Gru?,
Ralf
Submitted via EggHeadCafe
Microsoft LINQ Query Samples For Beginners
http://www.eggheadcafe.com/training-topic-area/LINQ-Standard-Query-Operators/33/LINQ-Standard-Query-Operators.aspx
Carsten Buchloh
2011-08-05 12:56:54 UTC
Permalink
Eine Alternative w?re das S7 .NET Interface von SoftwareOption.
Ein C# Beispielprogramm kann kostenlos heruntergeladen werden.
Siehe http://www.softwareoption.de/siemens-produkte.htm
Post by Dimitri Alberto
Hallo,
weiss jemand, wie man eine Siemens SPS S7 per TCP/IP ansteuert? Gibts da ein
Protokoll oder dar ein paar Klassen dazu oder so?
Danke
Post by Klaus Vietzke
Hallo Dimitri,
Wir verwenden dafür ein Bibliothek von Traeger (IP-S7-Link).
Sie ist relativ günstig. Zu der Performance kann ich Dir noch nichts
sagen, da wir das Projekt noch nicht fertig haben. Ist aber von
unserem Projektpartner schon öfter erfolgreich eingesetzt worden (aber
nicht unter C# bisher, sondern unter C++/MFC).
Grüße,
Klaus
--
www.zertrox.de
Bildverarbeitung, Messtechnik, Programmierung aus Aachen.
Post by Michael Böckinghoff
Wenn es S7 / 315 2PN ist
kann man der per Sockets direkt Bytes schicken.
Also quasi so als wenn man mit nem Windows PC komuniziert...
Gruß
Michael
Post by Dimitri Alberto
Gibts dafür ne Beschreibung? Da soll irgendwie ein kurioses Protokoll sein
RFC1006 bzw. ISO on TCP was immer das ist.
Besten Dank
Post by Ralf Lenfers
Hallo Dimitri.
Geht es dir dabei um die Einsparung irgendwelcher Lizenzkosten?
Ich weiß zwar nicht was du machen willst, und welche Voraussetzungen du auf
deinem
PC hast, aber hast du schon mal OPC in Betracht gezogen?
Das Protokoll spielt dabei eine untergeordnete Rolle. Könnte auch ISO sein.
Wenn du die SW von Siemens für deinen PC hast, kannst du den OPC-Server
von Siemens einsetzen. Die haben auch einige Beispiele auf der CD.
Ansonsten könnte ich dir den OPC-Server von Advosol empfehlen.
Gruß,
Ralf
Post by Klaus Vietzke
Hallo Dimitri,
http://www.ibhsoftec-sps.de/german/first.htm
Der Adapter setzt den MPI-Bus auf TCP/IP um. Die Treiber / API wird
mitgeliefert.
Gruss,
Uwe
Post by Klaus Vietzke
Hallo Dimitri,
also das geht in der Theorie, aber aus der Praxis
heraus, nimm lieber die 3rd Parties.
Hier sind schon einige genannt, wir haben
noch andere genommen.
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Post by Dimitri Alberto
Ähm ...
Ist OPC schnell genug für 1MB pro Sekunde?
Post by Klaus Vietzke
Hallo Dimitri
dies dürfte [u.a.] stark von der Art/Struktur
der Datenpunkte/Datenzugriff abhängen,
also ob es um viele, diskrete Datenpunkte geht
oder grössere Datenblöcke/Arrays....
[softing] S7 OPC Server Performance-Test
(absolut ohne Gewähr!)
<URL:http://www.softing.com/home/en/pdf/ia/tests/opc/S7_Performance_en.pdf>
--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/
Post by Ralf Lenfers
Hallo Dimitri.
Der einzige Grund für mich, dass "Lowlevelst" zu programmieren, wäre der,
dass ich dadurch Lizenzkosten für die Komponenten von Drittanbietern
einsparen könnte. Bei den zu erwartenden Kosten würde ich mir das allerdings
schwer überlegen. In dem Umfeld, wo solche Sachen üblicherweise eingesetzt
werden, würde ich das als "Peanuts" abtun.
[...]
Ich hoffe, die Datenmenge brauchst du nur für irgendwelche Berechnungen
und musst sie nicht auch noch langfristig abspeichern;-)
Schreib doch einfach mal, was du überhaupt machen willst. Dann können
dir auch die anderen Poster bestimmt besser helfen.
Wenn du über einen Testaufbau verfügst, wovon ich mal schwer ausgehe,
dann mach doch einfach mal einen Test.
Die SW von Drittanbietern kannst du in der Regel meistens für 30 Tage
testen und mit den Beispielprogrammen bekommst du bestimmt ziemlich
schnell etwas auf die Beine gestellt.
Gruß,
Ralf
Post by Michael Böckinghoff
http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=de&objid=18843927&caller=view
Und hier die Klasse die ich im CompactFramework dafür benutze (warscheinlich
Dafür braucht mal also kein 3rd party Treiber usw... geht alles bequem per
sockets (allerdings nur mit bestimmten CPU's)
Gruß
Michael
using System;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
namespace CFTerminalLib.ComProtokoll {
/// <summary>
/// ReadWriteToSocketServer
/// </summary>
public class ReadWriteToS7PLCSocketServer {
public ReadWriteToS7PLCSocketServer(string strServerName, int
iServerPort, int iLenghtDummy)
{
_strServerName = strServerName;
_iServerPort = iServerPort;
_iLenghtDummy = iLenghtDummy;
}
public bool Connect() {
try {
ConnectToServer(false);
}
catch{
_bExceptionAufgetreten=true;
return false;
}
return true;
}
public void Close() {
_tcpClient.Close();
}
public void SendDataToServer(Byte[] data) {
try {
if(_bExceptionAufgetreten) {
// Com Alive ist in den ersten 2 byte, zu null
schreiben...
data[0] = 0;
data[1] = 0;
ConnectToServer(true);
}
NetworkStream stream =_tcpClient.GetStream();
stream.Write(data, 0, data.Length);
}catch{
_bExceptionAufgetreten = true;
}
}
public byte[] ReadDataFromServer() {
byte[] returnBuffer = null;
try {
if(_bExceptionAufgetreten) {
ConnectToServer(true);
}
NetworkStream stream =_tcpClient.GetStream();
if (stream.DataAvailable)
{
_LastReadLength = stream.Read(_ReadBuffer, 0,
_ReadBuffer.Length);
byte[] ReadBuffer = new byte[_LastReadLength];
Array.Copy(_ReadBuffer, 0, ReadBuffer, 0,
_LastReadLength);
returnBuffer = ReadBuffer;
}
}catch(Exception exc){
System.Diagnostics.Debug.WriteLine("ERROR:ReadWriteToS7PLCSocketServer.ReadDataFromServer
" + exc.Message);
_bExceptionAufgetreten = true;
}
return returnBuffer;
}// End ReadDataFromServer
/// <summary>
/// Verbindung zum Server herstellen
/// </summary>
/// <param name="bCloseBeforeOpen"></param>
/// <returns></returns>
private bool ConnectToServer(bool bCloseBeforeOpen) {
if(bCloseBeforeOpen) {
try {
_tcpClient.Close();
NetworkStream stream = _tcpClient.GetStream();
stream.Close();
}
catch {
bCloseBeforeOpen=false;
}
}
_tcpClient = new TcpClient();
_tcpClient.Connect(IPAddress.Parse(_strServerName),_iServerPort);
// Nach dem Connect direkt einmal etwas
// Schicken damit der Ping Pong losgehen kann
System.Threading.Thread.Sleep(500);
byte[] data = new byte[_iLenghtDummy];
NetworkStream stream2 = _tcpClient.GetStream();
stream2.Write(data, 0, data.Length);
System.Threading.Thread.Sleep(500);
_bExceptionAufgetreten = false;
return true;
}// End ConnectToServer
TcpClient _tcpClient;
// Connect To Server ?
private string _strServerName;
private int _iServerPort;
/// <summary>
/// _ReadBuffer , ist der Empfangsbuffer
/// </summary>
private byte[] _ReadBuffer = new byte[64000];
bool _bExceptionAufgetreten = false;
int _LastReadLength=0;
int _iLenghtDummy = 0;
}// End Class
}//End Namespace
Post by Ralf Lenfers
Hallo Michael.
[...]
Sieht interessant aus.
Wie wandelst du denn einen S7 Gleitpunktwert (Real) z.B. nach double?
Gruß,
Ralf
Post by Dimitri Alberto
...würde nur bei Massenfertigung Sinn machen, aber das ist kaum vorstellbar.
Ansonnsten ist die eigene Arbeitsleistung wohl immer teurer als der Zukauf.
Testaufbau? Der war gut - ich soll das fertig haben, bevor die wissen was
sie wollen.
Post by Dimitri Alberto
Besten Dank, werde ich sicher baldigst testen.
Ich hätte nicht gedacht hier sooo viele Infos zu bekommen. Da wurde aus
einer fast unmöglichen Herausforderung, doch recht schnell ein kleines
Problemchen ;-)
Besten Dank, auch an die anderen.
Post by Michael Böckinghoff
Das ganze kommt als Bytestrom. du musst ntürlich wissen welcher variablentyp
an welchem Byte steht und dann die entsprechenden bytes umwandeln per
BitConverter.ToSingle(ab4ByteVector, 0);
Gruß
Michael
Post by Michael Böckinghoff
hier nochmal nen codeschnipsel dazu, (bei siemens udn allenbreadly ist die
für die standart datentypen geht das dann entprechend....
private string GetRealConvert(byte[] receiveArray, Symbolik sym,
bool bAllenBreadley)
{
Single fl32 = 0;
Byte[] fl32Array = new byte[4];
if (bAllenBreadley)
{
fl32Array[0] = receiveArray[sym.bytePos];
fl32Array[1] = receiveArray[sym.bytePos + 1];
fl32Array[2] = receiveArray[sym.bytePos + 2];
fl32Array[3] = receiveArray[sym.bytePos + 3];
}
else
{
fl32Array[3] = receiveArray[sym.bytePos];
fl32Array[2] = receiveArray[sym.bytePos + 1];
fl32Array[1] = receiveArray[sym.bytePos + 2];
fl32Array[0] = receiveArray[sym.bytePos + 3];
}
fl32 = BitConverter.ToSingle(fl32Array, 0);
return
fl32.ToString(System.Globalization.CultureInfo.InvariantCulture);
}
private void SetReal(byte[] sendByteArray, Symbolik sym, string
strValue, bool bAllenBreadley)
{
float fl32 = float.Parse(strValue,
System.Globalization.CultureInfo.InvariantCulture);
Byte[] fl32Array = BitConverter.GetBytes(fl32);
if (bAllenBreadley)
{
sendByteArray[sym.bytePos] = fl32Array[0];
sendByteArray[sym.bytePos + 1] = fl32Array[1];
sendByteArray[sym.bytePos + 2] = fl32Array[2];
sendByteArray[sym.bytePos + 3] = fl32Array[3];
}
else
{
sendByteArray[sym.bytePos] = fl32Array[3];
sendByteArray[sym.bytePos + 1] = fl32Array[2];
sendByteArray[sym.bytePos + 2] = fl32Array[1];
sendByteArray[sym.bytePos + 3] = fl32Array[0];
}
}
Post by Ralf Lenfers
Hallo Dimitri.
Generell kenne ich die Problematik. Aber ich bin kein Freund davon, die
Software während der Inbetriebnahme zu entwickeln.
Ich persönlich würde dir wirklich empfehlen, dich mal mit OPC auseinander
zu setzen. Die OPC-Server, die ich so kenne, verfügen alle über einen
"Demo-Server". Mit dem kannst du deine Anwendung testen, ohne das du
dafür ein Stück Hardware brauchst.Das liefert natürlich keine Ergebnisse für
den Durchsatz in einer Produktivumgebung, aber bis deine Chefs "wissen
was sie wollen", kannst du dir schon mal einen kleinen Wissensvorsprung
erarbeiten.
Gruß,
Ralf
Post by Axel Arnold Bangert
Hi Michael,
aus Kostengründen (ich kann mir keine S7 leisten) habe ich deinen Code mit dem ACcontrol von Deltalogic ausprobiert. Alles funktioniert gut bis zu -> stream.DataAvailable.
Leider ist im Stream Nichts drin, so dass ich nicht qweiter komme. Ich hatte auch schon mal ein S7 Programm (*.s7p) in das ACcontrol geladen, aber leider auch ohne Erfolg.
Hättest Du da einen Tipp?
Beste Grüße
Axel Arnold Bangert - Herzogenrath 2010
Ralf Lenfers
2008-09-29 09:36:34 UTC
Permalink
Hallo Dimitri.
Post by Dimitri Alberto
weiss jemand, wie man eine Siemens SPS S7 per TCP/IP ansteuert? Gibts da ein
Protokoll oder dar ein paar Klassen dazu oder so?
Geht es dir dabei um die Einsparung irgendwelcher Lizenzkosten?
Ich weiß zwar nicht was du machen willst, und welche Voraussetzungen du auf
deinem
PC hast, aber hast du schon mal OPC in Betracht gezogen?
Das Protokoll spielt dabei eine untergeordnete Rolle. Könnte auch ISO sein.
Wenn du die SW von Siemens für deinen PC hast, kannst du den OPC-Server
von Siemens einsetzen. Die haben auch einige Beispiele auf der CD.
Ansonsten könnte ich dir den OPC-Server von Advosol empfehlen.

Gruß,

Ralf
Dimitri Alberto
2008-09-29 22:47:59 UTC
Permalink
Post by Ralf Lenfers
Geht es dir dabei um die Einsparung irgendwelcher Lizenzkosten?
Ähm ...
Post by Ralf Lenfers
Ich weiß zwar nicht was du machen willst, und welche Voraussetzungen du
auf deinem
PC hast, aber hast du schon mal OPC in Betracht gezogen?
Ist OPC schnell genug für 1MB pro Sekunde?
Thomas Scheidegger
2008-09-29 23:04:23 UTC
Permalink
Hallo Dimitri
Post by Dimitri Alberto
Ist OPC schnell genug für 1MB pro Sekunde?
dies dürfte [u.a.] stark von der Art/Struktur
der Datenpunkte/Datenzugriff abhängen,
also ob es um viele, diskrete Datenpunkte geht
oder grössere Datenblöcke/Arrays....
Bsp:
[softing] S7 OPC Server Performance-Test
(absolut ohne Gewähr!)
<URL:http://www.softing.com/home/en/pdf/ia/tests/opc/S7_Performance_en.pdf>
--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/
Ralf Lenfers
2008-09-30 07:47:40 UTC
Permalink
Hallo Dimitri.
Post by Dimitri Alberto
Post by Ralf Lenfers
Geht es dir dabei um die Einsparung irgendwelcher Lizenzkosten?
Ähm ...
Der einzige Grund für mich, dass "Lowlevelst" zu programmieren, wäre der,
dass ich dadurch Lizenzkosten für die Komponenten von Drittanbietern
einsparen könnte. Bei den zu erwartenden Kosten würde ich mir das allerdings
schwer überlegen. In dem Umfeld, wo solche Sachen üblicherweise eingesetzt
werden, würde ich das als "Peanuts" abtun.

[...]
Post by Dimitri Alberto
Ist OPC schnell genug für 1MB pro Sekunde?
Ich hoffe, die Datenmenge brauchst du nur für irgendwelche Berechnungen
und musst sie nicht auch noch langfristig abspeichern;-)
Schreib doch einfach mal, was du überhaupt machen willst. Dann können
dir auch die anderen Poster bestimmt besser helfen.

Wenn du über einen Testaufbau verfügst, wovon ich mal schwer ausgehe,
dann mach doch einfach mal einen Test.
Die SW von Drittanbietern kannst du in der Regel meistens für 30 Tage
testen und mit den Beispielprogrammen bekommst du bestimmt ziemlich
schnell etwas auf die Beine gestellt.

Gruß,

Ralf
Dimitri Alberto
2008-09-30 21:54:11 UTC
Permalink
Post by Ralf Lenfers
Post by Dimitri Alberto
Post by Ralf Lenfers
Geht es dir dabei um die Einsparung irgendwelcher Lizenzkosten?
Ähm ...
Der einzige Grund für mich, dass "Lowlevelst" zu programmieren, wäre der,
...würde nur bei Massenfertigung Sinn machen, aber das ist kaum vorstellbar.
Ansonnsten ist die eigene Arbeitsleistung wohl immer teurer als der Zukauf.
Post by Ralf Lenfers
Wenn du über einen Testaufbau verfügst, wovon ich mal schwer ausgehe,
dann mach doch einfach mal einen Test.
Testaufbau? Der war gut - ich soll das fertig haben, bevor die wissen was
sie wollen.
Ralf Lenfers
2008-10-01 08:36:58 UTC
Permalink
Hallo Dimitri.
Post by Dimitri Alberto
Testaufbau? Der war gut - ich soll das fertig haben, bevor die wissen was
sie wollen.
Generell kenne ich die Problematik. Aber ich bin kein Freund davon, die
Software während der Inbetriebnahme zu entwickeln.
Ich persönlich würde dir wirklich empfehlen, dich mal mit OPC auseinander
zu setzen. Die OPC-Server, die ich so kenne, verfügen alle über einen
"Demo-Server". Mit dem kannst du deine Anwendung testen, ohne das du
dafür ein Stück Hardware brauchst.Das liefert natürlich keine Ergebnisse für
den Durchsatz in einer Produktivumgebung, aber bis deine Chefs "wissen
was sie wollen", kannst du dir schon mal einen kleinen Wissensvorsprung
erarbeiten.

Gruß,

Ralf
Uwe Janssen
2008-09-29 13:33:05 UTC
Permalink
On Mon, 29 Sep 2008 00:12:11 +0200, "Dimitri Alberto"
Post by Dimitri Alberto
weiss jemand, wie man eine Siemens SPS S7 per TCP/IP ansteuert? Gibts da ein
Protokoll oder dar ein paar Klassen dazu oder so?
Hallo Dimitri,

wir benutzen dazu die Adapter von IBH:

http://www.ibhsoftec-sps.de/german/first.htm

Der Adapter setzt den MPI-Bus auf TCP/IP um. Die Treiber / API wird
mitgeliefert.

Gruss,
Uwe
Loading...