CSCP — CloudScale Communication Protocol
CSCP command reference for Neutron: message structure, weighing, configuration, counting, checkweighing and digital I/O.
NEUTRON · COMMUNICATION PROTOCOL
Neutron Modbus RTU/TCP reference for PLC, SCADA and HMI integration: connection, addressing, registers, calibration and automatic checkweigher control.

Version | Date | Description of change |
|---|---|---|
| June 2026 | First Neutron Modbus manual release. |
CloudScale Neutron NS and Neutron NT provide a Modbus interface for reading weighing data, status information, digital I/O and calibration data, and for executing selected scale commands. The interface is intended for PLC, SCADA, HMI, MES and custom software integrations.
Neutron supports the following Modbus transport variants:
Modbus RTU through the RS-232 or RS-485 interface. The default Modbus slave / unit ID is 1.
Modbus TCP through Wi-Fi or Ethernet. The default TCP port is 502.
The available functions and register areas are the same logical interface for Modbus TCP and Modbus RTU, except that TCP uses a Unit Identifier only where required by the client or gateway.
Important: Communication parameters such as serial port settings and network settings must be configured in Neutron before the Modbus master is connected. The device uses the Modbus address configured by parameter MBA.
Modbus TCP is available through the network connection of the Neutron. Use the IP address assigned to the device and TCP port 502. TCP communication does not require a serial line configuration.
To use Modbus TCP you must select Modbus TCP under scale communication interfaces (parameter SCI). You can use Modbus TCP while also using other interfaces, for instance you can still use RS-232 for communication with computer via CSCP protocol.
Configuration | Result |
|---|---|
SCI = 10 | Enables Modbus TCP only. |
SCI = 5,10 | Enables normal RS-232 scale communication together with Modbus TCP. |
SCI = 6,10 | Enables normal RS-485 scale communication together with Modbus TCP. |
| Sets Modbus slave / unit address. Default: 1. |
TCP port | |
Where several SCI values are shown, configure the interfaces according to the selected Neutron communication configuration. After applying configuration changes, restart communication or the device where required by the configuration menu.
Item | Example |
|---|---|
Modbus master | |
Transport | Ethernet or Wi-Fi TCP/IP |
Target address | Neutron IP address |
Service port | |
Unit ID | MBA value; default 1 |
For a stable industrial installation, Ethernet is recommended whenever a wired network is available. Wi-Fi adds network-dependent latency and should be assessed in the application environment.
Modbus RTU can be used through RS-232 or RS-485. The serial communication settings of the Modbus master must match the serial interface settings configured in Neutron. The Modbus slave ID is set by MBA and defaults to 1.
To use Modbus RTU you must select either Modbus RS-232 or Modbus RS-485 under scale communication interfaces (parameter SCI).
Interface | Typical wiring principle | Important note |
|---|---|---|
RS-232 | Connect TX, RX and GND between Neutron and the Modbus master. TX/RX may need to be crossed depending on whether the connected ports are DTE or DCE. | Use short point-to-point connections and a common signal ground. |
RS-485 | Connect A to A and B to B according to the terminal marking used by both devices; connect signal reference / GND where required by the installation. | Use a daisy-chain topology. Do not use star wiring. Apply line termination only at the two physical ends where required. |
Always follow the Neutron terminal marking and the wiring diagram supplied with the device. Manufacturers do not always label RS-485 polarity in the same way; if no communication is established, verify the A/B polarity and the master configuration.
This manual uses the conventional Modbus reference notation (for example, 40101). Many Modbus client tools use zero-based start addresses. In such tools, remove the leading register-area digit and subtract 1 from the reference address.
Reference notation | Zero-based start address | Example |
|---|---|---|
| | Holding register 40001 |
| | Holding register 40101 |
| | Holding register 40232 |
| | Holding register 40380 |
Confirm the addressing convention of the Modbus master before commissioning. An offset error of one register is the most common reason for incorrect data interpretation.
Gross, net and tare values are signed 32-bit integers stored in two consecutive 16-bit registers.
The high word is transmitted first (big-endian register order).
The decimal position is reported in the output / status configuration register, bits 14..13.
High-resolution gross and net registers 40109–40112 use two additional decimal places when the high-resolution value is available.
Example: where the decimal-position field indicates 2 decimals, the signed 32-bit value 12345 represents 123.45 in the active unit. The unit is available in register 40113 and is also encoded in the output/status configuration register.
Function | Name | Use in Neutron |
|---|---|---|
| Read Coils | Read digital output states (coils 1..6 map to DO1..DO6). |
| Read Holding Registers | Read writable and command-related registers. |
| Read Input Registers | Read process data, weights and status registers. |
| Write Single Coil | Set one digital output where output function is disabled. |
| Write Single Register | Write one holding register, including command-related fields. |
| Write Multiple Coils | Set multiple digital outputs where functions are disabled. |
| Write Multiple Registers | Write command, parameters and calibration data as a block. |
Write operations to outputs controlled by a configured output function are rejected. Typical function-controlled outputs include tolerance and dosing outputs.
Input / Holding reference | Description | Data type / notes |
|---|---|---|
| Gross weight | Signed INT32, big-endian register order. |
| Net weight | Signed INT32, big-endian register order. |
| Scale status | Bit field; see section 6.3. |
| Command status | Command processing state. |
| Output / status configuration | Bit field: outputs, unit and decimal position. |
The main map allows simple masters to obtain net or gross weight and key status data using a small contiguous register range.
Holding register | Description | Data type / notes |
|---|---|---|
| Gross weight | Signed INT32. |
| Net weight | Signed INT32. |
| Tare weight | Signed INT32. |
| Scale status | Bit field; see section 6.3. |
| Output / status configuration | Bit field; see section 6.3. |
| Gross high-resolution | Signed INT32; two extra decimal places where available. |
| Net high-resolution | Signed INT32; two extra decimal places where available. |
| Unit | 0 = g; 1 = kg; 2 = t; 3 = lb. |
| Digital input mask | Bits 0..5 = DI1..DI6. |
| Digital output mask | Bits 0..5 = DO1..DO6. |
| Output function mask | A set bit means the related output is function-controlled. |
| ADC points | Raw ADC value. |
| Millivolts | Load-cell signal in mV. |
| Command status | Command processing state. |
| Command | Write command code here. |
| Command parameter 1 | Optional parameter for the command in 40232. |
Bit | Meaning (if bit value=1) |
|---|---|
| Net weight is negative. |
| Gross weight is negative. |
| Weight is stable. |
| Underload condition. |
| Overload condition. |
| Tare is active. |
| Preset / manual tare is active. |
| Gross weight is zero. |
| Digital input 1 is active. |
| Digital input 2 is active. |
| Scale / ADC error is active. |
Bit(s) | Meaning |
|---|---|
| Digital output status: DO1..DO6. |
| Active unit code: 0 = g; 1 = kg; 2 = t; 3 = lb. |
| Scale / load-cell error. |
| Decimal-position code for standard weight values. |
For applications that require all output states, use register 40115. Use register 40116 to determine which outputs are currently reserved by the active function.
Write a command code to holding register 40232. Write the optional parameter to 40233 before issuing the command. The command status can be read from 40231. Command code 0 clears the repeat guard and allows the same command to be executed again.
Command code | Parameter 40233 | Action |
|---|---|---|
| | No command; reset repeat guard. |
| | Zero after stability check. |
| | Zero immediately. |
| | Tare after stability check. |
| | Tare immediately. |
| | Clear tare. |
| Output bit mask | Set digital outputs according to the bit mask. |
Shortcut: writing the command code to holding register 40001 also executes the command. For predictable integration, the extended command registers 40232 and 40233 are recommended, particularly where a parameter is required.
Coils 1..6 correspond to DO1..DO6.
Use functions 01, 05 and 15 to read or write coils.
An output can only be changed through Modbus when its output function is disabled.
If an output is controlled by a tolerance, dosing or other active function, the device rejects Modbus writes to that output.
Example: To activate DO1 and DO3 with command code 25, write a bit mask of binary 000101 (decimal 5) to 40233 and then write 25 to 40232. Verify the result through register 40115 or coils 1..6.
Calibration is performed through holding registers. Successful calibration data are stored to flash memory. If calibration fails, the changed data are not saved.
Holding reference | Zero-based start | Description |
|---|---|---|
| | Calibration status bit field. |
| | Scale channel. |
| | Number of decimals used for calibration weights. |
| | Number of valid calibration points. |
| | Zero ADC point, signed INT32. |
Calibration-status bit | Meaning |
|---|---|
| Zero point exists. |
| First calibration weight point exists. |
| Scale has the minimum valid calibration. |
| Scale / ADC error is active. |
Point 1 starts at 40310 (zero-based start 309). Each calibration point uses eight registers. The start register for point N is 40310 + ((N - 1) x 8).
Offset in point block | Description |
|---|---|
| Valid flag: 0 = invalid; 1 = valid. |
| Calibration weight, signed INT32. |
| ADC point, signed INT32. |
| Factor x100, signed INT32. |
| Reserved. |
Examples: point 1 = 40310-40317; point 2 = 40318-40325; point 3 = 40326-40333; point 8 = 40366-40373.
Holding reference | Zero-based start | Description |
|---|---|---|
| | Command. |
| | Point number. |
| | Calibration weight, signed INT32. |
| | Flags. |
| | Trigger. |
| | Command result. |
| | Last executed command. |
Command | Description |
|---|---|
| Calibrate zero. |
| Calibrate weight point. |
| Delete calibration point. |
| Delete zero point. |
| Delete all calibration. |
| Reload / initialize scale. |
Flags register 40384: bit 0 controls whether stability is required. A value of 0 executes immediately; a value of 1 requires a stable ADC average. All other flag bits are reserved.
Result 40386 | Meaning |
|---|---|
| OK. |
| Incorrect command. |
| Bad data. |
| Not allowed. |
| Unsupported command. |
| Calibration failed. |
Firmware processes calibration only when the trigger register 40385 changes to a non-zero value. Use the following sequence for every calibration command:
Write command and all required parameters.
Write 40385 = 1 to execute the operation.
Wait for command completion and read 40386.
Write 40385 = 0 to reset the trigger.
For the next command, write parameters and change 40385 to 1 again.
Command | Calibrate zero |
|---|---|
Purpose | Write Multiple Registers starting at zero-based address 379. |
Responses | |
| Command: calibrate zero. |
| Point number not used. |
| Calibration weight not used. |
| Require stable ADC average. |
| Trigger operation. |
Read 40386 | Expected result: 0 (OK). |
Command | Calibrate point 1 with 10.000 kg |
|---|---|
Purpose | For 40302 = 3, scale the calibration weight by 1000. |
Responses | |
| Command: calibrate weight point. |
| Point number 1. |
| 10.000 kg x 1000. |
| Require stable ADC average. |
| Trigger operation. |
Read 40386 | Expected result: 0 (OK). |
Command | Delete point 1 |
|---|---|
Purpose | Remove the first calibration point. |
Responses | |
| Command: delete calibration point. |
| Point number 1. |
| Trigger operation. |
Command | Delete all calibration |
|---|---|
Purpose | Remove all stored calibration data. |
Responses | |
| Command: delete all calibration. |
| Trigger operation. |
Configure SCI for the required interface combination and set MBA to the required Modbus slave / unit ID.
For Modbus TCP, confirm IP address and connect to TCP port 502. For Modbus RTU, match serial parameters and verify the wiring.
Read a known register such as 40113 (unit) or 40107 (scale status) to validate addressing.
Read 40101-40106 and decode the signed 32-bit gross, net and tare values using the reported decimal position.
Verify scale status, digital inputs and outputs before enabling control functions.
Use command registers and calibration functions only after confirming that the correct scale channel and application state are active.
Symptom | Likely cause | Action |
|---|---|---|
No Modbus response | Scale communication interface (SCI) is not configured for the selected interface; wrong IP/port or serial settings; incorrect wiring. | Verify SCI, TCP port 502, MBA, network reachability, serial parameters and physical wiring. |
Values appear shifted or invalid | Client uses an incorrect reference / zero-based register conversion; 32-bit words decoded in wrong order. | Check the client addressing convention and use signed INT32 with big-endian register order. |
Weight has wrong decimal position | Client ignores decimal-position configuration or high-resolution format. | Read 40108 and apply bits 14..13; use high-resolution registers only when required. |
Output cannot be written | Output is controlled by an assigned function. | Read 40116 and disable the relevant output function before controlling the output via Modbus. |
Same command does not execute again | Repeat guard has not been reset. | Write command 0 to 40232, then issue the command again. |
Calibration command has no effect | Trigger did not change to non-zero or was not reset after a previous command. | Set all parameters, change 40385 to 1, read 40386, then write 40385 back to 0. |
Safety note: Calibration, zeroing, taring and output control can affect the weighing result and connected machinery. Apply access control, validate commands in the host application and ensure that all operations comply with the applicable metrological and machine-safety requirements.
This chapter describes the basic CHECKWEIGHER interface, register map version 1. It supports reading process status and the last completed result, selecting an existing recipe, configuring autostart, and START / STOP / STOP NOW / RESET. Recipe editing, filter configuration, application selection, I/O assignment and detailed debug streaming are not included. Configure these using the normal setup interface before using this block.
The map is identical on Modbus TCP and enabled Modbus RTU interfaces. Use one controlling client/master; additional readers may monitor the data. There is one shared command mailbox across all transports, not one mailbox per client. Do not use broadcast requests for this interface. Before controlling, read the block and confirm application=4 (CHECKWEIGHER), channel and snapshot validity.
Addresses below are zero-based PDU addresses. For clients using 4xxxx notation, reference = 40001 + address: address 400 is 40401 and address 480 is 40481. Use function 03 (or 04) to read. Write commands only with function 16 (0x10), starting at 480 and writing exactly eight registers. Function 06 and partial writes are rejected. Result/status registers are read-only. The gap between the read and write blocks is not readable.
Read address 400, count 48 to obtain status, command acknowledgement and the last result in one request. Alternatively read 400/count 24 for status or 424/count 24 for the result. All 32-bit values use the high word first; each register uses the standard Modbus high-byte-first order. Do not split a 32-bit value across separate requests.
PDU / reference | Words | Name / type | Description |
|---|---|---|---|
| | MAP_VERSION / UINT16 | 1 for this map. |
| | BOOT_ID / UINT32 | Nonzero random session token generated on device boot. Echo in every write; not retained across reboot. This is not a security credential. |
| | CHANNEL / UINT16 | Current weighing channel. |
| | APPLICATION / UINT16 | Must be 4 for control. |
| | STATE / UINT16 | 0 IDLE; 1 START_CHECK; 2 RUN; 3 DRAINING; 4 PAUSED; 5 STOPPED; 6 ERROR; 7 CONS_LOST. |
| | ACTIVE_ID / UINT16 | Selected recipe; may differ from RESULT_ID of the previous product. |
| | AUTOSTART / UINT16 | Persistent CWAUTO: 0 disabled, 1 enabled. |
| | PROCESS_ERROR / UINT16 | Current blocking process error; 0 none. |
| | BELT / UINT16 | Logical belt request, 0/1; not motor feedback. |
| | CONS / INT16 | -1 (0xFFFF) not assigned; 0 inactive; 1 active. |
| | PQ / UINT16 | Pending products. |
| | EQ / UINT16 | Pending/active output events. |
| | AUTO_STATE / UINT16 | Autostart outcome: see 10.5. |
| | AUTO_ERROR / UINT16 | Error of boot autostart; 0 none. |
| | SNAPSHOT_VALID / UINT16 | 1 usable snapshot; 0 unavailable. Also check APPLICATION before control. |
| | REQUEST_ID / UINT32 | Last accepted request; changes immediately on acceptance. |
| | ACK_ID / UINT32 | Last completed request. 0 means none since boot. |
| | COMMAND_STATE / UINT16 | 0 IDLE; 1 BUSY; 2 DONE; 3 ERROR. |
| | COMMAND_ERROR / UINT16 | Application error of completed request; see 10.4. |
| | APPLIED_MASK / UINT16 | Bit 0 recipe selection applied; bit 1 autostart applied. May be nonzero when START fails. |
| | LAST_COMMAND / UINT16 | Command code of last accepted request. |
| | RESULT_SEQ / UINT32 | Sequence of last completed product; compare together with BOOT_ID. |
| | RESULT_ID / UINT16 | Recipe used for this result. |
| | RESULT_FLAGS / UINT16 | Bit 0 result exists; bit 1 mass valid/representable; bit 2 limits representable; bit 3 numeric conversion overflow/invalid. |
| | DECIMALS / UINT16 | Decimal places for W, LO and HI of this result. |
| | UNIT / UINT16 | 0 g; 1 kg; 2 t; 3 lb; 4 oz; 5 N; 65535 other/unknown. Do not assume g for unknown units. |
| | W / INT32 | Net mass including tare; divide by 10^DECIMALS. Use only when RESULT_FLAGS bit 1 is set. |
| | LO / INT32 | Lower tolerance limit; use only with flags bit 2. |
| | HI / INT32 | Upper tolerance limit; use only with flags bit 2. |
| | WS / UINT16 | Mass classification: 0 LOW; 1 OK; 2 HIGH; 3 ERROR. |
| | LTS / UINT16 | Length: 0 OK; 1 LENGTH_LOW; 2 LENGTH_HIGH; 3 DISABLED. |
| | RESULT / UINT16 | 0 LOW; 1 OK; 2 HIGH; 3 ERROR; 4 OVERLAP; 5 ABORTED; 6 ABORTED_CONS. |
| | PRODUCT_ERROR / UINT16 | Error of this product; separate from PROCESS_ERROR. |
| | NS / UINT16 | Accepted samples of the last completed result, before trimming; not the current product sample count. |
| | TD / UINT32 | Detection time in milliseconds since boot; wraps after approximately 49.7 days. |
| | ET / UINT32 | Milliseconds from detection to result. |
| | LT / UINT32 | Product sensor ON duration in milliseconds; 0 in mass-trigger mode. |
| | RESERVED / UINT16 | 0; ignore for version 1. |
Status and the last result are copied under the process lock. Each response contains a consistent snapshot; a subsequent request may see newer data. RESULT_SEQ, RESULT_ID, DECIMALS and UNIT belong to the stored result, not to the currently selected recipe. Before the first result, flags bit 0 is clear: do not interpret the zero-filled result fields as a real zero-weight product. Reading never consumes or clears a result.
Example: W high=0x0000, low=0x07D1 gives signed integer 2001. With DECIMALS=1 and UNIT=0 the mass is 200.1 g. Negative values use 32-bit two’s complement. If conversion exceeds INT32 or the scale value is not representable, the corresponding validity bit is clear, its numeric registers are zero, and flag bit 3 is set. The original product result is not changed.
Address / reference | Name | Value |
|---|---|---|
| | 0 settings only; 1 START; 2 STOP DRAIN; 3 STOP NOW; 4 RESET. |
| CHANGE_MASK | Bit 0: select RECIPE_ID. Bit 1: set AUTOSTART. Other bits must be 0. |
| RECIPE_ID | 1–500 when mask bit 0 is set. Otherwise write 0. Recipe must already exist. |
| | 0 or 1 when mask bit 1 is set. Otherwise write 0. |
| REQUEST_ID | |
| BOOT_ID | |
For COMMAND 2, 3 or 4, CHANGE_MASK, RECIPE_ID and AUTOSTART must all be 0. Settings may be combined with COMMAND 0 or 1. Recipe selection and autostart changes require a stopped, drained process. START without the recipe-change bit starts the currently selected recipe. Application selection and recipe creation remain outside Modbus scope.
The complete frame is validated before it is accepted. No partial control-block writes take effect. A normal function-16 response means the request was accepted into the mailbox, not that START succeeded. Execution occurs from the existing main loop. Poll until ACK_ID equals the submitted ID and COMMAND_STATE is DONE or ERROR. BUSY may be too brief to observe; never require observing it before accepting DONE.
Keep one request outstanding. If the write times out, reread BOOT_ID, REQUEST_ID and ACK_ID. If the boot token is unchanged, retransmit exactly the same eight words if necessary. A repeat of the most recently accepted request with identical data is acknowledged without executing it again, whether pending or completed. The same ID with changed data, skipped/old IDs, a different boot token, or another request while BUSY is rejected. After a reboot, resynchronise with the new token and current process state; do not automatically replay an old START.
Only the latest request is retained for duplicate detection; there is no persistent command journal. A network restart without a device reboot does not clear the mailbox. This protocol assumes one controlling PLC; it does not arbitrate competing writers. The boot token and request counter prevent accidental replays, not unauthorised access.
Recipe selection is applied first, autostart second, and the command last. Syntax, ID range and recipe validity are checked before setting changes. Flash errors can still leave an earlier setting applied. APPLIED_MASK reports exactly which requested settings succeeded. For example, recipe 25 and AUTOSTART=1 may be saved while START is refused because CONS is inactive: COMMAND_STATE=ERROR, COMMAND_ERROR=11, APPLIED_MASK=3. Settings are not rolled back. Read back ACTIVE_ID and AUTOSTART before deciding what to retry.
The error codes below belong to COMMAND_ERROR and must not be confused with process/product error fields. A rejected transport-level write does not change the mailbox or ACK_ID. Illegal addresses, read-only writes, partial writes and unsupported block ranges return Modbus exception 02. A correctly addressed eight-word control write with invalid data, token, sequence or mailbox state returns exception 03.
Code | Meaning |
|---|---|
| Success. |
| Selected recipe missing or invalid. |
| START refused: weight outside allowed range. |
| Required memory unavailable. |
| Configured CONS is inactive. |
| Recipe unit does not match the scale. |
| Sensor configuration/state prevents the operation. |
| Wrong application, running process, outstanding fault or conflicting scale operation. |
| Invalid request arguments or measuring system not ready. |
| Settings/database read or write failure. |
STOP DRAIN accepts no new products and finishes accepted products and output events. Its DONE acknowledgement means the stop was requested; STATE=5 confirms completion. STOP NOW cancels open products/events and deactivates process outputs. STOP is not a substitute for RESET in a blocking fault. RESET rechecks the scale and prerequisites and does not start the belt; if the cause remains it fails. All commands use the normal checkweigher interlocks. A result is a measurement outcome, not confirmation that a physical reject actuator operated.
AUTOSTART is the persistent CWAUTO setting, default 0. Enabling it does not start immediately; combine with COMMAND=1 for an immediate START. At the next device boot, application CHECKWEIGHER must be selected, initial zeroing enabled and successful, and a valid last active permanent recipe available. Normal START checks still apply. A failed boot attempt is not retried when an input later changes. Manual STOP, PAUSE or faults do not trigger automatic restart. Unchanged values do not cause another settings write.
AUTO_STATE: 0 DISABLED; 1 WAIT_ZERO; 2 ZERO_DISABLED; 3 ZERO_FAILED; 4 NO_PRODUCT; 5 STARTED; 6 START_FAILED; 7 CANCELLED; 8 INACTIVE; 9 INIT_FAILED. AUTO_ERROR is the rejected boot START code. This is the outcome of the boot attempt; STATE and PROCESS_ERROR describe the current process.
Example 1 — read everything: function 03, PDU start=400, count=48 (reference 40401). Verify MAP_VERSION=1, APPLICATION=4 and SNAPSHOT_VALID=1. Save BOOT_ID and ACK_ID. No command is needed to read data.
Example 2 — select recipe 25, enable autostart and START in one write. Assume BOOT_ID=0x12345678 and ACK_ID=0. Write function 16, PDU start=480, count=8 with decimal words: [1, 3, 25, 1, 0, 1, 4660, 22136]. The boot words are illustrative: always copy them from the device. Wait for ACK_ID=1 and COMMAND_STATE=2, then verify STATE=2 (RUN). If COMMAND_STATE=3, inspect COMMAND_ERROR and APPLIED_MASK.
Example 3 — STOP DRAIN. Assuming the previous request completed, submit [2, 0, 0, 0, 0, 2, 4660, 22136]. Wait for ACK_ID=2. DONE confirms acceptance; continue polling until STATE=5 (STOPPED). Pending products may still produce results while DRAINING.
Example 4 — change only the recipe, once stopped: [0, 1, 26, 0, 0, 3, 4660, 22136]. This leaves autostart unchanged and does not start. Start later with [1, 0, 0, 0, 0, 4, 4660, 22136].
Example 5 — reset a corrected fault: COMMAND=4 with mask/recipe/autostart=0, next request ID and current BOOT_ID. Wait for a successful acknowledgement; issue a separate START if required. Do not send RESET repeatedly without diagnosing the fault.
Suggested cyclic PLC logic (Structured Text pseudocode; adapt Modbus block names to your PLC):
ReadHoldingRegisters(Start := 400, Count := 48, Data := Rx);
BootId := JoinUInt32(Rx[1], Rx[2]);
AckId := JoinUInt32(Rx[18], Rx[19]);
IF BootId <> SavedBootId THEN
SavedBootId := BootId; HaveSeenResult := FALSE;
(* Resynchronise command handling; do not replay old START. *)
END_IF;
IF (Rx[15] = 1) AND ((Rx[27] AND 1) <> 0) THEN
Seq := JoinUInt32(Rx[24], Rx[25]);
IF NOT HaveSeenResult OR (Seq <> SavedSeq) THEN
SavedSeq := Seq; HaveSeenResult := TRUE;
IF ((Rx[27] AND 2) <> 0) AND (Rx[29] <> 65535) THEN
Mass := SignedInt32(Rx[30], Rx[31]) / Power10(Rx[28]);
END_IF;
Samples := Rx[40]; ProductResult := Rx[38];
(* Process this snapshot once, including invalid/rejected products. *)
END_IF;
END_IF;NS refers to the last completed product and is unchanged until a new result arrives. A last-result register block is not a queue: if two products finish between polls, the intermediate result is not retrievable through this basic map. Monitor SEQ changes and choose a poll interval below the shortest product interval. After reconnecting, decide whether the first available result should be recorded as a recovered snapshot or used only as the initial baseline. This interface does not guarantee an audit trail for every product.
Verify both address conventions, word order and known positive/negative masses; read all 48 words and both 24-word sub-blocks.
Verify no-result flags before the first product, then an OK, LOW and invalid product; confirm result ID/unit stay attached to the stored result after recipe selection changes.
Repeat an identical accepted write before/after completion: it must execute once. Try a changed payload with the same ID, a skipped ID, a partial write and a read-only write: each must be rejected without changing accepted settings.
Test START with inactive CONS and inspect APPLIED_MASK; test STOP DRAIN until STOPPED, STOP NOW, fault RESET and a subsequent START.
Disconnect/reconnect and reboot the device. Verify request resynchronisation and that an old boot token is rejected. Test enabled/disabled autostart with successful and failed initial zeroing.
Repeat on the actual PLC and both configured TCP/RTU transports. Confirm that cyclic communication does not prevent weighing or output timing.
The register tables use one-based 4xxxx references. For reference 40101, the zero-based PDU address is 100. Use the addressing convention required by your Modbus client.
High-resolution gross and net weights in registers 40109–40112 use two additional decimal places when available. Decode them as signed 32-bit values and account for the decimal-position configuration.
No. It holds the last completed product result and remains unchanged until a new result arrives. Monitor SEQ and choose a polling interval shorter than the shortest product interval. Intermediate results cannot be retrieved from this basic map.
Resynchronise command handling when BOOT_ID changes. Read the current BOOT_ID and ACK_ID, do not replay an old START, and follow the command mailbox sequence and checks described in the PLC examples.
CSCP command reference for Neutron: message structure, weighing, configuration, counting, checkweighing and digital I/O.
OPC UA integration for Neutron: secure connections, live weighing data, stable capture and PLC/SCADA integration.