nestjs node-snap7 实现读写单个bool类型的值 DBWrite
时间: 2023-07-07 14:10:41 浏览: 80
如果你想在 NestJS 的控制器中使用 `node-snap7` 模块来读写单个 bool 类型的值,可以创建一个服务,并在控制器中注入该服务。下面是一个示例代码:
```typescript
import { Controller, Get, Post, Body } from '@nestjs/common';
import { Snap7Service } from './snap7.service';
@Controller('snap7')
export class Snap7Controller {
constructor(private readonly snap7Service: Snap7Service) {}
@Get('/read')
async read(@Body() body: { db: number; byte: number; bit: number }) {
const { db, byte, bit } = body;
const value = await this.snap7Service.readBool(db, byte, bit);
return { value };
}
@Post('/write')
async write(@Body() body: { db: number; byte: number; bit: number; value: boolean }) {
const { db, byte, bit, value } = body;
await this.snap7Service.writeBool(db, byte, bit, value);
return { success: true };
}
}
```
在上述代码中,我们创建了一个名为 `Snap7Controller` 的控制器,注入了一个名为 `Snap7Service` 的服务,并提供了 `read()` 和 `write()` 两个路由。`read()` 方法接收一个包含 `db`、`byte` 和 `bit` 三个参数的请求体,使用 `Snap7Service` 中的 `readBool()` 方法读取对应的 DBX 值,并将结果返回。`write()` 方法接收一个包含 `db`、`byte`、`bit` 和 `value` 四个参数的请求体,使用 `Snap7Service` 中的 `writeBool()` 方法将对应的 DBX 值设置为指定的值,并将成功标志返回。
下面是 `Snap7Service` 中 `readBool()` 和 `writeBool()` 方法的实现,与之前给出的代码类似:
```typescript
import { Injectable } from '@nestjs/common';
import { S7Client } from 'node-snap7';
@Injectable()
export class Snap7Service {
private readonly client = new S7Client();
async connect(ip: string, rack: number, slot: number) {
return new Promise((resolve, reject) => {
this.client.connect(ip, rack, slot, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
async disconnect() {
return new Promise((resolve, reject) => {
this.client.disconnect((err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
async readBool(db: number, byte: number, bit: number) {
return new Promise<boolean>((resolve, reject) => {
this.client.readArea(S7Client.S7AreaDB, db, byte, 1, S7Client.S7WLBit, (err, res) => {
if (err) {
reject(err);
} else {
resolve(Boolean(res[0] & (1 << bit)));
}
});
});
}
async writeBool(db: number, byte: number, bit: number, value: boolean) {
const buffer = Buffer.alloc(1);
if (value) {
buffer.writeUInt8(1 << bit);
}
return new Promise((resolve, reject) => {
this.client.writeArea(S7Client.S7AreaDB, db, byte, 1, S7Client.S7WLBit, buffer, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
}
```
在控制器中,你可以使用 `@Body()` 装饰器来接收请求体中的参数。在路由方法中,你可以调用 `Snap7Service` 中的方法来读写 DBX 值。在控制器中,你也可以使用其他装饰器来定义路由的 HTTP 方法和路径,以及其他的参数,例如 `@Query()` 装饰器可以用于接收查询字符串参数。