Vai al contenuto
PLC Forum


Modificare funzione scrittura modbus per inviare singolo registro


GianLucaArrighiSalvade

Messaggi consigliati

GianLucaArrighiSalvade

Ciao a tutti,

ho appena acquistato un analizzatore di rete della Lovato (DMG610) e sto cercando di farlo comunicare via modbus con una CPU 313.

Nessun problema con la lettura; vorrei però poter dare anche alcuni comandi via modbus (reset dei contatori e reset dei picchi minimi e massimi);

leggendo il manuale della lovato trovo che i comandi possono essere inviati solo utilizzando la funzione modbus 6 (Preset single register), io ad ora ho già a disposizione un FB che implementa la funzione modbus 10  (Preset multiple register) inizialmente pensavo di poterla utilizzare comunque per inviare comandi, ma mi sono reso conto che l'unico valore che invia è 0 e tra l'altro, dopo l'invio, la scrittura rimane bloccata mentre posso continuare a leggere.

 


// E' possibile dare 2 tipi di comando:

// 10h 'Write n Words to master output area 4x',
// per scrivere words nello Slave.

// 03h 'Read n Words of master output area 4x'.
// per leggere words dallo Slave.

// A seconda del caso, compongo il telegramma di comando.


// Riconoscimento cambio Slave.
// Se viene richiesto un differente Slave, inserisco un ritardo,
// per essere sicuro che la linea seriale sia stata rilasciata.

      L     #wSlaveAddr
      L     #wLastSlaveAddr
      <>I   
      =     #bSlaveDifferent

      CALL  #tSwitchSlave_1
       IN:=#bSlaveDifferent
       PT:=#dDM_SwitchDelay
       Q :=
       ET:=


      ON    #bSlaveDifferent
      O     #tSwitchSlave_1.Q
      SPBN  lbl2

      L     #wSlaveAddr
      T     #wLastSlaveAddr


// Indirizzo Slave.

      L     #wSlaveAddr
      T     "dbModbus_Invio".SlaveAddr  // Telegramma Byte 0

// Funzione Modbus da eseguire

      L     #byModBusFunction
      T     "dbModbus_Invio".FunctionCode    // Telegramma Byte 1

// Indirizzo iniziale word.

      L     #wParamStart
      T     "dbModbus_Invio".AddrFirstWord    // Telegramma Byte 2 + Telegramma Byte 3

// Numero di words

      L     #wNumOfParam
      T     "dbModbus_Invio".NumOfWords // Telegramma Byte 4 + Telegramma Byte 5

// Scrittura words.

      L     #byModBusFunction
      L     W#16#10
      ==I   
      SPBN  no10

      L     "dbModbus_Invio".NumOfWords
      L     2
      *I    
      T     "dbModbus_Invio".NumOfBytes // Telegramma Byte 6


      L     "dbModbus_Invio".NumOfBytes
      L     7
      +I    
      T     #wSFC217_BufferLen


      SET   
      =     #bWriteWords

      SPA   fnok


// Lettura words.

no10: L     #byModBusFunction
      L     W#16#3
      ==I   
      SPBN  no03

      L     6
      T     #wSFC217_BufferLen

      SET   
      =     #bReadWords

      SPA   fnok


no03: NOP   0


      SET   
      R     #bCmdRun

      SPA   ncli

fnok: NOP   0

// Costruzione del puntatore.

// Memorizzazione contenuti dei Registri Indirizzi AR1 e AR2.

      TAR1  #dMemoAR1
      TAR2  #dMemoAR2

// Carica il valore iniziale del puntatore ANY in AR1

      LAR1  P##anyDataPtr

// Carica l'ID-sintassi nel puntatore ANY.

      L     B#16#10
      T     LB [AR1,P#0.0]

// Carica tipo di dati nel puntatore ANY.

      L     B#16#2                      // Tipo dati = byte
      T     LB [AR1,P#1.0]

// Scrive nel puntatore ANY quanti byte

      L     #wSFC217_BufferLen
      T     LW [AR1,P#2.0]

// Numero del DB dei telegrammi (DB107 dbModbus_Invio)

      L     107
      T     LW [AR1,P#4.0]

// Area di memoria DB.

      L     P#DBX 0.0


// Indirizzo iniziale bytes telegrammi.

      L     0
      SLD   3
      +D    
      T     LD [AR1,P#6.0]


// Ripristino contenuti Registri Indirizzi AR1 e AR2.

      LAR1  #dMemoAR1
      LAR2  #dMemoAR2


lbl2: NOP   0

// Esecuzione comando.

      U     #bCmdRun
      UN    #bSlaveDifferent
      =     #bRun

      U     #bRun
      SPBN  nrun

      CALL  SFC  217                    // Send
       DataPtr:=#anyDataPtr
       DataLen:=#wSFC217_DataLen        // uso interno SFC
       RetVal :=#wSFC217_RetVal         // Return-Code


nrun: NOP   0


Secondo voi si può adattare per scrivere in un singolo registro? dove potrebbe essere l'errore che mi causa il blocco se invio parametri differenti da 0?

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