проблема с протоколом Modbus при использовании java программирования - PullRequest
0 голосов
/ 27 февраля 2020

У меня проблема при использовании протокола Modbus, если честно, это мой первый раз, когда я имею дело с таким протоколом, особенно потому, что я использую его для связи с очень редким контроллером документации (BF-1010). связь верна, но мы не можем прочитать входные данные, и я не знаю почему ??? мы используем библиотеку easymodbus и в качестве технологии используем java. ниже вы найдете код, который мы используем, а также некоторые изображения для конфигурации и результатов. 4 ссылки.

[modbus config ][1]
[bf-1010 intrerface][2]
[java program][3]
[results][4]

  [1]: https://i.stack.imgur.com/aFa9B.jpg
  [2]: https://i.stack.imgur.com/RJpxJ.jpg
  [3]: https://i.stack.imgur.com/MZwPN.jpg
  [4]: https://i.stack.imgur.com/jQ4Td.jpg



package BF;
import de.re.easymodbus.modbusclient.*;
import de.re.easymodbus.exceptions.*;
import java.io.IOException;
import java.net.*;
import java.nio.ByteBuffer;
import java.io.*;
import java.util.*;
import java.io.InputStream;
import de.re.easymodbus.exceptions.ModbusException;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class connectBF {
public static void main(String[] args) throws Exception


ModbusClient modbusClient = new ModbusClient("192.168.9.124",50002);
modbusClient.Connect();
boolean d=modbusClient.isConnected();
System.out.println(d);

try
{
boolean[] input = modbusClient.ReadDiscreteInputs(10020, 2000);

for(int i=0;i<input.length;i++)
{
if(input[i] == true)  System.out.println("INPUT "+i+" : "+input[i]);
}
}

catch (Exception e)
{
System.out.println("error");
}  

}
}

1 Ответ

0 голосов
/ 28 февраля 2020

Таблица внизу ссылки modbus config помогает перевести приведенную выше таблицу и выдает вызов для получения DI1-12 (что, я полагаю, именно то, что вы пытаетесь сделать):

Код функции: 2 - чтение дискретных входов
Начальный адрес 0x14 - десятичный 20
Количество входов 0x0 C - 12 десятичных

Так что попробуйте modbusClient.ReadDiscreteInputs(20, 12);.

(возможно, вы пытаетесь получить дополнительные поля, не охватываемые одним изображением; однако я бы предложил сначала попробовать описанное выше, а затем расширить его, чтобы охватить дополнительные входные данные, когда вы знаете, что это работает).

A большая часть документации по Modbus следует старым «стандартам» и может быть довольно запутанной (см. раздел «Modbus: когда 40001 действительно означает 1 или 0 действительно означает 1» в этой статье для получения дополнительной информации)

...