138 lines
3.6 KiB
JavaScript
138 lines
3.6 KiB
JavaScript
|
|
'use strict';
|
|||
|
|
|
|||
|
|
const { Service } = require('ee-core');
|
|||
|
|
// 串口的功能
|
|||
|
|
const { SerialPort } = require('serialport')
|
|||
|
|
// 保存串口实例
|
|||
|
|
var seriaPortIns = undefined;
|
|||
|
|
|
|||
|
|
// 这个是处理时间的库
|
|||
|
|
var moment = require('moment')
|
|||
|
|
// Modbus TCP
|
|||
|
|
// create an empty modbus client
|
|||
|
|
const ModbusRTU = require("modbus-serial")
|
|||
|
|
var client = new ModbusRTU();
|
|||
|
|
|
|||
|
|
// open connection to a tcp line
|
|||
|
|
// 创建Modbus TCP连接,IP是15.18.200.23,端口502
|
|||
|
|
// client.connectTCP("15.18.200.23", { port: 502 });
|
|||
|
|
//-------
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* hardware(service层为单例)
|
|||
|
|
* @class
|
|||
|
|
*/
|
|||
|
|
class HardwareService extends Service {
|
|||
|
|
|
|||
|
|
constructor(ctx) {
|
|||
|
|
super(ctx);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 发送消息
|
|||
|
|
* @param {*} seriaPort 串口实例
|
|||
|
|
*/
|
|||
|
|
sendSeriaPort(args) {
|
|||
|
|
const port = seriaPortIns;
|
|||
|
|
const msg = args.msg;
|
|||
|
|
port.write(msg, 'hex')
|
|||
|
|
console.log('测试发送消息' + msg);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* 连接串口 只执行一次
|
|||
|
|
* @param {*} options 串口参数
|
|||
|
|
* @param {*} event 回调.
|
|||
|
|
*/
|
|||
|
|
connectSeriaPort(options, event) {
|
|||
|
|
|
|||
|
|
if (seriaPortIns != undefined) {
|
|||
|
|
console.log("SerialPort is have");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
const channel = 'controller.hardware.connectSeriaPort';
|
|||
|
|
const port = new SerialPort(options, (e) => {
|
|||
|
|
console.log("SerialPort open");
|
|||
|
|
console.log(e);
|
|||
|
|
if (e === null) {
|
|||
|
|
// 打开成功 把串口发送出去
|
|||
|
|
let data2 = {
|
|||
|
|
type: 'connect'
|
|||
|
|
}
|
|||
|
|
event.reply(`${channel}`, data2)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
port.on('data', (data) => {
|
|||
|
|
let data2 = {
|
|||
|
|
type: 'received',
|
|||
|
|
data: data
|
|||
|
|
}
|
|||
|
|
console.log(`Received data: ${data2}`)
|
|||
|
|
event.reply(`${channel}`, data2)
|
|||
|
|
})
|
|||
|
|
setInterval(() => {
|
|||
|
|
// console.log('setInterval')
|
|||
|
|
if (!port.isOpen) {
|
|||
|
|
// console.log('setInterval open')
|
|||
|
|
port.open();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}, 1000)
|
|||
|
|
port.on('close', () => {
|
|||
|
|
let data2 = {
|
|||
|
|
type: 'close'
|
|||
|
|
}
|
|||
|
|
console.log(`SerialPort close: ${data2}`)
|
|||
|
|
event.reply(`${channel}`, data2)
|
|||
|
|
})
|
|||
|
|
port.on('error', (e) => {
|
|||
|
|
let data2 = {
|
|||
|
|
type: 'error'
|
|||
|
|
}
|
|||
|
|
console.log(`SerialPort error: ${e}`)
|
|||
|
|
event.reply(`${channel}`, data2)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
seriaPortIns = port;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
* test
|
|||
|
|
*/
|
|||
|
|
async test(args) {
|
|||
|
|
let obj = {
|
|||
|
|
status: 'ok',
|
|||
|
|
params: args
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return obj;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 样例 ModbusTCP
|
|||
|
|
tempModbusTCP() {
|
|||
|
|
//http://momentjs.cn/ 时间库
|
|||
|
|
//https://www.jianshu.com/p/50954625b158
|
|||
|
|
// 读取非甲烷总烃的关于总烃、甲烷、NMHC这3个寄存器(寄存器地址分别为22,25,28)中的浓度
|
|||
|
|
// 每隔5秒钟读取保持寄存器的值,从寄存器地址22开始读取,读10个寄存器到data数组中
|
|||
|
|
setInterval(function () {
|
|||
|
|
// 要连接后才能用
|
|||
|
|
client.readHoldingRegisters(22, 10, function (err, data) {
|
|||
|
|
// 获取当前时间
|
|||
|
|
//moment.locale('zh-cn');
|
|||
|
|
// console.log("----------------------------------------------------------------------");
|
|||
|
|
// console.log("数据时间是:" + moment().format('YYYY年MM月DD日 HH时mm分ss秒'));
|
|||
|
|
// console.log("总烃的浓度是:" + data.data[0] * 0.01 + "ppmV"); // 总烃浓度对应的寄存器地址为22
|
|||
|
|
// console.log("CH4的浓度是:" + data.data[3] * 0.01 + "ppmV"); // CH4浓度对应的寄存器地址为22
|
|||
|
|
// console.log("NHMC的浓度是:" + data.data[6] * 0.01 + "ppmV"); // NHMC浓度对应的寄存器地址为22
|
|||
|
|
// console.log("----------------------------------------------------------------------");
|
|||
|
|
|
|||
|
|
//console.log(data.data);
|
|||
|
|
});
|
|||
|
|
}, 5000);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
HardwareService.toString = () => '[class HardwareService]';
|
|||
|
|
module.exports = HardwareService;
|