138 lines
5.9 KiB
Markdown
138 lines
5.9 KiB
Markdown
# Existing atMb interface backed by the C TCP engine
|
|
|
|
Import AtomModbus-Compatible.export into a BACKUP COPY of your existing
|
|
atomLibrary, accepting replacement of the matching ModbusMaster objects.
|
|
This preserves the other Atom helpers referenced by the original code.
|
|
Do not import it into your small CmpAtomModbus external-function library.
|
|
|
|
In the copied atomLibrary's Library Manager add your CmpAtomModbus 0.2.0.0
|
|
library. Ensure its namespace/alias is exactly `CmpAtomModbus`, as the wrapper
|
|
calls `CmpAtomModbus.atMbCall_cext`. Keep existing dependencies including
|
|
ModbusFB, SysTime, the standard timer library and your other Atom helpers.
|
|
ModbusFB remains for legacy enum types and RTU; TCP no longer creates or calls
|
|
its client/request objects.
|
|
|
|
The native export preserves all 78 original object IDs and adds 10 methods.
|
|
Review source is in All_Source_Review.st. Original_HomeCodesys.export is the
|
|
unchanged supplied original. The export's XML/schema structure and public
|
|
declaration preservation have been checked, but the revised IEC code has NOT
|
|
been compiled in CODESYS here. Compile the copied atomLibrary and test before
|
|
replacing the installed production version.
|
|
|
|
## Same application calls
|
|
|
|
Your export's exact request names include `Req`:
|
|
|
|
```iecst
|
|
VAR
|
|
mbClient : atMbClientTCP;
|
|
mbRead : atMbReqReadHolding;
|
|
mbWrite : atMbReqWriteHolding;
|
|
holding : ARRAY[0..9] OF UINT;
|
|
setpoints : ARRAY[0..1] OF UINT;
|
|
END_VAR
|
|
```
|
|
|
|
```iecst
|
|
mbClient(
|
|
in_ipAddress := To_IPAddress(192,168,1,50),
|
|
in_port := 502,
|
|
in_timeout := T#1S
|
|
);
|
|
|
|
mbRead(
|
|
client := mbClient,
|
|
in_unitId := 1,
|
|
in_startAddr := 0,
|
|
in_quantity := 10,
|
|
in_dataOffset := 0,
|
|
in_minDelay := T#200MS,
|
|
data := holding
|
|
);
|
|
|
|
mbWrite(
|
|
client := mbClient,
|
|
in_unitId := 1,
|
|
in_startAddr := 100,
|
|
in_quantity := 2,
|
|
in_dataOffset := 0,
|
|
in_minDelay := T#1S,
|
|
data := setpoints
|
|
);
|
|
// mbWrite.writeNow(); // Existing method boosts priority, respecting min delay.
|
|
```
|
|
|
|
Only use mapped register ranges for your device; the write example is an API
|
|
example, not part of the read-only bench test. Existing names, input defaults,
|
|
BOOL/UINT open arrays, client reference, stats properties and writeNow are kept.
|
|
Use your existing library namespace prefix if required by Library Manager.
|
|
|
|
`in_dataOffset` remains an ACTUAL ARRAY INDEX as in the old implementation,
|
|
not a relative offset from LOWER_BOUND. Native capacity clipping now considers
|
|
that starting index. Bad indices set out_parameterError and disable scheduling
|
|
until corrected. Quantity zero disables a request. Protocol-excessive quantities
|
|
are rejected with a request parameter error. Don't change the client reference
|
|
of a registered request while running; request registrations are persistent.
|
|
|
|
## Added diagnostics/options (old call sites need no new arguments)
|
|
|
|
Client: out_connected, out_connectionState, out_lastNativeError,
|
|
out_socketError, out_reconnectCount, out_registrationFull.
|
|
State: 0 disabled, 1 retry, 2 connecting, 3 ready, 4 sending, 5 receiving.
|
|
Request: out_nativeError, out_socketError, out_writeUncertain, out_validData,
|
|
out_dataAgeMs, out_stale, out_parameterError. Existing stats remain available.
|
|
|
|
Extra TCP inputs: in_enable (TRUE), in_connectTimeout (2s),
|
|
in_reconnectDelay (1s), in_holdUncertainWrites (FALSE).
|
|
Extra request input: in_staleAfter (2s).
|
|
|
|
Priorities/minimum polling delays and cyclic writes are preserved. The C engine
|
|
never automatically replays a failed packet, but the IEC scheduler submits a
|
|
fresh snapshot on the next eligible write cycle, as the original code does.
|
|
For command writes where that is inappropriate, set in_holdUncertainWrites=TRUE:
|
|
an uncertain write holds that request until its existing writeNow() is called.
|
|
A valid Modbus exception counts as responsive communication, but does not
|
|
refresh read-data freshness. A client endpoint change closes the old context,
|
|
cancels its transaction and invalidates its old read data.
|
|
|
|
The client processes its registered requests, as before. Request FB calls bind
|
|
their arrays/register the requests; they must still run every scan. After an
|
|
online change registrations are rebuilt by those calls. The native base's
|
|
FB_reinit resets in-flight state and TCP FB_exit closes the C context when
|
|
disposed. These lifecycle paths require target testing. An application STOP
|
|
alone does not guarantee FB_exit; set in_enable=FALSE and run one scan (or call
|
|
release()) before STOP/download. Re-enable afterwards.
|
|
|
|
All native clients/requests must be owned by ONE IEC task because the C pool
|
|
is not thread-safe. Up to 16 native clients and 100 registered requests/client.
|
|
Do not retain/persist client handles. Arrays/instances must live for the client
|
|
lifetime. No IEC data pointer is held in the C engine between calls.
|
|
|
|
## Rebuild the Pi component once
|
|
|
|
This wrapper uses new command 11 for per-request timeouts. Rebuild the included
|
|
component; do not use the previous .so. No external function declaration,
|
|
checksum or library interface regeneration is needed. Version stays 0.2.0.0.
|
|
|
|
```sh
|
|
cd ~/modbus-build/atom-modbus
|
|
make -C component SDKDIR="$(realpath sdk/ExtensionSDK)" clean
|
|
make -C component SDKDIR="$(realpath sdk/ExtensionSDK)" all
|
|
sudo /etc/init.d/codesyscontrol stop
|
|
sudo cp component/out/libCmpAtomModbus.so /usr/lib/
|
|
sudo /etc/init.d/codesyscontrol start
|
|
```
|
|
|
|
The stop/start requires the same safe bench maintenance conditions as before.
|
|
The existing ComponentManager entry stays valid. Add the copied/compiled Atom
|
|
library to a test application, use only the read block initially and verify
|
|
disconnect/reconnect, per-request timeouts, priorities and lifecycle handling.
|
|
|
|
## Validation
|
|
|
|
Public input/output/in-out declarations from the original export are retained.
|
|
The C engine and bridge regression tests cover TCP recovery, framing and
|
|
exceptions. The new per-request timeout command is exercised by the TCP bridge
|
|
driver. This does not substitute for CODESYS compile, target scheduler tests or
|
|
production commissioning.
|