nestjs S71200 连接 单个地址读写 多个地址读写 断连重连
时间: 2023-12-06 12:01:53 浏览: 27
要实现 NestJS 与 Siemens S7-1200 PLC 的连接,您可以使用 node-snap7 这个 Node.js 的 S7-communication 库。首先,您需要在 NestJS 项目中安装 snap7 库:
```
npm install node-snap7
```
然后,您可以创建一个 S7Service 提供者,用于与 S7-1200 进行通信。
```typescript
import { Injectable } from '@nestjs/common';
import { S7Client } from 'node-snap7';
@Injectable()
export class S7Service {
private plc: S7Client;
constructor() {
this.plc = new S7Client();
}
connect(ip: string, rack: number, slot: number): Promise<void> {
return new Promise<void>((resolve, reject) => {
this.plc.connectTo(ip, rack, slot, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
disconnect(): Promise<void> {
return new Promise<void>((resolve, reject) => {
this.plc.disconnect((err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
readDB(dbNumber: number, start: number, size: number): Promise<Buffer> {
return new Promise<Buffer>((resolve, reject) => {
const buffer = Buffer.alloc(size);
this.plc.readArea(S7Client.S7AreaDB, dbNumber, start, size, S7Client.S7WordLenByte, buffer, (err) => {
if (err) {
reject(err);
} else {
resolve(buffer);
}
});
});
}
writeDB(dbNumber: number, start: number, buffer: Buffer): Promise<void> {
return new Promise<void>((resolve, reject) => {
this.plc.writeArea(S7Client.S7AreaDB, dbNumber, start, buffer.length, S7Client.S7WordLenByte, buffer, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
readByte(dbNumber: number, byteOffset: number): Promise<number> {
return new Promise<number>((resolve, reject) => {
const buffer = Buffer.alloc(1);
this.plc.readArea(S7Client.S7AreaDB, dbNumber, byteOffset, 1, S7Client.S7WordLenByte, buffer, (err) => {
if (err) {
reject(err);
} else {
resolve(buffer.readInt8(0));
}
});
});
}
writeByte(dbNumber: number, byteOffset: number, value: number): Promise<void> {
return new Promise<void>((resolve, reject) => {
const buffer = Buffer.alloc(1);
buffer.writeInt8(value);
this.plc.writeArea(S7Client.S7AreaDB, dbNumber, byteOffset, 1, S7Client.S7WordLenByte, buffer, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
}
```
在上面的示例中,S7Service 提供了以下功能:
- 连接到 S7-1200 PLC
- 从 DB 区域读取数据
- 写入 DB 区域数据
- 读取单个字节
- 写入单个字节
可以通过以下方式在 NestJS 中使用 S7Service。
```typescript
import { Controller, Get, Post, Body } from '@nestjs/common';
import { S7Service } from './s7.service';
@Controller('s7')
export class S7Controller {
constructor(private readonly s7Service: S7Service) {}
@Post('connect')
async connect(@Body() { ip, rack, slot }) {
await this.s7Service.connect(ip, rack, slot);
}
@Post('disconnect')
async disconnect() {
await this.s7Service.disconnect();
}
@Get('read')
async read() {
const buffer = await this.s7Service.readDB(1, 0, 2);
console.log(buffer.readInt16BE(0));
return buffer.readInt16BE(0);
}
@Post('write')
async write(@Body() { value }) {
const buffer = Buffer.alloc(2);
buffer.writeInt16BE(value);
await this.s7Service.writeDB(1, 0, buffer);
}
@Get('readByte')
async readByte() {
const value = await this.s7Service.readByte(1, 0);
console.log(value);
return value;
}
@Post('writeByte')
async writeByte(@Body() { value }) {
await this.s7Service.writeByte(1, 0, value);
}
}
```
在上面的示例中,S7Controller 提供了以下路由:
- 连接到 S7-1200 PLC
- 断开连接
- 从 DB 区域读取数据
- 写入 DB 区域数据
- 读取单个字节
- 写入单个字节
您可以使用这些路由与 S7-1200 进行通信。如果需要读取多个地址,您可以在 `readDB` 方法中设置 `start` 参数为起始地址,`size` 参数为读取的数据长度。如果需要进行断连重连,您可以在 `connect` 方法中设置重连逻辑。