Jump to content

Component: Modbus Slave (Comms: System): Difference between revisions

From Flowcode Help
XML import - Pre 8.0 release
m Text replacement - "style="background-color:#EAE1EA;"" to "class="mtx-class-propfolder""
 
(23 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
{| style="width:50%"
 
{| width="50%"
|-
|-
| width="20%" style="color: gray;" | Author
| width="20%" style="color:gray;" | Author
| Matrix Ltd.
| Matrix Ltd.
|-
|-
| width="20%" style="color: gray;" | Version
| width="20%" style="color:gray;" | Version
| 2.0 (Release)
| 2.0
|-
|-
| width="20%" style="color: gray;" | Category
| width="20%" style="color:gray;" | Category
| Comms: System
| Comms: System
|}
|}




 
==Modbus Slave component==
==[[File:Component Icon 687f8ad4_59f2_4079_bb84_7713dcb57a13.png|Image]] Modbus Slave component==
Modbus component for creating Modbus compatible slave hardware via RS232 or RS485.  
Modbus component for creating Modbus compatible slave hardware via RS232 or RS485.  


==Examples==
==Detailed description==
Example master program to control the slave. The example reads the 8 switches connected to PortD. If the switch values change then the new value is send to the slave.
{{Fcfile|ModBus_Master_Example1.fcfx|Modbus Master Example}}
Example slave program to react to the signals from the master. The example listens for Modbus commands from the master and outputs the current coils 0-7 state to eight LEDs connected to PortD.
{{Fcfile|ModBus_Slave_Example1.fcfx|Modbus Slave Example}}
===Addressing===


In Modbus the addressing protocol looks like this.


{| width="80%"
|'''Data Type'''
|'''Common name'''
|'''Starting address'''
|'''Ending Address'''
|'''Flowcode Start Address'''
|'''Flowcode End Address'''
|-
|Modbus Coils
|Bits, binary values, flags
|00001
|10000
|0
|9999
|-
|Digital Inputs
|Binary inputs
|10001
|30000
|0
|19999
|-
|Analog Inputs
|Binary inputs
|30001
|40000
|0
|9999
|-
|Modbus Registers
|Analog values, variables
|40001
|60000
|0
|19999
|}




In Flowcode each section starts from 0 so the address range is as shown.


==Downloadable macro reference==


===<span style="font-weight: normal;"><u><tt>ReadHoldingRegister</tt></u></span>===
Reads the value of a single holding register.


'''Parameters'''


:[[Variable Types|UINT]] ''Address''
::Coil Address




'''Return value'''


:[[Variable Types|UINT]]




===<span style="font-weight: normal;"><u><tt>ReadCoilStates</tt></u></span>===
Reads the state of a single digital coil.


Can pack a max of 8-bits together in a single operation


'''Parameters'''


:[[Variable Types|UINT]] ''StartAddress''
::Coil Address Range 0 to (NumCoils - 1)


:[[Variable Types|BYTE]] ''AddressCount''
::Range 1-8




'''Return value'''


:[[Variable Types|BYTE]]




===<span style="font-weight: normal;"><u><tt>ReadAnalogueInput</tt></u></span>===
Reads the value of a single analogue input.


'''Parameters'''
''No detailed description exists yet for this component''


:[[Variable Types|UINT]] ''Address''
==Examples==
::Coil Address




'''Return value'''


:[[Variable Types|UINT]]




===<span style="font-weight: normal;"><u><tt>ReadInputStates</tt></u></span>===
Reads the state of a single digital input.


Can pack a max of 8-bits together in a single operation


'''Parameters'''


:[[Variable Types|UINT]] ''StartAddress''
::Coil Address Range 0 to (NumCoils - 1)


:[[Variable Types|BYTE]] ''AddressCount''
::Range 1-8




'''Return value'''


:[[Variable Types|BYTE]]




===<span style="font-weight: normal;"><u><tt>SetSlaveAddress</tt></u></span>===
Allows the slave address to be overridden from the default slave address specified


in the component property. The number of bytes used for the address is fixed by the


Slave ID Bytes property to save on RAM usage.


'''Parameters'''


:[[Variable Types|UINT]] ''SlaveAddress''




'''Return value'''


:''This call does not return a value''




===<span style="font-weight: normal;"><u><tt>SetCoilState</tt></u></span>===
Sets the state of a single digital coil.


'''Parameters'''


:[[Variable Types|UINT]] ''Address''
Example master program to control the slave. The example reads the 8 switches connected to PortD. If the switch values change then the new value is send to the slave.
::Coil Address


:[[Variable Types|BYTE]] ''State''
{{Fcfile|ModBus_Master_Example1.fcfx|Modbus Master Example}}
::0=off, 1=on




'''Return value'''
Example slave program to react to the signals from the master. The example listens for Modbus commands from the master and outputs the current coils 0-7 state to eight LEDs connected to PortD.


:''This call does not return a value''
{{Fcfile|ModBus_Slave_Example1.fcfx|Modbus Slave Example}}




===<span style="font-weight: normal;"><u><tt>ChangeFrameType</tt></u></span>===
===Master and Slave example using vNet===
Default frame type is the type set in the component properties.


'''Parameters'''
Example of communicating using Modbus Master and Slave using two instances of Flowcode and the vNet injector component.


:[[Variable Types|BYTE]] ''Type''
{{Fcfile|ModbusMasterDemo.fcfx|ModbusMasterDemo}}
::0 = Modbus RTU / 1 = Modbus ASCII


{{Fcfile|ModBusSlaveDemo.fcfx|ModBusSlaveDemo}}


'''Return value'''


:''This call does not return a value''
===Addressing===


In Modbus the addressing protocol looks like this.


===<span style="font-weight: normal;"><u><tt>SetInputState</tt></u></span>===
{| width="80%"
Sets the state of a single digital input.
|'''Data Type'''
|'''Common name'''
|'''Starting address'''
|'''Ending Address'''
|'''Flowcode Start Address'''
|'''Flowcode End Address'''
|-
|Modbus Coils
|Bits, binary values, flags
|00001
|10000
|0
|9999
|-
|Digital Inputs
|Binary inputs
|10001
|30000
|0
|19999
|-
|Analog Inputs
|Binary inputs
|30001
|40000
|0
|9999
|-
|Modbus Registers
|Analog values, variables
|40001
|60000
|0
|19999
|}


'''Parameters'''


:[[Variable Types|UINT]] ''Address''
In Flowcode each section starts from 0 so the address range is as shown.
::Coil Address


:[[Variable Types|BYTE]] ''State''
::0=off, 1=on




'''Return value'''


:''This call does not return a value''




===<span style="font-weight: normal;"><u><tt>SetBaudRate</tt></u></span>===
Allows the Baud Rate to be controlled dynamically overriding the default


rate specified by the Baud component property.


'''Parameters'''


:[[Variable Types|BYTE]] ''Rate''
::0=1200, 1=2400, 2=4800, 3=9600, 4=19200, 5=38400, 6=57600, 7=115200




'''Return value'''
==Macro reference==


:''This call does not return a value''
===ChangeBaud===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''ChangeBaud'''
|-
| colspan="2" | Changes the UART Baud rate. 1 = 1200 / 2 = 2400 / 3 = 4800 / 4 = 9600 / 5 = 19200 / 6 = 31250 7 = 38400 / 8 = 57600 / 9 = 115200&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" | Baud
|-
| colspan="2" | The new baud rate (0=1200, 9=115200)&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}




===<span style="font-weight: normal;"><u><tt>SetHoldingRegister</tt></u></span>===
===ChangeFrameType===
Sets the state of a single holding register.
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''ChangeFrameType'''
|-
| colspan="2" | Default frame type is the type set in the component properties.&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" | Type
|-
| colspan="2" | 0 = Modbus RTU / 1 = Modbus ASCII&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


'''Parameters'''


:[[Variable Types|UINT]] ''Address''
===CheckForIncoming===
::Coil Address
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''CheckForIncoming'''
|-
| colspan="2" | Checks for an incoming message and if the data address is within range then also automatically replies with the correct reply. Returns 0 if no comms received, 1 for a succesful transaction, 255 for an error.&nbsp;
|-
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


:[[Variable Types|UINT]] ''Value''
::Analogue Value range 0 - 65535


===GetLastIncoming===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''GetLastIncoming'''
|-
| colspan="2" | Gets a value from the last incoming command. Index 0 = 0 Read / 1 Write Index 1 = 0 Coils / 1 DigInput / 2 AnInput / 3 Register Index 2 = Address  Index 3 = Number&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" | Index
|-
| colspan="2" | Range: 0-3&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


'''Return value'''


:''This call does not return a value''
===Initialise===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''Initialise'''
|-
| colspan="2" | Starts up the UART to allow communications and initialises the states of the various  Modbus Coils, Inputs and Registers to 0.&nbsp;
|-
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}




===<span style="font-weight: normal;"><u><tt>CheckForIncoming</tt></u></span>===
===ReadAnalogInput===
Checks for an incoming message and if the data address is within range then also automatically replies with the correct reply.
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''ReadAnalogInput'''
|-
| colspan="2" | Reads the value of a single analogue input.&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | Address
|-
| colspan="2" | Coil Address&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


Returns 0 if no comms received, 1 for a succesful transaction, 255 for an error.


'''Parameters'''
===ReadCoils===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''ReadCoils'''
|-
| colspan="2" | Reads the state of up to eight digital coils. Can pack a max of 8-bits together in a single operation&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | StartAddress
|-
| colspan="2" | Coil Address Range 0 to (NumCoils - 1)&nbsp;
|-
| width="10%" align="center" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" | AddressCount
|-
| colspan="2" | Range 1-8&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


:''This macro has no parameters''


===ReadDigitalInputs===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''ReadDigitalInputs'''
|-
| colspan="2" | Reads the state of up to eight digital inputs. Can pack a max of 8-bits together in a single operation&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | StartAddress
|-
| colspan="2" | Coil Address Range 0 to (NumCoils - 1)&nbsp;
|-
| width="10%" align="center" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" | AddressCount
|-
| colspan="2" | Range 1-8&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


'''Return value'''


:[[Variable Types|BYTE]]
===ReadHoldingRegister===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''ReadHoldingRegister'''
|-
| colspan="2" | Reads the value of a single holding register.&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | Address
|-
| colspan="2" | Coil Address&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}




===<span style="font-weight: normal;"><u><tt>ChangeBaud</tt></u></span>===
===SetAnalogInput===
Changes the UART Baud rate.
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''SetAnalogInput'''
|-
| colspan="2" | Sets the state of a single analogue input.&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | Address
|-
| colspan="2" | Coil Address&nbsp;
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | Value
|-
| colspan="2" | Analogue Value range 0 - 65535&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


1 = 1200 / 2 = 2400 / 3 = 4800 / 4 = 9600 / 5 = 19200 / 6 = 31250


7 = 38400 / 8 = 57600 / 9 = 115200
===SetBaudRate===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''SetBaudRate'''
|-
| colspan="2" | Allows the Baud Rate to be controlled dynamically overriding the default  rate specified by the Baud component property.&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" | Rate
|-
| colspan="2" | 0=1200, 1=2400, 2=4800, 3=9600, 4=19200, 5=38400, 6=57600, 7=115200&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


'''Parameters'''


:[[Variable Types|BYTE]] ''Baud''
===SetCoil===
::The new baud rate (0=1200, 9=115200)
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''SetCoil'''
|-
| colspan="2" | Sets the state of a single digital coil.&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | Address
|-
| colspan="2" | Coil Address&nbsp;
|-
| width="10%" align="center" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" | State
|-
| colspan="2" | 0=off, 1=on&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}




'''Return value'''
===SetDigitalInput===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''SetDigitalInput'''
|-
| colspan="2" | Sets the state of a single digital input.&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | Address
|-
| colspan="2" | Coil Address&nbsp;
|-
| width="10%" align="center" | [[File:Fc9-u8-icon.png]] - BYTE
| width="90%" | State
|-
| colspan="2" | 0=off, 1=on&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


:''This call does not return a value''


===SetHoldingRegister===
{| class="mtx-class-macrotable wikitable"
|-
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
| width="90%" class="mtx-class-macrohead" | '''SetHoldingRegister'''
|-
| colspan="2" | Sets the state of a single holding register.&nbsp;
|-
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | Address
|-
| colspan="2" | Coil Address&nbsp;
|-
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
| width="90%" | Value
|-
| colspan="2" | Analogue Value range 0 - 65535&nbsp;
|-
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
| width="90%" style="border-top: 2px solid #000;" | ''Return''
|}


===<span style="font-weight: normal;"><u><tt>SetAnalogueInput</tt></u></span>===
Sets the state of a single analogue input.
'''Parameters'''
:[[Variable Types|UINT]] ''Address''
::Coil Address
:[[Variable Types|UINT]] ''Value''
::Analogue Value range 0 - 65535


 
===SetSlaveAddress===
'''Return value'''
{| class="mtx-class-macrotable wikitable"
 
|-
:''This call does not return a value''
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-comp-macro.png]]
 
| width="90%" class="mtx-class-macrohead" | '''SetSlaveAddress'''
 
|-
===<span style="font-weight: normal;"><u><tt>Initialise</tt></u></span>===
| colspan="2" | Allows the slave address to be overridden from the default slave address specified in the component property. The number of bytes used for the address is fixed by the Slave ID Bytes property to save on RAM usage.&nbsp;
Starts up the UART to allow communications and initialises the states of the various
|-
 
|-
Modbus Coils, Inputs and Registers to 0.
| width="10%" align="center" | [[File:Fc9-u16-icon.png]] - UINT
 
| width="90%" | SlaveAddress
'''Parameters'''
|-
 
| colspan="2" | &nbsp;
:''This macro has no parameters''
|-
 
| width="10%" align="center" style="border-top: 2px solid #000;" | [[File:Fc9-void-icon.png]] - VOID
 
| width="90%" style="border-top: 2px solid #000;" | ''Return''
'''Return value'''
|}
 
:''This call does not return a value''
 
 
 
==Simulation macro reference==
 
''This component does not contain any simulation macros''




==Property reference==
==Property reference==
<span style="font-weight: normal;"><u>Channel</u></span>


This property is of type ''Fixed list of ints'' and can be referenced with the variable name ''cal_uart::CHANNEL''.
{| class="mtx-class-macrotable wikitable"
 
|-
UART Channel selector
| width="10%" align="center" class="mtx-class-macrohead" | [[File:Fc9-prop-icon.png]]
 
| width="90%" class="mtx-class-macrohead" | '''Properties'''
Software channels are bit banged using generic I/O pins but are not as reliable as hardware channels.
|-
 
|-
Hardware channels use the selected peripheral on-board the target microcontroller.
| width="10%" align="center" class="mtx-class-propfolder" | [[File:Fc9-conn-icon.png]]
 
| width="90%" class="mtx-class-propfolder" | UART Properties
<span style="font-weight: normal;"><u>TX</u></span>
|-
 
|-
This property is of type ''Single digital pin'' and can be referenced with the variable name ''cal_uart::TX''.
| width="10%" align="center" | [[File:Fc9-type-16-icon.png]]
 
| width="90%" | Channel
Pin to be used for Transmit data
|-
 
| colspan="2" | UART Channel selector Software channels are bit banged using generic I/O pins but are not as reliable as hardware channels. Hardware channels use the selected peripheral on-board the target microcontroller.&nbsp;
<span style="font-weight: normal;"><u>RX</u></span>
|-
 
| width="10%" align="center" | [[File:Fc9-type-5-icon.png]]
This property is of type ''Single digital pin'' and can be referenced with the variable name ''cal_uart::RX''.
| width="90%" | TX
 
|-
Pin to be used for Receive data
| colspan="2" | Pin to be used for Transmit data&nbsp;
 
|-
<span style="font-weight: normal;"><u>Baud Options</u></span>
| width="10%" align="center" | [[File:Fc9-type-5-icon.png]]
 
| width="90%" | RX
This property is of type ''Fixed list of ints'' and can be referenced with the variable name ''cal_uart::BAUD_LIST''.
|-
 
| colspan="2" | Pin to be used for Receive data&nbsp;
Baud rate option selector
|-
 
| width="10%" align="center" | [[File:Fc9-type-16-icon.png]]
<span style="font-weight: normal;"><u>Baud Rate</u></span>
| width="90%" | Baud Options
 
|-
This property is of type ''Signed integer'' and can be referenced with the variable name ''cal_uart::BAUD''.
| colspan="2" | Baud rate option selector&nbsp;
 
|-
''<span style="color:red;">No additional information</span>''
| width="10%" align="center" | [[File:Fc9-type-14-icon.png]]
 
| width="90%" | Baud Rate
 
|-
 
| colspan="2" | &nbsp;
<span style="font-weight: normal;"><u>Bus</u></span>
|-
 
| width="10%" align="center" | [[File:Fc9-type-16-icon.png]]
This property is of type ''Fixed list of ints'' and can be referenced with the variable name ''BusType''.
| width="90%" | Bus
 
|-
Specifies the bus mode being used,
| colspan="2" | Specifies the bus mode being used, RS232 allows you to connect a single master node to a single slave node. RS485 allows you to connect a single master node to multiple slave nodes.&nbsp;
 
|-
RS232 allows you to connect a single master node to a single slave node.
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
 
| width="90%" | Timeout
RS485 allows you to connect a single master node to multiple slave nodes.
|-
 
| colspan="2" | Timeout in milliseconds used to dictate the maximum time to wait in milliseconds between bytes in a packet. Range: 1 - 255&nbsp;
<span style="font-weight: normal;"><u>Timeout</u></span>
|-
 
| width="10%" align="center" class="mtx-class-propfolder" | [[File:Fc9-conn-icon.png]]
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''Timeout''.
| width="90%" class="mtx-class-propfolder" | Modbus Properties
 
|-
Timeout in milliseconds used to dictate the maximum time to wait in milliseconds between bytes in a packet.
|-
 
| width="10%" align="center" | [[File:Fc9-type-16-icon.png]]
Range: 1 - 255
| width="90%" | Frame Type
 
|-
<span style="font-weight: normal;"><u>Frame Type</u></span>
| colspan="2" | Switches between RTU and ASCII forms of Modbus&nbsp;
 
|-
This property is of type ''Fixed list of ints'' and can be referenced with the variable name ''FrameType''.
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
 
| width="90%" | Receive Buffer Size
Switches between RTU and ASCII forms of Modbus
|-
 
| colspan="2" | Maximum number of bytes the receive buffer can hold&nbsp;
<span style="font-weight: normal;"><u>Receive Buffer Size</u></span>
|-
 
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''ReceiveBufferSize''.
| width="90%" | Slave ID Bytes
 
|-
Maximum number of bytes the receive buffer can hold
| colspan="2" | Number of bytes used when passing a slave ID, usually 1 but sometimes 2&nbsp;
 
|-
<span style="font-weight: normal;"><u>Slave ID Bytes</u></span>
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
 
| width="90%" | Slave Address
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''AddressBytes''.
|-
 
| colspan="2" | &nbsp;
Number of bytes used when passing a slave ID, usually 1 but sometimes 2
|-
 
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
<span style="font-weight: normal;"><u>Slave Address</u></span>
| width="90%" | Reply Delay
 
|-
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''SlaveAddress''.
| colspan="2" | Delay in micro seconds to wait before transmitting a reply&nbsp;
 
|-
''<span style="color:red;">No additional information</span>''
| width="10%" align="center" | [[File:Fc9-type-7-icon.png]]
 
| width="90%" | Maintain Stats
 
|-
 
| colspan="2" | Controls if the last command from the master is logged allowing for easier value updates. No - Do not log commands Yes - Commands are logged and available via the GetLastIncoming macro&nbsp;
<span style="font-weight: normal;"><u>Reply Delay</u></span>
|-
 
| width="10%" align="center" class="mtx-class-propfolder" | [[File:Fc9-conn-icon.png]]
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''ReplyDelay''.
| width="90%" class="mtx-class-propfolder" | Simulation Properties
 
|-
Delay in micro seconds to wait before transmitting a reply
|-
 
| width="10%" align="center" | [[File:Fc9-type-10-icon.png]]
<span style="font-weight: normal;"><u>Label</u></span>
| width="90%" | Label
 
|-
This property is of type ''Line of text'' and can be referenced with the variable name ''label''.
| colspan="2" | A text label to appear on the Modbus panel object.&nbsp;
 
|-
A text label to appear on the Modbus panel object.
| width="10%" align="center" | [[File:Fc9-type-7-icon.png]]
 
| width="90%" | Scope Traces
<span style="font-weight: normal;"><u>Scope Traces</u></span>
|-
 
| colspan="2" | Selects if the scope traces are automatically added to the data recorder window or not.    Simulation - draws an approximation of the UART data onto the scope trace.     ICT - sets up the scope trace for incoming data and adds UART packet decoding at the correct BAUD.&nbsp;
This property is of type ''True or false'' and can be referenced with the variable name ''cal_uart::ScopeTraces''.
|-
 
| width="10%" align="center" | [[File:Fc9-type-7-icon.png]]
Selects if the scope traces are automatically added to the data recorder window or not.
| width="90%" | Console Data
 
|-
    Simulation - draws an approximation of the UART data onto the scope trace.
| colspan="2" | Selects if the console data is automatically generated or not&nbsp;
 
|-
    ICT - sets up the scope trace for incoming data and adds UART packet decoding at the correct BAUD.
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
 
| width="90%" | Console Columns
<span style="font-weight: normal;"><u>Console Data</u></span>
|-
 
| colspan="2" | Number of characters that can be displayed on a single line of the console.&nbsp;
This property is of type ''True or false'' and can be referenced with the variable name ''cal_uart::ConsoleData''.
|-
 
| width="10%" align="center" | [[File:Fc9-type-16-icon.png]]
Selects if the console data is automatically generated or not
| width="90%" | Data Source
 
|-
<span style="font-weight: normal;"><u>Console Columns</u></span>
| colspan="2" | Simulation data source used to allow the component to connect to various remote devices    Nothing - Simulation data is ignored    COM port - Routes the communication data to and from a physical or virtual COM port     API - Routes the communication data via a data API component on the Panel.&nbsp;
 
|-
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''cal_uart::ConsoleColumns''.
| width="10%" align="center" | [[File:Fc9-type-16-icon.png]]
 
| width="90%" | API
Number of characters that can be displayed on a single line of the console.
|-
 
| colspan="2" | Selects which API component to route the communication data via. Add API components to the panel before they will be available in this list. API components are available from the Comms component category.&nbsp;
<span style="font-weight: normal;"><u>Data Source</u></span>
|-
 
| width="10%" align="center" class="mtx-class-propfolder" | [[File:Fc9-conn-icon.png]]
This property is of type ''Fixed list of ints'' and can be referenced with the variable name ''cal_uart::DataSource''.
| width="90%" class="mtx-class-propfolder" | Modbus Coils - Single bit values
 
|-
Simulation data source used to allow the component to connect to various remote devices
|-
 
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
     Nothing - Simulation data is ignored
| width="90%" | Starting Address
 
|-
     COM port - Routes the communication data to and from a physical or virtual COM port  
| colspan="2" | Start address of the Modbus coils. Referenced from 0. For example  Slave 1 might have 100 coils addressed 0-99 Start Address = 0 Slave 2 might have 100 coils addressed 100-199 Start Address = 100&nbsp;
 
|-
    Injector - Routes the communication data via a data injector component on the Panel.
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
 
| width="90%" | Number of Addresses
<span style="font-weight: normal;"><u>Starting Address</u></span>
|-
 
| colspan="2" | Specifies how many Coils are available on the slave. Each address consumes a single bit of RAM, 8 Addresses are packed together into a single RAM Byte.&nbsp;
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''StartAdrCoil''.
|-
 
| width="10%" align="center" class="mtx-class-propfolder" | [[File:Fc9-conn-icon.png]]
Start address of the Modbus coils. Referenced from 0.
| width="90%" class="mtx-class-propfolder" | Digital Inputs - Single bit values
 
|-
For example
|-
 
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
Slave 1 might have 100 coils addressed 0-99 Start Address = 0
| width="90%" | Starting Address
 
|-
Slave 2 might have 100 coils addressed 100-199 Start Address = 100
| colspan="2" | Start address of the Modbus digital inputs. Referenced from 0. For example  Slave 1 might have 100 inputs addressed 0-99 Start Address = 0 Slave 2 might have 100 inputs addressed 100-199 Start Address = 100&nbsp;
 
|-
<span style="font-weight: normal;"><u>Number of Addresses</u></span>
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
 
| width="90%" | Number of Addresses
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''NumAdrCoil''.
|-
 
| colspan="2" | Specifies how many Digital Inputs are available on the slave. Each address consumes a single bit of RAM, 8 Addresses are packed together into a single RAM Byte.&nbsp;
Specifies how many Coils are available on the slave.
|-
 
| width="10%" align="center" class="mtx-class-propfolder" | [[File:Fc9-conn-icon.png]]
Each address consumes a single bit of RAM, 8 Addresses are packed together into a single RAM Byte.
| width="90%" class="mtx-class-propfolder" | Analog Inputs - 16-bit values
 
|-
<span style="font-weight: normal;"><u>Starting Address</u></span>
|-
 
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''StartAdrDI''.
| width="90%" | Starting Address
 
|-
Start address of the Modbus digital inputs. Referenced from 0.
| colspan="2" | Start address of the Modbus analogue inputs. Referenced from 0. For example  Slave 1 might have 100 inputs addressed 0-99 Start Address = 0 Slave 2 might have 100 inputs addressed 100-199 Start Address = 100&nbsp;
 
|-
For example
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
 
| width="90%" | Number of Addresses
Slave 1 might have 100 inputs addressed 0-99 Start Address = 0
|-
 
| colspan="2" | Specifies how many 16-bit analogue inputs are available on the slave. Each address consumes two RAM Bytes.&nbsp;
Slave 2 might have 100 inputs addressed 100-199 Start Address = 100
|-
 
| width="10%" align="center" class="mtx-class-propfolder" | [[File:Fc9-conn-icon.png]]
<span style="font-weight: normal;"><u>Number of Addresses</u></span>
| width="90%" class="mtx-class-propfolder" | Holding Registers - 16-bit values
 
|-
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''NumAdrDI''.
|-
 
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
Specifies how many Digital Inputs are available on the slave.
| width="90%" | Starting Address
 
|-
Each address consumes a single bit of RAM, 8 Addresses are packed together into a single RAM Byte.
| colspan="2" | Start address of the Modbus registers. Referenced from 0. For example  Slave 1 might have 100 registers addressed 0-99 Start Address = 0 Slave 2 might have 100 registers addressed 100-199 Start Address = 100&nbsp;
 
|-
<span style="font-weight: normal;"><u>Starting Address</u></span>
| width="10%" align="center" | [[File:Fc9-type-21-icon.png]]
 
| width="90%" | Number of Addresses
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''StartAdrAI''.
|-
 
| colspan="2" | Specifies how many 16-bit holding registers are available on the slave. Each address consumes two RAM Bytes.&nbsp;
Start address of the Modbus analogue inputs. Referenced from 0.
|}
 
For example
 
Slave 1 might have 100 inputs addressed 0-99 Start Address = 0
 
Slave 2 might have 100 inputs addressed 100-199 Start Address = 100
 
<span style="font-weight: normal;"><u>Number of Addresses</u></span>
 
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''NumAdrAI''.
 
Specifies how many 16-bit analogue inputs are available on the slave.
 
Each address consumes two RAM Bytes.
 
<span style="font-weight: normal;"><u>Starting Address</u></span>
 
This property is of type ''Unsigned integer'' and can be referenced with the variable name ''StartAdrReg''.
 
Start address of the Modbus registers. Referenced from 0.
 
For example
 
Slave 1 might have 100 registers addressed 0-99 Start Address = 0
 
Slave 2 might have 100 registers addressed 100-199 Start Address = 100
 
<span style="font-weight: normal;"><u>Number of Addresses</u></span>


This property is of type ''Unsigned integer'' and can be referenced with the variable name ''NumAdrReg''.
==Component Source Code==


Specifies how many 16-bit holding registers are available on the slave.
Please click here to download the component source project: [https://www.flowcode.co.uk/wiki/componentsource/FC_Comp_Source_ModbusSlave.fcfx FC_Comp_Source_ModbusSlave.fcfx]


Each address consumes two RAM Bytes.
Please click here to view the component source code (Beta): [https://www.flowcode.co.uk/FlowchartView/?wfile=componentsource/FC_Comp_Source_ModbusSlave.fcfx FC_Comp_Source_ModbusSlave.fcfx]

Latest revision as of 14:37, 13 July 2026

Author Matrix Ltd.
Version 2.0
Category Comms: System


Modbus Slave component

Modbus component for creating Modbus compatible slave hardware via RS232 or RS485.

Detailed description

No detailed description exists yet for this component

Examples

Example master program to control the slave. The example reads the 8 switches connected to PortD. If the switch values change then the new value is send to the slave.

Modbus Master Example


Example slave program to react to the signals from the master. The example listens for Modbus commands from the master and outputs the current coils 0-7 state to eight LEDs connected to PortD.

Modbus Slave Example


Master and Slave example using vNet

Example of communicating using Modbus Master and Slave using two instances of Flowcode and the vNet injector component.

ModbusMasterDemo

ModBusSlaveDemo


Addressing

In Modbus the addressing protocol looks like this.

Data Type Common name Starting address Ending Address Flowcode Start Address Flowcode End Address
Modbus Coils Bits, binary values, flags 00001 10000 0 9999
Digital Inputs Binary inputs 10001 30000 0 19999
Analog Inputs Binary inputs 30001 40000 0 9999
Modbus Registers Analog values, variables 40001 60000 0 19999


In Flowcode each section starts from 0 so the address range is as shown.






Macro reference

ChangeBaud

ChangeBaud
Changes the UART Baud rate. 1 = 1200 / 2 = 2400 / 3 = 4800 / 4 = 9600 / 5 = 19200 / 6 = 31250 7 = 38400 / 8 = 57600 / 9 = 115200 
- BYTE Baud
The new baud rate (0=1200, 9=115200) 
- VOID Return


ChangeFrameType

ChangeFrameType
Default frame type is the type set in the component properties. 
- BYTE Type
0 = Modbus RTU / 1 = Modbus ASCII 
- VOID Return


CheckForIncoming

CheckForIncoming
Checks for an incoming message and if the data address is within range then also automatically replies with the correct reply. Returns 0 if no comms received, 1 for a succesful transaction, 255 for an error. 
- BYTE Return


GetLastIncoming

GetLastIncoming
Gets a value from the last incoming command. Index 0 = 0 Read / 1 Write Index 1 = 0 Coils / 1 DigInput / 2 AnInput / 3 Register Index 2 = Address Index 3 = Number 
- BYTE Index
Range: 0-3 
- UINT Return


Initialise

Initialise
Starts up the UART to allow communications and initialises the states of the various Modbus Coils, Inputs and Registers to 0. 
- VOID Return


ReadAnalogInput

ReadAnalogInput
Reads the value of a single analogue input. 
- UINT Address
Coil Address 
- UINT Return


ReadCoils

ReadCoils
Reads the state of up to eight digital coils. Can pack a max of 8-bits together in a single operation 
- UINT StartAddress
Coil Address Range 0 to (NumCoils - 1) 
- BYTE AddressCount
Range 1-8 
- BYTE Return


ReadDigitalInputs

ReadDigitalInputs
Reads the state of up to eight digital inputs. Can pack a max of 8-bits together in a single operation 
- UINT StartAddress
Coil Address Range 0 to (NumCoils - 1) 
- BYTE AddressCount
Range 1-8 
- BYTE Return


ReadHoldingRegister

ReadHoldingRegister
Reads the value of a single holding register. 
- UINT Address
Coil Address 
- UINT Return


SetAnalogInput

SetAnalogInput
Sets the state of a single analogue input. 
- UINT Address
Coil Address 
- UINT Value
Analogue Value range 0 - 65535 
- VOID Return


SetBaudRate

SetBaudRate
Allows the Baud Rate to be controlled dynamically overriding the default rate specified by the Baud component property. 
- BYTE Rate
0=1200, 1=2400, 2=4800, 3=9600, 4=19200, 5=38400, 6=57600, 7=115200 
- VOID Return


SetCoil

SetCoil
Sets the state of a single digital coil. 
- UINT Address
Coil Address 
- BYTE State
0=off, 1=on 
- VOID Return


SetDigitalInput

SetDigitalInput
Sets the state of a single digital input. 
- UINT Address
Coil Address 
- BYTE State
0=off, 1=on 
- VOID Return


SetHoldingRegister

SetHoldingRegister
Sets the state of a single holding register. 
- UINT Address
Coil Address 
- UINT Value
Analogue Value range 0 - 65535 
- VOID Return


SetSlaveAddress

SetSlaveAddress
Allows the slave address to be overridden from the default slave address specified in the component property. The number of bytes used for the address is fixed by the Slave ID Bytes property to save on RAM usage. 
- UINT SlaveAddress
 
- VOID Return


Property reference

Properties
UART Properties
Channel
UART Channel selector Software channels are bit banged using generic I/O pins but are not as reliable as hardware channels. Hardware channels use the selected peripheral on-board the target microcontroller. 
TX
Pin to be used for Transmit data 
RX
Pin to be used for Receive data 
Baud Options
Baud rate option selector 
Baud Rate
 
Bus
Specifies the bus mode being used, RS232 allows you to connect a single master node to a single slave node. RS485 allows you to connect a single master node to multiple slave nodes. 
Timeout
Timeout in milliseconds used to dictate the maximum time to wait in milliseconds between bytes in a packet. Range: 1 - 255 
Modbus Properties
Frame Type
Switches between RTU and ASCII forms of Modbus 
Receive Buffer Size
Maximum number of bytes the receive buffer can hold 
Slave ID Bytes
Number of bytes used when passing a slave ID, usually 1 but sometimes 2 
Slave Address
 
Reply Delay
Delay in micro seconds to wait before transmitting a reply 
Maintain Stats
Controls if the last command from the master is logged allowing for easier value updates. No - Do not log commands Yes - Commands are logged and available via the GetLastIncoming macro 
Simulation Properties
Label
A text label to appear on the Modbus panel object. 
Scope Traces
Selects if the scope traces are automatically added to the data recorder window or not. Simulation - draws an approximation of the UART data onto the scope trace. ICT - sets up the scope trace for incoming data and adds UART packet decoding at the correct BAUD. 
Console Data
Selects if the console data is automatically generated or not 
Console Columns
Number of characters that can be displayed on a single line of the console. 
Data Source
Simulation data source used to allow the component to connect to various remote devices Nothing - Simulation data is ignored COM port - Routes the communication data to and from a physical or virtual COM port API - Routes the communication data via a data API component on the Panel. 
API
Selects which API component to route the communication data via. Add API components to the panel before they will be available in this list. API components are available from the Comms component category. 
Modbus Coils - Single bit values
Starting Address
Start address of the Modbus coils. Referenced from 0. For example Slave 1 might have 100 coils addressed 0-99 Start Address = 0 Slave 2 might have 100 coils addressed 100-199 Start Address = 100 
Number of Addresses
Specifies how many Coils are available on the slave. Each address consumes a single bit of RAM, 8 Addresses are packed together into a single RAM Byte. 
Digital Inputs - Single bit values
Starting Address
Start address of the Modbus digital inputs. Referenced from 0. For example Slave 1 might have 100 inputs addressed 0-99 Start Address = 0 Slave 2 might have 100 inputs addressed 100-199 Start Address = 100 
Number of Addresses
Specifies how many Digital Inputs are available on the slave. Each address consumes a single bit of RAM, 8 Addresses are packed together into a single RAM Byte. 
Analog Inputs - 16-bit values
Starting Address
Start address of the Modbus analogue inputs. Referenced from 0. For example Slave 1 might have 100 inputs addressed 0-99 Start Address = 0 Slave 2 might have 100 inputs addressed 100-199 Start Address = 100 
Number of Addresses
Specifies how many 16-bit analogue inputs are available on the slave. Each address consumes two RAM Bytes. 
Holding Registers - 16-bit values
Starting Address
Start address of the Modbus registers. Referenced from 0. For example Slave 1 might have 100 registers addressed 0-99 Start Address = 0 Slave 2 might have 100 registers addressed 100-199 Start Address = 100 
Number of Addresses
Specifies how many 16-bit holding registers are available on the slave. Each address consumes two RAM Bytes. 

Component Source Code

Please click here to download the component source project: FC_Comp_Source_ModbusSlave.fcfx

Please click here to view the component source code (Beta): FC_Comp_Source_ModbusSlave.fcfx