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

OSCHINA-MIRROR/xingshuang-iot-communication

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

Протокол MITSUBISHI MELSEC(MC): учебное пособие

НАЗАД ДОМОЙ

Введение

Советы:

  • Устройство делится на битовое и слововое устройство.
  • 1 адрес устройства = 2 байта.
  • Используется режим с малым концом, формат кодирования данных 4 байтов = AB_CD. (режим с большим концом = DC_BA, режим с маленьким концом = AB_CD)
  • Поддерживается только чтение и запись в двоичном формате. Чтение и запись в ASCII не поддерживается
  • Поддержка режима TCP, последовательные порты не поддерживаются
  • Поддержка ПЛК: протестированы серии iQ-R, Q/L, QnA, A, L Series(L02CPU) и FX Series(FX5U-32M)
  • Поддержка автоматического переподключения.

Серии ПЛК

Серия Тип кадра Подключение Модель
A 1E Ethernet FX3U
QnA 3E Ethernet FX5U
Q/L 3E Ethernet Q/L
IQ-R - Ethernet -
IQ-L - Ethernet -

Формат адреса, совместим со случаем.

Аббр Имя устройства Символ Адрес Тип Обозначение
SM10 Специальное реле SM 10 BIT 10
SD12 Специальный регистр SD 12 WORD 10
X2F Вход X 0x2F BIT 16
Y12F Выход Y 0x12F BIT 16
M100 Внутреннее реле M 100 BIT 10
L10 Реле фиксации L 10 BIT 10
F10 Аннунатор F 10 BIT 10
V9 Реле края V 9 BIT 10
B2F Реле связи B 0x2F BIT 16
D100 Регистр данных D 100 WORD 10
W1F Регистр связи W 0x1F WORD 16
TN100 Текущее значение таймера TN 100 WORD 10
CN100 Текущее значение счётчика CN 100 WORD 10

Интерфейс доступа к ярлыкам

номер Метод Количество устройств Размер в байтах Размер в битах
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 readBoolean 1 1/8 1
10 writeInt16 1 2 16
11 writeUInt16 1 2 16
12 writeInt32 2 4 32
13 writeUInt32 2 4 32
14 writeFloat32 2 4 32
15 writeFloat64 4 8 64
16 writeString n 2n 16n

Печать сообщения

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

class Demo {
    public static void main(String[] args) {
        McPLC mcPLC = new McPLC(EMcSeries.QnA, "127.0.0.1", 6000);
        // optional
        mcPLC.setComCallback((tag, bytes) -> System.out.printf("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));
        // read boolean
        boolean booleanData = mcPLC.readBoolean("M100");
        mcPLC.close();
    }
}

Соединение для коммуникации

  • По умолчанию используется режим длительного соединения. Вам нужно закрыть соединение вручную, когда оно не используется.
  • Если требуется короткое соединение, вам необходимо установить его вручную. Long Connection Mode
class Demo {
    public static void main(String[] args) {
        // long connection mode, persistence = true
        McPLC mcPLC = new McPLC(EMcSeries.QnA, "127.0.0.1", 6000);
        boolean booleanData = mcPLC.readBoolean("M100");
        // close it manually
        plc.close();
    }
}

Short Connection Mode

class Demo {
    public static void main(String[] args) {
        // short connection mode
        McPLC mcPLC = new McPLC(EMcSeries.QnA, "127.0.0.1", 6000);
        // set short connection mode, persistence = false
        mcPLC.setPersistence(false);
        boolean booleanData = mcPLC.readBoolean("M100");
    }
}

Read and Write в общем

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

class Demo {
    public static void main(String[] args) {
        McPLC mcPLC = new McPLC(EMcSeries.QnA, "127.0.0.1", 6000);

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

        // чтение boolean
        boolean booleanData = mcPLC.readBoolean("M100");

        // чтение списка boolean
        List<Boolean> booleanList = mcPLC.readBoolean("M100", 10);

        // чтение одного байта
        byte byteData = mcPLC.readByte("D100");

        // чтение нескольких байт
        byte[] bytes = mcPLC.readBytes("D100", 10);

        // чтение int16
        short int16Data = mcPLC.readInt16("D100");

        // чтение списка int16
        List<Integer> int16List = mcPLC.readUInt16("D100", "D108", "D130");

        // чтение uint16
        int uint16Data = mcPLC.readUInt16("D100");

        // чтение списка uint16
        List<Integer> uint16List = mcPLC.readUInt16("D100", "D108", "D130");

        // чтение int32
        int int32Data = mcPLC.readInt32("D100");

        // чтение списка int32
        List<Integer> int32List = mcPLC.readInt32("D100", "D108", "D130");

        // чтение uint32
        long uint32Data = mcPLC.readUInt32("D100");

        // чтение списка uint32
        List<Long> uint32List = mcPLC.readUInt32("D100", "D108", "D130");

        // чтение float32
        float float32Data = mcPLC.readFloat32("D100");

        // чтение списка float32
        List<Float> float32List = mcPLC.readFloat32("D100", "D108", "D130");

        // чтение float64
        double float64Data = mcPLC.readFloat64("D100");

        // чтение строки
        String stringData = mcPLC.readString("D100", 6);

        // чтение мультиадреса, только поддержка word и dword
        McMultiAddressRead addressRead = new McMultiAddressRead();
        addressRead.addWordData("D100");
        addressRead.addWordData("D150");
        addressRead.addWordData("D130");
        addressRead.addWordData("D110");
        addressRead.addDWordData("D112");
        addressRead.addDWordData("D116");
        addressRead.addDWordData("D126");
        List<McDeviceContent> contentList = mcPLC.readMultiAddress(addressRead);

        mcPLC.close();
    }
}

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

class Demo {
    public static void main(String[] args) {
        McPLC mcPLC = new McPLC(EMcSeries.QnA, "127.0.0.1", 6000);

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

        // запись одного boolean
        mcPLC.writeBoolean("M100", true);

        // запись нескольких boolean
        mcPLC.writeBoolean("M100", true, false, true);

        // запись одного байта
        mcPLC.writeByte("D100", (byte) 0x01);

        // запись нескольких байт
        mcPLC.writeBytes("D100", new byte[]{0x01, 0x02, 0x03});

        // запись одного int16
        mcPLC.writeInt16("D100", (short) 16);

        // запись нескольких int16
        mcPLC.writeInt16("D100", (short) 16, (short) 17, (short) 118);

        // запись одного uint16
        mcPLC.writeUInt16("D100", 16);

        // запись нескольких uint16
        mcPLC.writeUInt16("D100", 16, 17, 18);

        // запись одного int32
        mcPLC.writeInt32("D100", 55);

        // запись нескольких int32
        mcPLC.writeInt32("D100", 55, 66, 77);

        // запись одного uint32

*Здесь текст обрывается.* ```
mcPLC.writeUInt32("D100", 55);

// write multi uint32
mcPLC.writeUInt32("D100", 55L, 66L, 77L);

// write one float32
mcPLC.writeFloat32("D100", 0.123f);

// write multi float32
mcPLC.writeFloat32("D100", 0.123f, 145.56f, 88.12f);

// write one float64
mcPLC.writeFloat64("D100", 0.123);

// write multi float64
mcPLC.writeFloat64("D100", 0.123, 145.56, 88.12);

// write string
mcPLC.writeString("D100", "1234567890");

// multi write, only support int16 uint16 int32 uint32 float32
McMultiAddressWrite addressWrite = new McMultiAddressWrite();
addressWrite.addInt16("D100", 110);
addressWrite.addUInt16("D101", 110);
addressWrite.addInt32("D102", 110);
addressWrite.addUInt32("D104", 110);
addressWrite.addFloat32("D106", 110);
mcPLC.writeMultiAddress(addressWrite);

mcPLC.close();
}

Read and Write in Custom

class Demo {
    public static void main(String[] args) {
        McPLC mcPLC = new McPLC(EMcSeries.QnA, "127.0.0.1", 6000);

        // optional
        mcPLC.setComCallback((tag, bytes) -> System.out.printf("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));

        // ------------------ read and write device batch in word ------------------------
        byte[] expect = new byte[]{0x34, 0x12, 0x02, 0x00};
        McDeviceContent reqContent = McDeviceContent.createBy("D110", 2, expect);
        mcPLC.writeDeviceBatchInWord(reqContent);
        McDeviceAddress address = McDeviceAddress.createBy("D110", 2);
        McDeviceContent ackContent = mcPLC.readDeviceBatchInWord(address);

        // ------------------ read and write device batch in bit --------------------------
        expect = new byte[]{0x11, 0x00, 0x01, 0x10};
        reqContent = McDeviceContent.createBy("M110", 8, expect);
        mcPLC.writeDeviceBatchInBit(reqContent);
        address = McDeviceAddress.createBy("M110", 8);
        ackContent = mcPLC.readDeviceBatchInBit(address);

        // ------------------ read and write device random in word ------------------------
        List<McDeviceContent> writeWord = new ArrayList<>();
        writeWord.add(McDeviceContent.createBy("D110", new byte[]{0x50, 0x05}));
        writeWord.add(McDeviceContent.createBy("D111", new byte[]{0x75, 0x05}));
        writeWord.add(McDeviceContent.createBy("M110", new byte[]{0x40, 0x05}));
        List<McDeviceContent> writeDWord = new ArrayList<>();
        writeDWord.add(McDeviceContent.createBy("D120", new byte[]{0x02, 0x12, 0x39, 0x04}));
        writeDWord.add(McDeviceContent.createBy("M130", new byte[]{0x75, 0x04, 0x25, 0x04}));
        mcPLC.writeDeviceRandomInWord(writeWord, writeDWord);

        List<McDeviceAddress> readWord = new ArrayList<>();
        readWord.add(McDeviceAddress.createBy("D110"));
        readWord.add(McDeviceAddress.createBy("D111"));
        readWord.add(McDeviceAddress.createBy("M110"));
        List<McDeviceAddress> readDWord = new ArrayList<>();
        readDWord.add(McDeviceAddress.createBy("D120"));
        readDWord.add(McDeviceAddress.createBy("M130"));
        List<McDeviceContent> mcDeviceContents = mcPLC.readDeviceRandomInWord(readWord, readDWord);

        // ------------------------ write device random in bit ---------------------------
        List<McDeviceContent> contents = new ArrayList<>();
        contents.add(McDeviceContent.createBy("M110", new byte[]{0x01}));
        contents.add(McDeviceContent.createBy("M112", new byte[]{0x01}));
        contents.add(McDeviceContent.createBy("M113", new byte[]{0x01}));
        mcPLC.writeDeviceRandomInBit(contents);

        // ---------- read and write device multi blocks (test failed, not get reason) ----
        List<McDeviceContent> wordContents = new ArrayList<>();
        wordContents.add(McDeviceContent.createBy("D110", 2, new byte[]{0x01, 0x02, 0x03, 0x04}));
        wordContents.add(McDeviceContent.createBy("D0", 1, new byte[]{0x08, 0x07}));
        List<McDeviceContent>

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