ServerSerial_extended (FB)

FUNCTION_BLOCK ServerSerial_extended EXTENDS ModbusFB.ServerSerial

MODBUS Serial server (slave) with non-standard extensions.

ServerSerial_extended actually supports beyond the ServerSerial features: - “wide register” (registers > 16bit) Other non-standard extensions might be added here, but not on ServerSerial.

“wide registers” and endianess

The MODBUS standard defines the length of input / holding registers to read/write with 16-bit - no way out of this. The message definitions in the MODBUS standard come with some room for non-standard interpretation. FC03 Read Holding Registers should be used as an example here:

Request: Quantity of Registers Response: Byte count

So a non-standard MODBUS server can inform a client in the response indirectly about the register width (Response:Byte count = Request:Quantity of Registers * register width in Bytes). This fact leaded some vendors to implement MODBUS devices with registers > 16bit. Because the CODESYS ModbusFB lib should be usable with such non-standard devices (clients as well as servers) there is a Server*_extended and some related ClientRequest*RegistersWide in this library. Following client requests can be used with “wide registers”: - Read Holding Registers - Read Input Registers - Write Multiple registers - Read/Write Multiple registers

Following client requests can not be used with “wide registers” because of their MODBUS protocol data unit (PDU) definition: - Write Single Register - Mask Write Register because the “data item” width is explicitly defined to be 16bit.

A standard MODBUS client requesting register data from such a non-standard MODBUS server, unfortunately requesting register data from a register > 16bit gets confronted with an invalid Response: Byte count <> Quantity of Registers * 2, and will most likely drop such a response as invalid or less likely put out error/warning/information on this fact.

The MODBUS standard defines byte ordering in MODBUS messages to read/write 16-bit registers. The MODBUS standard doesnt define anything beyond this - so there is no rule for byte ordering in “wide registers”. This ServerSerial_extended is using the same byte ordering for register data > 16bit as defined in the MODBUS standard (“big-Endian” representation). So for example register size 32bit value 0x12345678 - the first byte sent is 0x12 then 0x34, 0x56, 0x78.

Please visit https://forge.codesys.com/prj/codesys-example/modbus/home to find examples.

InOut:

Scope

Name

Type

Initial

Comment

Inherited from

Input

xEnable

BOOL

FALSE

Enables the server, take over the configuration information fcsSupported and dataModel. If the “data model” (tableDefinitions) contains configuration errors, the Server will not got busy (xBusy = FALSE).

Server

fcsSupported

SupportedFcs

Constants.SUPPORTED_FCS_SIMPLE_SERVER

Supported “function codes”, accepted at xEnable FALSE => TRUE. In case fcsSupported is not assigned by the application it defaults to |Constants.SUPPORTED_FCS_SIMPLE_SERVER|.

Server

dataModel

TableDefinitions

“data model”, accepted at xEnable FALSE => TRUE.

Server

tInactivityInfoTime

UDINT

0

“inactivity info time” (in milliseconds). If no valid requests are received in this time xInactive is signaling inactivity - default = 0 -> no “inactivity info”.

Server

Output

xRunning

BOOL

Server is up and running, waiting for requests.

Server

xError

BOOL

Error

Server

eErrorID

Error

Error status

Server

xInactive

BOOL

No valid requests received for tInactivityTimeOut.

Server

udiNumMsgRecv

UDINT

Number of request messages received since enabling the Server.

Server

udiNumMsgReply

UDINT

Number of reply messages send since enabling the Server.

Server

udiNumMsgExcReply

UDINT

Number of exception reply messages send since enabling the Server.

Server

udiNumMsgExcReplyIllFct

UDINT

Number of exception reply messages send since enabling the Server, signaling illegal function.

Server

udiNumMsgExcReplyIllDataAdr

UDINT

Number of exception reply messages send since enabling the Server, signaling illegal data address.

Server

udiNumMsgExcReplyIllDataValue

UDINT

Number of exception reply messages send since enabling the Server, signaling illegal data value.

Server

xReadRequest

BOOL

Read request(s) happened since last call, rejected requests included.

Server

udiNumReadRequests

UDINT

Read request counter, rejected requests included.

Server

xWriteRequest

BOOL

Write request(s) happened since last call, rejected requests included.

Server

udiNumWriteRequests

UDINT

Write request counter, rejected requests included.

Server

Input

uiUnitId

UINT

1

Unit-Id / Slave address. Only read when rising edge on xEnable occurs. Slave address has to be in range 1 .. 247 according to MODBUS standard.

ServerSerial

iPort

SysCom.SYS_COM_PORTS

SysCom.SYS_COM_PORTS.SYS_COMPORT_NONE

Serial port. Only read when rising edge on xEnable occurs.

ServerSerial

dwBaudrate

SysCom.SYS_COM_BAUDRATE

SysCom.SYS_COM_BAUDRATE.SYS_BR_115200

Baud rate. Only read when rising edge on xEnable occurs.

ServerSerial

byDataBits

BYTE

8

Number of data bits/BYTE, 4-8. Only read when rising edge on xEnable occurs.

ServerSerial

eParity

SysCom.SYS_COM_PARITY

SysCom.SYS_COM_PARITY.SYS_NOPARITY

Parity. Only read when rising edge on xEnable occurs.

ServerSerial

eStopBits

SysCom.SYS_COM_STOPBITS

SysCom.SYS_COM_STOPBITS.SYS_ONESTOPBIT

Stop bits. Only read when rising edge on xEnable occurs.

ServerSerial

eDTRcontrol

SysCom.SYS_COM_DTR_CONTROL

SysCom.SYS_COM_DTR_CONTROL.SYS_DTR_CONTROL_DISABLE

DTR control. Only read when rising edge on xEnable occurs.

ServerSerial

eRTScontrol

SysCom.SYS_COM_RTS_CONTROL

SysCom.SYS_COM_RTS_CONTROL.SYS_RTS_CONTROL_DISABLE

RTS control. Only read when rising edge on xEnable occurs.

ServerSerial

eRtuAscii

RtuAscii

RtuAscii.RTU

RTU / ASCII. Only read when rising edge on xEnable occurs.

ServerSerial

udiLogOptions

UDINT

LoggingOptions.ServerStartStop

Logging options.

ServerSerial