npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

simple-modbus

v1.1.2

Published

A simple library for working with Modbus with Typescript bindings.

Downloads

19

Readme

simple-modbus

A simple library for working with Modbus

styled with prettier Greenkeeper badge Travis Coveralls Dev Dependencies Donate All Contributors

The aim of this project is to make it extremely easy to work with Modbus with Node.js. It's written in Typescript, so you get easy to use strong typings. The error handling is consistent and easy, and it has a full test suite to ensure repeatable behavior.

Typedoc documentation

Find it here.

Currently Implemented

  • [x] Modbus TCP Server
  • [ ] Modbus RTU Server
  • [ ] Modbus ASCII Server
  • [ ] Modbus RTU/IP Server
  • [ ] Modbus TCP Client
  • [ ] Modbus RTU Client
  • [ ] Modbus ASCII Client
  • [ ] Modbus RTU/IP Client

Function Codes

Examples

Start a ModbusTCP server, and listen for all implemented Modbus commands.

Typescript:

import { ModbusCommandException, ModbusTcp } from 'simple-modbus'

const server = new ModbusTcp.Server()
server.listen(502)

server.onReadCoilStatus.on(command => {
  console.log(`Read Coil Status - Address: ${command.coilStartAddress} Number: ${command.numberOfCoils}`)
  // Respond with Success (response array must be same length as numberOfCoils)
  command.success([true, false, true, false])
})

server.onReadInputStatus.on(command => {
  console.log(`Read Input Status - Address: ${command.inputStartAddress} Number: ${command.numberOfInputs}`)
  // Respond with Success (response array must be same length as numberOfInputs)
  command.success([true, false, true, false])
})

server.onReadHoldingRegisters.on(command => {
  console.log(`Read Holding Registers - Address: ${command.registerStartAddress} Number: ${command.registerLength}`)
  // Respond with Success (response array must be same length as registerLength)
  command.success(new Uint16Array([0xFFFF, 0x0000, 0xDEAD, 0xBEEF]))
})

server.onReadInputRegisters.on(command => {
  console.log(`Read Input Registers - Address: ${command.registerStartAddress} Number: ${command.registerLength}`)
  // Respond with Success (response array must be same length as registerLength)
  command.success(new Uint16Array([0xFFFF, 0x0000, 0xDEAD, 0xBEEF]))
})

server.onPresetSingleRegister.on(command => {
  console.log(`Preset Single Register - Address: ${command.registerAddress} - Value: ${command.registerValue}`)
  // Respond with Success
  command.success()
})

server.onPresetMultipleRegisters.on(command => {
  console.log(`Preset Multiple Registers - Start Address: ${command.registerStartAddress} Length: ${command.registerLength} Values: ${command.registerValues}`)
  // Respond with Success
  command.success()
})

server.onForceSingleCoil.on(command => {
  console.log(`Force Single Coil - Address: ${command.coilAddress} Value: ${command.coilStatusAsCoilStatus}}`)
  // Respond with Success
  command.success()
})

server.onForceMultipleCoils.on(command => {
  console.log(`Force Multiple Coils - Start Address: ${command.coilStartAddress} Length: ${command.coilLength} Values: ${command.coilStatuses}}`)
  // Respond with Failure
  command.fail(ModbusCommandException.ILLEGAL_DATA_ADDRESS)
})

server.onCommandError.on(err => {
  console.error(`Error when trying to decode a packet: ${err.message}`)
})

server.onServerError.on(err => {
  console.error(`Error from underlying TCP server: ${err.message}`)
})

Javascript:

const ModbusTcp = require('simple-modbus').ModbusTcp
const ModbusCommandException = require('simple-modbus').ModbusCommandException

const server = new ModbusTcp.Server();
server.listen(502);

server.onPresetSingleRegister.on(command => {
  console.log(`${command.registerAddress} - ${command.registerValue}`)
  // Respond with Success
  command.success()
  // Or respond with failure
  command.fail(ModbusCommandException.ILLEGAL_DATA_ADDRESS)
})

Options

A server can be initialized with options which will affect its behavior.

const server = new ModbusTcp.Server({ simpleAddressing: false })
  • Modbus Addressing: By default, register and coil addresses will be 0 indexed, not using Modbus addresses. To change this, set simpleAddressing to false

Contributors

I need help! I've tested this with an Automation Direct Click PLC, but I need people to test with additional types of PLCs and submit issues. If you can include a Wireshark PCAP captue, that would be very helpful as well. All contributions are appreciated!

Thanks goes to these wonderful people (emoji key):

This project follows the all-contributors specification. Contributions of any kind welcome!