{"_id":"@aaqu/node-red-modbus-tcp","_rev":"11-b035e35e184cde8639a332084983dd78","name":"@aaqu/node-red-modbus-tcp","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.1":{"name":"@aaqu/node-red-modbus-tcp","version":"0.1.1","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.1.1","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"2b9c1a26be0e4400682a0a0016a66edb4fe24f37","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.1.1.tgz","fileCount":30,"integrity":"sha512-AT1Pdn0C8TRSfHwcjIFP2E/NduhWejI9X7vi+D3iMr8Yl2xRWpJAlNy8XVQOTytUdLxmb9ov6LxjI/eEMZHI/g==","signatures":[{"sig":"MEUCIH9h/fkqjNx/ogYcIu/XhIv6ohIk8ZOdLcC9axMr7S9uAiEA2G61yRN5YMVngSyq9wdNccWs1ZcerxUyWDakW9zClPk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69545},"engines":{"node":">=14.0.0"},"gitHead":"47531e794f8ceb7e50eeab4635e3e3a26297523c","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"modbus-read":"nodes/modbus-read.js","modbus-write":"nodes/modbus-write.js","modbus-client":"nodes/modbus-client.js","modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.6.2","description":"aaqu modbus tcp","directories":{},"_nodeVersion":"24.4.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.1.1_1769191702447_0.3378157828573187","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aaqu/node-red-modbus-tcp","version":"0.1.2","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.1.2","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"bba2dc222b4e47cca58c1c50c3f1758b2e62b86f","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.1.2.tgz","fileCount":30,"integrity":"sha512-MvQjxAtTfwlJMe4CpJ9UxCi0Ed+3ChfQvm12Em+wCGuzFXY/H/l6y8G2EaLdbcEwdSx2Lhp6CfCSO1c5f8P4Ug==","signatures":[{"sig":"MEQCICTACDmVot6SlNurUeUU+4CMpfZ6HhPrfmr4y9P6Si/vAiACsYwkCW0ACkp1xtRVkGOZJJr3GKWrl2bXy+B8+3QBIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":69579},"engines":{"node":">=14.0.0"},"gitHead":"b7ff07bf0a66e6d3e7aad1ee899135420be149ce","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"modbus-read":"nodes/modbus-read.js","modbus-write":"nodes/modbus-write.js","modbus-client":"nodes/modbus-client.js","modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.8.0","description":"aaqu modbus tcp","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.1.2_1769191990497_0.7115353033231873","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@aaqu/node-red-modbus-tcp","version":"0.1.3","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.1.3","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"bc114a8579a275ea77f298c19a8c872a81556303","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.1.3.tgz","fileCount":30,"integrity":"sha512-M287iDNGVO56rQhHjJtzh4fG5jGbCn1ryLsBwc8xb943Q+IiFsbJ7BVCx6nMfwnFMop4X/xJec8wQknazKJ7EA==","signatures":[{"sig":"MEYCIQCMFO/0JYMUYau8GBl0ps9nuOhxs4106prNGfEO7n582AIhAJi0eCEX5Sl4+eHV/HPSGFLH5RiYer89WUgiGo2CAOxa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":69575},"engines":{"node":">=14.0.0"},"gitHead":"77d286c1d6ca71b47ec4819837f4f1b50c7680ba","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"modbus-read":"nodes/modbus-read.js","modbus-write":"nodes/modbus-write.js","modbus-client":"nodes/modbus-client.js","modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.8.0","description":"aaqu modbus tcp","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.1.3_1769192701025_0.2423027677924534","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aaqu/node-red-modbus-tcp","version":"0.2.0","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.2.0","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"4f657ad2a9928caf7302defc2ba187fd285dc36e","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.2.0.tgz","fileCount":30,"integrity":"sha512-I86k/DgcylCAnnmmkSLP+kUioAOfCSsupveDD0qts/uTtwJxbZkhmMQhJWUHecig70rVCDxMbVFM+3YyDkNPKw==","signatures":[{"sig":"MEQCIHw+UpNTrm3cA2/A4sK7fqJKiKOildPJEDyZXQWvkyE9AiBtcp7eXzO0mKN0QVGPsIZbihindRS33f3deGHvxCPM3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":70001},"engines":{"node":">=14.0.0"},"gitHead":"cf75def65865cdc4963b327524679d2982d214d8","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"aaqu-modbus-read":"nodes/modbus-read.js","aaqu-modbus-write":"nodes/modbus-write.js","aaqu-modbus-client":"nodes/modbus-client.js","aaqu-modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.8.0","description":"aaqu modbus tcp","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.2.0_1769194684906_0.48749186931421895","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@aaqu/node-red-modbus-tcp","version":"0.2.1","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.2.1","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"5f8eecc86ffab4281973722ca390675a44e95726","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.2.1.tgz","fileCount":30,"integrity":"sha512-0uZvpguSZvBiO76NVNh9nm1eOjMuGjO53bP1afq8rdQwV85DcPSWlMWV8wAu6JzP7YeOMbEd6NxD01b/YUXfdA==","signatures":[{"sig":"MEQCIA9ILcAdyA33tX+PVFZ5RBuYjUYjWdCHNjYRi1BYpYzzAiBZ+5wJt/wLXVOMHRJH9OT4a8HY3rhTAuinJfHwZm2SBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":71829},"engines":{"node":">=14.0.0"},"gitHead":"a18df02e00719f24aa71bf0084b1cb6deb3f1a7a","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"aaqu-modbus-read":"nodes/modbus-read.js","aaqu-modbus-write":"nodes/modbus-write.js","aaqu-modbus-client":"nodes/modbus-client.js","aaqu-modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.8.0","description":"aaqu modbus tcp","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.2.1_1769245357695_0.5824336811702497","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@aaqu/node-red-modbus-tcp","version":"0.2.3","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.2.3","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"1b120cad42affb2e257d8a5e9df58c54d229db3f","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.2.3.tgz","fileCount":31,"integrity":"sha512-grGTjuWInmELtC2kaRGtOrPZVLj8OfUVWyiMgvcxJWon7Pu/e+8v5aOfvnsJ1YkPEk6bPPRO8nXiCfgFRRr1NQ==","signatures":[{"sig":"MEYCIQDBAoZtAbuCs1hxqH+aiS0H7LRR8MTSXgANIHnzesmf2wIhAMsvCIFO4JdWdRmagK+bRHjY/qOrVzMPqrGSxuKD8t8C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":93073},"engines":{"node":">=14.0.0"},"gitHead":"94457ff66212e0f6909eff353ad705bd356ed094","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"aaqu-modbus-read":"nodes/modbus-read.js","aaqu-modbus-write":"nodes/modbus-write.js","aaqu-modbus-client":"nodes/modbus-client.js","aaqu-modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.9.0","description":"Node-RED nodes for Modbus TCP client communication with PLCs and industrial automation devices. Zero production dependencies.","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.2.3_1770280513347_0.7598840726676634","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aaqu/node-red-modbus-tcp","version":"0.3.0","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.3.0","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"960facb8204a3aac7f491619fdb62b2d5121b536","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.3.0.tgz","fileCount":31,"integrity":"sha512-2xG0bY0D5SjFAl01A/bpQqBS86OWc0vynbh328sdjo2lNUXNvsu6yrTqfM83PJOM5Rp1jn5d377uJ5c1Cn1efQ==","signatures":[{"sig":"MEQCICv1kYt73hopDeJE6BJJpgUwz2dSrJBnViYJUAcCJiwXAiBF3AwfIv23BZGGKY6Hj55jNaMoFTT/qkay4q4FZnF28w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":93073},"engines":{"node":">=14.0.0"},"gitHead":"cbe80eb110cf947f41e9ea6a5704e5f55fadfc8b","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"aaqu-modbus-read":"nodes/modbus-read.js","aaqu-modbus-write":"nodes/modbus-write.js","aaqu-modbus-client":"nodes/modbus-client.js","aaqu-modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.9.0","description":"Node-RED nodes for Modbus TCP client communication with PLCs and industrial automation devices. Zero production dependencies.","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.3.0_1770280735461_0.4169191615731238","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@aaqu/node-red-modbus-tcp","version":"0.3.1","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.3.1","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"fa5b96d789e40e0de45d86499cd698060ef0c662","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.3.1.tgz","fileCount":31,"integrity":"sha512-6+azzKLBw5FS1BLSrWBAO9LH/L4j7ahDsafHBn5GKOCa46b2C2VzMXMS3mSfmTRg+qZ6BeV9Fdr9mSXG+dIWvw==","signatures":[{"sig":"MEUCIH1QeyJfP2cEQJsN3AA21h4SqDYyoRvcUVQioC3mopAQAiEAmkw6svw3Ghf/J3oUYcgbnAIkShMcrBzzdPikmWG7X70=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":93663},"engines":{"node":">=14.0.0"},"gitHead":"c981525abfe3320f32734baec112138a69a665b8","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"aaqu-modbus-read":"nodes/modbus-read.js","aaqu-modbus-write":"nodes/modbus-write.js","aaqu-modbus-client":"nodes/modbus-client.js","aaqu-modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.9.0","description":"Node-RED nodes for Modbus TCP client communication with PLCs and industrial automation devices. Zero production dependencies.","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.3.1_1770286494100_0.5038351706871544","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@aaqu/node-red-modbus-tcp","version":"0.3.2","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.3.2","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"96fba9f3991b0e9421801be60228830f9df36c62","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.3.2.tgz","fileCount":31,"integrity":"sha512-RhjyllJ0RGdQyJhBxwnRq+xiVUPM2WHy2lS1dFLOQEdn23hnK6RpmaMQ58mrdrdtb/FGb8LAq8j9h9aMqN5Nqw==","signatures":[{"sig":"MEQCIFxuHsAnU+v+yTx7qV/psffWzJTI2IvlzgsPo5jKRmCEAiAIK+i1D6WpI4ZgSX25CcV+2Lf+e7JK5gciBRv0LKk0HA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":94113},"engines":{"node":">=14.0.0"},"gitHead":"58afa471cf06e327cf56955b1c76dc6ca9c82a7b","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"aaqu-modbus-read":"nodes/modbus-read.js","aaqu-modbus-write":"nodes/modbus-write.js","aaqu-modbus-client":"nodes/modbus-client.js","aaqu-modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.9.0","description":"Node-RED nodes for Modbus TCP client communication with PLCs and industrial automation devices. Zero production dependencies.","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.3.2_1770403111011_0.9610669926108668","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aaqu/node-red-modbus-tcp","version":"0.4.0","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","_id":"@aaqu/node-red-modbus-tcp@0.4.0","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"dist":{"shasum":"431b814b04b8a0d43d194c838f8316e7ff1ece8c","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.4.0.tgz","fileCount":49,"integrity":"sha512-whAezVJUsV1Tr5N2PJFq6sUpaOk0M0FN1vwCB4dOEYGJiOmO/vBYk9lfDc1xDjpSwSwkU27t9m+wbKrOdOWwMg==","signatures":[{"sig":"MEYCIQDCaS78cQAeowaA7pNkKZ7r/uLmwS31cJPwAJwEpfYE3gIhAMu70S3XIyU91/Hpg4+PicQnkVGZlJUCiO8Yudx+3Me/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":145957},"engines":{"node":">=14.0.0"},"gitHead":"60d08e6e5b82e19c2c91a0e6ea32db1a75432a95","scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"node-red":{"nodes":{"aaqu-modbus-file":"nodes/modbus-file.js","aaqu-modbus-read":"nodes/modbus-read.js","aaqu-modbus-write":"nodes/modbus-write.js","aaqu-modbus-client":"nodes/modbus-client.js","aaqu-modbus-diagnostic":"nodes/modbus-diagnostic.js","aaqu-modbus-read-write":"nodes/modbus-read-write.js","aaqu-modbus-write-multiple":"nodes/modbus-write-multiple.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git","type":"git"},"_npmVersion":"11.13.0","description":"Node-RED nodes for Modbus TCP client communication with PLCs and industrial automation devices. Zero production dependencies.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^11.7.5","should":"^13.2.3","node-red":"^4.0.0","prettier":"^3.8.1","node-red-node-test-helper":"^0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/node-red-modbus-tcp_0.4.0_1777328524976_0.08241529125870017","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aaqu/node-red-modbus-tcp","version":"0.4.1","description":"Node-RED nodes for Modbus TCP client communication with PLCs and industrial automation devices. Zero production dependencies.","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"author":{"name":"aaqu"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git"},"bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","engines":{"node":">=14.0.0"},"node-red":{"version":">=2.0.0","nodes":{"aaqu-modbus-client":"nodes/modbus-client.js","aaqu-modbus-read":"nodes/modbus-read.js","aaqu-modbus-write":"nodes/modbus-write.js","aaqu-modbus-write-multiple":"nodes/modbus-write-multiple.js","aaqu-modbus-read-write":"nodes/modbus-read-write.js","aaqu-modbus-diagnostic":"nodes/modbus-diagnostic.js","aaqu-modbus-file":"nodes/modbus-file.js"}},"devDependencies":{"mocha":"^11.7.5","node-red":"^4.0.0","node-red-node-test-helper":"^0.3.6","prettier":"^3.8.1","should":"^13.2.3"},"scripts":{"test":"mocha \"test/**/*_spec.js\"","server":"node dev/modbus-server.js","server:5020":"node dev/modbus-server.js 5020"},"publishConfig":{"access":"public"},"gitHead":"7d233921360c27d21e1552e7bb93550f3929ed9d","_id":"@aaqu/node-red-modbus-tcp@0.4.1","_nodeVersion":"20.20.2","_npmVersion":"11.13.0","dist":{"integrity":"sha512-AOGmLAZehiOfY/cZPw7cLNXv0HHuGlPkutXRixN/hxz+/rUAQBQDzldzfAkY9nlb8/MKU/cuElDCkk9gqAU6Wg==","shasum":"3e3378eba9abfd14d69ba3b00a257cf02b1db200","tarball":"https://registry.npmjs.org/@aaqu/node-red-modbus-tcp/-/node-red-modbus-tcp-0.4.1.tgz","fileCount":49,"unpackedSize":150426,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2fnode-red-modbus-tcp@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDPC2xVTi2D4pziZmEN6ZAtzSUDAd2BbXuc1YgAhK5I2AiAcDZVyRbJxcrhPZMKwZ4y8qgis9IH57ihOJpH8r3HqnQ=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:680b9134-e476-4e8e-8c4f-8c6ae3be8ee7"}},"directories":{},"maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-red-modbus-tcp_0.4.1_1777329530142_0.5922682754660313"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-23T18:08:22.361Z","modified":"2026-04-27T22:38:50.754Z","0.1.1":"2026-01-23T18:08:22.584Z","0.1.2":"2026-01-23T18:13:10.625Z","0.1.3":"2026-01-23T18:25:01.149Z","0.2.0":"2026-01-23T18:58:05.055Z","0.2.1":"2026-01-24T09:02:37.852Z","0.2.3":"2026-02-05T08:35:13.500Z","0.3.0":"2026-02-05T08:38:55.604Z","0.3.1":"2026-02-05T10:14:54.248Z","0.3.2":"2026-02-06T18:38:31.259Z","0.4.0":"2026-04-27T22:22:05.119Z","0.4.1":"2026-04-27T22:38:50.291Z"},"bugs":{"url":"https://github.com/Aaqu/aaqu-modbus-tcp/issues"},"author":{"name":"aaqu"},"license":"MIT","homepage":"https://github.com/Aaqu/aaqu-modbus-tcp#readme","keywords":["aaqu","portal","aaqu-portal","node-red","modbus","modbus-tcp","industrial","automation","plc"],"repository":{"type":"git","url":"git+https://github.com/Aaqu/aaqu-modbus-tcp.git"},"description":"Node-RED nodes for Modbus TCP client communication with PLCs and industrial automation devices. Zero production dependencies.","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"readme":"# @aaqu/node-red-modbus-tcp\n\nNode-RED nodes for Modbus TCP client communication.\n\n## Support\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/L4L01UOFRG)\n\n\n## Disclaimer\n\n**THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.** The author makes no guarantees regarding the reliability, accuracy, or suitability of this software for any particular purpose. Use at your own risk. The author shall not be liable for any damages arising from the use of this software in production environments, industrial automation, or any other application.\n\n## Features\n\n- **Modbus TCP Client** - Connect to Modbus TCP servers (PLCs, RTUs, simulators)\n- **Read Operations** - FC01-FC04, FC24 (FIFO Queue)\n- **Write Operations** - FC05, FC06, FC15, FC16, FC22 (Mask Write)\n- **Read/Write Combined** - FC23 (atomic Read/Write Multiple Registers)\n- **Diagnostics** - FC17 (Report Server ID), FC43/14 (Read Device Identification)\n- **File Records** - FC20 (Read), FC21 (Write)\n- **Response validation** - byte-count check on read responses (rejects malformed frames)\n- **Auto-reconnect** - Automatic reconnection on connection loss\n- **Heartbeat** - Application-layer keep-alive for unstable links\n- **Dynamic configuration** - Override parameters via `msg` properties\n- **External Data mode** - Hide GUI fields and require parameters from `msg` only\n- **Unit ID per node** - Different Unit IDs for each operation\n- **No external dependencies** - Uses only native Node.js modules\n- **Multi-language support** - English, Polish, Chinese, Japanese\n\n## Installation\n\n### From npm\n\n```bash\nnpm install @aaqu/node-red-modbus-tcp\n```\n\n### From source\n\n```bash\ncd ~/.node-red\nnpm install /path/to/aaqu-modbus-tcp\n```\n\nAfter installation, restart Node-RED and refresh the browser.\n\n## Nodes\n\n### aaqu-modbus-client (Configuration Node)\n\nManages the TCP connection to a Modbus server. Shared by all operation nodes.\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| Host | string | localhost | IP address or hostname of Modbus server |\n| Port | number | 502 | TCP port number |\n| Timeout | number | 5000 | Request timeout in milliseconds |\n| Auto Reconnect | boolean | true | Automatically reconnect on connection loss |\n| Reconnect Interval | number | 5000 | Time between reconnection attempts (ms) |\n| Log Connection Errors | boolean | true | Log connection errors to console |\n| TCP Keep-Alive | boolean | true | Enable TCP keep-alive probes |\n| Keep-Alive Delay | number | 10000 | Initial delay before first keep-alive probe (ms) |\n| Heartbeat | boolean | false | Send periodic Modbus requests to keep connection active |\n| Heartbeat Interval | number | 5000 | Interval between heartbeat requests (ms) |\n| Include Raw Response | boolean | false | Include raw Modbus frame buffer in msg.raw |\n\n#### Connection Keep-Alive Options\n\nThe client provides multiple options to maintain stable connections:\n\n1. **TCP Keep-Alive** - System-level TCP probes. May not work with all devices.\n2. **Heartbeat** - Application-level Modbus requests. More reliable for devices that close idle connections.\n\n**Recommendation:** If your device closes idle connections, enable **Heartbeat**. It sends periodic read requests (FC03) that are ignored but keep the connection active. Heartbeat is skipped when there are pending requests to avoid interference.\n\n### aaqu-modbus-read\n\nReads data from a Modbus server.\n\n#### Properties\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| Server | config | - | Reference to aaqu-modbus-client node |\n| External Data | checkbox | false | When enabled, Unit ID/Address/Quantity are hidden and must come from msg |\n| Unit ID | number | 1 | Modbus unit identifier (1-255) |\n| Function | select | FC03 | Function code (FC01-FC04) |\n| Address | number | 0 | Starting address (0-65535) |\n| Quantity | number | 1 | Number of items to read |\n\n#### Supported Functions\n\n| Function | Code | Description | Max Quantity |\n|----------|------|-------------|--------------|\n| Read Coils | FC01 | Read coil status (bits) | 2000 |\n| Read Discrete Inputs | FC02 | Read discrete input status (bits) | 2000 |\n| Read Holding Registers | FC03 | Read holding registers (16-bit) | 125 |\n| Read Input Registers | FC04 | Read input registers (16-bit) | 125 |\n| Read FIFO Queue | FC24 | Read FIFO queue at a single address | 31 (server-defined) |\n\nFor **FC24 (FIFO)**, the `quantity` field is ignored — the server returns whatever the queue depth is at that address. Output:\n```javascript\nmsg.payload = [val1, val2, ...];   // Array of 16-bit values from the FIFO\nmsg.fifoCount = 3;                 // Number of values returned\n```\n\n#### Input Message (optional overrides)\n\n```javascript\nmsg.unitId = 2;           // Override Unit ID\nmsg.functionCode = 3;     // Override function code\nmsg.address = 100;        // Override starting address\nmsg.quantity = 10;        // Override quantity\n```\n\n#### External Data Mode\n\nWhen **External Data** checkbox is enabled, the GUI fields for Unit ID, Address, and Quantity are hidden. These values **must** be provided in the incoming message:\n\n```javascript\nmsg.unitId = 1;           // Required\nmsg.address = 100;        // Required\nmsg.quantity = 10;        // Required\nmsg.functionCode = 3;     // Optional (uses node config if not provided)\n```\n\nThis mode is useful when parameters come from external sources (database, API, other nodes) and you don't want to configure them statically in the node.\n\n#### Output Message\n\n```javascript\nmsg.payload = [100, 101, 102, ...];  // Array of read values\nmsg.modbus = {\n    unitId: 1,\n    functionCode: 3,\n    address: 0,\n    quantity: 10,\n    byteCount: 20\n};\n```\n\n### aaqu-modbus-write\n\nWrites a single value to a Modbus server.\n\n#### Properties\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| Server | config | - | Reference to aaqu-modbus-client node |\n| External Data | checkbox | false | When enabled, Unit ID/Address are hidden and must come from msg |\n| Unit ID | number | 1 | Modbus unit identifier (1-255) |\n| Function | select | FC06 | Function code (FC05 or FC06) |\n| Address | number | 0 | Address to write (0-65535) |\n\n#### Supported Functions\n\n| Function | Code | Description | Value Range |\n|----------|------|-------------|-------------|\n| Write Single Coil | FC05 | Write single coil | true/false |\n| Write Single Register | FC06 | Write single register | 0-65535 |\n| Mask Write Register | FC22 | Apply `(current AND andMask) OR (orMask AND NOT andMask)` to a register | masks 0-65535 |\n\nFor **FC22 (Mask Write)**, `msg.payload` is ignored. Required:\n```javascript\nmsg.andMask = 0xF2;\nmsg.orMask  = 0x25;\nmsg.address = 0x0010;     // (or from node config)\nmsg.unitId  = 1;\n```\n\n#### Input Message\n\n```javascript\nmsg.payload = 1234;       // Value to write (number for registers, boolean for coils)\nmsg.unitId = 2;           // Optional: Override Unit ID\nmsg.functionCode = 6;     // Optional: Override function code\nmsg.address = 100;        // Optional: Override address\n```\n\n#### External Data Mode\n\nWhen **External Data** checkbox is enabled, the GUI fields for Unit ID and Address are hidden. These values **must** be provided in the incoming message:\n\n```javascript\nmsg.payload = 1234;       // Value to write\nmsg.unitId = 1;           // Required\nmsg.address = 100;        // Required\nmsg.functionCode = 6;     // Optional (uses node config if not provided)\n```\n\n#### Output Message\n\n```javascript\nmsg.payload = 1234;       // Original payload (unchanged)\nmsg.modbus = {\n    unitId: 1,\n    functionCode: 6,\n    address: 100,\n    value: 1234\n};\n```\n\n### aaqu-modbus-write-multiple\n\nWrites multiple values to a Modbus server. This node operates in **forced external data mode** - Unit ID and Address must always be provided via the incoming message.\n\n#### Properties\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| Server | config | - | Reference to aaqu-modbus-client node |\n| Function | select | FC16 | Function code (FC15 or FC16) |\n\n> **Note:** Unit ID and Address are not configurable in the node. They must be provided in `msg.unitId` and `msg.address`.\n\n#### Supported Functions\n\n| Function | Code | Description | Max Quantity |\n|----------|------|-------------|--------------|\n| Write Multiple Coils | FC15 | Write multiple coils | 1968 |\n| Write Multiple Registers | FC16 | Write multiple registers | 123 |\n\n#### Input Message\n\n```javascript\nmsg.payload = [100, 200, 300];  // Array of values to write\nmsg.unitId = 1;                  // Required: Modbus Unit ID (1-255)\nmsg.address = 100;               // Required: Starting address (0-65535)\nmsg.functionCode = 16;           // Optional: Override function code\n```\n\n#### Output Message\n\n```javascript\nmsg.payload = [100, 200, 300];  // Original payload (unchanged)\nmsg.requestModbus = {\n    unitId: 1,\n    functionCode: 16,\n    address: 100,\n    quantity: 3\n};\n```\n\n#### Why External Data Mode?\n\nThis node is designed for dynamic, data-driven scenarios where parameters come from external sources (database, API, other nodes). This makes it ideal for:\n- Multi-device communication with varying addresses\n- Dynamic write operations based on external configuration\n- Integration with SCADA systems and databases\n\n### aaqu-modbus-read-write\n\nAtomic Read/Write Multiple Registers (FC23 / 0x17). The write is performed first, then the read — both in a single transaction.\n\n#### Properties\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| Server | config | - | Reference to aaqu-modbus-client node |\n| External Data | checkbox | false | When enabled, read/write addresses come from msg |\n| Unit ID | number | 1 | Modbus unit identifier (1-255) |\n| Read Address | number | 0 | Starting read address (0-65535) |\n| Read Quantity | number | 1 | Number of registers to read (1-125) |\n| Write Address | number | 0 | Starting write address (0-65535) |\n\n#### Input Message\n\n```javascript\nmsg.payload = [100, 200, 300];  // Values to write (1-121 registers)\n// External Data ON additionally requires:\nmsg.unitId = 1;\nmsg.readAddress = 0;\nmsg.readQuantity = 5;\nmsg.writeAddress = 100;\n```\n\n#### Output Message\n\n```javascript\nmsg.payload = [/* read register bytes */];\nmsg.requestModbus = {\n    functionCode: 23,\n    readAddress: 0, readQuantity: 5,\n    writeAddress: 100, writeQuantity: 3,\n    unitId: 1, byteCount: 10\n};\n```\n\n### aaqu-modbus-diagnostic\n\nDiagnostic operations: **Report Server ID** (FC17) and **Read Device Identification** (FC43 / MEI 0x0E).\n\n#### Properties\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| Server | config | - | Reference to aaqu-modbus-client node |\n| Unit ID | number | 1 | Modbus unit identifier (1-255) |\n| Operation | select | reportServerId | `reportServerId` or `readDeviceIdentification` |\n| ID Code | select | 1 - Basic | Only for Read Device ID: 1=Basic, 2=Regular, 3=Extended, 4=Specific |\n| Object ID | number | 0 | Only for Read Device ID. 0=VendorName, 1=ProductCode, 2=Revision, 3=VendorUrl, 4=ProductName, 5=ModelName, 6=UserApplicationName |\n\n#### Output Message\n\nFor `reportServerId`:\n```javascript\nmsg.payload = {\n    serverId: 0x42,\n    runIndicator: true,\n    additionalData: <Buffer ...>\n};\n```\n\nFor `readDeviceIdentification`:\n```javascript\nmsg.payload = {\n    conformityLevel: 0x01,\n    moreFollows: false,\n    nextObjectId: 0,\n    objects: { 0: 'VendorName', 1: 'ProductCode', 2: 'v1.0' }\n};\n```\n\n### aaqu-modbus-file\n\nExtended file record access: **Read File Record** (FC20) and **Write File Record** (FC21).\n\n#### Properties\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| Server | config | - | Reference to aaqu-modbus-client node |\n| Unit ID | number | 1 | Modbus unit identifier (1-255) |\n| Operation | select | read | `read` or `write` |\n\n#### Input Message\n\nFor **read**:\n```javascript\nmsg.payload = [\n    { fileNumber: 4, recordNumber: 1, recordLength: 2 },\n    { fileNumber: 4, recordNumber: 5, recordLength: 1 }\n];\n```\n\nFor **write**:\n```javascript\nmsg.payload = [\n    { fileNumber: 4, recordNumber: 7, recordData: [0x06AF, 0x04BE] }\n];\n```\n\nLimits: file number 1-65535, record number 0-9999, up to 122 16-bit words per record. Whole PDU must fit in 253 bytes.\n\n#### Output Message\n\nFor **read**, `msg.payload` is an array of `{ recordData: [uint16, ...] }`. For **write**, `msg.payload` is an echo of the request descriptors.\n\n## Examples\n\n### Read 10 Holding Registers\n\n```\n[inject] -> [aaqu-modbus-read] -> [debug]\n```\n\nConfigure aaqu-modbus-read:\n- Function: FC03 - Read Holding Registers\n- Address: 0\n- Quantity: 10\n- Unit ID: 1\n\n### Write Single Register\n\n```\n[inject (payload: 1234)] -> [aaqu-modbus-write] -> [debug]\n```\n\nConfigure aaqu-modbus-write:\n- Function: FC06 - Write Single Register\n- Address: 0\n- Unit ID: 1\n\n### Write Multiple Registers\n\n```\n[inject] -> [function] -> [aaqu-modbus-write-multiple] -> [debug]\n```\n\nInject node sends payload, Function node adds required properties:\n```javascript\nmsg.payload = [100, 200, 300];\nmsg.unitId = 1;\nmsg.address = 100;\nreturn msg;\n```\n\nConfigure aaqu-modbus-write-multiple:\n- Function: FC16 - Write Multiple Registers\n\n### Dynamic Configuration\n\nUse a function node to set parameters dynamically:\n\n```javascript\nmsg.unitId = 2;\nmsg.address = flow.get('startAddress') || 0;\nmsg.quantity = 5;\nreturn msg;\n```\n\n### External Data Mode\n\nWhen you need all parameters to come from external sources (database, API, etc.), enable **External Data** checkbox. This hides the GUI fields and requires values in the message:\n\n```\n[inject] -> [function] -> [aaqu-modbus-read (External Data: ON)] -> [debug]\n```\n\nFunction node:\n```javascript\nmsg.unitId = msg.payload.deviceId;\nmsg.address = msg.payload.registerAddress;\nmsg.quantity = msg.payload.count;\nreturn msg;\n```\n\nThis is useful for:\n- Reading device configuration from database\n- Dynamic polling based on external schedules\n- Multi-device scanning with varying parameters\n\n## Error Handling\n\nErrors are reported through Node-RED's standard error handling:\n\n1. **Node status** - Visual indicator (red ring with error message)\n2. **Catch node** - Use a catch node to handle errors programmatically\n3. **Debug sidebar** - Errors appear in the debug sidebar\n\n### Common Errors\n\n| Error | Description | Solution |\n|-------|-------------|----------|\n| Not connected | No connection to server | Check host/port, network connectivity |\n| Request timeout | Server didn't respond in time | Increase timeout, check server |\n| Illegal Data Address | Invalid address | Check address range |\n| Illegal Data Value | Invalid value | Check value range |\n| Illegal Function | Function not supported | Check server capabilities |\n\n## Modbus Protocol Reference\n\n### Address Space\n\n| Type | Address Range | Description |\n|------|---------------|-------------|\n| Coils | 0-65535 | Read/Write single bits |\n| Discrete Inputs | 0-65535 | Read-only single bits |\n| Holding Registers | 0-65535 | Read/Write 16-bit values |\n| Input Registers | 0-65535 | Read-only 16-bit values |\n\n### Data Types\n\n- **Coils/Discrete Inputs**: Boolean (true/false)\n- **Registers**: 16-bit unsigned integer (0-65535)\n\nFor larger data types (32-bit, float, etc.), read multiple consecutive registers and combine them in a function node.\n\n### Unit ID\n\nThe Unit ID (also called Slave ID) identifies the target device when multiple devices share a connection (e.g., through a gateway). Valid range: 1-255.\n\n## Testing\n\nRun the test suite:\n\n```bash\nnpm test\n```\n\n## Supported Languages\n\n| Language | Locale |\n|----------|--------|\n| English | en-US |\n| Polish | pl-PL |\n| Chinese (Simplified) | zh-CN |\n| Japanese | ja-JP |\n\n## Requirements\n\n- Node.js >= 14.0.0\n- Node-RED >= 2.0.0\n- No external dependencies (uses native Node.js `net` module)\n\n## License\n\nMIT\n\n## Author\n\nAaqu\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Run tests: `npm test`\n5. Submit a pull request\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for the full version history.\n","readmeFilename":"README.md"}