С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 36

ModBus RTU отправка запроса и таймаут

01.08.2019, 08:17. Показов 5069. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Подскажите в каком направлении копать, чтобы реализовать отправку сообщений, прием и таймаут? Знаком с библиотекой JSSC для работы с com портами в Windows и с протоколом ModBus RTU\TCP. Стоит задача по протоколу ModBus RTU опрашивать ПЛК и выводить данные. Опрос ПЛК должен быть в отдельном потоке, как мне кажется, чтобы не тормозить GUI программы. И так же с GUI программы по нажатию кнопки отправлять данные в ПЛК.
1. Отправляем команду на чтение в ПЛК.
2. Ждем ответа от ПЛК.
2.1 вышел таймаут ожидания приема пакета, выводим ошибку или повторяем отправку пакета(n раз) и выводим ошибку.
3. Принимаем пакет, разбираем его и выводим его в GUI.

Как правильно организовать поток, чтобы принимал данные для отправки в плк, и выводил данные результат в GUI программы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.08.2019, 08:17
Ответы с готовыми решениями:

Java и ModBus RTU + RS-485
Всем привет. Возникла следующая проблема. Мне необходимо подключиться к контроллеру шагового двигателя OSM-17RA и по протоколу ModBus...

Java библиотеки для Serial Master Modbus rtu
Всем привет. У кого есть опыт использования Java библиотек для общения с устройствами через конвертор интерфейсов USB-RS485 протокол Modbus...

Modbus RTU - разобрать сформированный запрос к Slave
Добрый день Не могу разобраться с работой modbus rtu что значит запрос 024600e260? 02 - номер модуля 46 - функция и нет нигде...

10
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
03.08.2019, 15:02
Casper17, должно помочь https://sourceforge.net/projec... -udp-java/
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 36
06.08.2019, 12:25  [ТС]
Aviz__, Я натыкался на эту библиотеку, но в настройках RTU нельзя выбрать скорость, по умолчанию стоит 9600
0
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
06.08.2019, 12:31
Цитата Сообщение от Casper17 Посмотреть сообщение
эту библиотеку
какую эту?
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 36
07.08.2019, 05:57  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
какую эту?
На которую вы скинули ссылку EasyModbusTCP/UDP/RTU .java
0
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
07.08.2019, 08:21
Casper17, ну, так разбирайся, это первая ссылка в гугле!
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 36
07.08.2019, 09:06  [ТС]
Вот из той библиотеки, на которую вы дали ссылку, там при создания клиента ModBus RTU в конструкторе по умолчанию выставляются параметры COM порта и их изменить нельзя! В частности нужна скорость 115200, а там 9600
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void Connect(String comPort) throws Exception
    {
            portIdentifier = CommPortIdentifier.getPortIdentifier( comPort );
                if( portIdentifier.isCurrentlyOwned() ) {
        System.out.println( "Error: Port is currently in use" );
        } else {
      int timeout = 2000;
      
      CommPort commPort = portIdentifier.open( this.getClass().getName(), timeout );
 
      if( commPort instanceof SerialPort ) {
        serialPort = ( SerialPort )commPort;
        serialPort.setSerialPortParams( 9600,
                                        SerialPort.DATABITS_8,
                                        SerialPort.STOPBITS_1,
                                        SerialPort.PARITY_EVEN );
 
        in = serialPort.getInputStream();
        out = serialPort.getOutputStream();
        
        serialflag = true; 
      } else {
        System.out.println( "Error: Only serial ports are handled by this example." );
      }
    }  
         }
0
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
07.08.2019, 09:11
Casper17, как ты понял выражение
Цитата Сообщение от Aviz__ Посмотреть сообщение
это первая ссылка в гугле
??
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 36
07.08.2019, 09:12  [ТС]
А как-то можно изменить файл? А то он открывается только для чтения через Intellij IDEA!
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 36
30.08.2019, 11:45  [ТС]
Кто подскажет, как правильнее организовать чтение и запись данных по ModBus TCP. Использую библиотеку указанную выше, создал класс ModBusTCP
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class ModBusTCP implements Runnable {
 
    private ModbusClient modbusClient;
    private GUIPlc guiPlc;
    private ModBusCommand modBusCommand;
    private Rele rele;
    private Fan fan;
    private boolean modBusRun = true;
    private int[] initPLC;
 
    public ModBusTCP(ModbusClient modbusClient, GUIPlc guiPlc) {
        this.modbusClient = modbusClient;
        this.guiPlc = guiPlc;
        modBusCommand = ModBusCommand.READ_STAT_RELE;
    }
 
    @Override
    public void run() {
 
        while(modBusRun){
            switch (modBusCommand){
                case READ_STAT_RELE:
                    try {
                        int[] inputRegisters = modbusClient.ReadHoldingRegisters(0,13);
                        Platform.runLater(() -> {
                            guiPlc.updateGUIData(modBusCommand, inputRegisters);
                        });
                    } catch (ModbusException e) {
                        modBusRun = false;
                        System.out.println("ModbusException");
                        e.printStackTrace();
                    } catch (IOException e) {
                        modBusRun = false;
                        guiPlc.setDisconnect(false);
                        System.out.println("IOException");
                        e.printStackTrace();
                    }
                    break;
 
                case SEND_STAT_RELE:
                    System.out.println("====================Отправляем данных по кнопке");
                    try {
                        modbusClient.WriteSingleCoil(rele.getNumber(), rele.getStateTuggleButton());
                    } catch (ModbusException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    modBusCommand = ModBusCommand.READ_STAT_RELE;
                    rele = null;
                    break;               
                
                   
                case WriteCoils:
                    for(int i = 0; i < initPLC.length; i=i+2){
                        try {
                            modbusClient.WriteSingleCoil(initPLC[i],initPLC[i+1]==1?true:false);
                        } catch (ModbusException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    initPLC = null;
                    modBusCommand = ModBusCommand.READ_STAT_RELE;
                    break;
               
            }
 
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
 
    public void sendButtonModBus(String idButton){
        System.out.println("====================Выставляем флаг отправки данных по кнопке");
        this.rele = guiPlc.getRele(idButton);
        if(rele == null){
            System.out.println("Такой кнопки не существует");
            return;
        }
        modBusCommand = ModBusCommand.SEND_STAT_RELE;
    }
 
    public void sendActivPost(int[] init){
        initPLC = init;
        modBusCommand = ModBusCommand.WriteCoils;
    }
 
    public void stopModBus(){
        modBusRun = false;
    }
   
}

и запускаю его в главном контроллере, передав ссылки на библиотеку для работы по ModBus TCP и класс где мы обновляем данные на экране.
Java
1
2
3
ModBusTCP modBusTCP = new ModBusTCP(modbusClient, guiPlc);
                Thread thread = new Thread(modBusTCP);
                thread.start();
Сейчас циклически считываются все значения case READ_STAT_RELE: и данные отправляются на обновление экрана с интервалом 100мс. Когда надо отправить данные на устройство, то приходится вызывать метод, в нем выставлять флаг, чтобы сменит состояния switch case, отправляем данные и меняем состояние обратно на считывание данных с устройства. Это работает до тех пор, пока надо отправить одни типы данных, а когда надо отправлять WriteSingleCoil и WriteSingleRegister то начинаются проблемы. А если из главного метода сразу отправлять данные, а не через класс ModBusTCP , то иногда возникают ошибка связанные с потоками.
Как организовать циклическое считывание данных с устройства, а когда надо записать данные, то останавливать циклическое считывание, отправлять данные и заново запускать циклическое считывание.
0
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
30.08.2019, 12:21
Casper17, попробуй у него спросить Java и ModBus RTU + RS-485
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.08.2019, 12:21
Помогаю со студенческими работами здесь

Сформировать запрос Modbus RTU к МВА8
Добрый день! Никак не получается получить ответ от МВА8. По протоколу ascii проблем не возникло. Пример: :100300010001EB ...

Работа с Modbus RTU
Есть некий модуль ввода/вывода, со своим адресом, дискретный и аналоговый сигнал поддерживает. RS-485 интерфейс, протокол MODBUS. По...

Modbus RTU по RS-232
Проблема такая, мы запросили у производителя РЗА программу для мониторинга состояния их устройств. Они прислали приложение к ТО со списком...

Modbus RTU на STM32F10x
Доброго времени суток. Столкнулся с задачей реализации Modbus на STM32f100C4T6B. До этого момента знакомства с Modbus не было, начал...

Modbus RTU. Oпрос прибора Овен ТРМ202
подскажите пожалуйста, что-то явно делаю не так, прибор опрашиваю по modbus rtu , но в ответ в response приходят одни нули , посылаю на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru