1. Einführung

MB2HAL ist eine generische nicht-Echtzeit HAL-Komponente zur Kommunikation mit einem oder mehreren Modbus-Geräten. Bislang gibt es zwei Möglichkeiten, mit einem Modbus-Gerät zu kommunizieren:

  1. Eine Möglichkeit besteht darin, eine HAL-Komponente als Treiber zu erstellen, siehe VFD Modbus.

  2. Eine andere Möglichkeit ist die Verwendung von Classic Ladder, das Modbus eingebaut hat, siehe <cha:classicladder,ClassicLadder >>.

  3. Jetzt gibt es eine dritte Option, die aus einem "generischen" Treiber besteht, der per Textdatei konfiguriert wird, dieser heißt MB2HAL.

Warum MB2HAL? Erwägen Sie den Einsatz von MB2HAL, wenn:

  • Sie einen neuen Treiber schreiben müssenund keine Ahnung haben vom Programmieren.

  • Sie müssen Classic Ladder "nur" verwenden, um die Modbus-Verbindungen zu verwalten.

  • Sie müssen zunächst die Modbus-Transaktionen ermitteln und konfigurieren. MB2HAL hat Debug-Ebenen, um das Debuggen des Low-Level-Protokolls zu erleichtern.

  • Sie haben mehr als ein Gerät zu verbinden. MB2HAL ist sehr effizient bei der Verwaltung mehrerer Geräte, Transaktionen und Verbindungen. Derzeit überwache ich zwei Achsentreiber über einen Rs232-Port, einen VFD-Treiber über einen anderen Rs232-Port und eine Remote I/O über TCP/IP.

  • Sie wollen ein Protokoll, um Ihren Arduino mit HAL zu verbinden. Sehen Sie sich die mitgelieferte Beispiel-Konfigurationsdatei, Skizze und Bibliothek für Arduino Modbus an.

2. Anwendung

  1. Erstellen Sie eine Konfigurationsdatei nach folgendem Beispiel

    1. Komponentenname festlegen (optional)

      Set HAL_MODULE_NAME=mymodule (Voreinstellung HAL_MODULE_NAME=mb2hal)

    2. Laden der Modbus-HAL-nicht-Echtzeit-Komponente

  2. Standard-Komponentenname: loadusr -W mb2hal config=config_file.ini

  3. Benutzerdefinierter Komponentenname: loadusr -Wn mymodule mb2hal config=config_file.ini

3. Optionen

3.1. Init-Abschnitt

[MB2HAL_INIT]

Wert Typ Erforderlich Beschreibung

INIT_DEBUG

Integer

Nein

Debug-Ebene der Init- und INI-Datei-Analyse.
0 = stumm
1 = Fehlermeldungen (Standard)
2 = OK-Bestätigungsmeldungen
3 = Debugging-Meldungen
4 = maximale Fehlersuchmeldungen (nur in Transaktionen)

VERSION

Zeichenfolge (engl. string)

Nein

Versionsnummer im Format N.N[NN]. Voreingestellt auf 1.0.

HAL_MODULE_NAME

Zeichenfolge (engl. string)

Nein

Name des HAL-Moduls (Komponente). Voreingestellt auf "mb2hal".

SLOWDOWN

Gleitkommazahl (engl. float)

Nein

Fügen Sie eine Verzögerung von "FLOAT Sekunden" zwischen Transaktionen ein, um eine umfangreiche Protokollierung zu vermeiden und die Fehlersuche zu erleichtern. Nützlich bei Verwendung von DEBUG=3 (NICHT INIT_DEBUG=3). Es betrifft ALLE Transaktionen. Verwenden Sie "0.0" für normale Aktivität.

TOTAL_TRANSACTIONS

Integer

Ja

Die Anzahl der gesamten Modbus-Transaktionen. Es gibt kein Maximum.

3.2. Transaktionsabschnitte

Für jede Transaktion ist ein Transaktionsabschnitt erforderlich, beginnend mit [TRANSACTION_00] und fortlaufend aufsteigend. Bei einer neuen Verknüpfung (nicht Transaktion) müssen Sie beim ersten Mal die Parameter REQUIRED angeben. Warnung: Alle nicht angegebenen OPTIONAL-Parameter werden von der vorherigen Transaktion übernommen.

Wert Typ Erforderlich Beschreibung

LINK_TYPE

Zeichenfolge (engl. string)

Ja

Sie müssen entweder einen "serial" oder "tcp" Link für die erste Transaktion angeben. Spätere Transaktionen verwenden den vorherigen Transaktionslink, wenn er nicht angegeben.

TCP_IP

IP Adresse

If LINK_TYPE=tcp

Die Modbus-Slave IP-Adresse des Geräts. Wird ignoriert, wenn LINK_TYPE=serial.

TCP_PORT

Integer

Nein

Der TCP-Port des Modbus-Slave-Geräts. Der Standardwert ist 502. Wird ignoriert, wenn LINK_TYPE=serial.

SERIAL_PORT

Zeichenfolge (engl. string)

If LINK_TYPE=serial

Die serielle Schnittstelle. Zum Beispiel "/dev/ttyS0". Wird ignoriert, wenn LINK_TYPE=tcp.

SERIAL_BAUD

Integer

If LINK_TYPE=serial

Die Baudrate. Wird ignoriert, wenn LINK_TYPE=tcp.

SERIAL_BITS

Integer

If LINK_TYPE=serial

Datenbits. Eines von 5, 6, 7, 8. Wird ignoriert, wenn LINK_TYPE=tcp.

SERIAL_PARITY

Zeichenfolge (engl. string)

If LINK_TYPE=serial

Datenparität. Eine von: gerade, ungerade, keine. Wird ignoriert, wenn LINK_TYPE=tcp.

SERIAL_STOP

Integer

If LINK_TYPE=serial

Stoppbits. Eins von 1, 2. Wird ignoriert, wenn LINK_TYPE=tcp.

SERIAL_DELAY_MS

Integer

If LINK_TYPE=serial

Verzögerung des seriellen Ports ausschließlich zwischen Transaktionen in diesem Abschnitt. In ms. Standardwert ist 0. Ignoriert wenn LINK_TYPE=tcp.

MB_SLAVE_ID

Integer

Ja

Modbus-Slave-Nummer.

FIRST_ELEMENT

Integer

Ja

Die erste Elementadresse.

NELEMENTS

Integer

Sofern nicht PIN_NAMES angegeben ist

Die Anzahl der Elemente. Es ist ein Fehler, sowohl NELEMENTS als auch PIN_NAMES` ANZUGEBEN. Die Pin-Namen werden fortlaufende Nummern sein z.B. mb2hal.plcin.01.

PIN_NAMES

Liste

Sofern nicht NELEMENTS angegeben ist

Eine Liste von Elementnamen. Diese Namen werden für die Pin-Namen verwendet, z.B. mb2hal.plcin.cycle_start.
HINWEIS: In der Liste dürfen keine Leerzeichen vorkommen. Beispiel: PIN_NAMES=cycle_start,stop,feed_hold

MB_TX_CODE

Zeichenfolge (engl. string)

Ja

Modbus Transaction Functions-Code (siehe Spezifikationen):

• fnct_01_read_coils
• fnct_02_read_discrete_inputs
• fnct_03_read_holding_registers
• fnct_04_read_input_registers
• fnct_05_write_single_coil
• fnct_06_write_single_register
• fnct_15_write_multiple_coils
• fnct_16_write_multiple_registers

MB_RESPONSE_TIMEOUT_MS

Integer

Nein

Antwort-Timeout für diese Transaktion. In ms. Der Standardwert ist 500 ms. Diese bestimmt, wie lange auf das 1. Byte gewartet werden soll, bevor ein Fehler ausgelöst wird.

MB_BYTE_TIMEOUT_MS

Integer

Nein

Byte-Timeout für diese Transaktion. In ms. Der Standardwert ist 500 ms. Dies bestimmt die Zeitspanne, die von Byte zu Byte warten gewartet wird, bevor ein Fehler ausgelöst wird.

HAL_TX_NAME

Zeichenfolge (engl. string)

Nein

Anstatt die Transaktions-Nummer anzugeben, verwenden Sie einen Namen. Beispiel: mb2hal.00.01 könnte zu mb2hal.plcin.01 werden. Der Name darf nicht länger als 28 Zeichen sein. HINWEIS: Achten Sie bei der Verwendung von Namen darauf, dass Sie nicht zwei Transaktionen mit demselben Namen erhalten.

MAX_UPDATE_RATE

Gleitkommazahl (engl. float)

Nein

Maximale Aktualisierungsrate in Hz. Standardwert ist 0.0 (0.0 = so schnell wie möglich = unendlich). HINWEIS: Dies ist eine maximale Rate, die tatsächliche Rate kann niedriger sein. Wenn Sie sie in ms berechnen wollen, verwenden Sie (1000 / required_ms). Beispiel: 100 ms = MAX_UPDATE_RATE=10.0, denn 1000,0 ms / 100,0 ms = 10,0 Hz.

DEBUG

Zeichenfolge (engl. string)

Nein

Debug-Level nur für diese Transaktion. Siehe Parameter INIT_DEBUG oben.

3.3. Fehlercodes

Beachten Sie beim Debuggen von Transaktionen, dass der zurückgegebene Wert "ret[]" entspricht:

Ausnahmen vom Modbus-Protokoll:

  • 0x01 - ILLEGAL_FUNCTION - the FUNCTION code received in the query is not allowed or invalid.

  • 0x02 - ILLEGAL_DATA_ADDRESS - the DATA ADDRESS received in the query is not an allowable address for the slave or is invalid.

  • 0x03 - ILLEGAL_DATA_VALUE - a VALUE contained in the data query field is not an allowable value or is invalid.

  • 0x04 - SLAVE_DEVICE_FAILURE - SLAVE (or MASTER) device unrecoverable FAILURE while attempting to perform the requested action.

  • 0x04 - SERVER_FAILURE - (see above).

  • 0x05 - ACKNOWLEDGE - 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.

  • 0x06 - SLAVE_DEVICE_BUSY - The slave (or server) is BUSY. Retransmit the request later.

  • 0x06 - SERVER_BUSY - (see above).

  • 0x07 - NEGATIVE_ACKNOWLEDGE - Unsuccessful programming request using function code 13 or 14.

  • 0x08 - MEMORY_PARITY_ERROR - SLAVE parity error in MEMORY.

  • 0x0A (-10) - GATEWAY_PROBLEM_PATH - Gateway path(s) not available.

  • 0x0B (-11) - GATEWAY_PROBLEM_TARGET - The target device failed to respond (generated by master, not slave).

Programm oder Verbindung:

  • 0x0C (-12) - COMM_TIME_OUT

  • 0x0D (-13) - PORT_SOCKET_FAILURE

  • 0x0E (-14) - SELECT_FAILURE

  • 0x0F (-15) - TOO_MANY_DATAS

  • 0x10 (-16) - INVALID_CRC

  • 0x11 (-17) - INVALID_EXCEPTION_CODE

4. Beispiel Konfigurationsdatei

Klicken Sie zum Herunterladen auf den Link:mb2hal_HOWTO.ini[hier].

#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.
# 4 = maximum debugging messages (only in transactions).
INIT_DEBUG=3

#OPTIONAL: Set to 1.1 to enable the new functions:
# - fnct_01_read_coils
# - fnct_05_write_single_coil
# - changed pin names (see https://linuxcnc.org/docs/2.9/html/drivers/mb2hal.html#_pins).
VERSION=1.1

#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.
#Useful 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

# ++++++++++++++++++++++++
# Transactions
# ++++++++++++++++++++++++
#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 (decimal integer).
FIRST_ELEMENT=0

#REQUIRED unless PIN_NAMES is specified: The number of elements.
#It is an error to specify both NELEMENTS and PIN_NAMES
#The pin names will be sequential numbers e.g mb2hal.plcin.01
#NELEMENTS=4

#REQUIRED unless NELEMENTS is specified: A list of element names.
#these names will be used for the pin names, e.g mb2hal.plcin.cycle_start
#NOTE: there must be no white space characters in the list
PIN_NAMES=cycle_start,stop,feed_hold

#REQUIRED: Modbus transaction function code (see www.modbus.org specifications).
#    fnct_01_read_coils               (01 = 0x01) (new in 1.1)
#    fnct_02_read_discrete_inputs     (02 = 0x02)
#    fnct_03_read_holding_registers   (03 = 0x03)
#    fnct_04_read_input_registers     (04 = 0x04)
#    fnct_05_write_single_coil        (05 = 0x05) (new in 1.1)
#    fnct_06_write_single_register    (06 = 0x06)
#    fnct_15_write_multiple_coils     (15 = 0x0F)
#    fnct_16_write_multiple_registers (16 = 0x10)
#
# Created pins:
# fnct_01_read_coils:
# fnct_02_read_discrete_inputs:
#     mb2hal.m.n.bit     (output)
#     mb2hal.m.n.bit-inv (output)
# fnct_03_read_holding_registers:
# fnct_04_read_input_registers:
#     mb2hal.m.n.float   (output)
#     mb2hal.m.n.int     (output)
# fnct_05_write_single_coil:
#     mb2hal.m.n.bit     (input)
#         NELEMENTS needs to be 1 or PIN_NAMES must contain just one name.
# fnct_06_write_single_register:
#     mb2hal.m.n.float   (input)
#     mb2hal.m.n.int     (input)
#     NELEMENTS needs to be 1 or PIN_NAMES must contain just one name.
#     Both pin values are added and limited to 65535 (UINT16_MAX). Normally use one and let the other open (read as 0).
# fnct_15_write_multiple_coils:
#     mb2hal.m.n.bit     (input)
# fnct_16_write_multiple_registers:
#     mb2hal.m.n.float   (input)
#     mb2hal.m.n.int     (input)
#     Both pin values are added and limited to 65535 (UINT16_MAX). Normally use one and let the other open (read as 0).
#
# m = HAL_TX_NAME or transaction number if not set, n = element number (NELEMENTS) or name from PIN_NAMES
# Example: mb2hal.00.01.<type> (transaction=00, second register=01 (00 is the first one))
#          mb2hal.TxName.01.<type> (HAL_TX_NAME=TxName, 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 28 characters.
#NOTE: when using names be careful that you dont end up with two transactions
#using the same name.
HAL_TX_NAME=remoteIOcfg

#OPTIONAL: Maximum update rate in HZ. Defaults to 0.0 (0.0 = as soon as available = infinite).
#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=2

#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 FAILURE while attempting 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 respond (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_01_read_coils
FIRST_ELEMENT=1024
NELEMENTS=24
HAL_TX_NAME=remoteIOin
MAX_UPDATE_RATE=0.0
DEBUG=1

[TRANSACTION_02]
MB_TX_CODE=fnct_02_read_discrete_inputs
FIRST_ELEMENT=1280
NELEMENTS=8
HAL_TX_NAME=readStatus
MAX_UPDATE_RATE=0.0

[TRANSACTION_03]
MB_TX_CODE=fnct_05_write_single_coil
FIRST_ELEMENT=100
NELEMENTS=1
HAL_TX_NAME=setEnableout
MAX_UPDATE_RATE=0.0

[TRANSACTION_04]
MB_TX_CODE=fnct_15_write_multiple_coils
FIRST_ELEMENT=150
NELEMENTS=10
HAL_TX_NAME=remoteIOout
MAX_UPDATE_RATE=0.0

[TRANSACTION_05]
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_06]
MB_TX_CODE=fnct_04_read_input_registers
FIRST_ELEMENT=12
NELEMENTS=3
HAL_TX_NAME=XDrive02
MAX_UPDATE_RATE=10.0
DEBUG=1

[TRANSACTION_07]
MB_TX_CODE=fnct_06_write_single_register
FIRST_ELEMENT=20
NELEMENTS=1
HAL_TX_NAME=XDrive03
MAX_UPDATE_RATE=0.0
DEBUG=1

[TRANSACTION_08]
MB_TX_CODE=fnct_16_write_multiple_registers
FIRST_ELEMENT=55
NELEMENTS=8
HAL_TX_NAME=XDrive04
MAX_UPDATE_RATE=10.0
DEBUG=1

5. Pins

Anmerkung

Yellow = Neu in MB2HAL 1.1 (LinuxCNC 2.9) Um diese neuen Funktionen zu nutzen, müssen Sie VERSION = 1.1 setzen.

m = Wert von HAL_TX_NAME wenn gesetzt, sonst Transaktionsnummer
n = Elementnummer (NELEMENTS) oder Name aus PIN_NAMES

Beispiel:

  • mb2hal.00.01.int (TRANSACTION_00, zweites Register)

  • mb2hal.readStatus.01.bit (HAL_TX_NAME=readStatus, erstes bit)

5.1. fnct_01_read_coils

  • mb2hal.m.n.bit bit out

  • mb2hal.m.n.bit-inv bit out

5.2. fnct_02_read_discrete_inputs

  • mb2hal.m.n.bit bit out

  • mb2hal.m.n.bit-inv bit out

5.3. fnct_03_read_holding_registers

  • mb2hal.m.n.float float out

  • mb2hal.m.n.int s32 out

5.4. fnct_04_read_input_registers

  • mb2hal.m.n.float float out

  • mb2hal.m.n.int s32 out

5.5. fnct_05_write_single_coil

  • mb2hal.m.n.bit bit in

NELEMENTS muss 1 sein oder PIN_NAMES darf nur einen Namen enthalten.

5.6. fnct_06_write_single_register

  • mb2hal.m.n.float float in

  • mb2hal.m.n.int s32 in

NELEMENTS muss 1 sein oder PIN_NAMES darf nur einen Namen enthalten. Beide Pinwerte werden addiert und auf 65535 (UINT16_MAX) begrenzt. Verwenden Sie einen und lassen Sie den anderen offen (wird als 0 gelesen).

5.7. fnct_15_write_multiple_coils

  • mb2hal.m.n.bit bit in

5.8. fnct_16_write_multiple_registers

  • mb2hal.m.n.float float in

  • mb2hal.m.n.int s32 in

Beide Pin-Werte werden addiert und auf 65535 (UINT16_MAX) begrenzt. Verwenden Sie einen und lassen Sie den anderen offen (gelesen als 0).