У меня есть странная проблема с моим подключением от C# к моему Simatic S7-1200. Я использую LibNoDave для подключения, и я хочу установить биты моего SPS с помощью C# -программы. Это работает нормально, но работает только 9 раз, а функция writeBytes (..) возвращает -1025, а не 0, как и должно, и больше не устанавливает байта. Затем я должен перезапустить приложение, и он снова будет работать 9 раз.writeBytes return -1025 using LibNoDave
Это мой класс 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();
}
1 - The что я устанавливаю с адресом 1 байты имеют типа данных байта, и это значение должны всегда этого нужно просто быть преодолен массивом ЬиХ байт , Это работает 9 раз. Не уверен, что это то, что вы имели в виду. 2- Какая позиция вы имели в виду? 3- Не знаете, как я проверяю это, и будет ли это проблемой? –
@LukasN., Факт сбоя программы через 9 раз может быть связан в пространстве от 0 до 9 (одна цифра), используемой в переменной SOME или в НЕКОТОРНОЙ позиции. Слишком специфично, что рутина сработает через 9 раз, поскольку 10-го числа потребуются 2 цифры (если в десятичной нотации, а не в BYTE-нотации). Вы уверены, что число будет байтом (или сообщено как байт), а не BCD или десятичным? –
Ops! Вы упомянули выше «... возвращает -1025, а не 0, как следует, и больше не устанавливает бит». Вы работаете с битами? Помните: 9 раз можно интерпретировать как бит от 0 до бит 7 (8 раз) + 1 ... И после этого, если пространство действительно ОДИН байт, у нас есть только 8 бит, поэтому ваша программа может записывать каждую битовую позицию в увеличенный путь до тех пор, пока не попробует 9-й бит ... –