Vai al contenuto
PLC Forum


Corretto Utilizzo Libreria Libnodave?


zak69pinz

Messaggi consigliati

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.

Link al commento
Condividi su altri siti


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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

  • 4 years later...

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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;      
      }
    }

Link al commento
Condividi su altri siti

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;      
      }
    }

Link al commento
Condividi su altri siti

Gianmario Pedrani

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??

Link al commento
Condividi su altri siti

Gianmario Pedrani

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??

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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...