{"id":19740369,"url":"https://github.com/jmmoser/node-drivers","last_synced_at":"2025-08-06T08:11:29.136Z","repository":{"id":20821265,"uuid":"91008114","full_name":"jmmoser/node-drivers","owner":"jmmoser","description":"Industrial protocol drivers in node.js","archived":false,"fork":false,"pushed_at":"2023-03-04T05:29:29.000Z","size":38172,"stargazers_count":27,"open_issues_count":2,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-04T05:12:03.282Z","etag":null,"topics":["allen","allen-bradley","bradley","cip","controllogix","driver","drivers","idec","js","logix5000","modbus","node","nodejs","pccc","plc","protocol","tcp","udp"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jmmoser.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-05-11T17:51:18.000Z","updated_at":"2024-07-10T19:06:37.000Z","dependencies_parsed_at":"2024-06-21T13:09:22.211Z","dependency_job_id":null,"html_url":"https://github.com/jmmoser/node-drivers","commit_stats":{"total_commits":460,"total_committers":6,"mean_commits":76.66666666666667,"dds":"0.21739130434782605","last_synced_commit":"808713b2d9182443a5ec8ad3273a10825eadf135"},"previous_names":[],"tags_count":46,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmmoser%2Fnode-drivers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmmoser%2Fnode-drivers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmmoser%2Fnode-drivers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmmoser%2Fnode-drivers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jmmoser","download_url":"https://codeload.github.com/jmmoser/node-drivers/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224199280,"owners_count":17272255,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["allen","allen-bradley","bradley","cip","controllogix","driver","drivers","idec","js","logix5000","modbus","node","nodejs","pccc","plc","protocol","tcp","udp"],"created_at":"2024-11-12T01:20:52.003Z","updated_at":"2024-11-12T01:20:52.464Z","avatar_url":"https://github.com/jmmoser.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# node-drivers\r\n\r\nA layered approach to protocol drivers.\r\n\r\n# Install\r\n\r\n```sh\r\nnpm install node-drivers\r\n```\r\n\r\n# Examples\r\n\r\n### Read and list tags from a Logix5000 processor:\r\n\r\n```javascript\r\nconst { TCP, CIP } = require('node-drivers');\r\n\r\nconst tcpLayer = new TCP('1.2.3.4');\r\nconst logix5000 = new CIP.Logix5000(tcpLayer);\r\n\r\nconsole.log(await logix5000.readTag('tagname'));\r\n\r\n/** Read an element from a 1-dimensional tag */\r\nconsole.log(await logix5000.readTag('TagThatIs1DArray[0]'));\r\n\r\n/** Read an entire 1-dimensional tag */\r\nconsole.log(await logix5000.readTag('TagThatIs1DArray'));\r\n\r\n/** Read the first 4 elements of a 1-dimensional tag */\r\nconsole.log(await logix5000.readTag('TagThatIs1DArray', 4))\r\n\r\n/**\r\n * Read a slice of a 1-dimensional tag\r\n * example returns an array containing the values of elements 3 through 7\r\n */\r\nconsole.log(await logix5000.readTag('TagThatIs1DArray[3]', 5));\r\n\r\n/** Read an element of a structure member of a tag */\r\nconsole.log(await logix5000.readTag('tag.member[0].anothermember'));\r\n\r\n/**\r\n * Read all tags scoped to a program\r\n * returns an object containing all of the scoped tags\r\n */\r\nconsole.log(await logix5000.readTag('TheProgramName'));\r\n\r\n/** Read a program scoped tag */\r\nconsole.log(await logix5000.readTag('TheProgramName.tag'));\r\n\r\n/**\r\n * Read a tag using the symbol instance id\r\n * (available in controller version 21 and above)\r\n */\r\nconsole.log(await logix5000.readTag(2130));\r\n\r\n/** List all global tags */\r\nfor await (const tag of logix5000.listTags()) {\r\n  console.log(tag);\r\n}\r\n\r\n/** List all tags scoped to a program */\r\nfor await (const tag of logix5000.listTags('Program:Alarms')) {\r\n  console.log(tag);\r\n}\r\n\r\nawait tcpLayer.close();\r\n```\r\n\r\n\r\n### Read/Write a tag from a PLC-5, SLC 5/03, or SLC 5/04 processor using PCCC embedded in CIP:\r\n\r\n```javascript\r\nconst { TCP, CIP, PCCC } = require('node-drivers');\r\n\r\nconst tcpLayer = new TCP('1.2.3.4');\r\nconst cipLayer = new CIP(tcpLayer);\r\nconst pccc = new PCCC(cipLayer);\r\n\r\n/** Write an integer */\r\nconsole.log(await pccc.typedWrite('N10:47', 1000));\r\n\r\n/** Read an integer */\r\nconsole.log(await pccc.typedRead('N10:47'));\r\n\r\n/** Write a float */\r\nconsole.log(await pccc.typedWrite('F8:1', 5.5));\r\n\r\nawait tcpLayer.close();\r\n```\r\n\r\n\r\n### Find all EtherNet/IP devices in a subnet using the UDP broadcast address or by explicitly pinging each host:\r\n\r\n```javascript\r\nconst { UDP, CIP } = require('node-drivers');\r\n\r\nconst udpLayer = new UDP('1.2.3.255');\r\nconst eipLayer = new CIP.EIP(udpLayer);\r\n\r\n/** Broadcast */\r\nconsole.log(await eipLayer.listIdentity());\r\n\r\n\r\n/** Explicitly */\r\nconst hosts = [];\r\nfor (let i = 1; i \u003c 255; i++) {\r\n  hosts.push(`1.2.3.${i}`);\r\n}\r\n\r\n/* hosts overrides whatever host was specified in the Layers.UDP() constructor */\r\nconsole.log(await eipLayer.listIdentity({ hosts }));\r\n\r\nawait udpLayer.close();\r\n```\r\n\r\n\r\n### Retrieve information from an EtherNet/IP device over TCP:\r\n\r\n```javascript\r\nconst { TCP, CIP } = require('node-drivers');\r\n\r\nconst tcpLayer = new TCP('1.2.3.4');\r\nconst eipLayer = new CIP.EIP(tcpLayer);\r\n\r\nconsole.log(await eipLayer.listInterfaces());\r\n\r\nconsole.log(await eipLayer.listServices());\r\n\r\n/** no response, used to test underlying transport layer */\r\nawait eipLayer.nop();\r\n\r\nawait tcpLayer.close();\r\n```\r\n\r\n### Communicate with a Modbus device over TCP:\r\n\r\n```javascript\r\nconst { TCP, Modbus } = require('node-drivers');\r\n\r\nconst tcpLayer = new TCP('1.2.3.4');\r\nconst modbusLayer = new Modbus(tcpLayer);\r\n\r\n// read holding register 40004\r\nconsole.log(await modbusLayer.readHoldingRegisters(3, 1));\r\n\r\nawait tcpLayer.close();\r\n```\r\n\r\n\r\n# Drivers/Protocols\r\n\r\n- CIP\r\n  - EtherNet/IP\r\n  - Logix5000\r\n- PCCC\r\n    - embedded in CIP\r\n- Modbus\r\n    - TCP frame format\r\n- TCP\r\n- UDP\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmmoser%2Fnode-drivers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjmmoser%2Fnode-drivers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmmoser%2Fnode-drivers/lists"}