将Modbus寄存器地址和相应的设置值存储到mysql数据库

时间:2019-06-13 13:23:29

标签: python pymodbus

我正在尝试运行一个Modbus服务器代码,该代码仅将Modbus寄存器地址和相应的值存储到MySQL数据库。例如,我想向Modbus服务器发送命令以将40001地址值设置为25。Modbus服务器只将这个地址和值保存到数据库中。有人对此有想法吗? 我正在使用pymodbus python库。

1 个答案:

答案 0 :(得分:0)

from __future__ import print_function
from pymodbus.server.asynchronous import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSparseDataBlock
from pymodbus.datastore import SqlSlaveContext
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
class CustomDataBlock(ModbusSparseDataBlock):
    def setValues(self, address, value):
        super(ModbusSparseDataBlock, self).setValues(address, value)
        print("wrote {} to {}".format(value, address))


def run_custom_db_server():
    block  = CustomDataBlock([0]*100)
    store  = SqlSlaveContext(di=block, co=block, hr=block, ir=block)
    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 = '2.2.0'
    StartTcpServer(context, identity=identity, address=("localhos", 502))


if __name__ == "__main__":
    run_custom_db_server()
`
from pymodbus.server.asynchronous import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSparseDataBlock
from pymodbus.datastore import SqlSlaveContext
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
class CustomDataBlock(ModbusSparseDataBlock):
    def setValues(self, address, value):
        super(ModbusSparseDataBlock, self).setValues(address, value)
        print("wrote {} to {}".format(value, address))


def run_custom_db_server():
    block  = CustomDataBlock([0]*100)
    store  = SqlSlaveContext(di=block, co=block, hr=block, ir=block)
    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 = '2.2.0'
    StartTcpServer(context, identity=identity, address=("localhos", 502))


if __name__ == "__main__":
    run_custom_db_server()