TypeScript Modbus runtime for Node.js, browsers, and Electron.
modbus-ts is an ESM-first monorepo with composable packages for protocol encoding/decoding, transport adapters, scheduling, subscription polling, and a high-level client API.
high-level Modbus client
shared contracts, types, and errors
FC1/FC2/FC3/FC4/FC5/FC6/FC15/FC16 frame encode/decode for TCP/RTU/ASCII
serial request queue with priority
polling engine and range merge
Node TCP transport with reconnect
Node UDP transport
browser WebSocket transport with reconnect
typed Electron main/renderer bridge
Electron IPC transport adapter
WebSocket to TCP binary relay gateway
register-value codec helpers
shared async and comparison utilities
- Multi-wire protocol support: TCP, RTU, ASCII
- Transports: TCP, UDP, WebSocket, Electron IPC
- High-level client API for read, write, and subscribe
- Priority scheduler with timeout handling
- Subscription engine with range merge and change detection
- Browser WebSocket gateway with TCP connection pooling
- Industrial data codec with byte-swap and word-swap options
pnpm install
pnpm build
pnpm testRun examples:
pnpm --filter @modbus-ts/node-tcp-example dev
pnpm --filter @modbus-ts/node-udp-example dev
pnpm --filter @modbus-ts/browser-example devimport { ModbusClient } from '@modbus-ts/client'
import { TcpTransport } from '@modbus-ts/transport-tcp'
const transport = new TcpTransport({ host: '127.0.0.1', port: 502 })
const client = new ModbusClient({ transport, defaultUnitId: 1, mode: 'tcp' })
await client.connect()
const regs = await client.readHoldingRegisters(0, 4)
const inputRegs = await client.readInputRegisters(0, 4)
const coils = await client.readCoils(0, 8)
const discreteInputs = await client.readDiscreteInputs(0, 8)
await client.writeSingleRegister(10, 123)
await client.writeSingleCoil(11, true)
await client.writeMultipleCoils(12, [true, false, true])
console.log({ regs, inputRegs, coils, discreteInputs })
await client.close()pnpm lint
pnpm typecheck
pnpm test:coverageMIT