C# 使用LibNoDave返回-1025的writeBytes
我从C#到Simatic S7-1200的连接有一个奇怪的问题。 我正在使用LibNoDave进行连接,我想用C#程序设置SP的位。 这工作正常,但只工作了9次,然后writeBytes(..)函数返回-1025,而不是它应该返回的0,并且不再设置字节。 然后我必须重新启动应用程序,它将再次工作9次 这是我的LibNoDave课程C# 使用LibNoDave返回-1025的writeBytes,c#,siemens,s7-1200,libnodave,C#,Siemens,S7 1200,Libnodave,我从C#到Simatic S7-1200的连接有一个奇怪的问题。 我正在使用LibNoDave进行连接,我想用C#程序设置SP的位。 这工作正常,但只工作了9次,然后writeBytes(..)函数返回-1025,而不是它应该返回的0,并且不再设置字节。 然后我必须重新启动应用程序,它将再次工作9次 这是我的LibNoDave课程 static class LibNoDave { static libnodave.daveConnection dc; static bool c
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();
}
我看不到代码中有任何问题,也不知道您的设备和LibNoDave,但问题可能与以下方面有关: 1-某个接收者是“一位数”(如0到9)地址还是容器 2-正如我在WritePLC函数中看到的那样,位置正在真正重置 3.“LibNoDave.WritePLC”正在增加其指针
祝你好运。我在代码中没有发现任何问题,我也不知道你的设备和LibNodeave,但问题可能与以下方面有关: 1-某个接收者是“一位数”(如0到9)地址还是容器 2-正如我在WritePLC函数中看到的那样,位置正在真正重置 3.“LibNoDave.WritePLC”正在增加其指针
祝你好运。关闭连接时可能会出现问题,请尝试:
public static void DisconnectPLC()
{
if (connection)
{
dc.disconnectPLC();
di.disconnectAdapter();
libnodave.closePort(fds.rfd);
connection = false;
}
}
关闭连接时可能会出现问题,请尝试:
public static void DisconnectPLC()
{
if (connection)
{
dc.disconnectPLC();
di.disconnectAdapter();
libnodave.closePort(fds.rfd);
connection = false;
}
}
它很旧,但其他人会发现:在我的例子中,它是fds和di的声明:它们必须是类成员,而不是connect方法的本地成员,否则超时值稍后会丢失。它很旧,但其他人会发现:在我的例子中,这是fds和di的声明:它们必须是类成员,而不是connect方法的本地成员,否则超时值稍后会丢失。1-我用地址1设置的字节是数据类型字节,它的值应该始终被buf字节数组覆盖。这是工作9次。不知道你是不是这个意思。2-你指的是什么职位?3-不确定我如何检查它,这会是一个问题吗?@LukasN.,程序在9次后崩溃的事实可以在某个变量或某个位置使用的0到9(一个位数)的空间中关联。太具体了,例程在9次之后崩溃,因为第10次需要2位数字(如果是十进制表示法,则不是字节表示法)。你确定数字是一个字节(或作为字节通知)而不是BCD或十进制数吗!您在上面提到“…返回-1025,而不是它应该返回的0,并且它不再设置位。”。你在用比特吗?记住:9次可以解释为第0位到第7位(8次)+1。。。在这之后,如果空间真的是一个字节,我们只有8位,所以你的程序可能会以递增的方式写入每个位的位置,直到尝试第9位…Sry,我的意思是在那里写入字节,因为它肯定在写入完整的字节。我正在设置的值介于1和100之间,它正在工作,所以应该是字节。无论如何,谢谢:)也许我明天会发现1-我正在设置的地址1的字节是数据类型字节,它的值应该总是被buf字节数组覆盖。这是工作9次。不知道你是不是这个意思。2-你指的是什么职位?3-不确定我如何检查它,这会是一个问题吗?@LukasN.,程序在9次后崩溃的事实可以在某个变量或某个位置使用的0到9(一个位数)的空间中关联。太具体了,例程在9次之后崩溃,因为第10次需要2位数字(如果是十进制表示法,则不是字节表示法)。你确定数字是一个字节(或作为字节通知)而不是BCD或十进制数吗!您在上面提到“…返回-1025,而不是它应该返回的0,并且它不再设置位。”。你在用比特吗?记住:9次可以解释为第0位到第7位(8次)+1。。。在这之后,如果空间真的是一个字节,我们只有8位,所以你的程序可能会以递增的方式写入每个位的位置,直到尝试第9位…Sry,我的意思是在那里写入字节,因为它肯定在写入完整的字节。我正在设置的值介于1和100之间,它正在工作,所以应该是字节。无论如何,谢谢:)也许我明天会知道