1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xingshuang-iot-communication

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-Modbus-CN.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 5 месяцев назад de05304

Modbus通信协议教程

Введение

  • 1 катушка = 1 бит;
  • 1 адрес регистра = 2 байта;
  • [адрес регистра начинается с 0001] соответствует [адресу доступа = 0], существует смещение адреса на 1;
  • данные в формате кодирования 4 байта = BA_DC (большой порядок байтов = DC_BA, маленький порядок байтов = AB_CD);
  • поддерживает автоматическое переподключение.

Типы протоколов 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();
    }
}

Подключение к сети

  • По умолчанию используется постоянное соединение, которое необходимо закрыть вручную;
  • Если вам нужно короткое соединение, вам необходимо настроить его вручную.

1. Постоянное соединение

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();
    }
}

2. Короткое соединение

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)

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();
    }
}

Произвольный режим unitId (1 к многим)

1. Чтение данных

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();
    }
}

2. Запись данных

class Demo {
    public static void main(String[] args) {
        ModbusTcp plc = new ModbusTcp("127.0.0.1");
        // опционально

Примечание: код переведён без учёта контекста и может содержать неточности.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/xingshuang-iot-communication.git
git@gitlife.ru:oschina-mirror/xingshuang-iot-communication.git
oschina-mirror
xingshuang-iot-communication
xingshuang-iot-communication
master