Pergunta

me deparei com uma situação curiosa ao usar jamod de escrever para Modbus. A seguir código de leitura funciona perfeitamente:

public static void main(String[] args) throws Exception {
   InetAddress address = InetAddress.getByName("host.somewhere");
   TCPMasterConnection connection = new TCPMasterConnection(address);
   connection.setPort(502);
   connection.connect();
   ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(0, 1);
   ReadMultipleRegistersResponse response = (ReadMultipleRegistersResponse)
       executeTransaction(connection, request);
}

private static ModbusResponse executeTransaction(TCPMasterConnection connection,
         ModbusRequest request) 
         throws ModbusIOException, ModbusSlaveException, ModbusException {
   ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);
   transaction.setRequest(request);
   transaction.execute();
   return transaction.getResponse();
}

Mas tentando escrever maneira similar falhar (Jamod tenta 3 vezes, encontros cada vezes SocketTimeoutException e, finalmente lança ModbusException).

public static void main(String[] args) throws Exception {
    final InetAddress address = InetAddress.getByName("host.somewhere");
    final TCPMasterConnection connection = new TCPMasterConnection(address);
    connection.setPort(502);
    connection.connect();
    Register reg = new SimpleRegister(0);
    WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
        new Register[]{reg});
    executeTransaction(connection, request);
}

Sim, eu sei que estou usando versões multi-registo do pedido-objetos, mas o dispositivo que estou trabalhando com apenas suporta a função de códigos 3 e 16.

Eu também escrevi matéria-socket tester para escrever registros, e, tanto quanto eu posso ver ele funciona corretamente. Mas seria bom para uso jamod em ambas as situações.

Alguém tem qualquer experiência no uso jamod e teria que se ter a amabilidade de dizer o que eu estou fazendo errado? Isso acontece com ambos os 1.1 e 1.2rc1 versões do jamod. Ou isso é possivelmente alguma situação específica do fornecedor?

Foi útil?

Solução

No final eu escrevi minha própria implementação do Modbus. Eu só precisava suportar 2 códigos de função diferentes, assim que a implementação foi simples.

Apesar Mais tarde eu descobri outra biblioteca fonte Modbus aberta para java. I alguém se depara com o mesmo problema usando modbus4j pode ajudar.

Outras dicas

pedidos de Modbus tem unidade id = 0 por padrão. Assim, qualquer outro tipo de identificação deve ser definida como pedido, por exemplo:.

WriteCoilRequest writeCoilRequest = new WriteCoilRequest(ref, bool);
writeCoilRequest.setUnitID(unitid);

desperdiçado algumas horas tentando resolver o mesmo problema que você descreveu na pergunta.

O meu método que eu escrevi com base em sua pergunta obras!

try {
            ModbusTCPTransaction trans = null; // the transaction

            String refe = "0";// HEX Address
            int ref = Integer.parseInt(refe, 16);// Hex to int
            // int count = 1; // the number Address to read

            ReadMultipleRegistersRequest ainReq = new ReadMultipleRegistersRequest(
                    ref, count);
            ReadMultipleRegistersResponse ainRes = new ReadMultipleRegistersResponse();

            // 3. Start Transaction
            trans = new ModbusTCPTransaction(con);
            trans.setRetries(5);
            trans.setReconnecting(true);
            trans.setRequest(ainReq);

            int k = 0;
            do {
                trans.execute();
                ainRes = (ReadMultipleRegistersResponse) trans.getResponse();
                Register reg = new SimpleRegister(ertekInt);
                WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
                        new Register[]{reg});
                System.out.println("Állított AOUT:  " + request.getRegisterValue(k));
                lista.add(createPlanet("AOUT",
                        "" + k + "    " + request.getRegisterValue(k)));
                k++;
            } while (k < count);
} catch (ModbusIOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ModbusSlaveException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ModbusException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Eu tive um problema semelhante, eu estava tentando escrever um valor num registo que foi definido no "trabalho de dispositivo" como um registo bobina. Então eu usei:

WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)

e que resolveu o problema. Talvez essa ajuda.

Bye!

Eu encontrei este problema no Android.

Como esta tarefa pode demorar algum tempo significativo, pois aguarda uma resposta de um dispositivo externo, a solução que eu encontrei foi a de executar a escrita ea leitura em outro segmento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top