Add modbus tcp block update implementation
parent
4507f3afb5
commit
e95d3f089d
|
|
@ -602,7 +602,77 @@ def writeBlockUpdateMethodImplementationsRtu(fileDescriptor, className, blockDef
|
|||
writeLine(fileDescriptor)
|
||||
|
||||
|
||||
def writeBlockUpdateMethodImplementationsTcp(fileDescriptor, className, blockDefinitions):
|
||||
for blockDefinition in blockDefinitions:
|
||||
blockName = blockDefinition['id']
|
||||
blockRegisters = blockDefinition['registers']
|
||||
blockStartAddress = 0
|
||||
registerCount = 0
|
||||
blockSize = 0
|
||||
registerType = ""
|
||||
|
||||
for i, blockRegister in enumerate(blockRegisters):
|
||||
if i == 0:
|
||||
blockStartAddress = blockRegister['address']
|
||||
registerType = blockRegister['registerType']
|
||||
|
||||
registerCount += 1
|
||||
blockSize += blockRegister['size']
|
||||
|
||||
writeLine(fileDescriptor, 'void %s::update%sBlock()' % (className, blockName[0].upper() + blockName[1:]))
|
||||
writeLine(fileDescriptor, '{')
|
||||
writeLine(fileDescriptor, ' // Update register block \"%s\"' % blockName)
|
||||
writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Read block \\"%s\\" registers from:" << %s << "size:" << %s;' % (className, blockName, blockStartAddress, blockSize))
|
||||
|
||||
# Build request depending on the register type
|
||||
# Build request depending on the register type
|
||||
if registerType == 'inputRegister':
|
||||
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::InputRegisters, %s, %s);' % (blockStartAddress, blockSize))
|
||||
elif registerType == 'discreteInputs':
|
||||
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::DiscreteInputs, %s, %s);' % (blockStartAddress, blockSize))
|
||||
elif registerType == 'coils':
|
||||
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, %s, %s);' % (blockStartAddress, blockSize))
|
||||
else:
|
||||
#Default to holdingRegister
|
||||
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, %s, %s);' % (blockStartAddress, blockSize))
|
||||
|
||||
writeLine(fileDescriptor, ' QModbusReply *reply = sendReadRequest(request, m_slaveId);')
|
||||
|
||||
writeLine(fileDescriptor, ' if (reply) {')
|
||||
writeLine(fileDescriptor, ' if (!reply->isFinished()) {')
|
||||
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::finished, this, [this, reply](){')
|
||||
writeLine(fileDescriptor, ' if (reply->error() == QModbusReply::NoError) {')
|
||||
writeLine(fileDescriptor, ' QVector<quint16> blockValues = reply->result();')
|
||||
writeLine(fileDescriptor, ' QVector<quint16> values;')
|
||||
writeLine(fileDescriptor, ' qCDebug(dc%s()) << "<-- Response from reading block \\"%s\\" register" << %s << "size:" << %s << blockValues;' % (className, blockName, blockStartAddress, blockSize))
|
||||
|
||||
# Start parsing the registers using offsets
|
||||
offset = 0
|
||||
for i, blockRegister in enumerate(blockRegisters):
|
||||
propertyName = blockRegister['id']
|
||||
propertyTyp = getCppDataType(blockRegister)
|
||||
writeLine(fileDescriptor, ' values = blockValues.mid(%s, %s);' % (offset, blockRegister['size']))
|
||||
writeLine(fileDescriptor, ' %s received%s = %s;' % (propertyTyp, propertyName[0].upper() + propertyName[1:], getValueConversionMethod(blockRegister)))
|
||||
writeLine(fileDescriptor, ' if (m_%s != received%s) {' % (propertyName, propertyName[0].upper() + propertyName[1:]))
|
||||
writeLine(fileDescriptor, ' m_%s = received%s;' % (propertyName, propertyName[0].upper() + propertyName[1:]))
|
||||
writeLine(fileDescriptor, ' emit %sChanged(m_%s);' % (propertyName, propertyName))
|
||||
writeLine(fileDescriptor, ' }')
|
||||
writeLine(fileDescriptor)
|
||||
offset += blockRegister['size']
|
||||
|
||||
writeLine(fileDescriptor, ' }')
|
||||
writeLine(fileDescriptor, ' });')
|
||||
writeLine(fileDescriptor)
|
||||
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [reply] (QModbusReply::Error error){')
|
||||
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while updating block \\"%s\\" registers" << error << reply->errorString();' % (className, blockName))
|
||||
writeLine(fileDescriptor, ' emit reply->finished();')
|
||||
writeLine(fileDescriptor, ' });')
|
||||
writeLine(fileDescriptor, ' }')
|
||||
writeLine(fileDescriptor, ' } else {')
|
||||
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading block \\"%s\\" registers";' % (className, blockName))
|
||||
writeLine(fileDescriptor, ' }')
|
||||
writeLine(fileDescriptor, '}')
|
||||
writeLine(fileDescriptor)
|
||||
|
||||
def writeInternalPropertyReadMethodDeclarationsTcp(fileDescriptor, registerDefinitions):
|
||||
for registerDefinition in registerDefinitions:
|
||||
|
|
@ -885,6 +955,9 @@ def writeTcpSourceFile():
|
|||
# Write update methods
|
||||
writePropertyUpdateMethodImplementationsTcp(sourceFile, className, registerJson['registers'])
|
||||
|
||||
# Write block update method
|
||||
writeBlockUpdateMethodImplementationsTcp(sourceFile, className, registerJson['blocks'])
|
||||
|
||||
# Write property read method implementations
|
||||
writeInternalPropertyReadMethodImplementationsTcp(sourceFile, className, registerJson['registers'])
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue