Перевод текста на русский язык:
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();
}
}
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");
}
}
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();
}
}
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();
}
}
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();
}
}
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();
}
}
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();
}
}
Поддерживает чтение и запись данных таких типов, как 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 адресация)
Инициализация
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 )