Change Log
2.59 (November 16, 2023)
- New: Added support for Embarcadero Delphi 12.0 Athens and C++Builder 12.0 Athens (Win32 and Win64 target platforms).
- New: ModLink VCL has undergone thorough testing and is now officially certified to be compatible with Windows 11.
2.58 (January 01, 2022)
- New: Added support for Embarcadero Delphi 11.0 Alexandria and C++Builder 11.0 Alexandria (Win32 and Win64 target platforms).
2.57 (June 06, 2020)
- New: Added support for Embarcadero Delphi 10.4 Sydney and C++Builder 10.4 Sydney (Win32 and Win64 target platforms).
2.56 (March 12, 2019)
- New: Added support for Embarcadero Delphi 10.3 Rio and C++Builder 10.3 Rio (Win32 and Win64 target platforms).
2.55 (April 28, 2017)
- New: Added support for Embarcadero Delphi 10.2 Tokyo and C++Builder 10.2 Tokyo (Win32 and Win64 target platforms).
2.54 (July 28, 2016)
- New: Added support for Embarcadero Delphi 10.1 Berlin and C++Builder 10.1 Berlin (Win32 and Win64 target platforms).
- New: ModLink VCL has undergone thorough testing and is now officially certified to be compatible with Windows 10.
- Change: TModbusConnection.ReceiveTimeout property now governs the entire process of reception of a Modbus frame.
This property should be set to a value that is large enough to transmit the entire Modbus frame over the network.
- Change: The default value of TModbusConnection.MinimumSilentInterval property has been changed to 50 milliseconds.
- Fix: Improved reliability of serial data reception especially at very high baud rates.
- Fix: Incoming Modbus frames are now handled more gracefully (no more fatal exceptions raised upon reception of corrupted data).
- Fix: TModbusConnection.RealSilentInterval property is now updated always, even when the connection is currently not active.
2.53 (November 10, 2015)
- New: Added support for Embarcadero Delphi 10 Seattle and C++Builder 10 Seattle (Win32 and Win64 target platforms).
2.52 (June 10, 2015)
- New: Added support for Embarcadero Delphi XE8 and C++ Builder XE8 (Win32 and Win64 target platforms).
2.51 (October 27, 2014)
- New: Added support for Embarcadero Delphi XE7 and C++ Builder XE7 (Win32 and Win64 target platforms).
2.50 (June 29, 2014)
- New: Added support for Embarcadero Delphi XE6, C++Builder XE6 and
RAD Studio XE6 (Win32 and Win64 target platforms).
- New: ModLink VCL has undergone thorough testing and is now officially
certified to be compatible with Windows 8 and Windows 8.1 Update.
- New: Revised the serial communication subsystem to improve
compatibility with standard serial ports and even more serial port adapters.
- New: Every unhandled exception that escapes from TModbusConnection's
transaction processing thread is now reported silently via newly introduced
OnFatalThreadException event, and the corresponding TModbusConnection instance
is then properly deactivated as a result of the failure. This behavior allows to
detect and act upon situations when a serial port resource is no longer available
(USB device surprise removal, network cable being unplugged, etc.)
- New: Updated the ModLink Demo application.
- Various tweaks.
2.42 (December 27, 2013)
- New: Added support for Embarcadero Delphi XE5, C++ Builder XE5 and RAD Studio XE5 (Win32 and Win64 target platforms).
2.41 (August 20, 2013)
- New: Added support for Embarcadero Delphi XE4, C++ Builder XE4 and RAD Studio XE4 (Win32 and Win64 target platforms).
- New: Added support for Borland C++Builder 6.
2.40 (October 11, 2012)
- New: Added support for Embarcadero Delphi XE3, C++ Builder XE3 and RAD Studio XE3.
- New: Added support for Win64 target platform (Delphi XE2, Delphi XE3).
2.30 (December 22, 2011)
- New: Added support for Embarcadero Delphi XE, C++ Builder XE and RAD Studio XE.
- New: Added support for Embarcadero Delphi XE2, C++ Builder XE2 and RAD Studio XE2
(Win32 target platform only).
- New: Extended TModbusConnection.ConnectionMode enumeration with a new member (cmMonitor)
that is supposed to turn TModbusConnection into a special monitoring mode in which every Modbus frame
travelling across the network will be captured, analyzed and developers will then be given access to
a detailed information about each Modbus frame being captured (server address, command code, command
data) via newly introduced OnInspectCapturedFrame event. Neither TModbusClient nor TModbusServer
classes are going to be used in this mode, because the intention here is to just intercept the
network communication traffic, but not disrupt it in any way.
- New: TModbusConnection class now has a capability to touch the contents of every
incoming Modbus frame via newly introduced OnPreprocessIncomingFrame event, right after it has been
received from the network, but before the main processing chain kicks in.
- New: Introduced a new TrimModbusFrame routine that was designed to strip a specific
number of bytes off the start and/or the end of a Modbus frame.
- Change: Improved the client-side and server-side code stability at runtime under stressed
conditions, e.g. when Modbus requests are initiated at a very high rate.
- Change: Changed the prototype of TModbusClient.InitCustomTransaction method so that it
now takes the request data as an array of bytes instead of a string.
- Change: Changed the prototype of TModbusClient.OnCustomTransactionComplete event so that
the internal TModbusTransaction object can now be accessed from within this event in order to
provide developers with more flexibility in processing of custom Modbus transactions.
- Change: Enhanced the look and feel of TModbusConnectionEditForm class.
- Various tweaks.
2.20 (February 26, 2010)
- New: ModLink has undergone thorough testing and is now officially certified to be Windows 7/Vista compatible.
- New: Serial communication subsystem has got a bit of overhaul that improves performance and overall stability especially under stressed conditions.
- Fix: Reception of a corrupted response frame in Modbus/RTU transmission mode gets sometimes misinterpreted as if no response was received at all (response timeout expired).
- Fix: Reception of a corrupted request/response frame in Modbus/ASCII transmission mode results in EAssertionFailed to be thrown with message 'DecodeFrame: Trailing CR is missing'.
- Fix: ReceiveTimeout property of TModbusConnection is misused to govern the entire process of reception of Modbus data frames. As a result, they are being truncated prematurely if ReceiveTimeout is smaller than the time required to transmit the entire frame over the network.
- Various tweaks.
2.13 (September 21, 2009)
- New: Added support for Embarcadero Delphi 2010, C++ Builder 2010 and RAD Studio 2010.
- Fix: Attempting to assign TModbusConnection->Port property programatically in C++ Builder code results in [Linker Error] Unresolved external '__fastcall Modlink::TModbusConnection::SetPortA(System::AnsiString)' referenced from ...
2.12 (March 8, 2009)
- New: Added support for CodeGear Delphi 2009, C++ Builder 2009 and RAD Studio 2009.
2.11 (May 14, 2008)
- New: Added support for CodeGear C++ Builder 2007.
- New: Added support for Delphi for Win32 and C++ Builder personalities of CodeGear RAD Studio 2007.
- New: When using RTS-Toggle flow control, TModbusConnection component now allows for
an arbitrary time gap (adjustable via RTSHoldDelay property)
to be inserted before the RTS line gets lowered to logical zero after the buffered
data waiting for transmission have been sent. This apparently leads to a better
compatibility with certain RS-232<->RS-485 converters.
- New: TModbusConnection component is now able to notify the application
about reception of corrupt/incomplete Modbus data frames via OnInvalidFrameDiscard event.
This event occurs whenever the incoming request from
remote Modbus client does not pass an error check to ensure its data integrity.
- New: TModbusServer component is now able to notify the application about the actual
reason of its inability to handle a specific Modbus client request via OnCommandHandlerException event.
This event occurs whenever an exception gets raised while the incoming request from
remote Modbus client is being handled.
- Change: Replaced the Windows automatic RTS-Toggle flow control implementation
with a custom one due to (i) tendency of lowering the RTS line to logical zero too early
even before the buffered data waiting for transmission actually had a chance to be sent
to the wire, and (ii) inability to work at all under Windows 95/98/ME.
- Fix: There were some issues related to communication with a certain combinations of
Modbus server devices and signal converters.
- A couple of internal tweaks.
- Updated the documentation.
- Added three new example projects that demonstrate how to write a basic Modbus client/server applications using ModLink.
2.10 (June 03, 2007)
- New: Added support for CodeGear Delphi 2007 for Win32.
- New: TModbusConnection component now makes it easy to intercept a moment whenever data frame is about to be sent to the serial network and provide additional behavior via newly introduced OnBeforeFrameSendAsync and OnAfterFrameSendAsync events. As indicated by 'Async' suffix both of them get triggered within the context of internal transaction management thread.
- Improved: RTS and DTR serial line signals can now be set manually during the communication session in order to allow for customized data flow control.
- Fixed: Attempting to initiate client requests at a very high rate may result in some responses from remote server to be lost.
- Fixed: Reception of zero sized data frame may result in either ERangeError or EAccessViolation to be raised, depending on whether range checking option is enabled or not.
- A couple of internal tweaks.
- Updated the documentation.
2.9 (December 20, 2006)
- New: Extended TServerReply enumerated type with srUnexpectedReply
member. This value indicates reception of response data frame that was originated
by "unexpected" remote server. Such change was introduced to allow for better
granularity when distinguishing between a response from "unexpected" server and
an unmatched response from "expected" server.
- Change: Upon reception of response from "unexpected" remote server,
the active Modbus transaction is now kept waiting for another response (hopefully)
from "expected" remote server while global response/receive timeout is still
in action. Previously there was no such implicit retry and the active Modbus
transaction was marked as unmatched in this case.
- New: TModbusClient now provides a centralized way to notify application
about every processed Modbus transaction via single OnTransactionProcessed event.
Component developers are advised to override protected DoTransactionProcessed method
instead.
- New:Added mechanism which allows TModbusClient to keep track of number
of consecutive Modbus transactions that timed out (i.e. those transactions where
either none or unexpected response was received from remote server within given
timeout). As soon as internal counter exceeds the limit imposed by
MaxConsecutiveTimeouts property, application will be notified via
OnConsecutiveTimeoutLimitExceed event. Provided that MaxConsecutiveTimeouts property
is set to a reasonable value, this mechanism might be useful to determine whether
or not the remote server is still responding during the communication session.
Component developers are advised to override protected ConsecutiveTimeoutLimitExceed
method instead.
- New: TModbusConnection now allows for size of internal reception/transmission
serial device buffers to be adjusted as needed via newly exposed InputBufferSize
and OutputBufferSize properties which both default to 1024 bytes.
- A couple of internal tweaks.
2.8 (July 20, 2006)
- New: Added support for public Modbus command
Read/Write Multiple Registers (code $17). This command can be used
to perform a combination of one read operation and one write operation
in a single Modbus transaction. It has the same effect as if
both Write Multiple Registers and Read Holding Registers
commands were called successively (in that order), but generally it takes much less time
to complete.
- New: Extended TServerReply enumerated type with a new srInvalidFrame member. As the name says, this member is intended to indicate that a partial, incomplete or otherwise corrupted Modbus data frame (response) has been received from a remote Modbus server.
- Change: ServerAddress property of TModbusClient component
may now be changed at any time, again (reconsidered the restriction
imposed in previous release). There is one difference, though.
If the property value is being changed while TModbusClient is associated
with an active TModbusConnection instance, all pending Modbus transactions
originated by that TModbusClient will be immediately discarded upon the change.
- Fix: Upon reception of unmatched server response (i.e. Modbus data frame whose server address and/or command code fields do not match their counterparts in the original client request), TModbusConnection component will no longer discard the current transaction results, and immediately make another attempt to receive even more data from a remote Modbus server, apparently without having any chance to succeed.
- A couple of internal tweaks.
- New: Demo application now provides necessary infrastructure
required for management of transactions based on the newly implemented
public Modbus command Read/Write Multiple Registers (code $17).
- New: Demo application now supports optional logging of various
activitity to a disk file. This covers complete Modbus transaction management
(client-side and server-side) including all incoming/outgoing traffic
over the serial network.
- Updated the documentation.
2.7 (March 09, 2006)
- New: Added support for Borland Developer Studio 2006.
For this version of IDE, ModLink components come in form of dual/shared
packages which means once installed, they will be accessible from both
Delphi 2006 for Win32 and C++ Builder 2006 for Win32 personality as well.
- New: TModbusClient component is now able to initiate
custom Modbus transactions based on user-supplied command code and data.
Once entered, ModLink will then take a care of generating the protocol
header, appropriate error check field, wrapping them up along with the
raw request data into valid Modbus frame, and forwarding it to the
transaction engine for further processing. This feature is especially
useful when there is a need to interface with certain devices that
implement proprietary device-specific commands not defined in the standard
Modbus specification.
- New: During the processing of remote Modbus client request by
TModbusServer component, the application is now able to abort the action
that is currently being performed and specify which kind of Modbus
exception response is to be transmitted back to a remote Modbus client
(instead of a normal Modbus response).
- New: The contents of server item listview in the demo application
now persists between the sessions.
- Fix: OnFrameReceive event of TModbusConnection component will
no longer be triggered upon receipt of zero bytes (i.e. whenever the receive
operation of underlying serial transport times out).
- Fix: ServerAddress property of TModbusClient component is no longer
allowed to be modified while TModbusClient is associated with an active
TModbusConnection instance. Additionally, there are no restrictions imposed
upon the value of this property anymore.
- Fix: Should TModbusServer component fail to perform an action
indicated by remote Modbus client request (particularly due to a runtime
exception being raised from within a server command handler), a special
Modbus exception response with code $04 (SERVER_DEVICE_FAILURE) is now
guaranteed to be transmitted back to a remote Modbus client. Previously,
no response was sent by TModbusServer component at all in such cases.
- Fix: When running in a Modbus server mode, the demo application
will no longer cause EAccessViolation exceptions to be raised whenever
an item gets removed from the server item listview.
- Updated the documentation.
2.6 (August 23, 2005)
- TModbusConnection
component is now able to optionally hook already opened
serial
port rather than explicitely open one for exclusive
access.
This feature may be useful in cases when handle to the
same serial port has to be shared between multiple parties
(e.g.
in addition to ModLink, you may want to use a third-party TAPI library
to establish/drop a connection with external modem device). Hooking
already opened
serial port is as easy as setting the value of HookExistingPort
property to True and providing a handler
for OnGetHookedPortHandle
event that gets triggered during the activation sequence.
- Fix:
In the {$R+} state when generation of range-checking code is
enabled, TModbusConnection
component no longer causes ERangeError or EAccessViolation (in
earlier versions of Delphi) runtime exceptions to be raised whenever
empty response frame is received from a remote Modbus server.
- Fix:
When the value of EchoQueryBeforeReply
property is True, TModbusConnection
component no longer triggers OnFrameReceive
event upon reception of
Modbus query frame echoed back by certain RS-232 <->
RS-485
converters.
- User settings in the demo application now persist
between the sessions.
- Fixed a couple of minor bugs in the demo application.
- Updated the documentation.
2.5 (May 16, 2005)
- Added support for new Modbus command: Read
Exception Status (code $07). This command can be used to read
the contents of eight exception status outputs in a remote Modbus
server.
- Added support for new Modbus command: Report
Server ID (code $11). This command can be used to read the
description of the type, the current status, and other information
specific to a remote Modbus server.
- Fix: Finally managed to remove annoying TModbusClient/TModbusConnection
shutdown bug which caused a runtime exception to be raised during
dispatching of pending Modbus transactions when either or both these
components were about to be destroyed.
- Increased scope visibility (from private to protected) of
relevant TModbusConnection methods (WaitForData,
ExamineInputBuffer, InternalReceiveFrame,
and SendFrame) in order to let application
developer to perform custom data interchange over the serial line as
well (e.g. to establish or drop a connection with external modem
device).
- A couple of internal tweaks.
- Updated the documentation.
- Updated the demo application.
2.4 (January 24, 2005)
- Added support for Borland Delphi 2005 (Win32 Personality
only).
- Introduced new EchoQueryBeforeReply
property in TModbusConnection. This property
allows ModLink based applications to take care of RS-232
<-> RS-485 converters that automatically echo the data
frame (Modbus query) immediately after its reception back to the client
that originated the transaction.
- Fix: Under certain circumstances, TModbusClient
could raise a runtime exception during TModbusConnection
shutdown when there were some pending Modbus transactions in the
transaction queue. This is no longer possible.
- Improved the layout of TModbusConnectionEditForm
dialog.
- Updated the documentation.
- Updated the demo application.
2.2 (December 22, 2003)
- Implemented support for the five additional Modbus
commands in the server simulation mode: Read Coils
(code $01), Read Discrete Inputs (code $02), Write
Single Coil (code $05), Write Single Register
(code $06), and Write Multiple Coils (code $0F).
- Fix: Added a workaround the delayed
serial port driver notification issue that occurs in the Windows OS
family. Due to this issue, an incomplete Modbus frames were received by
TModbusConnection under some circumstances, if
the value of RealSilentInterval property was less
than approx. 20 milliseconds. From now, the value of the real silent
interval is forced to be at least 20 milliseconds.
- Fix: TModbusConnection
now allows for the DTR and RTS lines of the serial port to be
enabled/disabled and left on/off during the communication session
provided that they are not used in any kind of the hardware data flow
control mechanism. In the previous versions those lines were always
disabled and left off by default (in case of no hardware data flow
control mechanism), which caused several remote Modbus servers to fail
to respond. For this purpose, a new DTREnabled and RTSEnabled
properties have been introduced.
- Introduced new DiscardPendingTransactions
method in TModbusConnection. As the name says, this
method is intended to discard all pending transactions in the
internally maintained transaction queue. However, it is possible to
restrict the removal process only to those pending transactions that
were previously initiated by given TModbusClient.
- Added a set of routines intended for a bidirectional
conversion between a real world values that occupy multiple Modbus
registers, and a Modbus register's native storage format compliant
values. They are: LongInt2Mod, Mod2LongInt,
LongWord2Int, Mod2LongWord, Single2Mod,
Mod2Single, Double2Mod, and Mod2Double.
Those already existing routines that operate with a real world values
that occupy only a single Modbus register were just renamed:
- Float2Mod -> ScaledFloat2Mod,
- Mod2Float -> Mod2ScaledFloat,
- Int2Mod -> SmallInt2Mod,
- Mod2Int -> Mod2SmallInt.
- Introduced new ExceptionCodeToStr
method in TModbusConnection. As the name says, this
method is intended to convert the Modbus exception code acquired by the
client from the reply returned by a remote server into a meaningful
description. The method first fills the result string with a default
description and then it lets the application to adjust this default
description by triggering a newly introduced OnTranslateExceptionCode
event.
- Fix: Fixed the bug in the internal
window procedure of TModbusConnection which was
causing the application using ModLink components not to respond
properly to WM_QUERYENDSESSION message, thereby preventing the Windows
system to be shut down. Thanks to Vadim Tishkevich for the bug
report/fix.
- Source code restructure and internal tweaks.
- Updated the documentation.
- Updated the demo application.
2.1 (May 20, 2003)
- Private release. Added preliminary
(experimental) support for local Modbus server simulation in ModLink.
- Introduced new component: TModbusServer.
This component is intended to simulate a local Modbus server which
listens on the serial port for incoming Modbus transactions initiated
by a remote Modbus client and performs the action requested in the
query. Currently, only three Modbus commands are supported: Read
Holding Registers (code $03), Read Input Registers
(code $04), and Write Multiple Registers (code
$10).
- Introduced new ConnectionMode property
in TModbusConnection. This property is used to
determine in which mode (either a local client mode or a local server
mode) will TModbusConnection operate, when activated. Since this
version, TModbusConnection may be shared with both TModbusClient and
TModbusServer components as well, however it's designed to operate only
with the objects of one kind upon activation.
- Source code restructure and internal tweaks.
2.0 (May 12, 2003)
- Rewritten and optimized nearly every line of code for
serial communication and Modbus transaction management to comply with
the new Modbus specifications.
- Removed the dependency on ComPort Library. From now,
ModLink doesn't require/rely on any third-party VCL extensions,
external DLLs or OCXs.
- Added support for five additional Modbus commands: Read
Coils (code $01), Read Discrete Inputs
(code $02), Write Single Coil (code $05), Diagnostics
(code $08, all sub-codes), and Write Multiple Coils
(code $0F).
- Added support for Modbus/ASCII serial transmission mode.
- Made it possible to initiate broadcast Modbus queries as
well. A new TurnaroundDelay property was introduced
in TModbusConnection which is now able to insert a specific delay after
sending the Modbus broadcast query in order to allow any remote server
to process the current query before sending a new one.
- Introduced two new events in TModbusConnection: Using OnReceiveFrame
and OnSendFrame events it's very easy to monitor
the serial network and examine all incoming/outgoing raw data frames
from/to a remote Modbus servers.
- During the initiation phase, every Modbus transaction now
gets assigned an unique ID to help application developers keep track of
particular Modbus transaction.
- Added support for Borland Delphi 4 development environment.
- Added a lot of useful design-time enhancements to the
Delphi IDE, such as introducing of property categories, and various
property/component editors.
- Updated the documentation.
- Source code restructure and internal tweaks. Unfortunately,
there were so many significant changes to the source code, so the
backward compatibility with previous versions of ModLink has been
broken.
1.3 (December 10, 2002)
- Corrected the typo in the source code: ftTimeout
member of TFailReason renamed to frTimeout.
- Added support for two additional Modbus commands: Read
File Record (code $14), and Write File Record
(code $15).
- Fix: Imposed additional restrictions
upon input parameters in ReadHoldingRegisters, ReadInputRegisters,
and WriteMultipleRegisters methods of TModbusClient.
These methods now make sure that no item of range of register
references to be read/written exceeds the upper Word ($FFFF) boundary.
- Stripped RegCount parameter out of WriteMultipleRegisters
method of TModbusClient for redundancy reason (this
information can be retrieved indirectly from the supplied array of
register values). This action caused the backward compatibility to be
broken.
- Introduced new CountPendingTransactions
method in TModbusConnection. As the name says, this
method is intended to retrieve information about the total item count
in the internally maintained pending transaction list. However, it is
possible to restrict the list search only to those pending transactions
that were previously initiated by given TModbusClient.
- Added an ability to associate any Modbus transaction with
the pointer to user-defined data. This pointer may be supplied via an
optional parameter of any of the transaction initiation methods defined
in TModbusClient. Similarly, it may be retrieved at
a later time, when the particular transaction has been completed.
- Added support for Borland Delphi 7 development environment.
- Updated the documentation.
- Source code restructure and internal tweaks.
1.2 (October 6, 2002)
- Introduced several changes in the interface part of the
main unit in order to increase the source code consistency. As a result
of this action, the backward compatibility was broken, so existing code
which uses ModLink must be slightly adjusted to be up-to-date:
- TSingleRegisterPresetEvent event
prototype renamed to TSingleRegisterWriteEvent.
- OnSingleRegisterPreset property of
TModbusClient renamed to OnSingleRegisterWrite.
- PresetSingleRegister method of
TModbusClient renamed to WriteSingleRegister.
- TModbusRegistersReadEvent event
prototype renamed to TMultipleRegistersAccessEvent.
- seIllegalFunction member of
TSlaveException renamed to seIllegalCommand.
- seSlaveDeviceException member of
TSlaveException renamed to seSlaveDeviceFailure.
- RegValues value parameter of TMultipleRegistersAccessEvent
changed to a constant parameter.
- Analysis value parameter used in TMultipleRegistersAccessEvent,
TSingleRegisterWriteEvent, and TLoopbackTestExecuteEvent
changed to a constant parameter.
- Added support for two additional Modbus commands: Write
Multiple Registers (code $10), and Mask Write
Register (code $16).
- Added a set of utility routines intended for conversion
from a real world values to a Modbus register's native storage format
and vice versa. They are: Float2Mod, Mod2Float,
Int2Mod, and Mod2Int.
- The scheduling priority of the background transaction
management thread can now be adjusted via new TransactionThreadPriority
property of TModbusConnection.
- Improved a Modbus transaction analysis which is now a bit
faster.
- Fix: Imposed additional restrictions
upon input parameters in ReadHoldingRegisters and ReadInputRegisters
methods of TModbusClient.
- Added a sample application demonstrating the key features
of ModLink. Full project sources (compatible with Borland Delphi 5/6)
are included.
- Updated and clarified the documentation.
- Internal tweaks.
1.1 (August 17, 2002)
- Massively updated the documentation which is almost
complete now.
1.0 (August 9, 2002)
- First public release.
- Built-in support for Borland Delphi 5/6 development
environments.
- Included preliminary HTML Help documentation in a compiled
form.
Copyright © 2002 - 2023
Ing. Ivo Bauer
All rights reserved.