Guten Tag zusammen.
Ich benutz jetzt mal diesen Thread hier, da ich ein ähnliches Problem hab und deshalb nicht unbedingt n neuen Thread erstellen will.
Vorab: Danke schonmal für libnodave, Zottel!
Folgendes Problem:
Ich muss mittels C# Daten aus einer SPS auslesen und stoße dabei als Anfänger auf Probleme, die ich in den letzten 2 Tagen nicht lösen konnte.
Hardware:
S7-300 (312), CP 343-1, Verbindung über TCP
Anbei der Code (bin noch in der Test-/Lernphase in Sachen SPS):
Code:
static int Main(string[] args)
{
int port = 102;
string ipadress = "192.168.100.122";
int result = 0;
int prg_nr = 0;
int prg_runtime = 0;
int mixingratio = 0;
int boothtemp = 0;
int boothhumidity = 0;
fds.rfd = libnodave.openSocket(port, ipadress);
fds.wfd = fds.rfd;
if (fds.rfd > 0)
{
di = new libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
di.setTimeout(1000000);
result = di.initAdapter();
if (result == 0)
{
dc = new libnodave.daveConnection(di, 0, rack, slot);
if (0 == dc.connectPLC())
{
result = dc.readBytes(libnodave.daveFlags, 0, 0, 102, savebuffer);
if (result == 0)
{
prg_nr = dc.getS16At(20);
prg_runtime = dc.getS16At(22);
mixingratio = dc.getS16At(24);
boothtemp = dc.getS16At(26);
boothhumidity = dc.getS16At(28);
Console.WriteLine("Programm-Nummer: " + prg_nr);
Console.WriteLine("prg_runtime: " + prg_runtime);
Console.WriteLine("mixingratio: " + mixingratio);
Console.WriteLine("boothtemp: " + boothtemp);
Console.WriteLine("boothhumidity: " + boothhumidity);
}
else
Console.WriteLine("Fehler! " + result + " " + libnodave.daveStrerror(result));
}
dc.disconnectPLC();
Console.ReadLine();
}
di.disconnectAdapter();
libnodave.closePort(fds.rfd);
}
else
{
Console.WriteLine("Fehler! Konnte keine Verbindung zur SPS herstellen!");
Console.ReadLine();
return -1;
}
return 0;
}
Ich hab von meinem Chef ein Datenblatt bekommen, auf dem die Daten der SPS vermerkt sind.
Adresse 0-19 sind Chars, dann einige 16Bit-Integer, dann bool'sche Werte etc. Die Daten ändern sich zu Testzwecken derzeit sekündlich.
Nun will ich wie oben im Code gesehen die 5 Integer-Werte von Position 20 bis Position 28 ausgeben und in meinem WinForm (derzeit noch Console) anzeigen lassen - ich bekomme für die letzten 4 Werte aber immer 0 und für den ersten Wert entweder 0 oder eine Zahl (je nach Konvertierung 16, 64, 4096 oder 138xx). Scheint mir also eher n Bool zu sein.
Ich les also irgendwie falsch aus oder konvertiere die Werte falsch - und kann mir keinen Reim darauf machen.
Den obigen Code hab ich aus den Beispielen, die bei libnodave dabei waren, abgeguckt ...
Vielen Dank für eure Hilfe!
mfG Andi