first commit
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,137 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user