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

OSCHINA-MIRROR/xingshuang-iot-communication

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

Протокол Modbus: руководство

Введение

  • Советы:

    • 1 катушка = 1 бит.
    • 1 адрес регистра = 2 байта.
    • Адрес начала регистра 0001 равен адресу доступа 0, есть смещение адреса на 1.
    • Формат кодирования данных из 4 байтов — BA_DC (режим big-endian — DC_BA, режим little-endian — AB_CD).
    • Поддерживается автоматическое переподключение.
  • Тип протокола: | Протокол Modbus | Класс | Примечание | |:---------------:|:-----------------------------|:------------------------| | Tcp | ModbusTcp, ModbusTcpServer | Ethernet | | Rtu | ModbusRtuOverTcp | Серийный в Ethernet | | Ascii | ModbusAsciiOverTcp | Серийный в Ethernet |

  • Область: | Номер области | Название | Чтение/запись | Диапазон адресов | Метод | |:-------------:|:-----------------:|--------------:|----------------:|------------------------------------| | 0 область | Выходная катушка | Чтение/запись | 00001–09999 | readCoil / writeCoil | | 1 область | Входная катушка | Чтение | 10001–19999 | readDiscreteInput | | 3 область | Входной регистр | Чтение | 30001–39999 | readInputRegister | | 4 область | Регистр удержания | Чтение/запись | 40001–49999 | readHoldRegister / writeHoldRegister |

  • Адрес: Согласно коммуникационному протоколу Modbus, данные 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 | регистр удержания | | 2 | readInt16 | 1 | 2 | 16 | регистр удержания | | 3 | readUInt16 | 1 | 2 | 16 | регистр удержания | | 4 | readInt32 | 2 | 4 | 32 | регистр удержания | | 5 | readUInt32 | 2 | 4 | 32 | регистр удержания | | 6 | readFloat32 | 2 | 4 | 32 | регистр удержания | | 7 | readFloat64 | 4 | 8 | 64 | регистр удержания | | 8 | readString | n | 2n | 16n | регистр удержания | | 9 | writeInt16 | 1 | 2 | 16 | регистр удержания | | 10 | writeUInt16 | 1 | 2 | 16 | регистр удержания | | 11 | writeInt32 | 2 | 4 | 32 | регистр удержания Регистрация данных | № | Метод | Длина в байтах | Размер регистра | Тип регистра | | :--: |:--:| :--:| :--:| :--:| | 12 | writeUInt32 | 4 | 32 | регистр | | 13 | writeFloat32 | 4 | 32 | регистр | | 14 | writeFloat64 | 8 | 64 | регистр | | 15 | writeString | n | 2n | 16n | регистр |

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

class Demo {
    public static void main(String[] args) {
        ModbusTcp plc = new ModbusTcp("127.0.0.1");
        // print message
        plc.setComCallback((tag, bytes) -> System.out.printf("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));
        plc.writeInt16(2, (short) 10);
        plc.close();
    }
}

Коммуникационное соединение

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

Режим длительного соединения

class Demo {
    public static void main(String[] args) {
        // long connection mode, persistence = true
        ModbusTcp plc = new ModbusTcp("127.0.0.1");
        plc.writeInt16(2, (short) 10);
        short data = plc.readInt16(2);
        // close it manually
        plc.close();
    }
}

Короткий режим соединения

class Demo {
    public static void main(String[] args) {
        // short connection mode
        ModbusTcp plc = new ModbusTcp("127.0.0.1");
        // set short connection mode, 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");

        // read coil
        List<Boolean> readCoil = plc.readCoil(0, 2);

        // read discrete input
        List<Boolean> readDiscreteInput = plc.readDiscreteInput(0, 4);

        // read hold register
        byte[] readHoldRegister = plc.readHoldRegister(0, 4);

        // read input register
        byte[] readInputRegister = plc.readInputRegister(0, 2);

        // hold register read Boolean
        boolean readBoolean = plc.readBoolean(2, 1);

        // hold register read Int16
        short readInt16 = plc.readInt16(2);

        // hold register read UInt16
        int readUInt16 = plc.readUInt16(2);

        // hold register read Int32
        int readInt32 = plc.readInt32(2);

        // hold register read UInt32
        long readUInt32 = plc.readUInt32(2);

        // hold register read Float32
        float readFloat32 = plc.readFloat32(2);

        // hold register read Float64
        double readFloat64 = plc.readFloat64(2);

        // hold register read String
        String readString = plc.readString(2, 4);

        plc.close();
    }
}

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

class Demo {
    public static void main(String[] args) {
        ModbusTcp plc = new ModbusTcp("127.0.0.1");

        // single write coil
        plc.writeCoil(0, true);

        // multiple write coil
        List<Boolean> booleans = Arrays.asList(true, false, true, false);
        plc.writeCoil(0, booleans);

        // single write hold register
        plc.writeHoldRegister(0, 33);
        // multiple write hold register
        plc.writeHoldRegister(3, new byte[]{(byte) 0x11, (byte) 0x12});
        // multiple write hold register
        List<Integer> integers = Arrays.asList(11, 12, 13, 14);
        plc.writeHoldRegister(3, integers);

        // hold register write int16
        plc.writeInt16(2, (short) 10);

        // hold register write uint16
        plc.writeUInt16(2, 20);

        // hold register write int32
        plc.writeInt32(2, 32);

        // hold register write uint32
        plc.writeUInt32(2, 32L);

        // hold register write float32
        plc.writeFloat32(2, 12.12f);

        // hold register write float64
``` ```
plc.writeFloat64(2, 33.21);

// hold register write String, even length
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);

        // регистр хранения чтение Int32
        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");
        // опционально
        plc.setComCallback((tag, bytes) -> System.out.printf("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));

        // одиночная запись катушки
        plc.writeCoil(2, 0, true);

        // множественная запись катушки
        List<Boolean> booleans = Arrays.asList(true, false, true, false);
        plc.writeCoil(2, 0, booleans);

        // одиночная запись регистра хранения
        plc.writeHoldRegister(2, 0, 33);
        // множественная запись регистра хранения
        List<Integer> integers = Arrays.asList(11, 12, 13, 14);
        plc.writeHoldRegister(2, 3, integers);

        // регистр хранения запись int16
        plc.writeInt16(3, 2, (short) 10, true);

        // регистр хранения запись uint16
        plc.writeUInt16(3, 2, 20, false);

        // регистр хранения запись int32
        plc.writeInt32(4, 2, 32, EByteBuffFormat.AB_CD);

        // регистр хранения запись uint32
        plc.writeUInt32(4, 2, 32L, EByteBuffFormat.AB_CD);

        // регистр хранения запись float32
        plc.writeFloat32(4, 2, 12.12f, EByteBuffFormat.AB_CD);

        // регистр хранения запись float64
        plc.writeFloat64(4, 2, 33.21, EByteBuffFormat.AB_CD);

        // регистр хранения запись String
        plc.writeString(5, 2, "1234");

        plc.close();
    }
}

ModbusTcp Server(Slave)

class Demo {
    public static void main(String[] args) {
        ModbusTcpServer server = new ModbusTcpServer();
        server.start();

        ModbusTcp modbusTcp = new ModbusTcp("127.0.0.1");
        // опционально
        modbusTcp.setComCallback((tag, bytes) -> System.out.printf("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));

        modbusTcp.writeInt16(2, (short) 10);
        short data = modbusTcp.readInt16(2);

        modbusTcp.close();
        server.stop();
    }
}

Опубликовать ( 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