2012-12-31 9 views
5

Sto utilizzando NModbus in un progetto C#, per leggere & scrivere dati Modbus da/a un numero di dispositivi I/O. Sto usando il protocollo Modbus TCP/IP (ModbusIpMaster ecc.) Nel programma.Messaggio personalizzato Modbus e funzioni secondarie (NModbus, TCP, sottofunzioni)

Ho comunicato correttamente con i dispositivi (tramite un gateway Modbus) e può utilizzare i metodi predefiniti (ad esempio funzioni comuni di Modbus come ReadHoldingRegisters, WriteCoils), per accedere ai dati dai dispositivi e poterli riscrivere. Al momento, tutto quello che posso fare sono i metodi NModbus di default che espongono i codici Modbus comunemente utilizzati (1, 2, 3, 4 ecc.).

ho due difficoltà:

1) I/O impostazioni e le informazioni supplementari dispositivi possibile accedere in base al codice Modbus di 70 (0x46), e ci sono funzioni secondarie di I che ho dovrà essere utilizzato per leggere e/o scrivere le impostazioni.

Ad esempio, Func 07 (0x46), Sub func 6 (0x06), può essere utilizzato per impostare le impostazioni di comunicazione di un modulo. In questo esempio ci sono 7 byte di informazioni da inviare che portano le impostazioni (ad esempio baud rate ecc ...)

NModbus non ha un metodo specifico per questo codice funzione "personalizzato" (70). Quindi, da quello che ho capito, è necessario utilizzare la funzionalità CustomMessage di NModbus. Ho provato ad eseguire CustomMessage e, quando utilizzo i comuni codici funzione Modbus (ad esempio 1 o 2), è possibile ottenere lo stesso risultato come se stessi utilizzando i metodi predefiniti di NModbus (ad esempio, il CustomMessage funziona finora).

Quando provo i codici di funzione diversi da quelli generali (ad esempio 1, 2, 3 ...) ottengo tutti i tipi di eccezioni. Inoltre, non so come dovrei inviare la sotto-funzione con il messaggio!

Quando ho aggiunto la sottofunzione subito dopo il codice funzione (ad esempio 70 seguito da 06), e i dati vengono inviati tramite Ottengo, eccezioni. Ho davvero bisogno dell'aiuto di esperti in questo campo, per favore.

Ecco un'eccezione più evidente:

"eccezione di tipo 'Modbus.SlaveException' stato gettato Codice funzione: 198 Codice di eccezione:. 3 - Un valore contenuto nel campo dati della query non è un valore ammesso per server (o slave) Questo indica un errore nella struttura della parte restante di una richiesta complessa, ad esempio in quanto la lunghezza implicita non è corretta, in particolare NON indica che un elemento di dati inviato per l'archiviazione in un registro ha un valore al di fuori delle aspettative del programma applicativo, dal momento che il MODBUS 01 Il protocollonon riconosce il significato di alcun valore particolare di alcun registro specifico ".

2) Il secondo problema è invio ASCII RS-232 messaggi attraverso Modbus, al fine di controllare un dispositivo RS-232 che è collegato a COM1 di un modulo che ha la capacità di convertire Modbus messaggi. In altre parole, sto progettando di comunicare con il gateway Modbus, per inviare dati ASCII alla sua COM1, che a sua volta traduce i dati in RS-232 e quindi comunica con il dispositivo RS-232. La traduzione è pensata per essere interna al gateway, quindi tutto quello che devo sapere è come sulla Terra posso inviare questi messaggi, che variano in lunghezza.Non ho idea di come sia possibile e da dove cominciare.

+0

Hai trovato qualche soluzione alla domanda 2)? – Norbert

+0

Vorrei poterti aiutare, ho fatto Modbus in passato, ma era tutto fatto in casa, roba tutta da scoprire, mai usato NModbus ... –

risposta

0

Part - NModbus consente di creare un master ASCII su un client TCP o UDP.

using (TcpClient client = new TcpClient("127.0.0.1", 502)) 
{ 
    ModbusSerialMaster master = ModbusSerialMaster.CreateAscii(client); 

    // Use the master here 
} 

Per quanto riguarda la prima parte della domanda, NModbus è grande per le basi, ma manca un livello di astrazione che le consentirebbe di estendere arbitrariamente. La mia esperienza personale si è conclusa quando ho scoperto che avrebbe richiesto modifiche significative per aggiungere e rendere operativa la funzione GetServerId, anche se questo fa parte delle specifiche per Modbus RTU. La mia soluzione era di ri-implementarla da zero, (che mi ha portato meno tempo di ottenere il sorgente NModbus da compilare ed eseguire in primo luogo, a causa della sua dipendenza da librerie di terze parti per la registrazione, ecc. & estensioni mancanti per IEnumerable classi).

Problemi correlati