Post by Dimitri AlbertoGibts 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