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

OSCHINA-MIRROR/xingshuang-iot-communication

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

Перевод текста на русский язык:

1. Длинное соединение (рекомендуется)

class Demo {
    public static void main(String[] args) {
        // Длинное соединение, то есть с сохранением данных в true
        S7PLC s7PLC = new S7PLC(EPlcType.S1200, "127.0.0.1");
        s7PLC.writeByte("DB2.1", (byte) 0x11);
        s7PLC.readByte("DB2.1");
        // Нужно закрыть вручную, если нужно использовать постоянно, закрывать не нужно
        s7PLC.close();
    }
}

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

class Demo {
    public static void main(String[] args) {
        // Короткое соединение
        S7PLC s7PLC = new S7PLC(EPlcType.S1200, "127.0.0.1");
        // Устанавливаем короткое соединение, то есть сохраняем данные в false
        s7PLC.setPersistence(false);
        s7PLC.writeByte("DB2.1", (byte) 0x11);
        s7PLC.readByte("DB2.1");
    }
}

Клиентское руководство (S7Any адресация)

1. Прямое чтение и запись

1.1 Чтение данных

class Demo {
    public static void main(String[] args) {
        S7PLC s7PLC = new S7PLC(EPlcType.S1200, "127.0.0.1");
        // Чтение boolean
        boolean boolData = s7PLC.readBoolean("DB1.2.0");
        List<Boolean> boolDatas = s7PLC.readBoolean("DB1.2.0", "DB1.2.1", "DB1.2.7");
        List<Boolean> iDatas = s7PLC.readBoolean("I0.0", "I0.1", "I0.2", "I0.3", "I0.4", "I0.5");
        List<Boolean> qDatas = s7PLC.readBoolean("Q0.0", "Q0.1", "Q0.2", "Q0.3", "Q0.4", "Q0.5", "Q0.6", "Q0.7");
        List<Boolean> mDatas = s7PLC.readBoolean("M1.0", "M1.1", "M1.2", "M1.3", "M1.4", "M1.5", "M1.6", "M1.7");
        List<Boolean> vDatas = s7PLC.readBoolean("V1.0", "V1.1", "V1.2", "V1.3", "V1.4", "V1.5", "V1.6", "V1.7"); // 200smart имеет V область

        // Чтение byte
        byte byteData = s7PLC.readByte("DB14.0");
        byte[] byteDatas = s7PLC.readByte("DB14.0", 4);
        byte iByteData = s7PLC.readByte("I0");
        byte qByteData = s7PLC.readByte("Q0");
        byte mByteData = s7PLC.readByte("M0");
        byte vByteData = s7PLC.readByte("V0"); // 200smart имеет V область

        // Чтение UInt16
        int intData = s7PLC.readUInt16("DB14.0");
        List<Integer> intDatas = s7PLC.readUInt16("DB1.0", "DB1.2");

        // Чтение UInt32
        long int32Data = s7PLC.readUInt32("DB1.0");
        List<Long> int32Datas = s7PLC.readUInt32("DB1.0", "DB1.4");

        // Чтение float32
        float float32Data = s7PLC.readFloat32("DB1.0");
        List<Float> float32Datas = s7PLC.readFloat32("DB1.0", "DB1.4");

        // Чтение float64
        double float64Data = s7PLC.readFloat64("DB1.0");
        List<Double> float64Datas = s7PLC.readFloat64("DB1.0", "DB1.4");

        // Чтение String
        String strData = s7PLC.readString("DB14.4");
        String strData1 = s7PLC.readString("DB14.4", 10);

        // Чтение time
        long timeData = s7PLC.readTime("DB1.0");
        // Чтение date
        LocalDate localDateData = s7PLC.readDate("DB1.0");
        // Чтение времени суток
        LocalTime localTimeOfDayData = s7PLC.readTimeOfDay("DB1.0");
        // Чтение DTL
        LocalDateTime dateTime = s7PLC.readDTL("DB1.0");

        // Чтение мультиадреса
        MultiAddressRead addressRead = new MultiAddressRead();
        addressRead.addData("DB1.0", 1)
                .addData("DB1.2", 3)
                .addData("DB1.3", 5);
        List<byte[]> multiByte = s7PLC.readMultiByte(addressRead);

        s7PLC.close();
    }
}

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

class Demo {
    public static void main(String[] args) {
        S7PLC s7PLC = new S7PLC(EPlcType.S1200, "127.0.0.1");
        // Запись boolean
        s7PLC.writeBoolean("DB2.0.7", true);
        s7PLC.writeBoolean("Q0.7", true);
        s7PLC.writeBoolean("M1.4", true);

        // Запись byte
        s7PLC.writeByte("DB2.1", (byte) 0x11);
        s7PLC.writeByte("M1", (byte) 0x11);
        s7PLC.writeByte("V1", (byte) 0x11); // 200smart имеет область V

        // Запись UInt16
        s7PLC.writeUInt16("DB2.0", 0x2222);

        // Запись UInt32
        s7PLC.writeUInt32("DB2.0", 0x11111122);

        // Запись float32
        s7PLC.writeFloat32("DB2.0", 12);

        // Запись float64
        s7PLC.writeFloat64("DB2.0", 12.02);

        // Запись String
        s7PLC.writeString("DB14.4", "demo");

        // Запись time
        s7PLC.writeTime("DB1.0", 1000);
        // Запись date
        s7PLC.writeDate("DB1.0",
``` ```
LocalDate.now());
        // write time of day
        s7PLC.writeTimeOfDay("DB1.0", LocalTime.now());
        // write DTL
        s7PLC.writeDTL("DB1.0", LocalDateTime.now());

        // write multi address
        MultiAddressWrite addressWrite = new MultiAddressWrite();
        addressWrite.addByte("DB2.0", (byte) 0x11)
                .addUInt16("DB2.2", 88)
                .addBoolean("DB2.1.0", true);
        s7PLC.writeMultiData(addressWrite);

        s7PLC.close();
    }
}

1.3 Контрольные команды

class Demo {
    public static void main(String[] args) {
        S7PLC s7PLC = new S7PLC(EPlcType.S1200, "127.0.0.1");

        // горячий перезапуск
        s7PLC.hotRestart();

        // холодный перезапуск
        s7PLC.coldRestart();

        // остановка PLC
        s7PLC.plcStop();

        // копирование RAM в ROM
        s7PLC.copyRamToRom();

        // сжатие
        s7PLC.compress();

        s7PLC.close();
    }
}

1.4 Команды загрузки и выгрузки

class Demo {
    public static void main(String[] args) {
        S7PLC s7PLC = new S7PLC(EPlcType.S200_SMART, "127.0.0.1");

        //********************************* загрузка ***************************************/
        // загрузка данных файла, PLC -> ПК, успешно в 200Smart
        byte[] bytes = s7PLC.uploadFile(EFileBlockType.OB, 1);

        //******************************** выгрузка **************************************/
        // 1. создать файл Mc7
        Mc7File mc7 = Mc7File.fromBytes(bytes);
        // 2. остановить PLC перед загрузкой файла
        s7PLC.plcStop();
        // 3. загрузить данные файла, ПК -> PLC, успешно в 200Smart
        s7PLC.downloadFile(mc7);
        // 4. вставить новое имя файла
        s7PLC.insert(mc7.getBlockType(), mc7.getBlockNumber());
        // 5. горячий перезапуск, перезапустить PLC после загрузки и вставки файла
        s7PLC.hotRestart();

        s7PLC.close();
    }
}

2. Пользовательский способ чтения и записи

class Demo {
    public static void main(String[] args) {
        S7PLC s7PLC = new S7PLC(EPlcType.S1200, "127.0.0.1");

        // чтение и запись битовых данных
        byte[] expect = new byte[]{(byte) 0x00};
        s7PLC.writeRaw(EParamVariableType.BIT, 1, EArea.DATA_BLOCKS, 1, 0, 3,
                EDataVariableType.BIT, expect);
        byte[] actual = s7PLC.readRaw(EParamVariableType.BIT, 1, EArea.DATA_BLOCKS, 1, 0, 3);

        // чтение и запись байтовых данных
        expect = new byte[]{(byte) 0x02, (byte) 0x03};
        s7PLC.writeRaw(EParamVariableType.BYTE, 2, EArea.DATA_BLOCKS, 1, 1, 0,
                EDataVariableType.BYTE_WORD_DWORD, expect);
        byte[] actual1 = s7PLC.readRaw(EParamVariableType.BYTE, 2, EArea.DATA_BLOCKS, 1, 1, 0);

        // отправка объекта
        RequestNckItem item = new RequestNckItem(ENckArea.C_CHANNEL, 1, 23, 1, ENckModule.S, 1);
        S7Data s7Data = NckRequestBuilder.creatNckRequest(item);
        S7Data ackData = s7PLC.readFromServerByPersistence(s7Data);

        // отправка «голого» сообщения
        byte[] sendByteArray = new byte[]{
                // tpkt
                (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x1D,
                // cotp DT Data
                (byte) 0x02, (byte) 0xF0, (byte) 0x80,
                // header
                (byte) 0x32, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x13, (byte) 0x00, (byte) 0x0C, (byte) 0x00, (byte) 0x00,
                // parameter
                (byte) 0x04, (byte) 0x01,
                // request item
                (byte) 0x12, (byte) 0x08, (byte) 0x82, (byte) 0x41, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x01, (byte) 0x7f, (byte) 0x01
        };
        byte[] recByteArray = s7PLC.readFromServerByPersistence(sendByteArray);

        s7PLC.close();
    }
}

3. Фиксированные аннотации для сериализации чтения и записи

Поддерживает чтение и запись данных таких типов, как BOOL, UINT16, INT16, UINT32, INT32, FLOAT32, FLOAT64, STRING, TIME, DATE, TIME_OF_DAY, DTL и другие.

Создание класса данных с небольшим объёмом информации:

@Data
public class DemoBean {

    @S7Variable(address = "DB1.0.1", type = EDataType.BOOL)
    private Boolean bitData;

    @S7Variable(address = "DB1.4", type = EDataType.UINT16)
    private Integer uint16Data;

    @S7Variable(address = "DB1.6", type = EDataType.INT16)
    private Short int16Data;
``` ```
list.add(new S7Parameter("DB1.0.1", EDataType.BOOL, 1, true));
list.add(new S7Parameter("DB1.4", EDataType.UINT16, 1, 42767));
list.add(new S7Parameter("DB1.6", EDataType.INT16, 1, (short) 32767));
list.add(new S7Parameter("DB1.8", EDataType.UINT32, 1, 3147483647L));
list.add(new S7Parameter("DB1.12", EDataType.INT32, 1, 2147483647));
list.add(new S7Parameter("DB1.16", EDataType.FLOAT32, 1, 3.14f));
list.add(new S7Parameter("DB1.20", EDataType.FLOAT64, 1, 4.15));
list.add(new S7Parameter("DB1.28", EDataType.BYTE, 3, byteData));
list.add(new S7Parameter("DB1.31", EDataType.STRING, 10, "1234567890"));
list.add(new S7Parameter("DB1.43", EDataType.TIME, 1, 12L));
list.add(new S7Parameter("DB1.47", EDataType.DATE, 1, LocalDate.of(2023, 5, 15)));
list.add(new S7Parameter("DB1.49", EDataType.TIME_OF_DAY, 1, LocalTime.of(20, 22, 13)));
list.add(new S7Parameter("DB1.53", EDataType.DTL, 1, LocalDateTime.of(2023, 5, 27, 12, 11, 22, 333225555)));
s7Serializer.write(list);

list = new ArrayList<>();
list.add(new S7Parameter("DB1.0.1", EDataType.BOOL));
list.add(new S7Parameter("DB1.4", EDataType.UINT16));
list.add(new S7Parameter("DB1.6", EDataType.INT16));
list.add(new S7Parameter("DB1.8", EDataType.UINT32));
list.add(new S7Parameter("DB1.12", EDataType.INT32));
list.add(new S7Parameter("DB1.16", EDataType.FLOAT32));
list.add(new S7Parameter("DB1.20", EDataType.FLOAT64));
list.add(new S7Parameter("DB1.28", EDataType.BYTE, 3));
list.add(new S7Parameter("DB1.31", EDataType.STRING, 10));
list.add(new S7Parameter("DB1.43", EDataType.TIME));
list.add(new S7Parameter("DB1.47", EDataType.DATE));
list.add(new S7Parameter("DB1.49", EDataType.TIME_OF_DAY));
list.add(new S7Parameter("DB1.53", EDataType.DTL));
List<S7Parameter> actual = s7Serializer.read(list);

s7PLC.close();
}

Серверные инструкции (S7Any адресация)

  • Сервер поддерживает по умолчанию I область, Q область, M область, T область, C область и DB1 область, каждая область содержит 65536 байт;
  • сервер может быть настроен для пользовательских областей DB, добавляемых по желанию;
  • в настоящее время поддерживается только операции чтения и записи;

Инициализация

class Demo {
    public static void main(String[] args) {
        // Создание сервера
        S7PLCServer server = new S7PLCServer();
        // Добавление DB2, DB3, DB4
        server.addDBArea(2, 3, 4);
        // Запуск сервера
        server.start();
        // Остановка сервера
        server.stop();
    }
}

Чтение и запись данных

class Demo {
    public static void main(String[] args) {
        // Создание сервера
        S7PLCServer server = new S7PLCServer();
        server.addDBArea(2, 3, 4);
        server.start();

        // Создание клиента
        S7PLC s7PLC = new S7PLC(EPlcType.S1200);
        s7PLC.writeByte("DB2.0", (byte) 0x01);
        byte b = s7PLC.readByte("DB2.0");

        // Закрытие
        s7PLC.close();
        server.stop();
    }
}

Инструкции для станка с ЧПУ (NCK адресация)

Простой способ

class Demo {
    public static void main(String[] args) {
        S7PLC s7PLC = new S7PLC(EPlcType.SINUMERIK_828D, "127.0.0.1");

        String cncId = s7PLC.readCncId();
        String cncVersion = s7PLC.readCncVersion();
        String cncType = s7PLC.readCncType();
        String cncManufactureDate = s7PLC.readCncManufactureDate();
        List<Double> machinePosition = s7PLC.readMachinePosition();
        List<Double> readRelativePosition = s7PLC.readRelativePosition();
        List<Double> readRemainPosition = s7PLC.readRemainPosition();
        List<Double> tWorkPiecePosition = s7PLC.readTWorkPiecePosition();
        int toolRadiusCompensationNumber = s7PLC.readToolRadiusCompensationNumber();
        int toolNumber = s7PLC.readToolNumber();
        double actSpindleSpeed = s7PLC.readActSpindleSpeed();
        double feedRate = s7PLC.readFeedRate();
        int workMode = s7PLC.readWorkMode();
        double runTime = s7PLC.readRunTime();
        double remainTime = s7PLC.readRemainTime();
        String programName = s7PLC.readProgramName();
        int alarmNumber = s7PLC.readAlarmNumber();

        s7PLC.close();
    }
}

Пользовательский способ

Данные представлены в формате с прямым порядком байтов.

class Demo
``` **Часто задаваемые вопросы**

1. Почему PLC может записывать данные, но checkConnected при этом false?

Используется ленивая загрузка, соединение устанавливается при чтении или записи данных. Если поместить checkConnected после write или read, то она станет true.

2. После закрытия PLC возникает ошибка, и после перезапуска PLC автоматически подключается. Как это решить?

Поддерживается автоматическое переподключение. При каждом вызове операции чтения или записи, если PLC был отключён, происходит попытка переподключения.

3. Получено сообщение об ошибке «Не реализовано на модуле или ошибка в кадре». В чём причина?

Это может быть связано с отсутствием данных по указанному адресу на PLC или невозможностью доступа к данным по этому адресу.

4. Каков максимальный размер данных для чтения и записи в процессе коммуникации с PLC?

Для разных моделей PLC существуют разные значения PDULength: S1200  240, S1500  960. Максимальный размер массива для чтения составляет 222 = 240 - 18 для S1200 и 942 = 960 - 18 для S1500. В настоящее время по умолчанию используется значение PDULength равное 240.

Согласно тестам на S1200 [CPU 1214C], при однократном чтении нескольких байтов:
* отправка: максимальный размер массива для чтения равен 216 = 240 - 24;
* получение: максимальный размер массива для чтения равен 222 = 240 - 18.

При однократной записи нескольких байтов:
* отправка: максимальный размер массива для записи равен 212 = 240 - 28;
* получение: максимальный размер массива для записи равен 225 = 240 - 15.

5. Сколько данных можно отправить или получить за один сеанс связи при пакетной обработке данных?

| PDU length | Тип данных                   | Количество байтов | (Запись) Максимальное количество | (Чтение) Максимальное количество | PLC               |
|:----------:|:-------------------------|:----:|:-------:|:-------:|-------------------|
|    240     | boolean / byte           |  1   | **12**  | **18**  | S1200 / S200Smart |
|    240     | uint16 / int16           |  2   | **12**  | **18**  | S1200 / S200Smart |
|    240     | uint32 / int32 / float32 |  4   | **11**  | **18**  | S1200 / S200Smart |
|    240     | float64                  |  8   |  **9**  | **17**  | S1200 / S200Smart |

| PDU length | Тип данных                     | Количество байтов | (Запись) Максимальное количество | (Чтение) Максимальное количество | PLC  |
|:----------:|:-------------------------|:----:|:-------:|:-------:|------|
|    480     | boolean / byte           |  1   | **26**  | **38**  | S400 |
|    480     | uint16 / int16           |  2   | **24**  | **38**  | S400 |
|    480     | uint32 / int32 / float32 |  4   | **22**  | **38**  | S400 |
|    480     | float64                  |  8   | **18**  | **35**  | S400 |

| PDU length | Тип данных                     | Количество байтов | (Запись) Максимальное количество | (Чтение) Максимальное количество | PLC    |
|:----------:|:-------------------------|:----:|:-------:|:-------:|--------|
|    960     | boolean / byte           |  1   | **52**  | **78**  | S1500  |
|    960     | uint16 / int16           |  2   | **49**  | **78**  | S1500  |
|    960     | uint32 / int32 / float32 |  4   | **45**  | **78**  | S1500  |
|    960     | float64                  |  8   | **38**  | **72**  | S1500  |

6. Параметры инициализации PLC

| PLC        | Максимальный PDU length | Rack  | Slot  |
|------------|:-------------:|:-----:|:-----:|
| S200_SMART |      240      | **0** | **1** |
| S300       |      240      | **0** | **2** |
| S400       |      480      | **0** | **3** |
| S1200      |      240      | **0** | **1** |
| S1500      |      960      | **0** | **1** |

7. Обычно одновременно можно подключить ограниченное количество PLC. Не рекомендуется многократно создавать новый объект S7PLC!!!

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