2015-10-26 3 views
1

У меня есть странная проблема с моим подключением от 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(); 
    } 

ответ

0

Я не вижу никакой проблемы в коде, и я не знаю ни устройства, ни Libnodave, но проблема может быть связана с:

1 Есть ли какой-нибудь приемник адрес или контейнер «Одна цифра» (например, от 0 до 9)?

2- Положение действительно сброшено, как я вижу в функции WritePLC?

3 - «LibNoDave.WritePLC» увеличивает указатель?

Удачи.

+0

1 - The что я устанавливаю с адресом 1 байты имеют типа данных байта, и это значение должны всегда этого нужно просто быть преодолен массивом ЬиХ байт , Это работает 9 раз. Не уверен, что это то, что вы имели в виду. 2- Какая позиция вы имели в виду? 3- Не знаете, как я проверяю это, и будет ли это проблемой? –

+0

@LukasN., Факт сбоя программы через 9 раз может быть связан в пространстве от 0 до 9 (одна цифра), используемой в переменной SOME или в НЕКОТОРНОЙ позиции. Слишком специфично, что рутина сработает через 9 раз, поскольку 10-го числа потребуются 2 цифры (если в десятичной нотации, а не в BYTE-нотации). Вы уверены, что число будет байтом (или сообщено как байт), а не BCD или десятичным? –

+0

Ops! Вы упомянули выше «... возвращает -1025, а не 0, как следует, и больше не устанавливает бит». Вы работаете с битами? Помните: 9 раз можно интерпретировать как бит от 0 до бит 7 (8 раз) + 1 ... И после этого, если пространство действительно ОДИН байт, у нас есть только 8 бит, поэтому ваша программа может записывать каждую битовую позицию в увеличенный путь до тех пор, пока не попробует 9-й бит ... –

0

это может быть проблемой закрытия соединения попробуйте:

public static void DisconnectPLC() 
    { 
     if (connection) 
     { 
      dc.disconnectPLC(); 
      di.disconnectAdapter(); 
      libnodave.closePort(fds.rfd); 
      connection = false; 
     } 
} 
Смежные вопросы