GianLucaArrighiSalvade Inserito: 31 maggio 2019 Segnala Share Inserito: 31 maggio 2019 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora