Modbus TCP Write Fehler

Hallo,
Ich arbeite mit einer Beckhoff SPS. Ich habe sie so konfiguriert, dass sie als Modbus-Gerät funktioniert (0x3000 - 0x5FFF als Modbus Memory area), so dass ich sie in OpenEMS integrieren kann. Bis jetzt kann ich die Werte erfolgreich aus dem Gerät lesen, aber wenn es um das Schreiben geht, funktioniert es nicht.

Ausschnitt aus meinem Code

@Override
protected ModbusProtocol defineModbusProtocol() throws OpenemsException {
	log.info("Initializing Beckhoff CX8090 channles");
	return new ModbusProtocol(this, //
			new FC16WriteRegistersTask(0x3000, //
					m(new BitsWordElement(0x3000, this)
							.bit(0, BeckhoffCX8090.ChannelId.READY_LOW_PLC)
							.bit(1, BeckhoffCX8090.ChannelId.READY_HIGH_PLC)
							.bit(2, BeckhoffCX8090.ChannelId.READY_TO_SWITCH_OFF_TARGET)
							.bit(3, BeckhoffCX8090.ChannelId.ST_THERMO_COUPLE_BASE_TARGET)
							.bit(4, BeckhoffCX8090.ChannelId.ST_THERMO_COUPLE_ALGORITHMS_TARGET)
							.bit(5, BeckhoffCX8090.ChannelId.ST_PV_TOTAL_TARGET)
							.bit(6, BeckhoffCX8090.ChannelId.ST_WIND_TOTAL_TARGET)
							.bit(7, BeckhoffCX8090.ChannelId.ST_BUILDING_TOTAL_TARGET)
							.bit(8, BeckhoffCX8090.ChannelId.ST_EV_CHARGING_STATION_TOTAL_TARGET)
							)
					),
	
			new FC3ReadRegistersTask(0x3004, Priority.HIGH, //
					m(new BitsWordElement(0x3004, this)
							.bit(0, BeckhoffCX8090.ChannelId.READY_LOW)
							.bit(1, BeckhoffCX8090.ChannelId.READY_HIGH)
							.bit(2, BeckhoffCX8090.ChannelId.READY_TO_SWITCH_OFF)
							.bit(3, BeckhoffCX8090.ChannelId.ST_THERMO_COUPLE_BASE)
							.bit(4, BeckhoffCX8090.ChannelId.ST_THERMO_COUPLE_SAFETY)
							.bit(5, BeckhoffCX8090.ChannelId.ST_THERMO_COUPLE_ALGORITHMS)
							.bit(6, BeckhoffCX8090.ChannelId.ST_PV_TOTAL)
							.bit(7, BeckhoffCX8090.ChannelId.ST_WIND_TOTAL)
							.bit(8, BeckhoffCX8090.ChannelId.ST_BUILDING_TOTAL)
							.bit(9, BeckhoffCX8090.ChannelId.ST_EV_CHARGING_STATION_TOTAL)
							),
					m(BeckhoffCX8090.ChannelId.VAL_2, new UnsignedWordElement(0x3005), 
							ElementToChannelConverter.DIRECT_1_TO_1),
					m(BeckhoffCX8090.ChannelId.VAL_3, new UnsignedWordElement(0x3006), 
							ElementToChannelConverter.DIRECT_1_TO_1),
					m(BeckhoffCX8090.ChannelId.VAL_4, new UnsignedWordElement(0x3007), 
							ElementToChannelConverter.DIRECT_1_TO_1),
					m(BeckhoffCX8090.ChannelId.VAL_5, new UnsignedWordElement(0x3008), 
							ElementToChannelConverter.DIRECT_1_TO_1),
					m(BeckhoffCX8090.ChannelId.VAL_6, new UnsignedWordElement(0x3009),
							ElementToChannelConverter.DIRECT_1_TO_1),
					m(BeckhoffCX8090.ChannelId.VAL_7, new UnsignedWordElement(0x300A),
							ElementToChannelConverter.DIRECT_1_TO_1),
					m(BeckhoffCX8090.ChannelId.VAL_8, new UnsignedWordElement(0x300B),
							ElementToChannelConverter.DIRECT_1_TO_1)
					)
			);
}

Ich verwende die Funktion FC3 zum Lesen mehrerer Register und FC16 zum Schreiben mehrerer Register. Ich habe auch READ_AND_WRITE Verbose für meine Modbus-Komponente aktiviert. Ich kann sehen, dass Verbose in der Konsole nur für die FC3-Funktion gedruckt wird und nicht für F16. Ich bin also verwirrt, wann wird die F16-Funktion ausgelöst. Ich verstehe, dass FC3 jeden Zyklus ausgelöst wird.

FYI, Ich setze den nächsten zu schreibenden Wert für meine Kanäle (z.B. BeckhoffCX8090.ChannelId.ST_PV_TOTAL_TARGET) durch .setNextValue(), in der activate() Funktion

Übersehe ich etwas oder mache ich etwas falsch? Muss ich noch weitere Parameter definieren. Zum Beispiel habe ich gesehen, dass in einigen anderen Komponenten eine Modbusslave-Tabelle implementiert ist, aber bin nicht ganz sicher wo oder wie ist es hilfreich.

Ich bin Ihnen für Ihre Hilfe sehr dankbar

viele Grüße
Laksh

Update zu meiner frage:

Ich habe .setNextWriteValue() anstelle von .setNextValue() verwendet, und es hat funktioniert. Ich habe bei den verfügbaren Möglichkeiten mit WriteChannel übersehen.

viele Grüße
Laksh

1 Like