Как отправить сигнал на Modbus через TCP / IP в Java? - PullRequest
0 голосов
/ 03 июля 2019

Я работаю над клиентским приложением, которое должно отправлять сигнал в Modbus, который открывает и закрывает шлюз с IP-адресом и неизменяемым номером порта 502. В инструкции говорится, чтобы создать клиентское приложение win-socket и отправить команду буфер. Я не понимаю, как отправить командный буфер. Это снимок команд. Команды Modbus

Я создал клиентский класс сокета Java, но я не знаю, какое сообщение отправлять и какой тип данных использовать для отправки сообщения. или я должен использовать одну из библиотек Modbus для отправки сигнала. Спасибо!

                socket = new Socket("192.168.0.8, 502);
                OutputStream output = socket.getOutputStream();
                OutputStreamWriter writer = new OutputStreamWriter(output);
                BufferedWriter bw = new BufferedWriter(writer);

                short buffer = ??; // don't know what to send here

                //String sendMesage = buffer;
                bw.write(buffer);
                bw.flush();
                System.out.println("Message sent to the server: " + buffer);

                InputStream receive = socket.getInputStream();
                InputStreamReader reader = new InputStreamReader(receive);
                BufferedReader bufferedReader = new BufferedReader(reader);

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Я получил ответ.Ну, по крайней мере, половина этого.Вместо создания класса сокета в Java, я использовал клиентскую библиотеку Easymodbus.jar.Все, что мне нужно было сделать, это подключиться к серверу с помощью IP-адреса Modbus и найти метод EasyModbus Methods с кодом функции (в моем случае это был код функции 6) и вызвать этот метод с помощьюпараметр предоставлен в руководстве.Я публикую код на тот случай, если он кому-нибудь понадобится.Это для контроллера Modbus от Magnetic autocontrol GMBH.

    ModbusClient modbusClient = new ModbusClient("192.168.0.135", 502);
    modbusClient.Connect();
    modbusClient.WriteSingleRegister(00, 0001);

Я все еще пытаюсь выяснить, получен ли вывод, отправленный сервером.Кто-нибудь может мне помочь?Спасибо!

0 голосов
/ 04 июля 2019

Исходя из фрагмента кода, который вы показываете по своему вопросу, создается впечатление, что вы пытаетесь написать клиент Modbus с нуля.

Modbus - довольно простой протокол, но для написания отладки нового клиента потребуется немало усилий, и, поскольку протокол открыт, уже написано, отлажено и протестировано большое количество кода. Смотри, например, здесь .

По какой команде отправлять нелегко сказать, если вы не упомянули, к какому устройству, в частности, вы подключаетесь и что именно вы хотите с ним делать. В частом сценарии у вас есть машина или датчик в отдаленном районе вашей фабрики, который регистрирует данные от своих датчиков и реагирует на эти данные определенным образом. С помощью Modbus вы можете отправлять запросы на данные на ваш компьютер (считывание катушек / битов или регистров / числовых значений), чтобы отслеживать, что он делает, и отправлять команды для управления им (запись катушек или регистров Modbus) из удаленной комнаты управления с помощью HMI или любой другой вид компьютера.

РЕДАКТИРОВАТЬ: Теперь, когда вы решили использовать EasyModbus, вы ближе к тому, что вы хотите. Но похоже, что вы ищете чтение данных с вашего устройства, поэтому вам не нужно записывать регистры. Вы можете попробовать этот фрагмент ( source ):

public static void main(String[] args) 
    {
        ModbusClient modbusClient = new ModbusClient("127.0.0.1", 1536);
        try
        {
            modbusClient.Connect();
            //Read Int value from register 0 (Barrier Command)
            System.out.println(modbusClient.ReadHoldingRegisters(0, 1));
            //Read Float Value from Register 1 and 2 (Barrier Status)
            System.out.println(ModbusClient.ConvertRegistersToFloat(modbusClient.ReadHoldingRegisters(1, 2)));

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

Если вы посмотрите на карту адресов Modbus с вашего устройства (я взял ее из этого руководства , предполагая, что это ваше устройство):

enter image description here

Важно отметить, что на вашем устройстве есть 16-битные и 32-битные значения. Поскольку регистры Modbus 16-битные, для 32-битных типов данных вам нужно прочитать два регистра. Это относится только к регистру № 1 (статус барьера в соответствии с приведенным выше отображением). Для всех остальных вы можете читать и отображать в виде целочисленных значений.

...