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