Vai al contenuto
PLC Forum


PROBLEMI CON LE FUNZIONI INPUT_CHAR , PRINT_CHAR


Seby_cucu

Messaggi consigliati

Ciao a tutti spero che qualcuno mi possa aiutare.

ho una CPU M340 e deve comunicare tramite modbus RS485 con una scheda MBS7. Praticamente devo gestire i fancoil per poterli accendere e spegnere.

Tutto il collegamento è fatto bene infatti riesco a spegnere e accendere il dispositivo. Il mio problema è proprio all'avvio. 

Quando accendo il PLC vorrei che alla prima scansione mi leggesse tutti i fancoil  e di tutti mi leggesse solo il registro 4. Gli altri settano altre cose che per il momento non uso.

Non capisco come usare la funzione poichè se cambio l'indirizzo del dispositivo all'avvio non me lo rileva nonostante faccio un ciclo di lettura per tutti i teorici dispositivi collegati.

Do il timeout per ogni lettura (200ms), do l'indirizzo del canale ADDM('0.0.0.SYS'), do la lunghezza dei caratteri da leggere, e metto il reset =1 per aggiornare sempre il baffer della risposta.

Dove sbaglio?

Ciao 

Spero di avere una risposta :wallbash:

Link al commento
Condividi su altri siti


CIAO,

DEVO LEGGERE UNA STRINGA POICHeE' IL DISPOSITIVO MI RISPONDE CON STRINGE DI CARATTERI PER QUESTO USO INPUT_CHAR E PRINT_CHAR.

Il dispositivo è un MBS7. 

:-(

 

Link al commento
Condividi su altri siti

Giuseppe Signorella

Ciao Seby_cucu,

Controlla che il tasto caps lock,non sia rimasto inserito.

Sul forum è vietato scrivere in maiuscolo, in quanto equivale ad urlare.

Buon proseguimento.

Link al commento
Condividi su altri siti

Ciao a tutti,

nessuno mi sa dare un piccolo .?

Sono sempre allo stato iniziale, non trovo nessun aiuto nella guida.

Lasciando stare il primo avvio di tutto il sistema, mi sapete dire perchè non leggo il cambio di stato del dispositivo?

Se accendo e spengo io da programma tutto ok, ma se qualcuno accende il condizionatore con il telecomando io con la 

input_char non rilevo il cambiamento di stato :wallbash:.

Spero in un vostro aiuto

Ciao a tutti

Link al commento
Condividi su altri siti

se parli di Modbus, dimentica print_xxx e input_xxx, utilizzerai Read_Var - Write_Var, attenzione: solamente sei sei master del bus. Potresti anche utilizzare la libreria Xmit_ Se il master non è il tuo PLC non devi implementare nulla, M340 è nativo Modbus. Se utilizzi print_char oppure input_char non stiamo parlando di Modbus bensì di Ascii. Se così controlla il carattere di fine trasmissione..

Link al commento
Condividi su altri siti

Grazie Biros,

faccio il controllo che mi suggerisci. Sono costretta ad usare input_char e print_char perchè me lo impone il dispositivo con cui comunico, e quello che non capisco è perchè se riesco a dare il comando di scrittura, ad esempio per spegnerlo, va tutto ok ma non riesco a rilevare il suo stato in lettura nel caso in cui il comando non gli arrivi dal PLC.

Provo la tua idea Grazie

Link al commento
Condividi su altri siti

Ciao sempre io!:(

Visto che nessuno mi sa dare risposta provo a postare il codice così magari mi sapete dare un suggerimento: 

vorrei solo leggere il registro 4 del mio fancoil,  il cui indirizzo è 3:

so che sbaglio in  count_case =0 ma non capisco come impostarlo perchè se lo elimino non legge nulla poichè la input_char non sa cosa leggere e non gli arriva nessuna richiesta dal master; se la metto allora o mi tiene acceso il dispositivo ( in read_2 il secondo parametro è 16#9) o me lo tiene spento.

Se in SEND_ManPar[3]:=3 qualunque cosa ci sia in read_2 me lo spegne, se send_ManPar[3]:=4 mi scrive in continuazione quello che c'è in read_2 e nessuno può cambiare lo stato del dispositivo, neppure se io da codice lo spengo.

 

IF (not(rec_manpar[0].0) or (count_case = 1)) then
    (*Ciclo di lettura *)    
   case count_case of
    0:  
       read_1 := byte_as_word(16#FE, 3);
       read_2 := byte_as_word(16#0004, 16#9);
        read_3:= 16#0000;
        send_ManPar[2]:= 2;    (*timeout trasmissione*)
        send_ManPar[3]:= 4;    (*numero di caratteri da inviare*)
        print_char(ADDM('0.0.0.SYS'), buf_string_send, send_ManPar);
        count_case:=1;
    
    1:      
        rec_manpar[2]:=2;   
        input_char (ADDM('0.0.0.SYS'), 0, 20, rec_manpar, buf_string_rec);
        read_fancoil:= string_to_ascii(buf_string_rec);
        count_case := 3;

    3: 

        (* interpretazione risposta *)
        IF(rec_manpar[1] = 0) then
            (*ricezione valida *)
            fc_alm[indice_fan] := false;
                   else fc_alm[indice_fan] := true;
            end_if;
        
        if  (simu) then 
            
            count_case:= 10; 
           elsecount_case:= 0; 
        end_if;
    10:        
            qui eseguo la scrittura che funziona perfettamente
            count_case:= 11;

    11:

        if not(send_ManPar[0].0) then
             count_case:= 0; end_if;
  

   end_case;
end_if;

 

 

Grazie

Ciao a tutti

 

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