Commit 43bef52d3faf8de9cd854861199a8f54771b7f42

Authored by 芯火源
1 parent f338d8e6

fix: modbus写多线圈问题修复

... ... @@ -334,27 +334,33 @@ public class TkDeviceScriptServiceImpl
334 334 }
335 335 private String multData(String functionCode,List<Integer>datas){
336 336 StringBuilder dataStr = new StringBuilder();
  337 + int dataLength = datas.size();
337 338 if(TkModBusFunctionCode.WRITE_MANY_REGISTER.getCode().equals(functionCode)){
338   - dataStr.append(dataLength(datas.size()*2));
  339 + dataStr.append(dataLength(dataLength*2));
339 340 for(Integer item: datas){
340 341 dataStr.append(modelHex(item));
341 342 }
342 343 }else{
343   - int filter = datas.size()%8;
344   - int num = datas.size()/8;
345   - dataStr.append(dataLength(filter == 0 ?num:num+1));
346   - byte one = 0x00;
347   - int index =1;
348   - for(Integer item: datas){
349   - byte byteVal=item.byteValue();
350   - one =(byte)(one<< 1);
351   - one ^= byteVal;
352   - if(index%8==0 || datas.size() == index){
353   - dataStr.append(ByteUtils.byteToHex(one));
354   - one=0x00;
355   - }
356   - index++;
357 344
  345 + int residue = dataLength%8;
  346 + int num = dataLength/8;
  347 + dataStr.append(dataLength(residue == 0 ?num:num+1));
  348 +
  349 + Integer wordVal=0;
  350 + for(int dataIndex=0,wordIndex=0;dataIndex<dataLength;dataIndex++){
  351 + Integer itemVal = datas.get(dataIndex);
  352 + if(itemVal == 1){
  353 + byte one = 1;
  354 + one<<=wordIndex;
  355 + wordVal+=one;
  356 + }
  357 + if(dataIndex%8==7 || dataLength == dataIndex+1){
  358 + dataStr.append(ByteUtils.byteToHex(wordVal.byteValue()));
  359 + wordVal=0;
  360 + wordIndex=0;
  361 + }else{
  362 + wordIndex++;
  363 + }
358 364 }
359 365 }
360 366 return dataStr.toString();
... ...