diff --git a/include/villas/nodes/iec60870.hpp b/include/villas/nodes/iec60870.hpp index c08f0144f..080f31e05 100644 --- a/include/villas/nodes/iec60870.hpp +++ b/include/villas/nodes/iec60870.hpp @@ -95,11 +95,11 @@ private: ASDUData::Descriptor { Type::DOUBLE_POINT, "double-point", "M_DP_NA_1", false, Type::DOUBLE_POINT, SignalType::INTEGER }, ASDUData::Descriptor { Type::DOUBLE_POINT_WITH_TIMESTAMP, "double-point", "M_DP_TB_1", true, Type::DOUBLE_POINT, SignalType::INTEGER }, ASDUData::Descriptor { Type::SCALED_INT, "scaled-int", "M_ME_NB_1", false, Type::SCALED_INT, SignalType::INTEGER }, - ASDUData::Descriptor { Type::SCALED_INT_WITH_TIMESTAMP, "scaled-int", "M_ME_TB_1", true, Type::SCALED_INT, SignalType::INTEGER }, + ASDUData::Descriptor { Type::SCALED_INT_WITH_TIMESTAMP, "scaled-int", "M_ME_TE_1", true, Type::SCALED_INT, SignalType::INTEGER }, ASDUData::Descriptor { Type::NORMALIZED_FLOAT, "normalized-float", "M_ME_NA_1", false, Type::NORMALIZED_FLOAT, SignalType::FLOAT }, - ASDUData::Descriptor { Type::NORMALIZED_FLOAT_WITH_TIMESTAMP, "normalized-float", "M_ME_TA_1", true, Type::NORMALIZED_FLOAT, SignalType::FLOAT }, + ASDUData::Descriptor { Type::NORMALIZED_FLOAT_WITH_TIMESTAMP, "normalized-float", "M_ME_TD_1", true, Type::NORMALIZED_FLOAT, SignalType::FLOAT }, ASDUData::Descriptor { Type::SHORT_FLOAT, "short-float", "M_ME_NC_1", false, Type::SHORT_FLOAT, SignalType::FLOAT }, - ASDUData::Descriptor { Type::SHORT_FLOAT_WITH_TIMESTAMP, "short-float", "M_ME_TC_1", true, Type::SHORT_FLOAT, SignalType::FLOAT }, + ASDUData::Descriptor { Type::SHORT_FLOAT_WITH_TIMESTAMP, "short-float", "M_ME_TF_1", true, Type::SHORT_FLOAT, SignalType::FLOAT }, }; ASDUData(ASDUData::Descriptor const *descriptor, int ioa, int ioa_sequence_start); diff --git a/lib/nodes/iec60870.cpp b/lib/nodes/iec60870.cpp index 81954968c..f33ad1748 100644 --- a/lib/nodes/iec60870.cpp +++ b/lib/nodes/iec60870.cpp @@ -51,8 +51,6 @@ ASDUData ASDUData::parse(json_t *signal_json, std::optional last_data, )) throw ConfigError(signal_json, err, "node-config-node-iec60870-5-104"); - with_timestamp = with_timestamp != -1 ? with_timestamp != 0 : false; - // Increase the ioa if it is found twice to make it a sequence if ( duplicate_ioa_is_sequence && last_data && @@ -66,7 +64,9 @@ ASDUData ASDUData::parse(json_t *signal_json, std::optional last_data, throw RuntimeError("Please specify one of asdu_type or asdu_type_id", ioa); auto asdu_data = asdu_type_name - ? ASDUData::lookupName(asdu_type_name, with_timestamp, ioa, ioa_sequence_start.value_or(ioa)) + ? ASDUData::lookupName(asdu_type_name, + with_timestamp != -1 ? with_timestamp != 0 : false, + ioa, ioa_sequence_start.value_or(ioa)) : ASDUData::lookupTypeId(asdu_type_id, ioa, ioa_sequence_start.value_or(ioa)); if (!asdu_data.has_value()) @@ -354,6 +354,7 @@ void SlaveNode::createSlave() noexcept // Create the slave object server.slave = CS104_Slave_create(server.low_priority_queue, server.high_priority_queue); CS104_Slave_setServerMode(server.slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP); + CS104_Slave_setMaxOpenConnections(server.slave, 1); // Configure the slave according to config server.asdu_app_layer_parameters = CS104_Slave_getAppLayerParameters(server.slave); @@ -509,21 +510,23 @@ bool SlaveNode::onInterrogation(IMasterConnection connection, CS101_ASDU asdu, Q ); do { - auto asdu_data = output.mapping[i].withoutTimestamp(); + auto asdu_data = output.mapping[i]; auto last_value = output.last_values[i]; if (asdu_data.type() != asdu_type) continue; - if (asdu_data.addSampleToASDU(signal_asdu, ASDUData::Sample { - last_value, - IEC60870_QUALITY_GOOD, - std::nullopt - }) == false) + if (!asdu_data.withoutTimestamp().addSampleToASDU(signal_asdu, + ASDUData::Sample { + last_value, + IEC60870_QUALITY_GOOD, + std::nullopt + })) break; } while (++i < output.mapping.size()); - IMasterConnection_sendASDU(connection, signal_asdu); + if (CS101_ASDU_getNumberOfElements(asdu) != 0) + IMasterConnection_sendASDU(connection, signal_asdu); CS101_ASDU_destroy(signal_asdu); }