문제

나는 Jamod를 사용할 때 Modbus에 글을 쓸 때 호기심 많은 상황을 발견했습니다. 다음 읽기 코드는 완벽하게 작동합니다.

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();
}

그러나 비슷한 방식을 쓰려고 시도하는 시도는 실패합니다 (Jamod는 3 번 시도합니다. 매번 소음 타임 아웃 렉스크를 만나고 결국 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);
}

예, 나는 요청-관찰의 다중 등록 버전을 사용하고 있다는 것을 알고 있지만 장치로 작업하는 장치는 기능 코드 3과 16 만 지원합니다.

또한 레지스터를 작성하기 위해 RAW 소켓 테스터를 작성했으며, 볼 수있는 한 올바르게 작동합니다. 그러나 두 상황 모두에서 Jamod를 사용하는 것이 좋을 것입니다.

누구든지 Jamod를 사용한 경험이 있습니까? 내가 무엇을 잘못하고 있는지 말할 수있을만큼 친절할까요? 이것은 Jamod의 1.1 및 1.2RC1 버전에서 발생합니다. 아니면 이것이 일부 공급 업체 별 상황일까요?

도움이 되었습니까?

해결책

결국 나는 내 자신의 modbus 구현을 썼습니다. 2 개의 다른 기능 코드 만 지원하면되므로 구현은 간단했습니다.

나중에 Java를위한 또 다른 오픈 소스 Modbus 라이브러리를 찾았습니다. 나는 다른 사람이 사용한 것과 같은 문제를 겪습니다 modbus4j 도움이 될 수 있습니다.

다른 팁

MODBUS 요청에는 기본적으로 단위 ID = 0이 있습니다. 따라서 다른 ID는 요청하도록 설정해야합니다.

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

질문에서 설명한 것과 동일한 문제를 해결하려고 몇 시간을 낭비했습니다.

당신의 질문에 따라 내가 쓴 나의 방법!

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();
        }

비슷한 문제가 있었는데 "장치 작업"에서 코일 레지스터로 정의 된 레지스터에 값을 쓰려고했습니다. 그래서 나는 사용했다 :

WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)

그리고 그것은 문제를 해결했습니다. 어쩌면이 도움이 될 수도 있습니다.

안녕히 계세요!

Android 에서이 문제를 겪었습니다.

이 작업은 외부 장치의 응답을 기다릴 때 큰 시간이 걸릴 수 있기 때문에 내가 찾은 솔루션은 다른 스레드에서 쓰기 및 읽기를 실행하는 것이 었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top