Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Corretto Utilizzo Libreria Libnodave?


Messaggi consigliati

Inserita:

quanti moduli di espansione I/O (num. max) posso collegare ad una CPU224 siemens?

esistono moduli misti analogico digitale?

ringrazio anticipatamente chi mi può dare una risposta

grazie mille.


Inserito:

quanti moduli di espansione I/O (num. max) posso collegare ad una CPU224 siemens?

esistono moduli misti analogico digitale?

ringrazio anticipatamente chi mi può dare una risposta

grazie mille.

Inserita:

Si possono mettere al max 7 moduli aggiuntivi su una CPU 224.

Bisogna pero' tener conto della capacita' di indirizzamento (256 pti I/O digitali, 32 AI e 32 AO) e della corrente a 5V erogata per alimentare i moduli di ampliamento che e' di 660 mA (bisogns calcolare la corrente assorbita dai vari moduli).

Non esistono moduli misti con digitali e analogiche.

Ciao

Paulus

Inserita:

Si possono mettere al max 7 moduli aggiuntivi su una CPU 224.

Bisogna pero' tener conto della capacita' di indirizzamento (256 pti I/O digitali, 32 AI e 32 AO) e della corrente a 5V erogata per alimentare i moduli di ampliamento che e' di 660 mA (bisogns calcolare la corrente assorbita dai vari moduli).

Non esistono moduli misti con digitali e analogiche.

Ciao

Paulus

Inserita:

ciao zak69pinz.

con la cpu 224 siemens è possibile collegare 7 moduli massimo di ampliamento digitale o analogico

esistono moduli di ampliamento digtale misti em223 4di+4do, 8di+8do, 16di+16do ,esiste un modulo ampliamento analogico misto em235 4ai+1a0, però moduli misti digitali+analocici da "catalogo" non mi risulta

spero di esserti stato utile

ciao da silvietto

Inserita:

ciao zak69pinz.

con la cpu 224 siemens è possibile collegare 7 moduli massimo di ampliamento digitale o analogico

esistono moduli di ampliamento digtale misti em223 4di+4do, 8di+8do, 16di+16do ,esiste un modulo ampliamento analogico misto em235 4ai+1a0, però moduli misti digitali+analocici da "catalogo" non mi risulta

spero di esserti stato utile

ciao da silvietto

Inserita:

Ringrazio per il vostro prezioso aiuto

grazie mille

Inserita:

Ringrazio per il vostro prezioso aiuto

grazie mille

Inserita:

sul sito siemens ci sono tutti i device che cerchi.

ciao

Inserita:

sul sito siemens ci sono tutti i device che cerchi.

ciao

  • 4 years later...
Inserita:

Ciao a tutti, cerco un pò di aiuto in un thread ormai consumato per capire se l'utilizzo che faccio della Libnodave è corretto.

Premessa:

- ho scaricato lo starter kit di Br1 (ancora grazie!).

Ho costruito due semplici servizi Windows (C#) che iterano su un numero finito di PLC Siemens S7300.

Le operazioni, in Ethernet, che vengono eseguite sono le seguenti:

- connessione al Plc;

- inizializzo un bit di una DB prestabilita che utilizzo come semaforo di passaggio;

- leggo i dati;

- scrivo in un database i dati raccolti;

- riscrivo nuovamente il bit del primo punto.

- disconnesione dal Plc.

I due servizi lavorano a intervalli di 5 minuti uno e 20 secondi l'altro.

Le applicazioni funzionano correttamente ma ho l'impressione che non riesco a trasformare in certezza perchè fattori esterni al software mi impediscono di fare un'analisi definitiva che ad un certo punto la raccolta dati vada in "sofferenza" magari dovuta ad una saturazione della rete.

Qualcuno avrebbe voglia di guardare, anche pubblicamente, senza ridere qualche decina di righe di codice per capire se l'utilizzo che faccio della Libnodave è scorretto o varace nei confronti delle risorse?

Grazie,

Francesco Aperti

Inserita:

Ciao a tutti, cerco un pò di aiuto in un thread ormai consumato per capire se l'utilizzo che faccio della Libnodave è corretto.

Premessa:

- ho scaricato lo starter kit di Br1 (ancora grazie!).

Ho costruito due semplici servizi Windows (C#) che iterano su un numero finito di PLC Siemens S7300.

Le operazioni, in Ethernet, che vengono eseguite sono le seguenti:

- connessione al Plc;

- inizializzo un bit di una DB prestabilita che utilizzo come semaforo di passaggio;

- leggo i dati;

- scrivo in un database i dati raccolti;

- riscrivo nuovamente il bit del primo punto.

- disconnesione dal Plc.

I due servizi lavorano a intervalli di 5 minuti uno e 20 secondi l'altro.

Le applicazioni funzionano correttamente ma ho l'impressione che non riesco a trasformare in certezza perchè fattori esterni al software mi impediscono di fare un'analisi definitiva che ad un certo punto la raccolta dati vada in "sofferenza" magari dovuta ad una saturazione della rete.

Qualcuno avrebbe voglia di guardare, anche pubblicamente, senza ridere qualche decina di righe di codice per capire se l'utilizzo che faccio della Libnodave è scorretto o varace nei confronti delle risorse?

Grazie,

Francesco Aperti

Gianmario Pedrani
Inserita:

Io sinceramente non ho molto capito quello che hai fatto se puoi spiegare meglio

grazie

Gianmario Pedrani
Inserita:

Io sinceramente non ho molto capito quello che hai fatto se puoi spiegare meglio

grazie

Inserita:

Ciao Gianmario, volevo sapere se qualcuno ha voglia di dare un'occhiata a qualche riga di codice C# dove ciclicamente scrivo e leggo da alcuni PLC.

Cosa che funziona apparentemente senza problemi nel breve intervallo mentre sembra diventare piuttosto pesante nell'arco di alcune giornate.

Il codice non l'ho messo perchè non volevo sembrare troppo noioso e invadente, ovviamente è sempre disponibile.

Grazie,

Francesco Aperti

Inserita:

Ciao Gianmario, volevo sapere se qualcuno ha voglia di dare un'occhiata a qualche riga di codice C# dove ciclicamente scrivo e leggo da alcuni PLC.

Cosa che funziona apparentemente senza problemi nel breve intervallo mentre sembra diventare piuttosto pesante nell'arco di alcune giornate.

Il codice non l'ho messo perchè non volevo sembrare troppo noioso e invadente, ovviamente è sempre disponibile.

Grazie,

Francesco Aperti

Inserita:

Grazie varg, ecco qua. Mi raccomando gli insulti in privato! :)

Saluti,

Francesco Aperti

      
private void TimerHandler ( object sender, System.Timers.ElapsedEventArgs e )
    {
      DCTemperature db = new DCTemperature ();
      var dispositivi = from d in db.DBDispositivis
                        where d.temperature == true
                        select d;

      foreach ( DBDispositivi dispositivo in dispositivi )
      {
        ProgrammaImpostato = SetPoint = Temperatura = 0;
        ZoneTemperature = dispositivo.zone_temperature;

        MainConn daveconn = new MainConn ();
        daveconn.sPLC_IP = dispositivo.ip_address;
        daveconn.iProtoNum = EmpTypeProto.daveProtoISOTCP;
        daveconn.iMPI = 10;
        daveconn.iRack = 0;
        daveconn.iSlot = 2;

        try
        {
          mLibNoDaveServer = new LibNoDaveServer( daveconn );
          if ( mLibNoDaveServer.bConnectionOK )
          {
            mLibNoDaveServer.NumPLC = 1;

            #region inizializzo a 0 bit di semaforo
            byte[] byte_sem_zero = new byte[4] { 0 , 0 , 0 , 0 };

            Byte[] myValuesSem = new Byte[16];
            myValuesSem[0] = System.Convert.ToByte( 1 );
            myValuesSem[1] = System.Convert.ToByte( 'W' );
            myValuesSem[2] = System.Convert.ToByte( 1 );
            myValuesSem[3] = System.Convert.ToByte( 1 );
            myValuesSem[4] = System.Convert.ToByte( 'D' );
            myValuesSem[5] = System.Convert.ToByte( 1 );

            myValuesSem[6] = System.Convert.ToByte( 18 / 256 );
            myValuesSem[7] = System.Convert.ToByte( 18 % 256 );
            myValuesSem[8] = System.Convert.ToByte( 0 / 256 );
            myValuesSem[9] = System.Convert.ToByte( 0 % 256 );
            myValuesSem[10] = System.Convert.ToByte( 4 / 256 );
            myValuesSem[11] = System.Convert.ToByte( 4 % 256 );

            for ( int i = 0 ; i < byte_sem_zero.Length ; i++ )
              myValuesSem[12 + i] = System.Convert.ToByte( byte_sem_zero[i] );

            try
            {
              byte[] myResultOffSem = RichiestePLC.ProcessMessage( myValuesSem , mLibNoDaveServer );
            }
            catch ( Exception err )
            {
              if ( mLibNoDaveServer != null )
              {
                mLibNoDaveServer.ClosePlcConn();
                LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
                mLibNoDaveServer = null;
              }

              continue;
            }
            #endregion

            // resto fermo per mezzo secondo prima di leggere le zone di temperatura
            Thread.Sleep( 500 );

            #region Converto in array di byte la stringa
            Byte[] request = new Byte[12];
            request[0] = System.Convert.ToByte( 1 );
            request[1] = System.Convert.ToByte( 'R' );
            request[2] = System.Convert.ToByte( 1 );
            request[3] = System.Convert.ToByte( 1 );
            request[4] = System.Convert.ToByte( 'D' );
            request[5] = System.Convert.ToByte( 1 );

            request[6] = System.Convert.ToByte( 18 / 256 ); //elencoDB
            request[7] = System.Convert.ToByte( 18 % 256 ); //elencoDB
            request[8] = System.Convert.ToByte( 0 / 256 );  //areaDataStart
            request[9] = System.Convert.ToByte( 0 % 256 );  //areaDataStart
            request[10] = System.Convert.ToByte( 160 / 256 ); //areaDataLen
            request[11] = System.Convert.ToByte( 160 % 256 ); //areaDataLen
            #endregion

            #region Processo messaggio
            byte[] response = null;
            try
            {
              response = RichiestePLC.ProcessMessage( request , mLibNoDaveServer );
            }
            catch ( Exception err )
            {
              if ( mLibNoDaveServer != null )
              {
                mLibNoDaveServer.ClosePlcConn();
                LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
                mLibNoDaveServer = null;
              }

              continue;
            }
            #endregion

            #region Parsing della risposta
            byte[] tempValue = new byte[4];

            byte[] myReturn = new byte[response.Length - 14];
            Array.Copy( response , 14 , myReturn , 0 , myReturn.Length );

            Array.Copy( myReturn , 8 , tempValue , 0 , tempValue.Length );

			// inserisco i dati in un database - ometto questo codice

            #endregion

            #region inizializzo a 1 bit di semaforo
            try
            {
              byte_sem_zero = new byte[4] { 1 , 0 , 0 , 0 };
              for ( int i = 0 ; i < byte_sem_zero.Length ; i++ )
                myValuesSem[12 + i] = System.Convert.ToByte( byte_sem_zero[i] );

              byte[] myResultOnSem = RichiestePLC.ProcessMessage( myValuesSem , mLibNoDaveServer );
            }
            catch ( Exception ex )
            {
              if ( mLibNoDaveServer != null )
              {
                mLibNoDaveServer.ClosePlcConn();
                LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
                mLibNoDaveServer = null;
              }

              continue;
            }
            #endregion
          }
        }
        catch ( Exception ex )
        {

        }
        finally
        {
          mLibNoDaveServer.ClosePlcConn();
          LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
          mLibNoDaveServer.bConnectionOK = false;
          mLibNoDaveServer = null;     
        }
      }

      if ( mLibNoDaveServer != null )
      {
        mLibNoDaveServer.ClosePlcConn();
        LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
        mLibNoDaveServer.bConnectionOK = false;
        mLibNoDaveServer = null;      
      }
    }

Inserita:

Grazie varg, ecco qua. Mi raccomando gli insulti in privato! :)

Saluti,

Francesco Aperti

      
private void TimerHandler ( object sender, System.Timers.ElapsedEventArgs e )
    {
      DCTemperature db = new DCTemperature ();
      var dispositivi = from d in db.DBDispositivis
                        where d.temperature == true
                        select d;

      foreach ( DBDispositivi dispositivo in dispositivi )
      {
        ProgrammaImpostato = SetPoint = Temperatura = 0;
        ZoneTemperature = dispositivo.zone_temperature;

        MainConn daveconn = new MainConn ();
        daveconn.sPLC_IP = dispositivo.ip_address;
        daveconn.iProtoNum = EmpTypeProto.daveProtoISOTCP;
        daveconn.iMPI = 10;
        daveconn.iRack = 0;
        daveconn.iSlot = 2;

        try
        {
          mLibNoDaveServer = new LibNoDaveServer( daveconn );
          if ( mLibNoDaveServer.bConnectionOK )
          {
            mLibNoDaveServer.NumPLC = 1;

            #region inizializzo a 0 bit di semaforo
            byte[] byte_sem_zero = new byte[4] { 0 , 0 , 0 , 0 };

            Byte[] myValuesSem = new Byte[16];
            myValuesSem[0] = System.Convert.ToByte( 1 );
            myValuesSem[1] = System.Convert.ToByte( 'W' );
            myValuesSem[2] = System.Convert.ToByte( 1 );
            myValuesSem[3] = System.Convert.ToByte( 1 );
            myValuesSem[4] = System.Convert.ToByte( 'D' );
            myValuesSem[5] = System.Convert.ToByte( 1 );

            myValuesSem[6] = System.Convert.ToByte( 18 / 256 );
            myValuesSem[7] = System.Convert.ToByte( 18 % 256 );
            myValuesSem[8] = System.Convert.ToByte( 0 / 256 );
            myValuesSem[9] = System.Convert.ToByte( 0 % 256 );
            myValuesSem[10] = System.Convert.ToByte( 4 / 256 );
            myValuesSem[11] = System.Convert.ToByte( 4 % 256 );

            for ( int i = 0 ; i < byte_sem_zero.Length ; i++ )
              myValuesSem[12 + i] = System.Convert.ToByte( byte_sem_zero[i] );

            try
            {
              byte[] myResultOffSem = RichiestePLC.ProcessMessage( myValuesSem , mLibNoDaveServer );
            }
            catch ( Exception err )
            {
              if ( mLibNoDaveServer != null )
              {
                mLibNoDaveServer.ClosePlcConn();
                LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
                mLibNoDaveServer = null;
              }

              continue;
            }
            #endregion

            // resto fermo per mezzo secondo prima di leggere le zone di temperatura
            Thread.Sleep( 500 );

            #region Converto in array di byte la stringa
            Byte[] request = new Byte[12];
            request[0] = System.Convert.ToByte( 1 );
            request[1] = System.Convert.ToByte( 'R' );
            request[2] = System.Convert.ToByte( 1 );
            request[3] = System.Convert.ToByte( 1 );
            request[4] = System.Convert.ToByte( 'D' );
            request[5] = System.Convert.ToByte( 1 );

            request[6] = System.Convert.ToByte( 18 / 256 ); //elencoDB
            request[7] = System.Convert.ToByte( 18 % 256 ); //elencoDB
            request[8] = System.Convert.ToByte( 0 / 256 );  //areaDataStart
            request[9] = System.Convert.ToByte( 0 % 256 );  //areaDataStart
            request[10] = System.Convert.ToByte( 160 / 256 ); //areaDataLen
            request[11] = System.Convert.ToByte( 160 % 256 ); //areaDataLen
            #endregion

            #region Processo messaggio
            byte[] response = null;
            try
            {
              response = RichiestePLC.ProcessMessage( request , mLibNoDaveServer );
            }
            catch ( Exception err )
            {
              if ( mLibNoDaveServer != null )
              {
                mLibNoDaveServer.ClosePlcConn();
                LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
                mLibNoDaveServer = null;
              }

              continue;
            }
            #endregion

            #region Parsing della risposta
            byte[] tempValue = new byte[4];

            byte[] myReturn = new byte[response.Length - 14];
            Array.Copy( response , 14 , myReturn , 0 , myReturn.Length );

            Array.Copy( myReturn , 8 , tempValue , 0 , tempValue.Length );

			// inserisco i dati in un database - ometto questo codice

            #endregion

            #region inizializzo a 1 bit di semaforo
            try
            {
              byte_sem_zero = new byte[4] { 1 , 0 , 0 , 0 };
              for ( int i = 0 ; i < byte_sem_zero.Length ; i++ )
                myValuesSem[12 + i] = System.Convert.ToByte( byte_sem_zero[i] );

              byte[] myResultOnSem = RichiestePLC.ProcessMessage( myValuesSem , mLibNoDaveServer );
            }
            catch ( Exception ex )
            {
              if ( mLibNoDaveServer != null )
              {
                mLibNoDaveServer.ClosePlcConn();
                LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
                mLibNoDaveServer = null;
              }

              continue;
            }
            #endregion
          }
        }
        catch ( Exception ex )
        {

        }
        finally
        {
          mLibNoDaveServer.ClosePlcConn();
          LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
          mLibNoDaveServer.bConnectionOK = false;
          mLibNoDaveServer = null;     
        }
      }

      if ( mLibNoDaveServer != null )
      {
        mLibNoDaveServer.ClosePlcConn();
        LibNoDaveServer.CloseHardware( EmpTypeProto.daveProtoISOTCP );
        mLibNoDaveServer.bConnectionOK = false;
        mLibNoDaveServer = null;      
      }
    }

Gianmario Pedrani
Inserita:

Avevo letto che c'erano dei problei sulla chiusura della connessione, in pratica non si chiudeva realmente il task di comunicazione.. hai provato a lasciare sempre attiva la conesione, e fare le richieste a tempo??

Gianmario Pedrani
Inserita:

Avevo letto che c'erano dei problei sulla chiusura della connessione, in pratica non si chiudeva realmente il task di comunicazione.. hai provato a lasciare sempre attiva la conesione, e fare le richieste a tempo??

Inserita:

Confermo quello detto da Gianmario, in più vedo un paio di cose strane nel codice che hai postato: se è un timer (funzione richiamata ciclicamento), mi vengono dubbi sulla gestione degli oggetti. (specie in chiusura)

In più mi sembra che ci sia una gestione messaggi che non capisco nel costesto ....

hai la mia mail, riesci a postarmi il codice intero che provo a darci una occhiata.... indica anche la configurazione hardware (numero PLC e indirizzi IP) che provo a simulare.

Ciao e scusa gli insulti che erriveranno :lol:

BR1

Inserita:

Confermo quello detto da Gianmario, in più vedo un paio di cose strane nel codice che hai postato: se è un timer (funzione richiamata ciclicamento), mi vengono dubbi sulla gestione degli oggetti. (specie in chiusura)

In più mi sembra che ci sia una gestione messaggi che non capisco nel costesto ....

hai la mia mail, riesci a postarmi il codice intero che provo a darci una occhiata.... indica anche la configurazione hardware (numero PLC e indirizzi IP) che provo a simulare.

Ciao e scusa gli insulti che erriveranno :lol:

BR1

Inserita:

Ciao ad occhio e croce sai cosa puo succedere ? mi sembra che te ad ogni colpo di timer apri una connessione, fai quello che devi fare e poi la chiudi.

Se è cosi puo verificarsi un problema, perche il windows anche se fai richiesta di chiusura, la connessione te la mette in Time_Wait mi sembra, e viene chiusa fisicamente dopo un certo timeout, quindi aprendo e chiudendo in realtà aumenti le connessioni teoricamente aperte sulla macchina, per verificare questo, basta che mentre esegui il tutto, apri il prompt e digiti un bel

netstat -n

Vedrai in indirizzo esterno l'indirizzo del tuo ip e in stato lo stato della tua connessione.

Se per caso succede questo, man mano hai delle connessioni zombi che ti saturano la rete.

Prova a darci un occhio

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...