我有一个 Java Modbus/TCP 应用程序,它不断地从设备读取数据。
这在 99.9% 的情况下都正常工作,但是在一个周末工作之后,它可能会进入一种奇怪的模式,在这种模式下,我会在几秒钟内得到我的读取多个保持寄存器函数的假值。
我已经使用 Modscan 应用程序进行了检查,并且客户端站点上出现了虚假值,这意味着服务器设备正在正确应答。
我能得到的答案是一个由 0、1 和其他随机值填充的字节数组。
这是我的 Modbus/TCP 答案阅读:
private byte[] getModbusReply(){
byte[] reply = null;
int transactionId;
int protocol;
int tcpLen;
int id;
int replyCode;
int mbLen = 1;
try{
InputStream is = socket.getInputStream();
transactionId = (is.read()<<8)+is.read();
protocol = (is.read()<<8)+is.read();
tcpLen = (is.read()<<8)+is.read();
id = is.read();
replyCode = is.read();
if(replyCode>0x3F){
mbLen = 1;
}else{
switch(replyCode){
case 0x03:
case 0x04:
mbLen = is.read();
break;
case 0x10:
case 0x06:
mbLen = 4;
break;
default://unsupported Modbus Methods
return null;
}
}
reply = new byte[mbLen+1];
reply[0] = (byte)replyCode;
for(int i=1;i<reply.length;i++){
int res=is.read();
if(res<0){
//Modbus Stream Reading is returning -1
return null;
}
reply[i] = (byte)res;
}
}catch(Exception e){
e.printStackTrace();
return null;
}
return reply;
}
返回 null 在函数外部作为错误异常处理。
我添加了2个保护:
read() 方法在 EOF 之后返回 -1,所以我添加:
int res=is.read(); if(res<0){ //Modbus Stream Reading is returning -1 return null; }
对不支持的 Modbus/TCP 方法返回 null:
default:///unsupported Modbus Methods return null;
也许我在流式阅读中遗漏了更多我没有保护的东西。