[Home]ModbusToHal

LinuxCNCKnowledgeBase | RecentChanges | PageIndex | Preferences | LinuxCNC.org

MB2HAL

MB2HAL is a generic userspace HAL component to communicate with one or more Modbus devices.

So far, there are two options to comunicate with a Modbus device:
1) One option is to create a HAL component as a driver (see VFD Modbus).
2) Another option is to use Classic Ladder which has Modbus built in (see ClassicLadder Ver 7.124).

Now there is a third option that consists of a "generic" driver configured by text file, this is called MB2HAL.

Why MB2HAL ?

Consider using Mb2hal if:
You have to write a new driver and you don't know anything about programming.
You need to use Classic Ladder "only" to manage the Modbus connections.
You have to discover and configure first time the Modbus transactions. Mb2hal have debug levels to facilitate the low level protocol debug.
You have more than one device to connect. Mb2hal is very efficient managing multiple devices, transactions and links. Currently i am monitoring two axis drivers using a Rs232 port, a VFD driver using another Rs232 port, and a remote I/O using TCP/IP.
You want a protocol to connect your Arduino to HAL. Look the included sample configuration file, sketch and library for Arduino Modbus.

How to install.

Introduction: so far (December 2013) mb2hal is not included in release 2.5.3, but it is in the source code of the master branch (version 2.6.0)
For this procedure i will assume you have installed version 2.5.3 from CD. We will update to version 2.6.0 using buildbot.

1) Open and read http://buildbot.linuxcnc.org/
2) Choose in the table "Master branch (development)" and your installation, example: "Lucid (32-bit only), realtime"
3) Open a console: sudo gedit /etc/apt/sources.list.d/linuxcnc-buildbot.list
4) Paste the content of the selected box, example:
deb http://buildbot.linuxcnc.org/ lucid master-rt
deb-src http://buildbot.linuxcnc.org/ lucid master-rt
5) sudo apt-get update
6) sudo apt-get install libmodbus5
7) sudo apt-get install linuxcnc (or "sudo apt-get install linuxcnc-sim")
8) Read the example config file, wich is also the help, how-to and manual of Mb2hal.
The file mb2hal_HOWTO.ini is located in http://git.linuxcnc.org/gitweb?p=linuxcnc.git;a=blob_plain;f=src/hal/user_comps/mb2hal/mb2hal_HOWTO.ini;hb=HEAD

Example config file.

 #This .INI file is also the HELP, MANUAL and HOW-TO file for mb2hal.

 #Load the modbus HAL userspace module as the examples below,
 #change to match your own HAL_MODULE_NAME and .ini file name
 #Using HAL_MODULE_NAME=mb2hal or nothing (default): loadusr -W mb2hal config=config_file.ini
 #Using HAL_MODULE_NAME=mymodule: loadusr -Wn mymodule mb2hal config=config_file.ini

 #Common section
[MB2HAL_INIT]

 #OPTIONAL: Debug level of init and INI file parsing.
 # 0 = silent.
 # 1 = error messages (default).
 # 2 = OK confirmation messages.
 # 3 = debugging messages.
INIT_DEBUG=3

 #OPTIONAL: HAL module (component) name. Defaults to "mb2hal".
HAL_MODULE_NAME=mb2hal

 #OPTIONAL: Insert a delay of "FLOAT seconds" between transactions in order
 #to not to have a lot of logging and facilitate the debugging.
 #Usefull when using DEBUG=3 (NOT INIT_DEBUG=3)
 #It affects ALL transactions.
 #Use "0.0" for normal activity.
SLOWDOWN=0.0

 #REQUIRED: The number of total Modbus transactions. There is no maximum.
TOTAL_TRANSACTIONS=9

 #One transaction section is required per transaction, starting at 00 and counting up sequentially.
 #If there is a new link (not transaction), you must provide the REQUIRED parameters 1st time.
 #Warning: Any OPTIONAL parameter not specified are copied from the previous transaction.
[TRANSACTION_00]

 #REQUIRED: You must specify either a "serial" or "tcp" link for the first transaction.
 #Later transaction will use the previous transaction link if not specified.
LINK_TYPE=tcp

 #if LINK_TYPE=tcp then REQUIRED (only 1st time): The Modbus slave device ip address.
 #if LINK_TYPE=serial then IGNORED
TCP_IP=192.168.2.10

 #if LINK_TYPE=tcp then OPTIONAL.
 #if LINK_TYPE=serial then IGNORED
 #The Modbus slave device tcp port. Defaults to 502.
TCP_PORT=502

 #if LINK_TYPE=serial then REQUIRED (only 1st time).
 #if LINK_TYPE=tcp then IGNORED
 #The serial port.
SERIAL_PORT=/dev/ttyS0

 #if LINK_TYPE=serial then REQUIRED (only 1st time).
 #if LINK_TYPE=tcp then IGNORED
 #The baud rate.
SERIAL_BAUD=115200

 #if LINK_TYPE=serial then REQUIRED (only 1st time).
 #if LINK_TYPE=tcp then IGNORED
 #Data bits. One of 5,6,7,8.
SERIAL_BITS=8

 #if LINK_TYPE=serial then REQUIRED (only 1st time).
 #if LINK_TYPE=tcp then IGNORED
 #Data parity. One of: even, odd, none.
SERIAL_PARITY=none

 #if LINK_TYPE=serial then REQUIRED (only 1st time).
 #if LINK_TYPE=tcp then IGNORED
 #Stop bits. One of 1, 2.
SERIAL_STOP=2

 #if LINK_TYPE=serial then OPTIONAL:
 #if LINK_TYPE=tcp then IGNORED
 #Serial port delay between for this transaction only.
 #In ms. Defaults to 0.
SERIAL_DELAY_MS=10

 #REQUIRED (only 1st time).
 #Modbus slave number.
MB_SLAVE_ID=1

 #REQUIRED: The first element address.
FIRST_ELEMENT=0

 #REQUIRED: The number of elements.
NELEMENTS=16

 #REQUIRED: Modbus transaction function code (see www.modbus.org specifications).
 #    fnct_02_read_discrete_inputs     (02 = 0x02)
 #    fnct_03_read_holding_registers   (03 = 0x03)
 #    fnct_04_read_input_registers     (04 = 0x04)
 #    fnct_15_write_multiple_coils     (15 = 0x0F)
 #    fnct_16_write_multiple_registers (16 = 0x10)

 #fnct_02_read_discrete_inputs: creates boolean output HAL pins.
 #fnct_03_read_holding_registers: creates a floating point output HAL pins.
 #                           also creates a u32 output HAL pins.
 #fnct_04_read_input_registers: creates a floating point output HAL pins.
 #                         also creates a u32 output HAL pins.
 #fnct_15_write_multiple_coils: creates boolean input HAL pins.
 #fnct_16_write_multiple_registers: creates a floating point input HAL pins.

 #The pins are named based on component name, transaction number and order number.
 #Example: mb2hal.00.01 (transaction=00, second register=01 (00 is the first one))

MB_TX_CODE=fnct_03_read_holding_registers

 #OPTIONAL: Response timeout for this transaction. In INTEGER ms. Defaults to 500 ms.
 #This is how much to wait for 1st byte before raise an error.
MB_RESPONSE_TIMEOUT_MS=500

 #OPTIONAL: Byte timeout for this transaction. In INTEGER ms. Defaults to 500 ms.
 #This is how much to wait from byte to byte before raise an error.
MB_BYTE_TIMEOUT_MS=500

 #OPTIONAL: Instead of giving the transaction number, use a name.
 #Example: mb2hal.00.01 could become mb2hal.plcin.01
 #The name must not exceed 32 characters.
 #NOTE: when using names be careful that you dont end up with two transactions
 #usign the same name.
HAL_TX_NAME=remoteIOcfg

 #OPTIONAL: Maximum update rate in HZ. Defaults to 0.0 (0.0 = as soon as available = infinit).
 #NOTE: This is a maximum rate and the actual rate may be lower.
 #If you want to calculate it in ms use (1000 / required_ms).
 #Example: 100 ms = MAX_UPDATE_RATE=10.0, because 1000.0 ms / 100.0 ms = 10.0 Hz
MAX_UPDATE_RATE=0.0

 #OPTIONAL: Debug level for this transaction only.
 #See INIT_DEBUG parameter above.
DEBUG=1

 #While DEBUGGING transactions note the returned "ret[]" value correspond to:
 #/* Modbus protocol exceptions */
 #ILLEGAL_FUNCTION        -0x01 the FUNCTION code received in the query is not allowed or invalid.
 #ILLEGAL_DATA_ADDRESS    -0x02 the DATA ADDRESS received in the query is not an allowable address for the slave or is invalid.
 #ILLEGAL_DATA_VALUE      -0x03 a VALUE contained in the data query field is not an allowable value or is invalid.
 #SLAVE_DEVICE_FAILURE    -0x04 SLAVE (or MASTER) device unrecoverable FAILUER while attemping to perform the requested action.
 #SERVER_FAILURE          -0x04 (see above).
 #ACKNOWLEDGE             -0x05 This response is returned to PREVENT A TIMEOUT in the master.
 #                              A long duration of time is required to process the request in the slave.
 #SLAVE_DEVICE_BUSY       -0x06 The slave (or server) is BUSY. Retrasmit the request later.
 #SERVER_BUSY             -0x06 (see above).
 #NEGATIVE_ACKNOWLEDGE    -0x07 Unsuccessful programming request using function code 13 or 14.
 #MEMORY_PARITY_ERROR     -0x08 SLAVE parity error in MEMORY.
 #GATEWAY_PROBLEM_PATH    -0x0A (-10) Gateway path(s) not available.
 #GATEWAY_PROBLEM_TARGET  -0x0B (-11) The target device failed to repond (generated by master, not slave).
 #/* Program or connection */
 #COMM_TIME_OUT           -0x0C (-12)
 #PORT_SOCKET_FAILURE     -0x0D (-13)
 #SELECT_FAILURE          -0x0E (-14)
 #TOO_MANY_DATAS          -0x0F (-15)
 #INVALID_CRC             -0x10 (-16)
 #INVALID_EXCEPTION_CODE  -0x11 (-17)

[TRANSACTION_01]
MB_TX_CODE=fnct_02_read_discrete_inputs
FIRST_ELEMENT=1024
NELEMENTS=24
HAL_TX_NAME=remoteIOin
MAX_UPDATE_RATE=0.0
DEBUG=1

[TRANSACTION_02]
MB_TX_CODE=fnct_15_write_multiple_coils
FIRST_ELEMENT=1280
NELEMENTS=8
HAL_TX_NAME=remoteIOout
MAX_UPDATE_RATE=0.0

[TRANSACTION_03]
LINK_TYPE=serial
SERIAL_PORT=/dev/ttyS0
SERIAL_BAUD=115200
SERIAL_BITS=8
SERIAL_PARITY=none
SERIAL_STOP=2
SERIAL_DELAY_MS=50
MB_SLAVE_ID=1
MB_TX_CODE=fnct_03_read_holding_registers
FIRST_ELEMENT=1
NELEMENTS=2
HAL_TX_NAME=XDrive01
MAX_UPDATE_RATE=0.0
DEBUG=1

[TRANSACTION_04]
MB_TX_CODE=fnct_03_read_holding_registers
FIRST_ELEMENT=4
NELEMENTS=3
HAL_TX_NAME=XDrive02
MAX_UPDATE_RATE=0.0
DEBUG=1

[TRANSACTION_05]
MB_TX_CODE=fnct_03_read_holding_registers
FIRST_ELEMENT=9
NELEMENTS=1
HAL_TX_NAME=XDrive03
MAX_UPDATE_RATE=0.0

[TRANSACTION_06]
MB_TX_CODE=fnct_03_read_holding_registers
FIRST_ELEMENT=1024
NELEMENTS=1
HAL_TX_NAME=XDrive04
MAX_UPDATE_RATE=0.0

[TRANSACTION_07]
MB_TX_CODE=fnct_03_read_holding_registers
FIRST_ELEMENT=1030
NELEMENTS=2
HAL_TX_NAME=XDrive05
MAX_UPDATE_RATE=0.0

[TRANSACTION_08]
MB_TX_CODE=fnct_03_read_holding_registers
FIRST_ELEMENT=1033
NELEMENTS=1
HAL_TX_NAME=XDrive06
MAX_UPDATE_RATE=0.0

Author

Victor Rocco at http://www.metalurgicavictor.com.ar
Adapted from Les Newell's modbuscomms.c which is
Copyright (C) 2009-2012 Les Newell <les@sheetcam.com>
Copyright (C) 2012 Victor Rocco <victor_rocco AT hotmail DOT com>

VNR 2013-12-12.


LinuxCNCKnowledgeBase | RecentChanges | PageIndex | Preferences | LinuxCNC.org
This page is read-only. Follow the BasicSteps to edit pages. | View other revisions
Last edited December 12, 2013 11:47 am by VNR (diff)
Search:
Published under a Creative Commons License