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;
         }
}
Другие вопросы по тегам