Modbus通信协议教程
Введение
Типы протоколов Modbus
Modbus протокол | Соответствующий класс | Примечание |
---|---|---|
Tcp | ModbusTcp, ModbusTcpServer | сетевой порт |
Rtu | ModbusRtuOverTcp | требуется последовательный порт для преобразования в сетевой порт |
Ascii | ModbusAsciiOverTcp | требуется последовательный порт для преобразования в сетевой порт |
Область данных
Номер области | Название | Чтение и запись | Диапазон адресов | Соответствующие методы |
---|---|---|---|---|
0 область | Выходные катушки | Можно читать и записывать логические значения | 00001-09999 | readCoil / writeCoil |
1 область | Входные катушки | Только чтение логических значений | 10001-19999 | readDiscreteInput |
3 область | Входной регистр | Только чтение регистров | 30001-39999 | readInputRegister |
4 область | Регистр хранения | Можно читать и записывать регистры | 40001-49999 | readHoldRegister / writeHoldRegister |
Анализ адреса Согласно протоколу Modbus, адрес данных использует форму 0xxxx, 1xxxx, 3xxxx и 4xxxx.
Пример адреса | Область данных | Префикс адреса | Остаток адреса | Соответствующий метод адреса | Пример использования |
---|---|---|---|---|---|
00001 | Выходная катушка | 0 | 0001 | 0 | readCoil(0, 1) |
10003 | Входная катушка | 1 | 0003 | 2 | readDiscreteInput(2, 1) |
30020 | Входной регистр | 3 | 0020 | 19 | readInputRegister(19, 1) |
40100 | Регистр хранения | 4 | 0100 | 99 | readHoldRegister(99, 1) |
Код функции
Порядковый номер | Код функции | Описание функции | Соответствующий метод |
---|---|---|---|
1 | 01H | Считывание выходной катушки | readCoil |
2 | 02H | Считывание входной катушки | readDiscreteInput |
3 | 03H | Считывание регистра хранения | readHoldRegister |
4 | 04H | Считывание входного регистра | readInputRegister |
5 | 05H | Запись одиночной катушки | writeCoil |
6 | 06H | Запись одного регистра хранения | writeHoldRegister |
7 | 0FH | Запись нескольких катушек | writeCoil |
8 | 10H | Запись нескольких регистров хранения | writeHoldRegister |
Быстрый доступ к регистру хранения
Порядковый номер | Метод | Количество регистров | Размер байта | Размер бита | Значение | Регистры |
---|---|---|---|---|---|---|
1 | readBoolean | 1 | 1/8 | 1 | считывание boolean | регистр хранения |
2 | readInt16 | 1 | 2 | 16 | считывание Int16 | регистр хранения |
3 | readUInt16 | 1 | 2 | 16 | считывание UInt16 | регистр хранения |
4 | readInt32 | 2 | 4 | 32 | считывание Int32 | регистр хранения |
5 | readUInt32 | 2 | 4 | 32 | считывание UInt32 | регистр хранения |
6 | readFloat32 | 2 | 4 | 32 | считывание Float32 | регистр хранения |
7 | readFloat64 | 4 | 8 | 64 | считывание Float64 | регистр хранения |
8 | readString | n | 2n | 16n | считывание строки | регистр хранения |
9 | writeInt16 | 1 | 2 | 16 | запись Int16 | регистр хранения |
10 | writeUInt16 | 1 | 2 | 16 | запись UInt16 | регистр хранения |
11 | writeInt32 | 2 | 4 | 32 | запись Int32 | регистр хранения |
12 | writeUInt32 | 2 | 4 | 32 | запись UInt32 | регистр хранения |
13 | writeFloat32 | 2 | 4 | 32 | запись Float32 | регистр хранения |
14 | writeFloat64 | 4 | 8 | 64 | запись Float64 | регистр хранения |
15 | writeString | n | 2n | 16n | запись строки | регистр хранения |
Печать сообщений Если вы хотите узнать фактическое содержимое входных и выходных сообщений в процессе связи, вы можете добавить функцию печати сообщений.
class Demo {
public static void main(String[] args) {
ModbusTcp plc = new ModbusTcp("127.0.0.1");
// Настройка вывода сообщений
plc.setComCallback((tag, bytes) -> System.out.printf("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));
plc.writeInt16(2, (short) 10);
short data = plc.readInt16(2);
// Необходимо вручную закрыть
plc.close();
}
}
Подключение к сети
class Demo {
public static void main(String[] args) {
// Постоянное соединение, то есть persistence установлено в true
ModbusTcp plc = new ModbusTcp("127.0.0.1");
plc.writeInt16(2, (short) 10);
short data = plc.readInt16(2);
// Нужно закрыть вручную
plc.close();
}
}
class Demo {
public static void main(String[] args) {
// Короткое соединение
ModbusTcp plc = new ModbusTcp("127.0.0.1");
// Установить короткое соединение, т. е. persistence установить в false
plc.setPersistence(false);
plc.writeInt16(2, (short) 10);
short data = plc.readInt16(2);
}
}
Режим фиксированного unitId (1 к 1)
class
``` **Перевод кода на русский язык:**
Demo { public static void main(String[] args) { ModbusTcp plc = new ModbusTcp("127.0.0.1");
// чтение катушки
List<Boolean> readCoil = plc.readCoil(0, 2);
// чтение дискретного входа
List<Boolean> readDiscreteInput = plc.readDiscreteInput(0, 4);
// чтение регистра хранения
byte[] readHoldRegister = plc.readHoldRegister(0, 4);
// чтение входного регистра
byte[] readInputRegister = plc.readInputRegister(0, 2);
// регистр хранения, чтение Boolean
boolean readBoolean = plc.readBoolean(2, 1);
// регистр хранения, чтение Int16
short readInt16 = plc.readInt16(2);
// регистр хранения, чтение UInt16
int readUInt16 = plc.readUInt16(2);
// регистр хранения, чтение Int32
int readInt32 = plc.readInt32(2);
// регистр хранения, чтение UInt32
long readUInt32 = plc.readUInt32(2);
// регистр хранения, чтение Float32
float readFloat32 = plc.readFloat32(2);
// регистр хранения, чтение Float64
double readFloat64 = plc.readFloat64(2);
// регистр хранения, чтение String
String readString = plc.readString(2, 4);
plc.close();
}
}
### 2. Запись данных
```java
class Demo {
public static void main(String[] args) {
ModbusTcp plc = new ModbusTcp("127.0.0.1");
// одиночная запись в катушку
plc.writeCoil(0, true);
// множественная запись в катушку
List<Boolean> booleans = Arrays.asList(true, false, true, false);
plc.writeCoil(0, booleans);
// одиночная запись в регистр хранения
plc.writeHoldRegister(0, 33);
// множественная запись в регистр хранения
List<Integer> integers = Arrays.asList(11, 12, 13, 14);
plc.writeHoldRegister(3, integers);
// запись Int16 в регистр хранения
plc.writeInt16(2, (short) 10);
// запись UInt16 в регистр хранения
plc.writeUInt16(2, 20);
// запись Int32 в регистр хранения
plc.writeInt32(2, 32);
// запись UInt32 в регистр хранения
plc.writeUInt32(2, 32L);
// запись Float32 в регистр хранения
plc.writeFloat32(2, 12.12f);
// запись Float64 в регистр хранения
plc.writeFloat64(2, 33.21);
// запись String в регистр хранения, чётной длины
plc.writeString(2, "1234");
plc.close();
}
}
class Demo {
public static void main(String[] args) {
ModbusTcp plc = new ModbusTcp("127.0.0.1");
// опционально
plc.setComCallback((tag, bytes) -> System.out.printf("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));
// чтение катушки
List<Boolean> readCoil = plc.readCoil(2, 0, 2);
// чтение дискретного входа
List<Boolean> readDiscreteInput = plc.readDiscreteInput(2, 0, 4);
// чтение регистра хранения
byte[] readHoldRegister = plc.readHoldRegister(2, 0, 4);
// чтение входного регистра
byte[] readInputRegister = plc.readInputRegister(2, 0, 2);
// регистр хранения, чтение Boolean
boolean readBoolean = plc.readBoolean(3, 2, 1);
// регистр хранения, чтение Int16
short readInt16 = plc.readInt16(3, 2, true);
// регистр хранения, чтение UInt16
int readUInt16 = plc.readUInt16(3, 2, false);
// регистр хранения, чтение Int32
int readInt32 = plc.readInt32(4, 2, EByteBuffFormat.AB_CD);
// регистр хранения, чтение UInt32
long readUInt32 = plc.readUInt32(4, 2, EByteBuffFormat.AB_CD);
// регистр хранения, чтение Float32
float readFloat32 = plc.readFloat32(4, 2, EByteBuffFormat.AB_CD);
// регистр хранения, чтение Float64
double readFloat64 = plc.readFloat64(4, 2, EByteBuffFormat.AB_CD);
// регистр хранения, чтение String
String readString = plc.readString(5, 2, 4);
plc.close();
}
}
class Demo {
public static void main(String[] args) {
ModbusTcp plc = new ModbusTcp("127.0.0.1");
// опционально
Примечание: код переведён без учёта контекста и может содержать неточности.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )