Это модуль NodeJS, который поможет вам обрабатывать данные Modbus. Он использует pdu для построения основного PDU, а затем использует транспорты для расширения остальных.
Это мой текущий файл test.js
Он создает сетевой сокет клиента и сервера, и сервер запрашивает катушки, как только клиент подключается.
var modbus = require ( "modbus-stream" ) ;
modbus . tcp . server ( { debug : "server" } , ( connection ) => {
connection . readCoils ( { address : 5 , quantity : 8 } , ( err , info ) => {
console . log ( "response" , info . response . data ) ;
} ) ;
} ) . listen ( 12345 , ( ) => {
modbus . tcp . connect ( 12345 , { debug : "client" } , ( err , connection ) => {
connection . on ( "read-coils" , ( request , reply ) => {
reply ( null , [ 1 , 0 , 1 , 0 , 1 , 1 , 0 , 1 ] ) ;
} ) ;
} ) ;
} ) ;
Чтобы подключиться к устройству Modbus через TCP, используйте:
var modbus = require ( "modbus-stream" ) ;
modbus . tcp . connect ( 502 , "134.2.56.231" , { debug : "automaton-2454" } , ( err , connection ) => {
// do something with connection
} ) ;
Чтобы прослушивать соединения через TCP, используйте:
var modbus = require ( "modbus-stream" ) ;
modbus . tcp . server ( { debug : "server" } , ( connection ) => {
// do something with connection
} ) . listen ( 502 , ( ) => {
// ready
} ) ;
Для подключения к устройству Modbus через последовательный порт используйте:
var modbus = require ( "modbus-stream" ) ;
modbus . serial . connect ( "/dev/ttyS123" , { debug : "automaton-123" } , ( err , connection ) => {
// do something with connection
} ) ;
После установления соединения вы можете отправлять запросы и прослушивать ответы.
modbus . serial . connect ( "/dev/ttyS123" , { debug : "automaton-123" } , ( err , connection ) => {
if ( err ) throw err ;
connection . readCoils ( { address : 52 , quantity : 8 , extra : { unitId : 25 } } , ( err , res ) => {
if ( err ) throw err ;
console . log ( res ) ; // response
} )
} ) ;
Каждый метод принимает options
объекта, которые имеют параметры по умолчанию (например, address = 0
) и обратный вызов на случай, если вы хотите увидеть ответ от удаленного устройства. Вот список поддерживаемых кодов функций и соответствующих методов:
Базовые чтения
readCoils
( address = 0
, quantity = 1
)readDiscreteInputs
( address = 0
, quantity = 1
)readHoldingRegisters
( address = 0
, quantity = 1
)readInputRegisters
( address = 0
, quantity = 1
)База пишет
writeSingleCoil
( address = 0
, value = 0
)writeSingleRegister
( address = 0
, value = <Buffer 0x00 0x00>
)writeMultipleCoils
( address = 0
, values = []
)writeMultipleRegisters
( address = 0
, values = [ <Buffer 0x00 0x00> ]
)Файловые записи
readFileRecord
( requests = []
)writeFileRecord
( requests = []
)ФИФО
readFifoQueue
( address = 0
)Передовой
maskWriteRegister
( address = 0
, andmask = 0xFFFF
, ormask = 0x0000
)readWriteMultipleRegisters
( read_address = 0
, read_quantity = 1
, write_address = 0
, values = [ <Buffer 0x00 0x00> ]
)readDeviceIdentification
( type = "BasicDeviceIdentification"
, id = "ProductName"
)readExceptionStatus
()getCommEventCounter
()getCommEventLog
()Для получения дополнительной информации об этих методах посмотрите репозиторий pdu, который используется для создания пакетов.
Чтобы отвечать на удаленные запросы, прослушивайте события.
modbus . serial . connect ( "/dev/ttyS123" , {
// except "debug", everything else is the default for serial
baudRate : 9600 ,
dataBits : 8 ,
stopBits : 1 ,
parity : "none" ,
debug : "automaton-123"
} , ( err , connection ) => {
if ( err ) throw err ;
connection . events . on ( "read-coils" , ( req , reply ) => {
console . log ( req ) ; // request
// ...
return reply ( null , [ data ] ) ;
} )
} ) ;
Есть события, распространяющиеся от транспортов до потока. Вам следует связать какой-нибудь прослушиватель событий на случай, если произойдет ошибка соединения или последовательного устройства или просто закроется. Помните, что в NodeJS событие ошибки, возникающее без прослушивателя, приведет к тому, что процесс выдаст uncaughtException
.
close
) Это событие генерируется, когда модуль serialport
генерирует событие close
или когда сокет генерирует событие end
.
error
) Это событие происходит, если что-то происходит с базовым потоком, например ECONNRESET
или что-то подобное.