Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
passerelle VMC modbus / KNX
#29
Bon, voici un exemple d'utilisation de pymodbus en esclave (mode serveur, donc). J'ai utilisé ici le protocole Tcp, mais c'est la même chose en Udp, Rtu ou Ascii...

Côté maître, rien de compliqué :

Code :
# -*- coding: utf-8 -*-

""" master
"""

from pymodbus.client.sync import ModbusTcpClient

client = ModbusTcpClient("localhost", 5020)
client.connect()

# Read discrete inputs
print "read discrete inputs"
print client.read_discrete_inputs(0, 3, unit=0).bits
print

# Read-write coils
print "read coils"
print client.read_coils(0, 3, unit=0).bits
print "write coils [False, False, False]"
client.write_coils(0, [False, False, False], unit=0)
print "read coils"
print client.read_coils(0, 3, unit=0).bits
print

# Read input registers
print "read inputs registers"
print client.read_input_registers(0, 3, unit=0).registers
print

# Read-write holding registers
print "read holding registers"
print client.read_holding_registers(0, 3, unit=0).registers
print "write holding registers [7, 8, 9]"
client.write_registers(0, [7, 8, 9], unit=0)
print "read holding registers"
print client.read_holding_registers(0, 3, unit=0).registers

client.close()

Côté esclave, ça donne :

Code :
#!/usr/bin/env python

""" slave
"""

import thread
import time

from pymodbus.server.async import StartTcpServer
#from pymodbus.server.async import StartSerialServer

from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
#from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer


store = ModbusSlaveContext(
    di = ModbusSequentialDataBlock(1, [True, True, True]),  # discrete inputs
    co = ModbusSequentialDataBlock(1, [True, True, True]),  # coils outputs
    hr = ModbusSequentialDataBlock(1, [1, 2, 3]),           # holding registers
    ir = ModbusSequentialDataBlock(1, [11, 12, 13]))        # input registers
context = ModbusServerContext(slaves=store, single=True)

identity = ModbusDeviceIdentification()
identity.VendorName  = 'Pymodbus'
identity.ProductCode = 'PM'
identity.VendorUrl   = 'http://github.com/bashwork/pymodbus/'
identity.ProductName = 'Pymodbus Server'
identity.ModelName   = 'Pymodbus Server'
identity.MajorMinorRevision = '1.0'

def dump():
    global store
    while True:
        print
        print "d=%s" % store.store['d'].getValues(1, 3)
        print "c=%s" % store.store['c'].getValues(1, 3)
        print "h=%s" % store.store['h'].getValues(1, 3)
        print "i=%s" % store.store['i'].getValues(1, 3)
        time.sleep(3)

thread.start_new_thread(dump, ())

StartTcpServer(context, identity=identity, address=("localhost", 5020))
#StartSerialServer(context, identity=identity, port='/dev/pts/3', framer=ModbusRtuFramer)
#StartSerialServer(context, identity=identity, port='/dev/pts/3', framer=ModbusAsciiFramer)

Comme StartTcpServer() est bloquant, j'ai créé un thread qui dump régulièrement l'état des registres (tu noteras au passage le décalage du mapping d'adresse, propre au protocole modbus, mais qui peut être bypassé).

Note qu'un même serveur peut réagir en tant que plusieurs noeuds slaves. C'est bien expliqué dans le lien que j'avais posté au dessus.

Voici une autre version qui utilise un callback custom ; en gros, on surcharge la classe ModbusSequentialDataBlock (ou ModbusSparseDataBlock, si tu veux un block à trous), et on implémente notre propre méthode setValue(), laquelle sera appelée lorsque l'esclave reçoit une demande de modification. À partir de là, tu peux déclencher des choses en fonction du registre qui a été modifié.

Code :
#!/usr/bin/env python

""" slave cb
"""

import thread
import time

from pymodbus.server.async import StartTcpServer
#from pymodbus.server.async import StartSerialServer

from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
#from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer


class CallbackDataBlock(ModbusSequentialDataBlock):

    def setValues(self, address, value):
        """
        """
        super(CallbackDataBlock, self).setValues(address, value)
        print "CallbackDataBlock.setValues(): address=%s, value=%s" % (address, value)


store = ModbusSlaveContext(
    di = CallbackDataBlock(1, [True, True, True]),  # discrete inputs
    co = CallbackDataBlock(1, [True, True, True]),  # coils outputs
    hr = CallbackDataBlock(1, [1, 2, 3]),           # holding registers
    ir = CallbackDataBlock(1, [11, 12, 13]))        # input registers
context = ModbusServerContext(slaves=store, single=True)

identity = ModbusDeviceIdentification()
identity.VendorName  = 'Pymodbus'
identity.ProductCode = 'PM'
identity.VendorUrl   = 'http://github.com/bashwork/pymodbus/'
identity.ProductName = 'Pymodbus Server'
identity.ModelName   = 'Pymodbus Server'
identity.MajorMinorRevision = '1.0'

StartTcpServer(context, identity=identity, address=("localhost", 5020))
#StartSerialServer(context, identity=identity, port='/dev/pts/3', framer=ModbusRtuFramer)
#StartSerialServer(context, identity=identity, port='/dev/pts/3', framer=ModbusAsciiFramer)

Dès que j'ai un moment, je vois comment intégrer ça à un FunctionalBlock de pKNyX. Mais bon, rien de sorcier, en fait...

N'hésites pas à poser des questions si besoin.

PS : je confirme que pymodbus est vraiment très puissant, et très bien écrit. Les autres implémentations sont bien plus brouillons, et incomplètes...
Frédéric

https://pknyx.gbiloba.org (de nouveau en ligne !)
Répondre


Messages dans ce sujet
passerelle VMC modbus / KNX - par vf62 - 27/08/2014, 15:50:00
RE: passerelle modbus / KNX - par fma38 - 27/08/2014, 19:16:06
RE: passerelle modbus / KNX - par vf62 - 28/08/2014, 08:06:26
RE: passerelle modbus / KNX - par vf62 - 18/09/2014, 21:55:51
RE: passerelle modbus / KNX - par fma38 - 19/09/2014, 06:31:58
RE: passerelle modbus / KNX - par fma38 - 19/09/2014, 07:39:20
RE: passerelle modbus / KNX - par vf62 - 19/09/2014, 07:57:08
RE: passerelle modbus / KNX - par fma38 - 19/09/2014, 08:09:47
RE: passerelle modbus / KNX - par epithenium - 28/11/2014, 22:22:23
RE: passerelle modbus / KNX - par vf62 - 30/11/2014, 16:31:28
RE: passerelle modbus / KNX - par fma38 - 30/11/2014, 16:58:15
RE: passerelle modbus / KNX - par vf62 - 30/11/2014, 21:03:04
RE: passerelle modbus / KNX - par epithenium - 30/11/2014, 18:17:28
RE: passerelle modbus / KNX - par fma38 - 02/12/2014, 07:20:11
RE: passerelle modbus / KNX - par vf62 - 03/12/2014, 00:00:01
RE: passerelle modbus / KNX - par fma38 - 03/12/2014, 07:11:40
RE: passerelle modbus / KNX - par vf62 - 03/12/2014, 09:02:11
RE: passerelle modbus / KNX - par fma38 - 03/12/2014, 09:13:11
RE: passerelle modbus / KNX - par vf62 - 03/12/2014, 10:29:43
RE: passerelle modbus / KNX - par zener - 09/09/2015, 10:41:09
RE: passerelle modbus / KNX - par fma38 - 07/12/2014, 20:10:05
RE: passerelle modbus / KNX - par starjuice - 05/01/2015, 13:40:03
RE: passerelle modbus / KNX - par fma38 - 05/01/2015, 14:04:23
RE: passerelle modbus / KNX - par starjuice - 05/01/2015, 16:33:57
RE: passerelle modbus / KNX - par fma38 - 05/01/2015, 17:48:50
RE: passerelle modbus / KNX - par starjuice - 05/01/2015, 21:12:50
RE: passerelle modbus / KNX - par vf62 - 05/01/2015, 21:48:17
RE: passerelle modbus / KNX - par starjuice - 06/01/2015, 00:21:30
RE: passerelle modbus / KNX - par vf62 - 08/01/2015, 13:29:49
RE: passerelle modbus / KNX - par fma38 - 06/01/2015, 07:18:01
RE: passerelle modbus / KNX - par fma38 - 06/01/2015, 09:07:49
RE: passerelle modbus / KNX - par starjuice - 06/01/2015, 18:53:25
RE: passerelle modbus / KNX - par fma38 - 06/01/2015, 19:52:59
RE: passerelle modbus / KNX - par starjuice - 06/01/2015, 22:35:39
RE: passerelle modbus / KNX - par fma38 - 06/01/2015, 23:41:55
RE: passerelle modbus / KNX - par fma38 - 07/01/2015, 08:19:02
RE: passerelle VMC modbus / KNX - par vf62 - 09/09/2015, 11:02:20
RE: passerelle VMC modbus / KNX - par sial - 16/09/2015, 12:49:07
RE: passerelle VMC modbus / KNX - par steph - 09/09/2015, 12:52:06
RE: passerelle VMC modbus / KNX - par vf62 - 11/08/2016, 22:55:36
RE: passerelle VMC modbus / KNX - par ksin - 12/07/2017, 16:44:08
RE: passerelle VMC modbus / KNX - par sial - 12/08/2016, 13:15:56
RE: passerelle VMC modbus / KNX - par stephane27320 - 05/09/2016, 11:56:41
RE: passerelle VMC modbus / KNX - par fma38 - 05/09/2016, 12:20:05
RE: passerelle VMC modbus / KNX - par mouette44 - 05/09/2016, 12:30:30
RE: passerelle VMC modbus / KNX - par stephane27320 - 05/09/2016, 13:58:59
RE: passerelle VMC modbus / KNX - par mouette44 - 05/09/2016, 23:31:13
RE: passerelle VMC modbus / KNX - par stephane27320 - 07/09/2016, 09:55:33
RE: passerelle VMC modbus / KNX - par mouette44 - 07/09/2016, 10:31:30
RE: passerelle VMC modbus / KNX - par vf62 - 15/09/2016, 12:23:44
RE: passerelle VMC modbus / KNX - par epithenium - 28/12/2018, 17:45:37
RE: passerelle VMC modbus / KNX - par mouette44 - 15/09/2016, 13:36:37
RE: passerelle VMC modbus / KNX - par fma38 - 15/09/2016, 13:51:17
RE: passerelle VMC modbus / KNX - par mouette44 - 15/09/2016, 14:36:28
RE: passerelle VMC modbus / KNX - par fma38 - 15/09/2016, 15:04:27
RE: passerelle VMC modbus / KNX - par mouette44 - 15/09/2016, 15:11:36
RE: passerelle VMC modbus / KNX - par mouette44 - 16/09/2016, 14:01:34
RE: passerelle VMC modbus / KNX - par fma38 - 16/09/2016, 14:16:08
RE: passerelle VMC modbus / KNX - par dsacchet - 25/11/2016, 21:56:53
RE: passerelle VMC modbus / KNX - par vf62 - 21/02/2017, 16:15:39
RE: passerelle VMC modbus / KNX - par raintonr - 03/03/2017, 12:07:50
RE: passerelle VMC modbus / KNX - par vf62 - 03/03/2017, 15:47:28
RE: passerelle VMC modbus / KNX - par raintonr - 03/03/2017, 16:24:23
RE: passerelle VMC modbus / KNX - par raintonr - 03/03/2017, 21:49:06
RE: passerelle VMC modbus / KNX - par stephane27320 - 13/03/2017, 07:45:26
RE: passerelle VMC modbus / KNX - par vf62 - 13/03/2017, 10:12:25
RE: passerelle VMC modbus / KNX - par stephane27320 - 13/03/2017, 10:33:30
RE: passerelle VMC modbus / KNX - par vf62 - 13/03/2017, 14:50:12
RE: passerelle VMC modbus / KNX - par stephane27320 - 14/03/2017, 09:41:41
RE: passerelle VMC modbus / KNX - par stephane27320 - 14/03/2017, 10:15:56
RE: passerelle VMC modbus / KNX - par stephane27320 - 14/03/2017, 14:57:19
RE: passerelle VMC modbus / KNX - par vf62 - 25/07/2017, 15:03:23
RE: passerelle VMC modbus / KNX - par jeertuyian - 11/08/2017, 12:52:58
RE: passerelle VMC modbus / KNX - par stephane27320 - 18/09/2017, 14:49:23
RE: passerelle VMC modbus / KNX - par raintonr - 16/11/2017, 09:08:11
RE: passerelle VMC modbus / KNX - par Marcus_2B - 04/03/2018, 15:20:56
RE: passerelle VMC modbus / KNX - par vf62 - 04/01/2019, 09:25:56
RE: passerelle VMC modbus / KNX - par epithenium - 15/01/2019, 18:44:45
RE: passerelle VMC modbus / KNX - par vf62 - 16/01/2019, 13:59:05
RE: passerelle VMC modbus / KNX - par epithenium - 16/01/2019, 15:27:54
RE: passerelle VMC modbus / KNX - par vf62 - 16/01/2019, 17:23:36
RE: passerelle VMC modbus / KNX - par epithenium - 16/01/2019, 22:21:47
RE: passerelle VMC modbus / KNX - par epithenium - 22/01/2019, 09:40:51
RE: passerelle VMC modbus / KNX - par vf62 - 24/01/2019, 10:44:38
RE: passerelle VMC modbus / KNX - par lepiallou - 24/01/2019, 14:15:55
RE: passerelle VMC modbus / KNX - par vf62 - 25/01/2019, 14:18:36
RE: passerelle VMC modbus / KNX - par lepiallou - 07/02/2019, 13:52:55
RE: passerelle VMC modbus / KNX - par stephane27320 - 23/04/2019, 09:10:18
RE: passerelle VMC modbus / KNX - par Fuego45 - 31/08/2019, 09:43:50
RE: passerelle VMC modbus / KNX - par filou59 - 01/09/2019, 19:12:49
RE: passerelle VMC modbus / KNX - par Fuego45 - 03/09/2019, 09:17:08
RE: passerelle VMC modbus / KNX - par stephane27320 - 09/09/2019, 13:56:08
RE: passerelle VMC modbus / KNX - par epithenium - 18/12/2019, 16:55:03
RE: passerelle VMC modbus / KNX - par Wolfen38 - 24/10/2020, 17:12:48
RE: passerelle VMC modbus / KNX - par filou59 - 25/10/2020, 10:14:15
RE: passerelle VMC modbus / KNX - par Wolfen38 - 01/11/2020, 12:11:44
RE: passerelle VMC modbus / KNX - par filou59 - 01/11/2020, 15:26:55
RE: passerelle VMC modbus / KNX - par Wolfen38 - 02/11/2020, 18:03:22
RE: passerelle VMC modbus / KNX - par filou59 - 02/11/2020, 18:09:57
RE: passerelle VMC modbus / KNX - par Wolfen38 - 02/11/2020, 18:16:19
RE: passerelle VMC modbus / KNX - par filou59 - 02/11/2020, 19:31:05
RE: passerelle VMC modbus / KNX - par Wolfen38 - 02/11/2020, 20:20:15
RE: passerelle VMC modbus / KNX - par filou59 - 02/11/2020, 21:12:25
RE: passerelle VMC modbus / KNX - par Wolfen38 - 02/11/2020, 21:19:58

Atteindre :


Utilisateur(s) parcourant ce sujet : 5 visiteur(s)