[英]Socket get input stream reading wrong values few times
我有一個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;
也許我在流閱讀中缺少更多我沒有保護的東西。
僅在出現錯誤或收到不了解的內容時僅返回null
並不足夠。 這樣,您只是使連接處於打開狀態並且處於非同步狀態,因此您沒有理由相信下一個字節是新消息的開頭。 因此,從那時起,您將閱讀難以理解的垃圾。 您需要關閉連接並重新打開它。 或者,實施協議的其余部分。
您不會從流水線中讀取的十個點中的九點檢查流的結束。
您還應該對DataInputStream
有所了解。 它已經完成了您已經很難完成的所有工作。 特別要注意readShort()
和readFully()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.