writeBytes возвращает -1025 с помощью LibNoDave
У меня странная проблема с моим подключением из C# к моему Simatic S7-1200. Я использую LibNoDave для подключения и хочу установить биты моего SPS с помощью C#-программы. Это работает просто отлично, но работает только 9 раз, и тогда функция writeBytes(..) возвращает -1025, а не 0, как должно, и больше не устанавливает байт. Затем мне нужно перезапустить приложение, и оно снова будет работать 9 раз.
Это мой класс LibNoDave.
static class LibNoDave
{
static libnodave.daveConnection dc;
static bool connection = false;
public static bool CreateConnection()
{
const string IP = "192.168.1.250";
const int Rack = 0;
const int Slot = 0;
libnodave.daveOSserialType fds;
libnodave.daveInterface di;
try
{
fds.rfd = libnodave.openSocket(102, IP);
fds.wfd = fds.rfd;
if (fds.rfd > 0)
{
di = new libnodave.daveInterface(fds, "IF1",
0, libnodave.daveProtoISOTCP,
libnodave.daveSpeed187k);
di.setTimeout(1000000);
int res = di.initAdapter();
if (res == 0)
{
dc = new libnodave.daveConnection(di, 0,
Rack, Slot);
res = dc.connectPLC();
if (res == 0)
{
connection = true;
return true;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return false;
}
public static void DisconnectPLC()
{
if (connection)
{
dc.disconnectPLC();
libnodave.closeSocket(102);
connection = false;
}
}
public static void WritePLC(int anfangswert, byte wert)
{
if (connection)
{
byte[] buf = new Byte[1];
buf[0] = wert;
int res = dc.writeBytes(libnodave.daveFlags, 0, anfangswert, 1, buf);
MessageBox.Show(res.ToString());
}
}
}
Здесь я вызываю функции:
private void frmAuslagerung_Load(object sender, EventArgs e)
{
if (!LibNoDave.CreateConnection())
{
finished = true;
this.Close();
}
LibNoDave.WritePLC(1, Byte.Parse(auto.Position.Lade.ToString()));
}
private void frmAuslagerung_FormClosing(object sender, FormClosingEventArgs e)
{
if (!finished)
{
//e.Cancel = true; //Not in code for testing
LibNoDave.DisconnectPLC(); //Only for testing
}
else
LibNoDave.DisconnectPLC();
}
2 ответа
Он старый, но его могут найти другие: в моем случае это было объявление fds и di: они должны быть членами класса, а не локальными для метода connect, иначе значение тайм-аута было потеряно позже.
Я не вижу проблем в коде и не знаю ни вашего устройства, ни LibNoDave, но проблема может быть связана с:
1- Является ли какой-либо получатель адресом или контейнером из одной цифры (например, от 0 до 9)?
2- Положение действительно сбрасывается, как я вижу в функции WritePLC?
3- "LibNoDave.WritePLC" увеличивает свой указатель?
Удачи.
Может быть проблема с закрытием соединения, попробуйте с:
public static void DisconnectPLC()
{
if (connection)
{
dc.disconnectPLC();
di.disconnectAdapter();
libnodave.closePort(fds.rfd);
connection = false;
}
}