@types/node-snap7 模块在 nestjs调用 , 单个地址读写,多个地址读写,重连
时间: 2024-04-30 16:19:42 浏览: 135
你可以使用 `node-snap7` 模块来读写 S7PLC 的数据。在 NestJS 中使用该模块时,你需要在 NestJS 项目中安装 `node-snap7` 模块。你可以通过以下命令来安装该模块:
```
npm install node-snap7
```
下面是一个读取单个地址的例子:
```typescript
import { Injectable } from '@nestjs/common';
import * as snap7 from 'node-snap7';
@Injectable()
export class Snap7Service {
private client: any;
constructor() {
this.client = new snap7.S7Client();
this.client.connect('192.168.0.1', 0, 1, () => {
console.log('Connected to PLC.');
});
}
async readData(address: string, dataType: number) {
return new Promise((resolve, reject) => {
this.client.readArea(
snap7.types.AreaDB,
1,
parseInt(address),
dataType,
1,
(err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
},
);
});
}
}
```
在上面的代码中,我们创建了一个 `Snap7Service` 类,该类包含了读取单个地址的方法 `readData`。在构造函数中,我们创建了一个 `S7Client` 对象并连接到 PLC。
`readData` 方法接收两个参数:`address` 和 `dataType`,它们分别表示地址和数据类型。在方法中,我们使用 `client.readArea` 方法来读取 PLC 中的数据。该方法接收 6 个参数:区域类型(如 `AreaDB`)、区域编号、地址、数据类型、数据长度和回调函数。
下面是一个读取多个地址的例子:
```typescript
import { Injectable } from '@nestjs/common';
import * as snap7 from 'node-snap7';
@Injectable()
export class Snap7Service {
private client: any;
constructor() {
this.client = new snap7.S7Client();
this.client.connect('192.168.0.1', 0, 1, () => {
console.log('Connected to PLC.');
});
}
async readMultiData(addresses: string[], dataType: number) {
const items = addresses.map(address => ({
area: snap7.types.AreaDB,
dbnr: 1,
start: parseInt(address),
amount: dataType,
}));
const result = await new Promise((resolve, reject) => {
this.client.readMultiVars(items, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
return result;
}
}
```
在上面的代码中,我们创建了一个 `readMultiData` 方法来读取多个地址的数据。该方法接收两个参数:`addresses` 和 `dataType`,它们分别表示地址列表和数据类型。在方法中,我们首先将地址列表转换为 `items` 数组,该数组包含了每个地址的区域类型、区域编号、起始地址和数据长度。然后,我们使用 `client.readMultiVars` 方法来读取多个地址的数据。
最后,下面是一个重连的例子:
```typescript
import { Injectable } from '@nestjs/common';
import * as snap7 from 'node-snap7';
@Injectable()
export class Snap7Service {
private client: any;
private connected: boolean = false;
constructor() {
this.client = new snap7.S7Client();
this.connect();
}
private connect() {
this.client.connect('192.168.0.1', 0, 1, err => {
if (err) {
console.log('Connection failed. Retrying in 5 seconds...');
setTimeout(() => {
this.connect();
}, 5000);
} else {
this.connected = true;
console.log('Connected to PLC.');
}
});
}
async readData(address: string, dataType: number) {
if (!this.connected) {
throw new Error('Not connected to PLC.');
}
return new Promise((resolve, reject) => {
this.client.readArea(
snap7.types.AreaDB,
1,
parseInt(address),
dataType,
1,
(err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
},
);
});
}
}
```
在上面的代码中,我们添加了一个 `connected` 属性来记录当前是否连接到 PLC。在构造函数中,我们调用了 `connect` 方法来连接到 PLC。在 `connect` 方法中,如果连接失败,则会在 5 秒后重新连接。在 `readData` 方法中,我们首先检查当前是否连接到 PLC,如果没有连接,则抛出一个错误。
阅读全文